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

Phabricator via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 16 13:12:58 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL332517: [WebAssembly] MC: Ensure that FUNCTION_OFFSET relocations are always against… (authored by sbc, committed by ).

Repository:
  rL LLVM

https://reviews.llvm.org/D46970

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


Index: llvm/trunk/test/MC/WebAssembly/debug-info.ll
===================================================================
--- llvm/trunk/test/MC/WebAssembly/debug-info.ll
+++ llvm/trunk/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: llvm/trunk/lib/MC/WasmObjectWriter.cpp
===================================================================
--- llvm/trunk/lib/MC/WasmObjectWriter.cpp
+++ llvm/trunk/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.isDefined() && WS.isFunction() && !WS.isVariable()) {
+      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,
@@ -475,7 +491,7 @@
     const MCSymbol *SectionSymbol = nullptr;
     const MCSection &SecA = SymA->getSection();
     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.147165.patch
Type: text/x-patch
Size: 3864 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180516/5199e102/attachment.bin>


More information about the llvm-commits mailing list