[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 12:05:45 PDT 2018
sbc100 updated this revision to Diff 147151.
sbc100 added a comment.
- revert
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.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.147151.patch
Type: text/x-patch
Size: 3798 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180516/a9e50762/attachment.bin>
More information about the llvm-commits
mailing list