[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
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index 0095a4d..2d5c78f 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -187,49 +187,57 @@
// 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<DefinedFunction>(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<DefinedData>(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<DefinedGlobal>(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 @@
llvm_unreachable("unkown symbol kind");
}
-Symbol *ObjFile::createDefinedFunction(const WasmSymbol &Sym,
- InputFunction *Function) {
- if (Sym.isBindingLocal())
- return make<DefinedFunction>(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<DefinedData>(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<DefinedGlobal>(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");