COFF: Split ObjectFile::createSymbolBody into small functions. NFC.

llvm-svn: 241011
This commit is contained in:
Rui Ueyama 2015-06-29 22:16:21 +00:00
parent aef3659e18
commit dae1661436
2 changed files with 28 additions and 15 deletions

View File

@ -168,7 +168,14 @@ std::error_code ObjectFile::initializeSymbols() {
AuxP = COFFObj->getSymbol(I + 1)->getRawPtr(); AuxP = COFFObj->getSymbol(I + 1)->getRawPtr();
bool IsFirst = (LastSectionNumber != Sym.getSectionNumber()); bool IsFirst = (LastSectionNumber != Sym.getSectionNumber());
SymbolBody *Body = createSymbolBody(Sym, AuxP, IsFirst); SymbolBody *Body = nullptr;
if (Sym.isUndefined()) {
Body = createUndefined(Sym);
} else if (Sym.isWeakExternal()) {
Body = createWeakExternal(Sym, AuxP);
} else {
Body = createDefined(Sym, AuxP, IsFirst);
}
if (Body) { if (Body) {
SymbolBodies.push_back(Body); SymbolBodies.push_back(Body);
SparseSymbolBodies[I] = Body; SparseSymbolBodies[I] = Body;
@ -179,13 +186,22 @@ std::error_code ObjectFile::initializeSymbols() {
return std::error_code(); return std::error_code();
} }
SymbolBody *ObjectFile::createSymbolBody(COFFSymbolRef Sym, const void *AuxP, Undefined *ObjectFile::createUndefined(COFFSymbolRef Sym) {
bool IsFirst) {
StringRef Name; StringRef Name;
if (Sym.isUndefined()) {
COFFObj->getSymbolName(Sym, Name); COFFObj->getSymbolName(Sym, Name);
return new (Alloc) Undefined(Name); return new (Alloc) Undefined(Name);
} }
Undefined *ObjectFile::createWeakExternal(COFFSymbolRef Sym, const void *AuxP) {
StringRef Name;
COFFObj->getSymbolName(Sym, Name);
auto *Aux = (const coff_aux_weak_external *)AuxP;
return new (Alloc) Undefined(Name, &SparseSymbolBodies[Aux->TagIndex]);
}
Defined *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
bool IsFirst) {
StringRef Name;
if (Sym.isCommon()) { if (Sym.isCommon()) {
auto *C = new (Alloc) CommonChunk(Sym); auto *C = new (Alloc) CommonChunk(Sym);
Chunks.push_back(C); Chunks.push_back(C);
@ -200,12 +216,6 @@ SymbolBody *ObjectFile::createSymbolBody(COFFSymbolRef Sym, const void *AuxP,
} }
if (Sym.getSectionNumber() == llvm::COFF::IMAGE_SYM_DEBUG) if (Sym.getSectionNumber() == llvm::COFF::IMAGE_SYM_DEBUG)
return nullptr; return nullptr;
// TODO: Handle IMAGE_WEAK_EXTERN_SEARCH_ALIAS
if (Sym.isWeakExternal()) {
COFFObj->getSymbolName(Sym, Name);
auto *Aux = (const coff_aux_weak_external *)AuxP;
return new (Alloc) Undefined(Name, &SparseSymbolBodies[Aux->TagIndex]);
}
// Nothing else to do without a section chunk. // Nothing else to do without a section chunk.
auto *SC = cast_or_null<SectionChunk>(SparseChunks[Sym.getSectionNumber()]); auto *SC = cast_or_null<SectionChunk>(SparseChunks[Sym.getSectionNumber()]);

View File

@ -29,7 +29,9 @@ using llvm::object::COFFObjectFile;
using llvm::object::COFFSymbolRef; using llvm::object::COFFSymbolRef;
class Chunk; class Chunk;
class Defined;
class SymbolBody; class SymbolBody;
class Undefined;
// The root class of input files. // The root class of input files.
class InputFile { class InputFile {
@ -114,8 +116,9 @@ private:
std::error_code initializeChunks(); std::error_code initializeChunks();
std::error_code initializeSymbols(); std::error_code initializeSymbols();
SymbolBody *createSymbolBody(COFFSymbolRef Sym, const void *Aux, Defined *createDefined(COFFSymbolRef Sym, const void *Aux, bool IsFirst);
bool IsFirst); Undefined *createUndefined(COFFSymbolRef Sym);
Undefined *createWeakExternal(COFFSymbolRef Sym, const void *Aux);
std::unique_ptr<COFFObjectFile> COFFObj; std::unique_ptr<COFFObjectFile> COFFObj;
llvm::BumpPtrAllocator Alloc; llvm::BumpPtrAllocator Alloc;