mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
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:
@@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user