Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-06-30 01:16:21 +0300
committerRui Ueyama <ruiu@google.com>2015-06-30 01:16:21 +0300
commitdae1661436027bd0ee82f40cfae9a5931a50c864 (patch)
tree07763e4c5f15a697d4a712dccd79a21c0a5378f8 /lld/COFF
parentaef3659e1888753ffe03510c513e1a2d9101a795 (diff)
COFF: Split ObjectFile::createSymbolBody into small functions. NFC.
llvm-svn: 241011
Diffstat (limited to 'lld/COFF')
-rw-r--r--lld/COFF/InputFiles.cpp36
-rw-r--r--lld/COFF/InputFiles.h7
2 files changed, 28 insertions, 15 deletions
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<SectionChunk>(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<COFFObjectFile> COFFObj;
llvm::BumpPtrAllocator Alloc;