[PATCH] D61800: [WebAssembly] Refactor relocation processing. NFC.
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 10 12:47:40 PDT 2019
sbc100 created this revision.
Herald added subscribers: llvm-commits, sunfish, aheejin, jgravelle-google, dschuff.
Herald added a project: LLVM.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D61800
Files:
lld/wasm/Writer.cpp
Index: lld/wasm/Writer.cpp
===================================================================
--- lld/wasm/Writer.cpp
+++ lld/wasm/Writer.cpp
@@ -1152,35 +1152,38 @@
ObjFile *File = Chunk->File;
ArrayRef<WasmSignature> Types = File->getWasmObj()->types();
for (const WasmRelocation &Reloc : Chunk->getRelocations()) {
+ if (Reloc.Type == R_WASM_TYPE_INDEX_LEB) {
+ // Mark target type as live
+ File->TypeMap[Reloc.Index] = registerType(Types[Reloc.Index]);
+ File->TypeIsUsed[Reloc.Index] = true;
+ continue;
+ }
+
+ // Other relocation types all have a corresponding symbol
+ auto *Sym = File->getSymbols()[Reloc.Index];
switch (Reloc.Type) {
case R_WASM_TABLE_INDEX_I32:
case R_WASM_TABLE_INDEX_SLEB:
case R_WASM_TABLE_INDEX_REL_SLEB: {
- FunctionSymbol *Sym = File->getFunctionSymbol(Reloc.Index);
- if (Sym->hasTableIndex() || !Sym->hasFunctionIndex() || requiresGOTAccess(Sym))
+ auto *F = cast<FunctionSymbol>(Sym);
+ if (F->hasTableIndex() || !F->hasFunctionIndex() || requiresGOTAccess(F))
break;
- Sym->setTableIndex(TableBase + IndirectFunctions.size());
- IndirectFunctions.emplace_back(Sym);
+ F->setTableIndex(TableBase + IndirectFunctions.size());
+ IndirectFunctions.emplace_back(F);
break;
}
case R_WASM_TYPE_INDEX_LEB:
- // Mark target type as live
- File->TypeMap[Reloc.Index] = registerType(Types[Reloc.Index]);
- File->TypeIsUsed[Reloc.Index] = true;
break;
- case R_WASM_GLOBAL_INDEX_LEB: {
- auto* Sym = File->getSymbols()[Reloc.Index];
+ case R_WASM_GLOBAL_INDEX_LEB:
if (!isa<GlobalSymbol>(Sym) && !Sym->isInGOT()) {
Sym->setGOTIndex(NumImportedGlobals++);
GOTSymbols.push_back(Sym);
}
break;
- }
case R_WASM_MEMORY_ADDR_SLEB:
case R_WASM_MEMORY_ADDR_LEB:
- case R_WASM_MEMORY_ADDR_REL_SLEB: {
+ case R_WASM_MEMORY_ADDR_REL_SLEB:
if (!Config->Relocatable) {
- auto* Sym = File->getSymbols()[Reloc.Index];
if (Sym->isUndefined() && !Sym->isWeak()) {
error(toString(File) + ": cannot resolve relocation of type " +
relocTypeToString(Reloc.Type) +
@@ -1189,34 +1192,29 @@
}
break;
}
- }
if (Config->Pic) {
switch (Reloc.Type) {
case R_WASM_TABLE_INDEX_SLEB:
case R_WASM_MEMORY_ADDR_SLEB:
- case R_WASM_MEMORY_ADDR_LEB: {
+ case R_WASM_MEMORY_ADDR_LEB:
// Certain relocation types can't be used when building PIC output, since
// they would require absolute symbol addresses at link time.
- Symbol *Sym = File->getSymbols()[Reloc.Index];
error(toString(File) + ": relocation " +
relocTypeToString(Reloc.Type) + " cannot be used againt symbol " +
toString(*Sym) + "; recompile with -fPIC");
break;
- }
case R_WASM_TABLE_INDEX_I32:
- case R_WASM_MEMORY_ADDR_I32: {
+ case R_WASM_MEMORY_ADDR_I32:
// These relocation types are only present in the data section and
// will be converted into code by `generateRelocationCode`. This code
// requires the symbols to have GOT entires.
- auto* Sym = File->getSymbols()[Reloc.Index];
if (requiresGOTAccess(Sym) && !Sym->isInGOT()) {
Sym->setGOTIndex(NumImportedGlobals++);
GOTSymbols.push_back(Sym);
}
break;
}
- }
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61800.199059.patch
Type: text/x-patch
Size: 3511 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190510/7510044a/attachment.bin>
More information about the llvm-commits
mailing list