diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-26 07:00:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-26 07:00:12 +0000 |
commit | ed0c676d4ee8f25d06297caa81502efa3f65782e (patch) | |
tree | 6178770be2c961efdb66096dca312636def13129 /lib | |
parent | 0fb7059f26c5843f57ea7c6607e4b5ec2e318c76 (diff) | |
download | external_llvm-ed0c676d4ee8f25d06297caa81502efa3f65782e.zip external_llvm-ed0c676d4ee8f25d06297caa81502efa3f65782e.tar.gz external_llvm-ed0c676d4ee8f25d06297caa81502efa3f65782e.tar.bz2 |
make SectionKind know whether a symbol is weak or not in addition
to its classification.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77140 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 18 | ||||
-rw-r--r-- | lib/CodeGen/ELFWriter.cpp | 14 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 35 |
3 files changed, 36 insertions, 31 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 5da01a2..0bbbddf 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -311,15 +311,17 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { SectionKind Kind; switch (CPE.getRelocationInfo()) { default: llvm_unreachable("Unknown section kind"); - case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel); break; - case 1: Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal); break; + case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel, false); break; + case 1: + Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false); + break; case 0: - switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { - case 4: Kind = SectionKind::get(SectionKind::MergeableConst4); break; - case 8: Kind = SectionKind::get(SectionKind::MergeableConst8); break; - case 16: Kind = SectionKind::get(SectionKind::MergeableConst16); break; - default: Kind = SectionKind::get(SectionKind::MergeableConst); break; - } + switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { + case 4: Kind = SectionKind::get(SectionKind::MergeableConst4,false); break; + case 8: Kind = SectionKind::get(SectionKind::MergeableConst8,false); break; + case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break; + default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break; + } } const Section *S = TAI->getSectionForMergeableConstant(Kind); diff --git a/lib/CodeGen/ELFWriter.cpp b/lib/CodeGen/ELFWriter.cpp index 97b7ff0..c0e7b93 100644 --- a/lib/CodeGen/ELFWriter.cpp +++ b/lib/CodeGen/ELFWriter.cpp @@ -157,14 +157,16 @@ ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) { SectionKind Kind; switch (CPE.getRelocationInfo()) { default: llvm_unreachable("Unknown section kind"); - case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel); break; - case 1: Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal); break; + case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel,false); break; + case 1: + Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false); + break; case 0: switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { - case 4: Kind = SectionKind::get(SectionKind::MergeableConst4); break; - case 8: Kind = SectionKind::get(SectionKind::MergeableConst8); break; - case 16: Kind = SectionKind::get(SectionKind::MergeableConst16); break; - default: Kind = SectionKind::get(SectionKind::MergeableConst); break; + case 4: Kind = SectionKind::get(SectionKind::MergeableConst4,false); break; + case 8: Kind = SectionKind::get(SectionKind::MergeableConst8,false); break; + case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break; + default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break; } } diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 205a34d..18807f6 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -220,23 +220,24 @@ static unsigned SectionFlagsForGlobal(const GlobalValue *GV, static SectionKind SectionKindForGlobal(const GlobalValue *GV, const TargetMachine &TM) { Reloc::Model ReloModel = TM.getRelocationModel(); + bool isWeak = GV->isWeakForLinker(); // Early exit - functions should be always in text sections. const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); if (GVar == 0) - return SectionKind::get(SectionKind::Text); + return SectionKind::get(SectionKind::Text, isWeak); // Handle thread-local data first. if (GVar->isThreadLocal()) { if (isSuitableForBSS(GVar)) - return SectionKind::get(SectionKind::ThreadBSS); - return SectionKind::get(SectionKind::ThreadData);; + return SectionKind::get(SectionKind::ThreadBSS, isWeak); + return SectionKind::get(SectionKind::ThreadData, isWeak); } // Variable can be easily put to BSS section. if (isSuitableForBSS(GVar)) - return SectionKind::get(SectionKind::BSS); + return SectionKind::get(SectionKind::BSS, isWeak); Constant *C = GVar->getInitializer(); @@ -252,16 +253,16 @@ static SectionKind SectionKindForGlobal(const GlobalValue *GV, // If initializer is a null-terminated string, put it in a "cstring" // section if the target has it. if (isConstantString(C)) - return SectionKind::get(SectionKind::MergeableCString); + return SectionKind::get(SectionKind::MergeableCString, isWeak); // Otherwise, just drop it into a mergable constant section. If we have // a section for this size, use it, otherwise use the arbitrary sized // mergable section. switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { - case 4: return SectionKind::get(SectionKind::MergeableConst4); - case 8: return SectionKind::get(SectionKind::MergeableConst8); - case 16: return SectionKind::get(SectionKind::MergeableConst16); - default: return SectionKind::get(SectionKind::MergeableConst); + case 4: return SectionKind::get(SectionKind::MergeableConst4, isWeak); + case 8: return SectionKind::get(SectionKind::MergeableConst8, isWeak); + case 16: return SectionKind::get(SectionKind::MergeableConst16, isWeak); + default: return SectionKind::get(SectionKind::MergeableConst, isWeak); } case Constant::LocalRelocation: @@ -269,22 +270,22 @@ static SectionKind SectionKindForGlobal(const GlobalValue *GV, // the relocation entries will actually be constants by the time the app // starts up. if (ReloModel == Reloc::Static) - return SectionKind::get(SectionKind::ReadOnly); + return SectionKind::get(SectionKind::ReadOnly, isWeak); // Otherwise, the dynamic linker needs to fix it up, put it in the // writable data.rel.local section. - return SectionKind::get(SectionKind::ReadOnlyWithRelLocal); + return SectionKind::get(SectionKind::ReadOnlyWithRelLocal, isWeak); case Constant::GlobalRelocations: // In static relocation model, the linker will resolve all addresses, so // the relocation entries will actually be constants by the time the app // starts up. if (ReloModel == Reloc::Static) - return SectionKind::get(SectionKind::ReadOnly); + return SectionKind::get(SectionKind::ReadOnly, isWeak); // Otherwise, the dynamic linker needs to fix it up, put it in the // writable data.rel section. - return SectionKind::get(SectionKind::ReadOnlyWithRel); + return SectionKind::get(SectionKind::ReadOnlyWithRel, isWeak); } } @@ -294,16 +295,16 @@ static SectionKind SectionKindForGlobal(const GlobalValue *GV, // globals together onto fewer pages, improving the locality of the dynamic // linker. if (ReloModel == Reloc::Static) - return SectionKind::get(SectionKind::DataNoRel); + return SectionKind::get(SectionKind::DataNoRel, isWeak); switch (C->getRelocationInfo()) { default: llvm_unreachable("unknown relocation info kind"); case Constant::NoRelocation: - return SectionKind::get(SectionKind::DataNoRel); + return SectionKind::get(SectionKind::DataNoRel, isWeak); case Constant::LocalRelocation: - return SectionKind::get(SectionKind::DataRelLocal); + return SectionKind::get(SectionKind::DataRelLocal, isWeak); case Constant::GlobalRelocations: - return SectionKind::get(SectionKind::DataRel); + return SectionKind::get(SectionKind::DataRel, isWeak); } } |