mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Record in a MCSymbolELF if it has been used in a relocation.
No functionality change, just saves an on the side map. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238979 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a41438c5d8
commit
2b9f4dc654
@ -18,6 +18,7 @@ class MCSymbolELF : public MCSymbol {
|
||||
const MCExpr *SymbolSize = nullptr;
|
||||
|
||||
mutable unsigned BindingSet : 1;
|
||||
mutable unsigned UsedInReloc : 1;
|
||||
|
||||
public:
|
||||
MCSymbolELF(const StringMapEntry<bool> *Name, bool isTemporary)
|
||||
@ -40,6 +41,9 @@ public:
|
||||
|
||||
bool isBindingSet() const { return BindingSet; }
|
||||
|
||||
void setUsedInReloc() const;
|
||||
bool isUsedInReloc() const;
|
||||
|
||||
static bool classof(const MCSymbol *S) { return S->isELF(); }
|
||||
};
|
||||
}
|
||||
|
@ -74,8 +74,7 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
static uint64_t SymbolValue(const MCSymbol &Sym, const MCAsmLayout &Layout);
|
||||
static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbolELF &Symbol,
|
||||
bool Used, bool Renamed);
|
||||
static bool isLocal(const MCSymbol &Symbol, bool IsUsedInReloc,
|
||||
bool IsSignature);
|
||||
static bool isLocal(const MCSymbolELF &Symbol, bool IsSignature);
|
||||
|
||||
/// Helper struct for containing some precomputed information on symbols.
|
||||
struct ELFSymbolData {
|
||||
@ -100,7 +99,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
/// The target specific ELF writer instance.
|
||||
std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter;
|
||||
|
||||
SmallPtrSet<const MCSymbol *, 16> UsedInReloc;
|
||||
SmallPtrSet<const MCSymbol *, 16> WeakrefUsedInReloc;
|
||||
DenseMap<const MCSymbolELF *, const MCSymbolELF *> Renames;
|
||||
|
||||
@ -144,7 +142,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
: MCObjectWriter(OS, IsLittleEndian), TargetObjectWriter(MOTW) {}
|
||||
|
||||
void reset() override {
|
||||
UsedInReloc.clear();
|
||||
WeakrefUsedInReloc.clear();
|
||||
Renames.clear();
|
||||
Relocations.clear();
|
||||
@ -716,7 +713,7 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
|
||||
if (const MCSymbol *WeakRef = getWeakRef(*RefA))
|
||||
WeakrefUsedInReloc.insert(WeakRef);
|
||||
else
|
||||
UsedInReloc.insert(SymA);
|
||||
SymA->setUsedInReloc();
|
||||
}
|
||||
ELFRelocationEntry Rec(FixupOffset, SymA, Type, Addend);
|
||||
Relocations[&FixupSection].push_back(Rec);
|
||||
@ -758,15 +755,14 @@ bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ELFObjectWriter::isLocal(const MCSymbol &Symbol, bool IsUsedInReloc,
|
||||
bool IsSignature) {
|
||||
bool ELFObjectWriter::isLocal(const MCSymbolELF &Symbol, bool IsSignature) {
|
||||
if (Symbol.isExternal())
|
||||
return false;
|
||||
|
||||
if (Symbol.isDefined())
|
||||
return true;
|
||||
|
||||
if (IsUsedInReloc)
|
||||
if (Symbol.isUsedInReloc())
|
||||
return false;
|
||||
|
||||
return IsSignature;
|
||||
@ -802,7 +798,7 @@ void ELFObjectWriter::computeSymbolTable(
|
||||
bool HasLargeSectionIndex = false;
|
||||
for (const MCSymbol &S : Asm.symbols()) {
|
||||
const auto &Symbol = cast<MCSymbolELF>(S);
|
||||
bool Used = UsedInReloc.count(&Symbol);
|
||||
bool Used = Symbol.isUsedInReloc();
|
||||
bool WeakrefUsed = WeakrefUsedInReloc.count(&Symbol);
|
||||
bool isSignature = RevGroupMap.count(&Symbol);
|
||||
|
||||
@ -815,7 +811,7 @@ void ELFObjectWriter::computeSymbolTable(
|
||||
|
||||
// Undefined symbols are global, but this is the first place we
|
||||
// are able to set it.
|
||||
bool Local = isLocal(Symbol, Used, isSignature);
|
||||
bool Local = isLocal(Symbol, isSignature);
|
||||
if (!Local && Symbol.getBinding() == ELF::STB_LOCAL)
|
||||
Symbol.setBinding(ELF::STB_GLOBAL);
|
||||
|
||||
|
@ -77,4 +77,13 @@ unsigned MCSymbolELF::getOther() const {
|
||||
unsigned Other = (getFlags() & (0x3f << ELF_STO_Shift)) >> ELF_STO_Shift;
|
||||
return Other;
|
||||
}
|
||||
|
||||
void MCSymbolELF::setUsedInReloc() const {
|
||||
UsedInReloc = true;
|
||||
}
|
||||
|
||||
bool MCSymbolELF::isUsedInReloc() const {
|
||||
return UsedInReloc;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user