diff --git a/lib/Target/PowerPC/PPC.td b/lib/Target/PowerPC/PPC.td index a9842b287cb..155f3d5b5c1 100644 --- a/lib/Target/PowerPC/PPC.td +++ b/lib/Target/PowerPC/PPC.td @@ -107,6 +107,16 @@ def DeprecatedDST : SubtargetFeature<"", "DeprecatedDST", "true", // POPCNTB p5 through p7 popcntb and related instructions // VSX p7 vector-scalar instruction set +//===----------------------------------------------------------------------===// +// ABI Selection // +//===----------------------------------------------------------------------===// + +def FeatureELFv1 : SubtargetFeature<"elfv1", "TargetABI", "PPC_ABI_ELFv1", + "Use the ELFv1 ABI">; + +def FeatureELFv2 : SubtargetFeature<"elfv2", "TargetABI", "PPC_ABI_ELFv2", + "Use the ELFv2 ABI">; + //===----------------------------------------------------------------------===// // Classes used for relation maps. //===----------------------------------------------------------------------===// diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index b51512d335f..b39fe10bc13 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -78,7 +78,7 @@ PPCSubtarget::PPCSubtarget(const std::string &TT, const std::string &CPU, const std::string &FS, PPCTargetMachine &TM, bool is64Bit, CodeGenOpt::Level OptLevel) : PPCGenSubtargetInfo(TT, CPU, FS), IsPPC64(is64Bit), TargetTriple(TT), - OptLevel(OptLevel), + OptLevel(OptLevel), TargetABI(PPC_ABI_UNKNOWN), FrameLowering(initializeSubtargetDependencies(CPU, FS)), DL(getDataLayoutString(*this)), InstrInfo(*this), JITInfo(*this), TLInfo(TM), TSInfo(&DL) {} @@ -203,6 +203,16 @@ void PPCSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) { // issues in those instructions can be addressed. if (IsLittleEndian) HasVSX = false; + + // Determine default ABI. + if (TargetABI == PPC_ABI_UNKNOWN) { + if (!isDarwin() && IsPPC64) { + if (IsLittleEndian) + TargetABI = PPC_ABI_ELFv2; + else + TargetABI = PPC_ABI_ELFv1; + } + } } /// hasLazyResolverStub - Return true if accesses to the specified global have diff --git a/lib/Target/PowerPC/PPCSubtarget.h b/lib/Target/PowerPC/PPCSubtarget.h index a3cedafb5ef..8c4f583bdb8 100644 --- a/lib/Target/PowerPC/PPCSubtarget.h +++ b/lib/Target/PowerPC/PPCSubtarget.h @@ -109,6 +109,12 @@ protected: /// OptLevel - What default optimization level we're emitting code for. CodeGenOpt::Level OptLevel; + enum { + PPC_ABI_UNKNOWN, + PPC_ABI_ELFv1, + PPC_ABI_ELFv2 + } TargetABI; + PPCFrameLowering FrameLowering; const DataLayout DL; PPCInstrInfo InstrInfo; @@ -227,9 +233,7 @@ public: bool isDarwinABI() const { return isDarwin(); } bool isSVR4ABI() const { return !isDarwin(); } - /// FIXME: Should use a command-line option. - bool isELFv2ABI() const { return isPPC64() && isSVR4ABI() && - isLittleEndian(); } + bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; } bool enableEarlyIfConversion() const override { return hasISEL(); }