From 4b56adce2093feadbe3edd4c83e0adc49c387d18 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 28 Feb 2018 00:50:54 +0000 Subject: [PATCH] [WebAssembly] Refactor ObjFile::initializeSymbols. The main purpose of this change is to make initializeSymbols shorter. Differential Revision: https://reviews.llvm.org/D43691 llvm-svn: 326285 --- lld/wasm/InputFiles.cpp | 108 +++++++++++++++++----------------------- lld/wasm/InputFiles.h | 5 +- 2 files changed, 47 insertions(+), 66 deletions(-) diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 0095a4d617c2d..2d5c78fffb7ab 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -187,49 +187,57 @@ void ObjFile::initializeSymbols() { // Populate `Symbols` based on the WasmSymbols in the object for (const SymbolRef &Sym : WasmObj->symbols()) { const WasmSymbol &WasmSym = WasmObj->getWasmSymbol(Sym.getRawDataRefImpl()); - bool IsDefined = WasmSym.isDefined(); - - if (IsDefined) { - switch (WasmSym.Info.Kind) { - case WASM_SYMBOL_TYPE_FUNCTION: { - InputFunction *Function = getFunction(WasmSym); - if (isExcludedByComdat(Function)) { - Function->Live = false; - IsDefined = false; - break; - } - Symbols.push_back(createDefinedFunction(WasmSym, Function)); - break; - } - case WASM_SYMBOL_TYPE_DATA: { - InputSegment *Segment = getSegment(WasmSym); - if (isExcludedByComdat(Segment)) { - Segment->Live = false; - IsDefined = false; - break; - } - Symbols.push_back(createDefinedData(WasmSym, Segment, - WasmSym.Info.DataRef.Offset, - WasmSym.Info.DataRef.Size)); - break; - } - case WASM_SYMBOL_TYPE_GLOBAL: - Symbols.push_back(createDefinedGlobal(WasmSym, getGlobal(WasmSym))); - break; - default: - llvm_unreachable("unkown symbol kind"); - break; - } - } - // Either the the symbol itself was undefined, or was excluded via comdat - // in which case this simply insertes the existing symbol into the correct - // slot in the Symbols array. - if (!IsDefined) + if (Symbol *Sym = createDefined(WasmSym)) + Symbols.push_back(Sym); + else Symbols.push_back(createUndefined(WasmSym)); } } +Symbol *ObjFile::createDefined(const WasmSymbol &Sym) { + if (!Sym.isDefined()) + return nullptr; + + switch (Sym.Info.Kind) { + case WASM_SYMBOL_TYPE_FUNCTION: { + InputFunction *Func = getFunction(Sym); + if (isExcludedByComdat(Func)) { + Func->Live = false; + return nullptr; + } + + if (Sym.isBindingLocal()) + return make(Sym.Info.Name, Sym.Info.Flags, this, Func); + return Symtab->addDefinedFunction(Sym.Info.Name, Sym.Info.Flags, this, + Func); + } + case WASM_SYMBOL_TYPE_DATA: { + InputSegment *Seg = getSegment(Sym); + if (isExcludedByComdat(Seg)) { + Seg->Live = false; + return nullptr; + } + + uint32_t Offset = Sym.Info.DataRef.Offset; + uint32_t Size = Sym.Info.DataRef.Size; + + if (Sym.isBindingLocal()) + return make(Sym.Info.Name, Sym.Info.Flags, this, Seg, Offset, + Size); + return Symtab->addDefinedData(Sym.Info.Name, Sym.Info.Flags, this, Seg, + Offset, Size); + } + case WASM_SYMBOL_TYPE_GLOBAL: + if (Sym.isBindingLocal()) + return make(Sym.Info.Name, Sym.Info.Flags, this, + getGlobal(Sym)); + return Symtab->addDefinedGlobal(Sym.Info.Name, Sym.Info.Flags, this, + getGlobal(Sym)); + } + llvm_unreachable("unkown symbol kind"); +} + Symbol *ObjFile::createUndefined(const WasmSymbol &Sym) { StringRef Name = Sym.Info.Name; uint32_t Flags = Sym.Info.Flags; @@ -245,30 +253,6 @@ Symbol *ObjFile::createUndefined(const WasmSymbol &Sym) { llvm_unreachable("unkown symbol kind"); } -Symbol *ObjFile::createDefinedFunction(const WasmSymbol &Sym, - InputFunction *Function) { - if (Sym.isBindingLocal()) - return make(Sym.Info.Name, Sym.Info.Flags, this, Function); - return Symtab->addDefinedFunction(Sym.Info.Name, Sym.Info.Flags, this, - Function); -} - -Symbol *ObjFile::createDefinedData(const WasmSymbol &Sym, InputSegment *Segment, - uint32_t Offset, uint32_t Size) { - if (Sym.isBindingLocal()) - return make(Sym.Info.Name, Sym.Info.Flags, this, Segment, - Offset, Size); - return Symtab->addDefinedData(Sym.Info.Name, Sym.Info.Flags, this, Segment, - Offset, Size); -} - -Symbol *ObjFile::createDefinedGlobal(const WasmSymbol &Sym, - InputGlobal *Global) { - if (Sym.isBindingLocal()) - return make(Sym.Info.Name, Sym.Info.Flags, this, Global); - return Symtab->addDefinedGlobal(Sym.Info.Name, Sym.Info.Flags, this, Global); -} - void ArchiveFile::parse() { // Parse a MemoryBufferRef as an archive file. DEBUG(dbgs() << "Parsing library: " << toString(this) << "\n"); diff --git a/lld/wasm/InputFiles.h b/lld/wasm/InputFiles.h index 6dcd4b54f92bd..9275b1242cfd7 100644 --- a/lld/wasm/InputFiles.h +++ b/lld/wasm/InputFiles.h @@ -111,10 +111,7 @@ class ObjFile : public InputFile { GlobalSymbol *getGlobalSymbol(uint32_t Index) const; private: - Symbol *createDefinedData(const WasmSymbol &Sym, InputSegment *Segment, - uint32_t Offset, uint32_t DataSize); - Symbol *createDefinedFunction(const WasmSymbol &Sym, InputFunction *Function); - Symbol *createDefinedGlobal(const WasmSymbol &Sym, InputGlobal *Global); + Symbol *createDefined(const WasmSymbol &Sym); Symbol *createUndefined(const WasmSymbol &Sym); void initializeSymbols();