Skip to content

Commit

Permalink
[lld][MachO] Make emitEndFunStab independent from .subsections_via_sy…
Browse files Browse the repository at this point in the history
…mbols

This diff addresses FIXME in SyntheticSections.cpp and removes
the dependency of emitEndFunStab on .subsections_via_symbols.

Test plan: make check-lld-macho

Differential revision: https://reviews.llvm.org/D99054
  • Loading branch information
Alexander Shaposhnikov committed Apr 2, 2021
1 parent 7af9b03 commit f6ad045
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 26 deletions.
1 change: 1 addition & 0 deletions lld/MachO/Driver.cpp
Expand Up @@ -531,6 +531,7 @@ static void replaceCommonSymbols() {
inputSections.push_back(isec);

replaceSymbol<Defined>(sym, sym->getName(), isec->file, isec, /*value=*/0,
/*size=*/0,
/*isWeakDef=*/false,
/*isExternal=*/true, common->privateExtern);
}
Expand Down
29 changes: 20 additions & 9 deletions lld/MachO/InputFiles.cpp
Expand Up @@ -332,7 +332,7 @@ void ObjFile::parseRelocations(const section_64 &sec,

static macho::Symbol *createDefined(const structs::nlist_64 &sym,
StringRef name, InputSection *isec,
uint64_t value) {
uint64_t value, uint64_t size) {
// Symbol scope is determined by sym.n_type & (N_EXT | N_PEXT):
// N_EXT: Global symbols
// N_EXT | N_PEXT: Linkage unit (think: dylib) scoped
Expand All @@ -342,10 +342,11 @@ static macho::Symbol *createDefined(const structs::nlist_64 &sym,

if (sym.n_type & (N_EXT | N_PEXT)) {
assert((sym.n_type & N_EXT) && "invalid input");
return symtab->addDefined(name, isec->file, isec, value,
return symtab->addDefined(name, isec->file, isec, value, size,
sym.n_desc & N_WEAK_DEF, sym.n_type & N_PEXT);
}
return make<Defined>(name, isec->file, isec, value, sym.n_desc & N_WEAK_DEF,
return make<Defined>(name, isec->file, isec, value, size,
sym.n_desc & N_WEAK_DEF,
/*isExternal=*/false, /*isPrivateExtern=*/false);
}

Expand Down Expand Up @@ -381,10 +382,11 @@ static macho::Symbol *createAbsolute(const structs::nlist_64 &sym,
InputFile *file, StringRef name) {
if (sym.n_type & (N_EXT | N_PEXT)) {
assert((sym.n_type & N_EXT) && "invalid input");
return symtab->addDefined(name, file, nullptr, sym.n_value,
return symtab->addDefined(name, file, nullptr, sym.n_value, /*size=*/0,
/*isWeakDef=*/false, sym.n_type & N_PEXT);
}
return make<Defined>(name, file, nullptr, sym.n_value, /*isWeakDef=*/false,
return make<Defined>(name, file, nullptr, sym.n_value, /*size=*/0,
/*isWeakDef=*/false,
/*isExternal=*/false, /*isPrivateExtern=*/false);
}

Expand Down Expand Up @@ -477,16 +479,25 @@ void ObjFile::parseSymbols(ArrayRef<structs::nlist_64> nList,

uint64_t offset = sym.n_value - sec.addr;

auto it = llvm::upper_bound(
subsecMap, offset, [](int64_t value, SubsectionEntry subsectionEntry) {
return value < subsectionEntry.offset;
});
uint32_t size = it != subsecMap.end()
? it->offset - offset
: subsecMap.front().isec->getSize() - offset;

// If the input file does not use subsections-via-symbols, all symbols can
// use the same subsection. Otherwise, we must split the sections along
// symbol boundaries.
if (!subsectionsViaSymbols) {
symbols[i] = createDefined(sym, name, subsecMap.front().isec, offset);
symbols[i] =
createDefined(sym, name, subsecMap.front().isec, offset, size);
continue;
}

InputSection *subsec = findContainingSubsection(subsecMap, &offset);
symbols[i] = createDefined(sym, name, subsec, offset);
InputSection *subsec = (--it)->isec;
symbols[i] = createDefined(sym, name, subsec, offset - it->offset, size);
}

if (!subsectionsViaSymbols)
Expand Down Expand Up @@ -864,7 +875,7 @@ static macho::Symbol *createBitcodeSymbol(const lto::InputFile::Symbol &objSym,
}

return symtab->addDefined(name, &file, /*isec=*/nullptr, /*value=*/0,
objSym.isWeak(), isPrivateExtern);
/*size=*/0, objSym.isWeak(), isPrivateExtern);
}

BitcodeFile::BitcodeFile(MemoryBufferRef mbref)
Expand Down
9 changes: 5 additions & 4 deletions lld/MachO/SymbolTable.cpp
Expand Up @@ -38,8 +38,9 @@ std::pair<Symbol *, bool> SymbolTable::insert(StringRef name) {
}

Defined *SymbolTable::addDefined(StringRef name, InputFile *file,
InputSection *isec, uint32_t value,
bool isWeakDef, bool isPrivateExtern) {
InputSection *isec, uint64_t value,
uint64_t size, bool isWeakDef,
bool isPrivateExtern) {
Symbol *s;
bool wasInserted;
bool overridesWeakDef = false;
Expand All @@ -66,7 +67,7 @@ Defined *SymbolTable::addDefined(StringRef name, InputFile *file,
}

Defined *defined =
replaceSymbol<Defined>(s, name, file, isec, value, isWeakDef,
replaceSymbol<Defined>(s, name, file, isec, value, size, isWeakDef,
/*isExternal=*/true, isPrivateExtern);
defined->overridesWeakDef = overridesWeakDef;
return defined;
Expand Down Expand Up @@ -160,7 +161,7 @@ Symbol *SymbolTable::addLazy(StringRef name, ArchiveFile *file,
Defined *SymbolTable::addSynthetic(StringRef name, InputSection *isec,
uint32_t value, bool isPrivateExtern,
bool includeInSymtab) {
Defined *s = addDefined(name, nullptr, isec, value,
Defined *s = addDefined(name, nullptr, isec, value, /*size*/ 0,
/*isWeakDef=*/false, isPrivateExtern);
s->includeInSymtab = includeInSymtab;
return s;
Expand Down
3 changes: 2 additions & 1 deletion lld/MachO/SymbolTable.h
Expand Up @@ -38,7 +38,8 @@ class Undefined;
class SymbolTable {
public:
Defined *addDefined(StringRef name, InputFile *, InputSection *,
uint32_t value, bool isWeakDef, bool isPrivateExtern);
uint64_t value, uint64_t size, bool isWeakDef,
bool isPrivateExtern);

Symbol *addUndefined(StringRef name, InputFile *, bool isWeakRef);

Expand Down
9 changes: 5 additions & 4 deletions lld/MachO/Symbols.h
Expand Up @@ -95,9 +95,9 @@ class Symbol {

class Defined : public Symbol {
public:
Defined(StringRefZ name, InputFile *file, InputSection *isec, uint32_t value,
bool isWeakDef, bool isExternal, bool isPrivateExtern)
: Symbol(DefinedKind, name, file), isec(isec), value(value),
Defined(StringRefZ name, InputFile *file, InputSection *isec, uint64_t value,
uint64_t size, bool isWeakDef, bool isExternal, bool isPrivateExtern)
: Symbol(DefinedKind, name, file), isec(isec), value(value), size(size),
overridesWeakDef(false), privateExtern(isPrivateExtern),
includeInSymtab(true), weakDef(isWeakDef), external(isExternal) {}

Expand All @@ -119,7 +119,8 @@ class Defined : public Symbol {

InputFile *file;
InputSection *isec;
uint32_t value;
uint64_t value;
uint64_t size;

bool overridesWeakDef : 1;
// Whether this symbol should appear in the output binary's export trie.
Expand Down
11 changes: 5 additions & 6 deletions lld/MachO/SyntheticSections.cpp
Expand Up @@ -454,9 +454,10 @@ void StubHelperSection::setup() {
in.got->addEntry(stubBinder);

inputSections.push_back(in.imageLoaderCache);
dyldPrivate = make<Defined>("__dyld_private", nullptr, in.imageLoaderCache, 0,
/*isWeakDef=*/false,
/*isExternal=*/false, /*isPrivateExtern=*/false);
dyldPrivate =
make<Defined>("__dyld_private", nullptr, in.imageLoaderCache, 0, 0,
/*isWeakDef=*/false,
/*isExternal=*/false, /*isPrivateExtern=*/false);
}

ImageLoaderCacheSection::ImageLoaderCacheSection() {
Expand Down Expand Up @@ -663,9 +664,7 @@ void SymtabSection::emitObjectFileStab(ObjFile *file) {

void SymtabSection::emitEndFunStab(Defined *defined) {
StabsEntry stab(N_FUN);
// FIXME this should be the size of the symbol. Using the section size in
// lieu is only correct if .subsections_via_symbols is set.
stab.value = defined->isec->getSize();
stab.value = defined->size;
stabs.emplace_back(std::move(stab));
}

Expand Down
4 changes: 2 additions & 2 deletions lld/MachO/UnwindInfoSection.cpp
Expand Up @@ -148,8 +148,8 @@ void macho::prepareCompactUnwind(InputSection *isec) {
// symbols for them in the GOT.
Symbol *&s = personalityTable[{referentIsec, r.addend}];
if (s == nullptr) {
s = make<Defined>("<internal>", nullptr, referentIsec, r.addend, false,
false, false);
s = make<Defined>("<internal>", nullptr, referentIsec, r.addend, 0,
false, false, false);
in.got->addEntry(s);
}
r.referent = s;
Expand Down

0 comments on commit f6ad045

Please sign in to comment.