projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fetch alignment directly out of MCSection. NFC.
[oota-llvm.git]
/
lib
/
MC
/
ELFObjectWriter.cpp
diff --git
a/lib/MC/ELFObjectWriter.cpp
b/lib/MC/ELFObjectWriter.cpp
index b0158014a9ec4772bc78e8582ad67a891d16a0d8..8afd00fb7e315cee0211c832b839a0396fb1dfa4 100644
(file)
--- a/
lib/MC/ELFObjectWriter.cpp
+++ b/
lib/MC/ELFObjectWriter.cpp
@@
-72,22
+72,22
@@
public:
class ELFObjectWriter : public MCObjectWriter {
static bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind);
static bool RelocNeedsGOT(MCSymbolRefExpr::VariantKind Variant);
class ELFObjectWriter : public MCObjectWriter {
static bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind);
static bool RelocNeedsGOT(MCSymbolRefExpr::VariantKind Variant);
- static uint64_t SymbolValue(
MCSymbolData &Data
, const MCAsmLayout &Layout);
- static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbol
Data &Data
,
+ static uint64_t SymbolValue(
const MCSymbol &Sym
, const MCAsmLayout &Layout);
+ static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbol
&Symbol
,
bool Used, bool Renamed);
bool Used, bool Renamed);
- static bool isLocal(const MCSymbol
Data &Data
, bool isUsedInReloc);
+ static bool isLocal(const MCSymbol
&Symbol
, bool isUsedInReloc);
/// Helper struct for containing some precomputed information on symbols.
struct ELFSymbolData {
/// Helper struct for containing some precomputed information on symbols.
struct ELFSymbolData {
-
MCSymbolData *SymbolData
;
+
const MCSymbol *Symbol
;
uint64_t StringIndex;
uint32_t SectionIndex;
StringRef Name;
// Support lexicographic sorting.
bool operator<(const ELFSymbolData &RHS) const {
uint64_t StringIndex;
uint32_t SectionIndex;
StringRef Name;
// Support lexicographic sorting.
bool operator<(const ELFSymbolData &RHS) const {
- unsigned LHSType = MCELF::GetType(
*SymbolData
);
- unsigned RHSType = MCELF::GetType(
*RHS.SymbolData
);
+ unsigned LHSType = MCELF::GetType(
Symbol->getData()
);
+ unsigned RHSType = MCELF::GetType(
RHS.Symbol->getData()
);
if (LHSType == ELF::STT_SECTION && RHSType != ELF::STT_SECTION)
return false;
if (LHSType != ELF::STT_SECTION && RHSType == ELF::STT_SECTION)
if (LHSType == ELF::STT_SECTION && RHSType != ELF::STT_SECTION)
return false;
if (LHSType != ELF::STT_SECTION && RHSType == ELF::STT_SECTION)
@@
-133,8
+133,8
@@
class ELFObjectWriter : public MCObjectWriter {
unsigned ShstrtabIndex;
// Sections in the order they are to be output in the section table.
unsigned ShstrtabIndex;
// Sections in the order they are to be output in the section table.
- std::vector<
const
MCSectionELF *> SectionTable;
- unsigned addToSectionTable(
const
MCSectionELF *Sec);
+ std::vector<MCSectionELF *> SectionTable;
+ unsigned addToSectionTable(MCSectionELF *Sec);
// TargetObjectWriter wrappers.
bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
// TargetObjectWriter wrappers.
bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
@@
-198,7
+198,7
@@
class ELFObjectWriter : public MCObjectWriter {
bool shouldRelocateWithSymbol(const MCAssembler &Asm,
const MCSymbolRefExpr *RefA,
bool shouldRelocateWithSymbol(const MCAssembler &Asm,
const MCSymbolRefExpr *RefA,
- const MCSymbol
Data *SD
, uint64_t C,
+ const MCSymbol
*Sym
, uint64_t C,
unsigned Type) const;
void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
unsigned Type) const;
void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
@@
-221,8
+221,8
@@
class ELFObjectWriter : public MCObjectWriter {
const SectionIndexMapTy &SectionIndexMap,
const RevGroupMapTy &RevGroupMap);
const SectionIndexMapTy &SectionIndexMap,
const RevGroupMapTy &RevGroupMap);
-
const
MCSectionELF *createRelocationSection(MCAssembler &Asm,
-
const MCSectionELF &Sec);
+ MCSectionELF *createRelocationSection(MCAssembler &Asm,
+ const MCSectionELF &Sec);
const MCSectionELF *createSectionHeaderStringTable();
const MCSectionELF *createStringTable(MCContext &Ctx);
const MCSectionELF *createSectionHeaderStringTable();
const MCSectionELF *createStringTable(MCContext &Ctx);
@@
-244,25
+244,23
@@
class ELFObjectWriter : public MCObjectWriter {
void writeRelocations(const MCAssembler &Asm, const MCSectionELF &Sec);
void writeRelocations(const MCAssembler &Asm, const MCSectionELF &Sec);
- bool
- IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
- const MCSymbolData &DataA,
- const MCFragment &FB,
- bool InSet,
- bool IsPCRel) const override;
+ bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
+ const MCSymbol &SymA,
+ const MCFragment &FB,
+ bool InSet,
+ bool IsPCRel) const override;
- bool isWeak(const MCSymbol
Data &SD
) const override;
+ bool isWeak(const MCSymbol
&Sym
) const override;
void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
void writeSection(MCAssembler &Asm,
const SectionIndexMapTy &SectionIndexMap,
void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
void writeSection(MCAssembler &Asm,
const SectionIndexMapTy &SectionIndexMap,
- uint32_t GroupSymbolIndex,
- uint64_t Offset, uint64_t Size, uint64_t Alignment,
+ uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size,
const MCSectionELF &Section);
};
}
const MCSectionELF &Section);
};
}
-unsigned ELFObjectWriter::addToSectionTable(
const
MCSectionELF *Sec) {
+unsigned ELFObjectWriter::addToSectionTable(MCSectionELF *Sec) {
SectionTable.push_back(Sec);
ShStrTabBuilder.add(Sec->getSectionName());
return SectionTable.size();
SectionTable.push_back(Sec);
ShStrTabBuilder.add(Sec->getSectionName());
return SectionTable.size();
@@
-402,16
+400,17
@@
void ELFObjectWriter::writeHeader(const MCAssembler &Asm) {
Write16(ShstrtabIndex);
}
Write16(ShstrtabIndex);
}
-uint64_t ELFObjectWriter::SymbolValue(
MCSymbolData &Data
,
+uint64_t ELFObjectWriter::SymbolValue(
const MCSymbol &Sym
,
const MCAsmLayout &Layout) {
const MCAsmLayout &Layout) {
+ MCSymbolData &Data = Sym.getData();
if (Data.isCommon() && Data.isExternal())
return Data.getCommonAlignment();
uint64_t Res;
if (Data.isCommon() && Data.isExternal())
return Data.getCommonAlignment();
uint64_t Res;
- if (!Layout.getSymbolOffset(
&Data
, Res))
+ if (!Layout.getSymbolOffset(
Sym
, Res))
return 0;
return 0;
- if (Layout.getAssembler().isThumbFunc(&
Data.getSymbol()
))
+ if (Layout.getAssembler().isThumbFunc(&
Sym
))
Res |= 1;
return Res;
Res |= 1;
return Res;
@@
-422,8
+421,8
@@
void ELFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
// The presence of symbol versions causes undefined symbols and
// versions declared with @@@ to be renamed.
// The presence of symbol versions causes undefined symbols and
// versions declared with @@@ to be renamed.
- for (
MCSymbolData &OriginalData
: Asm.symbols()) {
-
const MCSymbol &Alias = OriginalData.getSymbol
();
+ for (
const MCSymbol &Alias
: Asm.symbols()) {
+
MCSymbolData &OriginalData = Alias.getData
();
// Not an alias.
if (!Alias.isVariable())
// Not an alias.
if (!Alias.isVariable())
@@
-494,12
+493,12
@@
static uint8_t mergeTypeForSet(uint8_t origType, uint8_t newType) {
void ELFObjectWriter::WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD,
const MCAsmLayout &Layout) {
void ELFObjectWriter::WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD,
const MCAsmLayout &Layout) {
- MCSymbolData &OrigData =
*MSD.SymbolData
;
+ MCSymbolData &OrigData =
MSD.Symbol->getData()
;
assert((!OrigData.getFragment() ||
(&OrigData.getFragment()->getParent()->getSection() ==
assert((!OrigData.getFragment() ||
(&OrigData.getFragment()->getParent()->getSection() ==
- &
OrigData.getSymbol().
getSection())) &&
+ &
MSD.Symbol->
getSection())) &&
"The symbol's section doesn't match the fragment's symbol");
"The symbol's section doesn't match the fragment's symbol");
- const MCSymbol *Base = Layout.getBaseSymbol(
OrigData.getSymbol()
);
+ const MCSymbol *Base = Layout.getBaseSymbol(
*MSD.Symbol
);
// This has to be in sync with when computeSymbolTable uses SHN_ABS or
// SHN_COMMON.
// This has to be in sync with when computeSymbolTable uses SHN_ABS or
// SHN_COMMON.
@@
-521,7
+520,7
@@
void ELFObjectWriter::WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD,
uint8_t Other = MCELF::getOther(OrigData) << (ELF_STO_Shift - ELF_STV_Shift);
Other |= Visibility;
uint8_t Other = MCELF::getOther(OrigData) << (ELF_STO_Shift - ELF_STV_Shift);
Other |= Visibility;
- uint64_t Value = SymbolValue(
OrigData
, Layout);
+ uint64_t Value = SymbolValue(
*MSD.Symbol
, Layout);
uint64_t Size = 0;
const MCExpr *ESize = OrigData.getSize();
uint64_t Size = 0;
const MCExpr *ESize = OrigData.getSize();
@@
-549,7
+548,7
@@
void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm,
unsigned EntrySize = is64Bit() ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32;
// Symbol table
unsigned EntrySize = is64Bit() ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32;
// Symbol table
-
const
MCSectionELF *SymtabSection =
+ MCSectionELF *SymtabSection =
Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0, EntrySize, "");
MCSectionData &SymtabSD = Asm.getOrCreateSectionData(*SymtabSection);
SymtabSD.setAlignment(is64Bit() ? 8 : 4);
Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0, EntrySize, "");
MCSectionData &SymtabSD = Asm.getOrCreateSectionData(*SymtabSection);
SymtabSD.setAlignment(is64Bit() ? 8 : 4);
@@
-583,7
+582,7
@@
void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm,
for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) {
ELFSymbolData &MSD = ExternalSymbolData[i];
for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) {
ELFSymbolData &MSD = ExternalSymbolData[i];
- MCSymbolData &Data =
*MSD.SymbolData
;
+ MCSymbolData &Data =
MSD.Symbol->getData()
;
assert(((Data.getFlags() & ELF_STB_Global) ||
(Data.getFlags() & ELF_STB_Weak)) &&
"External symbol requires STB_GLOBAL or STB_WEAK flag");
assert(((Data.getFlags() & ELF_STB_Global) ||
(Data.getFlags() & ELF_STB_Weak)) &&
"External symbol requires STB_GLOBAL or STB_WEAK flag");
@@
-594,7
+593,7
@@
void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm,
for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) {
ELFSymbolData &MSD = UndefinedSymbolData[i];
for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) {
ELFSymbolData &MSD = UndefinedSymbolData[i];
- MCSymbolData &Data =
*MSD.SymbolData
;
+ MCSymbolData &Data =
MSD.Symbol->getData()
;
WriteSymbol(Writer, MSD, Layout);
if (MCELF::GetBinding(Data) == ELF::STB_LOCAL)
LastLocalSymbolIndex++;
WriteSymbol(Writer, MSD, Layout);
if (MCELF::GetBinding(Data) == ELF::STB_LOCAL)
LastLocalSymbolIndex++;
@@
-608,7
+607,7
@@
void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm,
return;
SecStart = OS.tell();
return;
SecStart = OS.tell();
-
const
MCSectionELF *SymtabShndxSection =
+ MCSectionELF *SymtabShndxSection =
Ctx.getELFSection(".symtab_shndxr", ELF::SHT_SYMTAB_SHNDX, 0, 4, "");
addToSectionTable(SymtabShndxSection);
MCSectionData *SymtabShndxSD =
Ctx.getELFSection(".symtab_shndxr", ELF::SHT_SYMTAB_SHNDX, 0, 4, "");
addToSectionTable(SymtabShndxSection);
MCSectionData *SymtabShndxSD =
@@
-625,9
+624,10
@@
void ELFObjectWriter::WriteSymbolTable(MCAssembler &Asm,
// allows us to omit some local symbols from the symbol table.
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
const MCSymbolRefExpr *RefA,
// allows us to omit some local symbols from the symbol table.
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
const MCSymbolRefExpr *RefA,
- const MCSymbolData *SD,
- uint64_t C,
+ const MCSymbol *Sym, uint64_t C,
unsigned Type) const {
unsigned Type) const {
+ MCSymbolData *SD = Sym ? &Sym->getData() : nullptr;
+
// A PCRel relocation to an absolute value has no symbol (or section). We
// represent that with a relocation to a null section.
if (!RefA)
// A PCRel relocation to an absolute value has no symbol (or section). We
// represent that with a relocation to a null section.
if (!RefA)
@@
-662,8
+662,8
@@
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
// An undefined symbol is not in any section, so the relocation has to point
// to the symbol itself.
// An undefined symbol is not in any section, so the relocation has to point
// to the symbol itself.
-
const MCSymbol &Sym = SD->getSymbol(
);
- if (Sym
.
isUndefined())
+
assert(Sym && "Expected a symbol"
);
+ if (Sym
->
isUndefined())
return true;
unsigned Binding = MCELF::GetBinding(*SD);
return true;
unsigned Binding = MCELF::GetBinding(*SD);
@@
-690,7
+690,7
@@
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
// If we change such a relocation to use the section, the linker would think
// that it pointed to another string and subtracting 42 at runtime will
// produce the wrong value.
// If we change such a relocation to use the section, the linker would think
// that it pointed to another string and subtracting 42 at runtime will
// produce the wrong value.
- auto &Sec = cast<MCSectionELF>(Sym
.
getSection());
+ auto &Sec = cast<MCSectionELF>(Sym
->
getSection());
unsigned Flags = Sec.getFlags();
if (Flags & ELF::SHF_MERGE) {
if (C != 0)
unsigned Flags = Sec.getFlags();
if (Flags & ELF::SHF_MERGE) {
if (C != 0)
@@
-713,7
+713,7
@@
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
// bit. With a symbol that is done by just having the symbol have that bit
// set, so we would lose the bit if we relocated with the section.
// FIXME: We could use the section but add the bit to the relocation value.
// bit. With a symbol that is done by just having the symbol have that bit
// set, so we would lose the bit if we relocated with the section.
// FIXME: We could use the section but add the bit to the relocation value.
- if (Asm.isThumbFunc(
&
Sym))
+ if (Asm.isThumbFunc(Sym))
return true;
if (TargetObjectWriter->needsRelocateWithSymbol(*SD, Type))
return true;
if (TargetObjectWriter->needsRelocateWithSymbol(*SD, Type))
@@
-783,14
+783,14
@@
void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
// or (A + C - R). If B = R + K and the relocation is not pcrel, we can
// replace B to implement it: (A - R - K + C)
if (IsPCRel)
// or (A + C - R). If B = R + K and the relocation is not pcrel, we can
// replace B to implement it: (A - R - K + C)
if (IsPCRel)
- Asm.getContext().FatalError(
+ Asm.getContext().
report
FatalError(
Fixup.getLoc(),
"No relocation available to represent this relative expression");
const MCSymbol &SymB = RefB->getSymbol();
if (SymB.isUndefined())
Fixup.getLoc(),
"No relocation available to represent this relative expression");
const MCSymbol &SymB = RefB->getSymbol();
if (SymB.isUndefined())
- Asm.getContext().FatalError(
+ Asm.getContext().
report
FatalError(
Fixup.getLoc(),
Twine("symbol '") + SymB.getName() +
"' can not be undefined in a subtraction expression");
Fixup.getLoc(),
Twine("symbol '") + SymB.getName() +
"' can not be undefined in a subtraction expression");
@@
-798,15
+798,14
@@
void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
assert(!SymB.isAbsolute() && "Should have been folded");
const MCSection &SecB = SymB.getSection();
if (&SecB != &FixupSection)
assert(!SymB.isAbsolute() && "Should have been folded");
const MCSection &SecB = SymB.getSection();
if (&SecB != &FixupSection)
- Asm.getContext().FatalError(
+ Asm.getContext().
report
FatalError(
Fixup.getLoc(), "Cannot represent a difference across sections");
Fixup.getLoc(), "Cannot represent a difference across sections");
- const MCSymbolData &SymBD = Asm.getSymbolData(SymB);
- if (::isWeak(SymBD))
- Asm.getContext().FatalError(
+ if (::isWeak(SymB.getData()))
+ Asm.getContext().reportFatalError(
Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol");
Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol");
- uint64_t SymBOffset = Layout.getSymbolOffset(
&SymBD
);
+ uint64_t SymBOffset = Layout.getSymbolOffset(
SymB
);
uint64_t K = SymBOffset - FixupOffset;
IsPCRel = true;
C -= K;
uint64_t K = SymBOffset - FixupOffset;
IsPCRel = true;
C -= K;
@@
-815,12
+814,11
@@
void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
// We either rejected the fixup or folded B into C at this point.
const MCSymbolRefExpr *RefA = Target.getSymA();
const MCSymbol *SymA = RefA ? &RefA->getSymbol() : nullptr;
// We either rejected the fixup or folded B into C at this point.
const MCSymbolRefExpr *RefA = Target.getSymA();
const MCSymbol *SymA = RefA ? &RefA->getSymbol() : nullptr;
- const MCSymbolData *SymAD = SymA ? &Asm.getSymbolData(*SymA) : nullptr;
unsigned Type = GetRelocType(Target, Fixup, IsPCRel);
unsigned Type = GetRelocType(Target, Fixup, IsPCRel);
- bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymA
D
, C, Type);
+ bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymA, C, Type);
if (!RelocateWithSymbol && SymA && !SymA->isUndefined())
if (!RelocateWithSymbol && SymA && !SymA->isUndefined())
- C += Layout.getSymbolOffset(
SymAD
);
+ C += Layout.getSymbolOffset(
*SymA
);
uint64_t Addend = 0;
if (hasRelocationAddend()) {
uint64_t Addend = 0;
if (hasRelocationAddend()) {
@@
-871,9
+869,9
@@
ELFObjectWriter::getSymbolIndexInSymbolTable(const MCAssembler &Asm,
}
bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
}
bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
- const MCSymbol
Data &Data
, bool Used,
+ const MCSymbol
&Symbol
, bool Used,
bool Renamed) {
bool Renamed) {
- const MCSymbol
&Symbol = Data.getSymbol
();
+ const MCSymbol
Data &Data = Symbol.getData
();
if (Symbol.isVariable()) {
const MCExpr *Expr = Symbol.getVariableValue();
if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {
if (Symbol.isVariable()) {
const MCExpr *Expr = Symbol.getVariableValue();
if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {
@@
-907,11
+905,11
@@
bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
return true;
}
return true;
}
-bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) {
+bool ELFObjectWriter::isLocal(const MCSymbol &Symbol, bool isUsedInReloc) {
+ const MCSymbolData &Data = Symbol.getData();
if (Data.isExternal())
return false;
if (Data.isExternal())
return false;
- const MCSymbol &Symbol = Data.getSymbol();
if (Symbol.isDefined())
return true;
if (Symbol.isDefined())
return true;
@@
-929,32
+927,31
@@
void ELFObjectWriter::computeSymbolTable(
// FIXME: Why is an undefined reference to _GLOBAL_OFFSET_TABLE_ needed?
if (NeedsGOT) {
StringRef Name = "_GLOBAL_OFFSET_TABLE_";
// FIXME: Why is an undefined reference to _GLOBAL_OFFSET_TABLE_ needed?
if (NeedsGOT) {
StringRef Name = "_GLOBAL_OFFSET_TABLE_";
- MCSymbol *Sym = Asm.getContext().
G
etOrCreateSymbol(Name);
+ MCSymbol *Sym = Asm.getContext().
g
etOrCreateSymbol(Name);
MCSymbolData &Data = Asm.getOrCreateSymbolData(*Sym);
Data.setExternal(true);
MCELF::SetBinding(Data, ELF::STB_GLOBAL);
}
// Add the data for the symbols.
MCSymbolData &Data = Asm.getOrCreateSymbolData(*Sym);
Data.setExternal(true);
MCELF::SetBinding(Data, ELF::STB_GLOBAL);
}
// Add the data for the symbols.
- for (
MCSymbolData &SD
: Asm.symbols()) {
-
const MCSymbol &Symbol = SD.getSymbol
();
+ for (
const MCSymbol &Symbol
: Asm.symbols()) {
+
MCSymbolData &SD = Symbol.getData
();
bool Used = UsedInReloc.count(&Symbol);
bool WeakrefUsed = WeakrefUsedInReloc.count(&Symbol);
bool isSignature = RevGroupMap.count(&Symbol);
bool Used = UsedInReloc.count(&Symbol);
bool WeakrefUsed = WeakrefUsedInReloc.count(&Symbol);
bool isSignature = RevGroupMap.count(&Symbol);
- if (!isInSymtab(Layout, SD,
- Used || WeakrefUsed || isSignature,
+ if (!isInSymtab(Layout, Symbol, Used || WeakrefUsed || isSignature,
Renames.count(&Symbol)))
continue;
ELFSymbolData MSD;
Renames.count(&Symbol)))
continue;
ELFSymbolData MSD;
- MSD.Symbol
Data = &SD
;
+ MSD.Symbol
= &Symbol
;
const MCSymbol *BaseSymbol = Layout.getBaseSymbol(Symbol);
// Undefined symbols are global, but this is the first place we
// are able to set it.
const MCSymbol *BaseSymbol = Layout.getBaseSymbol(Symbol);
// Undefined symbols are global, but this is the first place we
// are able to set it.
- bool Local = isLocal(S
D
, Used);
+ bool Local = isLocal(S
ymbol
, Used);
if (!Local && MCELF::GetBinding(SD) == ELF::STB_LOCAL) {
assert(BaseSymbol);
MCSymbolData &BaseData = Asm.getSymbolData(*BaseSymbol);
if (!Local && MCELF::GetBinding(SD) == ELF::STB_LOCAL) {
assert(BaseSymbol);
MCSymbolData &BaseData = Asm.getSymbolData(*BaseSymbol);
@@
-1041,7
+1038,7
@@
void ELFObjectWriter::computeSymbolTable(
FileSymbolData.push_back(StrTabBuilder.getOffset(*i));
for (ELFSymbolData &MSD : LocalSymbolData)
FileSymbolData.push_back(StrTabBuilder.getOffset(*i));
for (ELFSymbolData &MSD : LocalSymbolData)
- MSD.StringIndex = MCELF::GetType(
*MSD.SymbolData
) == ELF::STT_SECTION
+ MSD.StringIndex = MCELF::GetType(
MSD.Symbol->getData()
) == ELF::STT_SECTION
? 0
: StrTabBuilder.getOffset(MSD.Name);
for (ELFSymbolData &MSD : ExternalSymbolData)
? 0
: StrTabBuilder.getOffset(MSD.Name);
for (ELFSymbolData &MSD : ExternalSymbolData)
@@
-1058,15
+1055,15
@@
void ELFObjectWriter::computeSymbolTable(
// symbols with non-local bindings.
unsigned Index = FileSymbolData.size() + 1;
for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
// symbols with non-local bindings.
unsigned Index = FileSymbolData.size() + 1;
for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i)
- LocalSymbolData[i].Symbol
Data->
setIndex(Index++);
+ LocalSymbolData[i].Symbol
->getData().
setIndex(Index++);
for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i)
- ExternalSymbolData[i].Symbol
Data->
setIndex(Index++);
+ ExternalSymbolData[i].Symbol
->getData().
setIndex(Index++);
for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
- UndefinedSymbolData[i].Symbol
Data->
setIndex(Index++);
+ UndefinedSymbolData[i].Symbol
->getData().
setIndex(Index++);
}
}
-
const
MCSectionELF *
+MCSectionELF *
ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
const MCSectionELF &Sec) {
if (Relocations[&Sec].empty())
ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
const MCSectionELF &Sec) {
if (Relocations[&Sec].empty())
@@
-1087,7
+1084,7
@@
ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
if (Sec.getFlags() & ELF::SHF_GROUP)
Flags = ELF::SHF_GROUP;
if (Sec.getFlags() & ELF::SHF_GROUP)
Flags = ELF::SHF_GROUP;
-
const
MCSectionELF *RelaSection = Ctx.createELFRelSection(
+ MCSectionELF *RelaSection = Ctx.createELFRelSection(
RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL,
Flags, EntrySize, Sec.getGroup(), &Sec);
MCSectionData &RelSD = Asm.getOrCreateSectionData(*RelaSection);
RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL,
Flags, EntrySize, Sec.getGroup(), &Sec);
MCSectionData &RelSD = Asm.getOrCreateSectionData(*RelaSection);
@@
-1143,8
+1140,7
@@
prependCompressionHeader(uint64_t Size,
void ELFObjectWriter::writeSectionData(const MCAssembler &Asm,
const MCSectionData &SD,
const MCAsmLayout &Layout) {
void ELFObjectWriter::writeSectionData(const MCAssembler &Asm,
const MCSectionData &SD,
const MCAsmLayout &Layout) {
- const MCSectionELF &Section =
- static_cast<const MCSectionELF &>(SD.getSection());
+ MCSectionELF &Section = static_cast<MCSectionELF &>(SD.getSection());
StringRef SectionName = Section.getSectionName();
// Compressing debug_frame requires handling alignment fragments which is
StringRef SectionName = Section.getSectionName();
// Compressing debug_frame requires handling alignment fragments which is
@@
-1247,7
+1243,7
@@
const MCSectionELF *ELFObjectWriter::createSectionHeaderStringTable() {
}
const MCSectionELF *ELFObjectWriter::createStringTable(MCContext &Ctx) {
}
const MCSectionELF *ELFObjectWriter::createStringTable(MCContext &Ctx) {
-
const
MCSectionELF *StrtabSection =
+ MCSectionELF *StrtabSection =
Ctx.getELFSection(".strtab", ELF::SHT_STRTAB, 0);
StringTableIndex = addToSectionTable(StrtabSection);
OS << StrTabBuilder.data();
Ctx.getELFSection(".strtab", ELF::SHT_STRTAB, 0);
StringTableIndex = addToSectionTable(StrtabSection);
OS << StrTabBuilder.data();
@@
-1258,7
+1254,6
@@
void ELFObjectWriter::writeSection(MCAssembler &Asm,
const SectionIndexMapTy &SectionIndexMap,
uint32_t GroupSymbolIndex,
uint64_t Offset, uint64_t Size,
const SectionIndexMapTy &SectionIndexMap,
uint32_t GroupSymbolIndex,
uint64_t Offset, uint64_t Size,
- uint64_t Alignment,
const MCSectionELF &Section) {
uint64_t sh_link = 0;
uint64_t sh_info = 0;
const MCSectionELF &Section) {
uint64_t sh_link = 0;
uint64_t sh_info = 0;
@@
-1301,9
+1296,9
@@
void ELFObjectWriter::writeSection(MCAssembler &Asm,
sh_link = SectionIndexMap.lookup(Section.getAssociatedSection());
WriteSecHdrEntry(ShStrTabBuilder.getOffset(Section.getSectionName()),
sh_link = SectionIndexMap.lookup(Section.getAssociatedSection());
WriteSecHdrEntry(ShStrTabBuilder.getOffset(Section.getSectionName()),
- Section.getType(),
-
Section.getFlags(), 0, Offset, Size, sh_link, sh_info
,
-
Alignment,
Section.getEntrySize());
+ Section.getType(),
Section.getFlags(), 0, Offset, Size,
+
sh_link, sh_info, Section.getAlignment()
,
+ Section.getEntrySize());
}
void ELFObjectWriter::writeSectionHeader(
}
void ELFObjectWriter::writeSectionHeader(
@@
-1317,7
+1312,7
@@
void ELFObjectWriter::writeSectionHeader(
(NumSections + 1) >= ELF::SHN_LORESERVE ? NumSections + 1 : 0;
WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, 0, 0, 0, 0);
(NumSections + 1) >= ELF::SHN_LORESERVE ? NumSections + 1 : 0;
WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, 0, 0, 0, 0);
- for (
const
MCSectionELF *Section : SectionTable) {
+ for (MCSectionELF *Section : SectionTable) {
const MCSectionData &SD = Asm.getOrCreateSectionData(*Section);
uint32_t GroupSymbolIndex;
unsigned Type = Section->getType();
const MCSectionData &SD = Asm.getOrCreateSectionData(*Section);
uint32_t GroupSymbolIndex;
unsigned Type = Section->getType();
@@
-1332,14
+1327,14
@@
void ELFObjectWriter::writeSectionHeader(
: Offsets.second - Offsets.first;
writeSection(Asm, SectionIndexMap, GroupSymbolIndex, Offsets.first, Size,
: Offsets.second - Offsets.first;
writeSection(Asm, SectionIndexMap, GroupSymbolIndex, Offsets.first, Size,
-
SD.getAlignment(),
*Section);
+ *Section);
}
}
void ELFObjectWriter::WriteObject(MCAssembler &Asm,
const MCAsmLayout &Layout) {
MCContext &Ctx = Asm.getContext();
}
}
void ELFObjectWriter::WriteObject(MCAssembler &Asm,
const MCAsmLayout &Layout) {
MCContext &Ctx = Asm.getContext();
-
const
MCSectionELF *ShstrtabSection =
+ MCSectionELF *ShstrtabSection =
Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0);
ShstrtabIndex = addToSectionTable(ShstrtabSection);
Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0);
ShstrtabIndex = addToSectionTable(ShstrtabSection);
@@
-1355,8
+1350,7
@@
void ELFObjectWriter::WriteObject(MCAssembler &Asm,
SectionOffsetsTy SectionOffsets;
bool ComputedSymtab = false;
for (const MCSectionData &SD : Asm) {
SectionOffsetsTy SectionOffsets;
bool ComputedSymtab = false;
for (const MCSectionData &SD : Asm) {
- const MCSectionELF &Section =
- static_cast<const MCSectionELF &>(SD.getSection());
+ MCSectionELF &Section = static_cast<MCSectionELF &>(SD.getSection());
uint64_t Padding = OffsetToAlignment(OS.tell(), SD.getAlignment());
WriteZeros(Padding);
uint64_t Padding = OffsetToAlignment(OS.tell(), SD.getAlignment());
WriteZeros(Padding);
@@
-1390,13
+1384,13
@@
void ELFObjectWriter::WriteObject(MCAssembler &Asm,
if (Type == ELF::SHT_GROUP || Type == ELF::SHT_REL || Type == ELF::SHT_RELA)
continue;
if (Type == ELF::SHT_GROUP || Type == ELF::SHT_REL || Type == ELF::SHT_RELA)
continue;
-
const
MCSectionELF *RelSection = createRelocationSection(Asm, Section);
+ MCSectionELF *RelSection = createRelocationSection(Asm, Section);
if (SignatureSymbol) {
Asm.getOrCreateSymbolData(*SignatureSymbol);
unsigned &GroupIdx = RevGroupMap[SignatureSymbol];
if (!GroupIdx) {
if (SignatureSymbol) {
Asm.getOrCreateSymbolData(*SignatureSymbol);
unsigned &GroupIdx = RevGroupMap[SignatureSymbol];
if (!GroupIdx) {
-
const
MCSectionELF *Group = Ctx.createELFGroupSection(SignatureSymbol);
+ MCSectionELF *Group = Ctx.createELFGroupSection(SignatureSymbol);
GroupIdx = addToSectionTable(Group);
MCSectionData *GroupD = &Asm.getOrCreateSectionData(*Group);
GroupD->setAlignment(4);
GroupIdx = addToSectionTable(Group);
MCSectionData *GroupD = &Asm.getOrCreateSectionData(*Group);
GroupD->setAlignment(4);
@@
-1469,18
+1463,19
@@
void ELFObjectWriter::WriteObject(MCAssembler &Asm,
}
bool ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
}
bool ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
- const MCAssembler &Asm, const MCSymbol
Data &Data
A, const MCFragment &FB,
+ const MCAssembler &Asm, const MCSymbol
&Sym
A, const MCFragment &FB,
bool InSet, bool IsPCRel) const {
if (IsPCRel) {
assert(!InSet);
bool InSet, bool IsPCRel) const {
if (IsPCRel) {
assert(!InSet);
- if (::isWeak(
DataA
))
+ if (::isWeak(
SymA.getData()
))
return false;
}
return false;
}
- return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(Asm,
Data
A, FB,
+ return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(Asm,
Sym
A, FB,
InSet, IsPCRel);
}
InSet, IsPCRel);
}
-bool ELFObjectWriter::isWeak(const MCSymbolData &SD) const {
+bool ELFObjectWriter::isWeak(const MCSymbol &Sym) const {
+ const MCSymbolData &SD = Sym.getData();
if (::isWeak(SD))
return true;
if (::isWeak(SD))
return true;
@@
-1493,7
+1488,6
@@
bool ELFObjectWriter::isWeak(const MCSymbolData &SD) const {
if (MCELF::GetBinding(SD) != ELF::STB_GLOBAL)
return false;
if (MCELF::GetBinding(SD) != ELF::STB_GLOBAL)
return false;
- const MCSymbol &Sym = SD.getSymbol();
if (!Sym.isInSection())
return false;
if (!Sym.isInSection())
return false;