[PATCH] D46970: [WebAssembly] MC: Ensure that FUNCTION_OFFSET relocations are always against function symbols.

Sam Clegg via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 16 11:51:06 PDT 2018


sbc100 created this revision.
Herald added subscribers: llvm-commits, sunfish, aheejin, jgravelle-google, dschuff.

Repository:
  rL LLVM

https://reviews.llvm.org/D46970

Files:
  lib/MC/WasmObjectWriter.cpp
  test/MC/WebAssembly/debug-info.ll


Index: test/MC/WebAssembly/debug-info.ll
===================================================================
--- test/MC/WebAssembly/debug-info.ll
+++ test/MC/WebAssembly/debug-info.ll
@@ -204,6 +204,13 @@
 ; CHECK-NEXT:  }
 ; CHECK-NEXT:]
 
+; generated from the following C code using: clang --target=wasm32 -g -O0 -S -emit-llvm test.c
+; extern int myextern;
+; void f2(void) { return; }
+;
+; int* foo = &myextern;
+; void (*ptr2)(void) = f2;
+
 target triple = "wasm32-unknown-unknown"
 
 source_filename = "test.c"
@@ -226,7 +233,7 @@
 
 !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
 !1 = distinct !DIGlobalVariable(name: "foo", scope: !2, file: !3, line: 4, type: !11, isLocal: false, isDefinition: true)
-!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 6.0.0 (trunk 315924) (llvm/trunk 315960)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 7.0.0 (trunk 332303) (llvm/trunk 332406)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
 !3 = !DIFile(filename: "test.c", directory: "/usr/local/google/home/sbc/dev/wasm/simple")
 !4 = !{}
 !5 = !{!0, !6}
@@ -240,6 +247,6 @@
 !13 = !{i32 2, !"Dwarf Version", i32 4}
 !14 = !{i32 2, !"Debug Info Version", i32 3}
 !15 = !{i32 1, !"wchar_size", i32 4}
-!16 = !{!"clang version 6.0.0 (trunk 315924) (llvm/trunk 315960)"}
+!16 = !{!"clang version 7.0.0 (trunk 332303) (llvm/trunk 332406)"}
 !17 = distinct !DISubprogram(name: "f2", scope: !3, file: !3, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !2, retainedNodes: !4)
-!18 = !DILocation(line: 2, column: 16, scope: !17)
+!18 = !DILocation(line: 2, column: 17, scope: !17)
Index: lib/MC/WasmObjectWriter.cpp
===================================================================
--- lib/MC/WasmObjectWriter.cpp
+++ lib/MC/WasmObjectWriter.cpp
@@ -225,6 +225,9 @@
   DenseMap<const MCSectionWasm *, std::vector<WasmRelocationEntry>>
       CustomSectionsRelocations;
 
+  // Map from section to fintining function.
+  DenseMap<const MCSection *, const MCSymbol *> SectionFunctions;
+
   DenseMap<WasmFunctionType, int32_t, WasmFunctionTypeDenseMapInfo>
       FunctionTypeIndices;
   SmallVector<WasmFunctionType, 4> FunctionTypes;
@@ -265,6 +268,7 @@
     FunctionTypes.clear();
     Globals.clear();
     DataSegments.clear();
+    SectionFunctions.clear();
     MCObjectWriter::reset();
     NumFunctionImports = 0;
     NumGlobalImports = 0;
@@ -383,6 +387,18 @@
 
 void WasmObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
                                                 const MCAsmLayout &Layout) {
+  // Build a map of sections to the function that defines them, for use
+  // in recordRelocation.
+  for (const MCSymbol &S : Asm.symbols()) {
+    const auto &WS = static_cast<const MCSymbolWasm &>(S);
+    if (WS.isFunction()) {
+      const auto &Sec = static_cast<const MCSectionWasm &>(S.getSection());
+      auto Pair = SectionFunctions.insert(std::make_pair(&Sec, &S));
+      if (!Pair.second)
+        report_fatal_error("section already has a defining function: " +
+                           Sec.getSectionName());
+    }
+  }
 }
 
 void WasmObjectWriter::recordRelocation(MCAssembler &Asm,
@@ -468,14 +484,17 @@
   // See: test/MC/WebAssembly/blockaddress.ll
   if (Type == wasm::R_WEBASSEMBLY_FUNCTION_OFFSET_I32 ||
       Type == wasm::R_WEBASSEMBLY_SECTION_OFFSET_I32) {
+    LLVM_DEBUG(dbgs() << "dbgs begin sym: " << *SymA << "\n");
+    LLVM_DEBUG(dbgs() << "isSymbolLinkerVisible: " << Asm.isSymbolLinkerVisible(*SymA) << "\n");
     if (!FixupSection.getKind().isMetadata())
       report_fatal_error("relocations for function or section offsets are "
                          "only supported in metadata sections");
 
     const MCSymbol *SectionSymbol = nullptr;
     const MCSection &SecA = SymA->getSection();
+    LLVM_DEBUG(dbgs() << "isText: " << SecA.getKind().isText() << "\n");
     if (SecA.getKind().isText())
-      SectionSymbol = SecA.begin()->getAtom();
+      SectionSymbol = SectionFunctions.find(&SecA)->second;
     else
       SectionSymbol = SecA.getBeginSymbol();
     if (!SectionSymbol)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46970.147149.patch
Type: text/x-patch
Size: 4352 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180516/f4da6aa8/attachment.bin>


More information about the llvm-commits mailing list