aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-26 07:00:12 +0000
committerChris Lattner <sabre@nondot.org>2009-07-26 07:00:12 +0000
commited0c676d4ee8f25d06297caa81502efa3f65782e (patch)
tree6178770be2c961efdb66096dca312636def13129 /lib
parent0fb7059f26c5843f57ea7c6607e4b5ec2e318c76 (diff)
downloadexternal_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.cpp18
-rw-r--r--lib/CodeGen/ELFWriter.cpp14
-rw-r--r--lib/Target/TargetAsmInfo.cpp35
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);
}
}