From dae1661436027bd0ee82f40cfae9a5931a50c864 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 29 Jun 2015 22:16:21 +0000 Subject: COFF: Split ObjectFile::createSymbolBody into small functions. NFC. llvm-svn: 241011 --- lld/COFF/InputFiles.cpp | 36 +++++++++++++++++++++++------------- lld/COFF/InputFiles.h | 7 +++++-- 2 files changed, 28 insertions(+), 15 deletions(-) (limited to 'lld/COFF') diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 5688f505a48d..2022554e26e3 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -168,7 +168,14 @@ std::error_code ObjectFile::initializeSymbols() { AuxP = COFFObj->getSymbol(I + 1)->getRawPtr(); 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) { SymbolBodies.push_back(Body); SparseSymbolBodies[I] = Body; @@ -179,13 +186,22 @@ std::error_code ObjectFile::initializeSymbols() { return std::error_code(); } -SymbolBody *ObjectFile::createSymbolBody(COFFSymbolRef Sym, const void *AuxP, - bool IsFirst) { +Undefined *ObjectFile::createUndefined(COFFSymbolRef Sym) { + StringRef Name; + COFFObj->getSymbolName(Sym, 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.isUndefined()) { - COFFObj->getSymbolName(Sym, Name); - return new (Alloc) Undefined(Name); - } if (Sym.isCommon()) { auto *C = new (Alloc) CommonChunk(Sym); Chunks.push_back(C); @@ -200,12 +216,6 @@ SymbolBody *ObjectFile::createSymbolBody(COFFSymbolRef Sym, const void *AuxP, } if (Sym.getSectionNumber() == llvm::COFF::IMAGE_SYM_DEBUG) 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. auto *SC = cast_or_null(SparseChunks[Sym.getSectionNumber()]); diff --git a/lld/COFF/InputFiles.h b/lld/COFF/InputFiles.h index b0fb80b210c0..16d9834c9a1e 100644 --- a/lld/COFF/InputFiles.h +++ b/lld/COFF/InputFiles.h @@ -29,7 +29,9 @@ using llvm::object::COFFObjectFile; using llvm::object::COFFSymbolRef; class Chunk; +class Defined; class SymbolBody; +class Undefined; // The root class of input files. class InputFile { @@ -114,8 +116,9 @@ private: std::error_code initializeChunks(); std::error_code initializeSymbols(); - SymbolBody *createSymbolBody(COFFSymbolRef Sym, const void *Aux, - bool IsFirst); + Defined *createDefined(COFFSymbolRef Sym, const void *Aux, bool IsFirst); + Undefined *createUndefined(COFFSymbolRef Sym); + Undefined *createWeakExternal(COFFSymbolRef Sym, const void *Aux); std::unique_ptr COFFObj; llvm::BumpPtrAllocator Alloc; -- cgit v1.2.3