diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index f0c939c47d8..79b7e68c320 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -335,6 +335,13 @@ static std::string computeDataLayout(const X86Subtarget &ST) { return Ret; } +X86Subtarget &X86Subtarget::initializeSubtargetDependencies(StringRef CPU, + StringRef FS) { + initializeEnvironment(); + resetSubtargetFeatures(CPU, FS); + return *this; +} + X86Subtarget::X86Subtarget(const std::string &TT, const std::string &CPU, const std::string &FS, X86TargetMachine &TM, unsigned StackAlignOverride) @@ -346,18 +353,11 @@ X86Subtarget::X86Subtarget(const std::string &TT, const std::string &CPU, TargetTriple.getEnvironment() != Triple::CODE16), In16BitMode(TargetTriple.getArch() == Triple::x86 && TargetTriple.getEnvironment() == Triple::CODE16), - DL(computeDataLayout(*this)), TSInfo(DL) { - initializeEnvironment(); - resetSubtargetFeatures(CPU, FS); - // Ordering here is important. X86InstrInfo initializes X86RegisterInfo which - // X86TargetLowering needs. - InstrInfo = make_unique(*this); - TLInfo = make_unique(TM); - FrameLowering = - make_unique(TargetFrameLowering::StackGrowsDown, - getStackAlignment(), is64Bit() ? -8 : -4); - JITInfo = make_unique(hasSSE1()); -} + DL(computeDataLayout(*this)), TSInfo(DL), + InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM), + FrameLowering(TargetFrameLowering::StackGrowsDown, getStackAlignment(), + is64Bit() ? -8 : -4), + JITInfo(hasSSE1()) {} bool X86Subtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel, diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h index 85da720cbc2..09db0ebc5a9 100644 --- a/lib/Target/X86/X86Subtarget.h +++ b/lib/Target/X86/X86Subtarget.h @@ -229,10 +229,12 @@ private: // Calculates type size & alignment const DataLayout DL; X86SelectionDAGInfo TSInfo; - std::unique_ptr TLInfo; - std::unique_ptr InstrInfo; - std::unique_ptr FrameLowering; - std::unique_ptr JITInfo; + // Ordering here is important. X86InstrInfo initializes X86RegisterInfo which + // X86TargetLowering needs. + X86InstrInfo InstrInfo; + X86TargetLowering TLInfo; + X86FrameLowering FrameLowering; + X86JITInfo JITInfo; public: /// This constructor initializes the data members to match that @@ -242,14 +244,12 @@ public: const std::string &FS, X86TargetMachine &TM, unsigned StackAlignOverride); - const X86TargetLowering *getTargetLowering() const { return TLInfo.get(); } - const X86InstrInfo *getInstrInfo() const { return InstrInfo.get(); } + const X86TargetLowering *getTargetLowering() const { return &TLInfo; } + const X86InstrInfo *getInstrInfo() const { return &InstrInfo; } const DataLayout *getDataLayout() const { return &DL; } - const X86FrameLowering *getFrameLowering() const { - return FrameLowering.get(); - } + const X86FrameLowering *getFrameLowering() const { return &FrameLowering; } const X86SelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; } - X86JITInfo *getJITInfo() { return JITInfo.get(); } + X86JITInfo *getJITInfo() { return &JITInfo; } /// getStackAlignment - Returns the minimum alignment known to hold of the /// stack frame on entry to the function and which must be maintained by every @@ -267,6 +267,9 @@ public: /// \brief Reset the features for the X86 target. void resetSubtargetFeatures(const MachineFunction *MF) override; private: + /// \brief Initialize the full set of dependencies so we can use an initializer + /// list for X86Subtarget. + X86Subtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); void initializeEnvironment(); void resetSubtargetFeatures(StringRef CPU, StringRef FS); public: