diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-28 17:50:28 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-28 17:50:28 +0000 |
commit | a3242e93b766f05979f76a5874e7558035a24e79 (patch) | |
tree | 2cd6cd6ca875bea14de1baf19d8f36a4c162275a | |
parent | 5142fbd02efb857ca2edd2152849cf9ed23354bf (diff) | |
download | bcm5719-llvm-a3242e93b766f05979f76a5874e7558035a24e79.tar.gz bcm5719-llvm-a3242e93b766f05979f76a5874e7558035a24e79.zip |
the apple "ld_classic" linker doesn't support .literal16 in 32-bit
mode, and "ld64" (the default linker) falls back to it in -static
mode.
llvm-svn: 77334
-rw-r--r-- | llvm/include/llvm/Target/TargetLoweringObjectFile.h | 2 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/TargetLoweringObjectFile.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 2 |
5 files changed, 16 insertions, 9 deletions
diff --git a/llvm/include/llvm/Target/TargetLoweringObjectFile.h b/llvm/include/llvm/Target/TargetLoweringObjectFile.h index 18ce1de01a0..03bc5a09328 100644 --- a/llvm/include/llvm/Target/TargetLoweringObjectFile.h +++ b/llvm/include/llvm/Target/TargetLoweringObjectFile.h @@ -160,7 +160,7 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { const Section *EightByteConstantSection; const Section *SixteenByteConstantSection; public: - TargetLoweringObjectFileMachO(); + TargetLoweringObjectFileMachO(const TargetMachine &TM); virtual const Section *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const; diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 3b1be764248..afb0b69c54e 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -106,7 +106,7 @@ void ARMTargetLowering::addQRTypeForNEON(MVT VT) { static TargetLoweringObjectFile *createTLOF(TargetMachine &TM) { if (TM.getSubtarget<ARMSubtarget>().isTargetDarwin()) - return new TargetLoweringObjectFileMachO(); + return new TargetLoweringObjectFileMachO(TM); return new TargetLoweringObjectFileELF(true); } diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index fa1989b3d7e..df71838b1e6 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -59,7 +59,7 @@ cl::desc("enable preincrement load/store generation on PPC (experimental)"), static TargetLoweringObjectFile *CreateTLOF(const PPCTargetMachine &TM) { if (TM.getSubtargetImpl()->isDarwin()) - return new TargetLoweringObjectFileMachO(); + return new TargetLoweringObjectFileMachO(TM); return new TargetLoweringObjectFileELF(false, true); } diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp index e3c0dfa5626..2074b6c5d69 100644 --- a/llvm/lib/Target/TargetLoweringObjectFile.cpp +++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp @@ -486,7 +486,7 @@ getSectionForMergeableConstant(SectionKind Kind) const { //===----------------------------------------------------------------------===// TargetLoweringObjectFileMachO:: -TargetLoweringObjectFileMachO() { +TargetLoweringObjectFileMachO(const TargetMachine &TM) { TextSection = getOrCreateSection("\t.text", true, SectionKind::Text); DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel); @@ -496,8 +496,15 @@ TargetLoweringObjectFileMachO() { SectionKind::MergeableConst4); EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, SectionKind::MergeableConst8); - SixteenByteConstantSection = - getOrCreateSection("\t.literal16\n", true, SectionKind::MergeableConst16); + + // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back + // to using it in -static mode. + if (TM.getRelocationModel() != Reloc::Static && + TM.getTargetData()->getPointerSize() == 32) + SixteenByteConstantSection = + getOrCreateSection("\t.literal16\n", true, SectionKind::MergeableConst16); + else + SixteenByteConstantSection = 0; ReadOnlySection = getOrCreateSection("\t.const", true, SectionKind::ReadOnly); @@ -551,7 +558,7 @@ TargetLoweringObjectFileMachO::SelectSectionForGlobal(const GlobalValue *GV, return FourByteConstantSection; if (Kind.isMergeableConst8()) return EightByteConstantSection; - if (Kind.isMergeableConst16()) + if (Kind.isMergeableConst16() && SixteenByteConstantSection) return SixteenByteConstantSection; return ReadOnlySection; // .const } @@ -582,7 +589,7 @@ getSectionForMergeableConstant(SectionKind Kind) const { return FourByteConstantSection; if (Kind.isMergeableConst8()) return EightByteConstantSection; - if (Kind.isMergeableConst16()) + if (Kind.isMergeableConst16() && SixteenByteConstantSection) return SixteenByteConstantSection; return ReadOnlySection; // .const } diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 29f5765d5e1..f34deb1f464 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -55,7 +55,7 @@ static TargetLoweringObjectFile *createTLOF(X86TargetMachine &TM) { switch (TM.getSubtarget<X86Subtarget>().TargetType) { default: llvm_unreachable("unknown subtarget type"); case X86Subtarget::isDarwin: - return new TargetLoweringObjectFileMachO(); + return new TargetLoweringObjectFileMachO(TM); case X86Subtarget::isELF: return new TargetLoweringObjectFileELF(); case X86Subtarget::isMingw: |