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
This commit is contained in:
Chris Lattner
2009-07-26 07:00:12 +00:00
parent 37939c910f
commit 4c50922f6b
4 changed files with 45 additions and 36 deletions

View File

@@ -125,13 +125,16 @@ namespace llvm {
}; };
private: private:
Kind K : 8; Kind K : 7;
/// Weak - This is true if the referenced symbol is weak (i.e. linkonce,
/// weak, weak_odr, etc). This is orthogonal from the categorization.
bool Weak : 1;
public: public:
bool isText() const { bool isWeak() const { return Weak; }
return K == Text;
} bool isText() const { return K == Text; }
bool isReadOnly() const { bool isReadOnly() const {
return K == ReadOnly || K == MergeableCString || isMergeableConst(); return K == ReadOnly || K == MergeableCString || isMergeableConst();
@@ -182,9 +185,10 @@ namespace llvm {
return K == ReadOnlyWithRelLocal; return K == ReadOnlyWithRelLocal;
} }
static SectionKind get(Kind K) { static SectionKind get(Kind K, bool isWeak) {
SectionKind Res; SectionKind Res;
Res.K = K; Res.K = K;
Res.Weak = isWeak;
return Res; return Res;
} }
}; };

View File

@@ -311,15 +311,17 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
SectionKind Kind; SectionKind Kind;
switch (CPE.getRelocationInfo()) { switch (CPE.getRelocationInfo()) {
default: llvm_unreachable("Unknown section kind"); default: llvm_unreachable("Unknown section kind");
case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel); break; case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel, false); break;
case 1: Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal); break; case 1:
Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false);
break;
case 0: case 0:
switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
case 4: Kind = SectionKind::get(SectionKind::MergeableConst4); break; case 4: Kind = SectionKind::get(SectionKind::MergeableConst4,false); break;
case 8: Kind = SectionKind::get(SectionKind::MergeableConst8); break; case 8: Kind = SectionKind::get(SectionKind::MergeableConst8,false); break;
case 16: Kind = SectionKind::get(SectionKind::MergeableConst16); break; case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break;
default: Kind = SectionKind::get(SectionKind::MergeableConst); break; default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break;
} }
} }
const Section *S = TAI->getSectionForMergeableConstant(Kind); const Section *S = TAI->getSectionForMergeableConstant(Kind);

View File

@@ -157,14 +157,16 @@ ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) {
SectionKind Kind; SectionKind Kind;
switch (CPE.getRelocationInfo()) { switch (CPE.getRelocationInfo()) {
default: llvm_unreachable("Unknown section kind"); default: llvm_unreachable("Unknown section kind");
case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel); break; case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel,false); break;
case 1: Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal); break; case 1:
Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false);
break;
case 0: case 0:
switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
case 4: Kind = SectionKind::get(SectionKind::MergeableConst4); break; case 4: Kind = SectionKind::get(SectionKind::MergeableConst4,false); break;
case 8: Kind = SectionKind::get(SectionKind::MergeableConst8); break; case 8: Kind = SectionKind::get(SectionKind::MergeableConst8,false); break;
case 16: Kind = SectionKind::get(SectionKind::MergeableConst16); break; case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break;
default: Kind = SectionKind::get(SectionKind::MergeableConst); break; default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break;
} }
} }

View File

@@ -220,23 +220,24 @@ static unsigned SectionFlagsForGlobal(const GlobalValue *GV,
static SectionKind SectionKindForGlobal(const GlobalValue *GV, static SectionKind SectionKindForGlobal(const GlobalValue *GV,
const TargetMachine &TM) { const TargetMachine &TM) {
Reloc::Model ReloModel = TM.getRelocationModel(); Reloc::Model ReloModel = TM.getRelocationModel();
bool isWeak = GV->isWeakForLinker();
// Early exit - functions should be always in text sections. // Early exit - functions should be always in text sections.
const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
if (GVar == 0) if (GVar == 0)
return SectionKind::get(SectionKind::Text); return SectionKind::get(SectionKind::Text, isWeak);
// Handle thread-local data first. // Handle thread-local data first.
if (GVar->isThreadLocal()) { if (GVar->isThreadLocal()) {
if (isSuitableForBSS(GVar)) if (isSuitableForBSS(GVar))
return SectionKind::get(SectionKind::ThreadBSS); return SectionKind::get(SectionKind::ThreadBSS, isWeak);
return SectionKind::get(SectionKind::ThreadData);; return SectionKind::get(SectionKind::ThreadData, isWeak);
} }
// Variable can be easily put to BSS section. // Variable can be easily put to BSS section.
if (isSuitableForBSS(GVar)) if (isSuitableForBSS(GVar))
return SectionKind::get(SectionKind::BSS); return SectionKind::get(SectionKind::BSS, isWeak);
Constant *C = GVar->getInitializer(); 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" // If initializer is a null-terminated string, put it in a "cstring"
// section if the target has it. // section if the target has it.
if (isConstantString(C)) 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 // Otherwise, just drop it into a mergable constant section. If we have
// a section for this size, use it, otherwise use the arbitrary sized // a section for this size, use it, otherwise use the arbitrary sized
// mergable section. // mergable section.
switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
case 4: return SectionKind::get(SectionKind::MergeableConst4); case 4: return SectionKind::get(SectionKind::MergeableConst4, isWeak);
case 8: return SectionKind::get(SectionKind::MergeableConst8); case 8: return SectionKind::get(SectionKind::MergeableConst8, isWeak);
case 16: return SectionKind::get(SectionKind::MergeableConst16); case 16: return SectionKind::get(SectionKind::MergeableConst16, isWeak);
default: return SectionKind::get(SectionKind::MergeableConst); default: return SectionKind::get(SectionKind::MergeableConst, isWeak);
} }
case Constant::LocalRelocation: 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 // the relocation entries will actually be constants by the time the app
// starts up. // starts up.
if (ReloModel == Reloc::Static) 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 // Otherwise, the dynamic linker needs to fix it up, put it in the
// writable data.rel.local section. // writable data.rel.local section.
return SectionKind::get(SectionKind::ReadOnlyWithRelLocal); return SectionKind::get(SectionKind::ReadOnlyWithRelLocal, isWeak);
case Constant::GlobalRelocations: case Constant::GlobalRelocations:
// In static relocation model, the linker will resolve all addresses, so // In static relocation model, the linker will resolve all addresses, so
// the relocation entries will actually be constants by the time the app // the relocation entries will actually be constants by the time the app
// starts up. // starts up.
if (ReloModel == Reloc::Static) 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 // Otherwise, the dynamic linker needs to fix it up, put it in the
// writable data.rel section. // 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 // globals together onto fewer pages, improving the locality of the dynamic
// linker. // linker.
if (ReloModel == Reloc::Static) if (ReloModel == Reloc::Static)
return SectionKind::get(SectionKind::DataNoRel); return SectionKind::get(SectionKind::DataNoRel, isWeak);
switch (C->getRelocationInfo()) { switch (C->getRelocationInfo()) {
default: llvm_unreachable("unknown relocation info kind"); default: llvm_unreachable("unknown relocation info kind");
case Constant::NoRelocation: case Constant::NoRelocation:
return SectionKind::get(SectionKind::DataNoRel); return SectionKind::get(SectionKind::DataNoRel, isWeak);
case Constant::LocalRelocation: case Constant::LocalRelocation:
return SectionKind::get(SectionKind::DataRelLocal); return SectionKind::get(SectionKind::DataRelLocal, isWeak);
case Constant::GlobalRelocations: case Constant::GlobalRelocations:
return SectionKind::get(SectionKind::DataRel); return SectionKind::get(SectionKind::DataRel, isWeak);
} }
} }