[llvm-branch-commits] [llvm] a630217 - [WebAssembly] fix __stack_pointer being added to .debug_aranges
Author: Wouter van Oortmerssen Date: 2021-11-08T15:55:17-08:00 New Revision: a630217313fcd38fa0071206ab832c081d0eac37 URL: https://github.com/llvm/llvm-project/commit/a630217313fcd38fa0071206ab832c081d0eac37 DIFF: https://github.com/llvm/llvm-project/commit/a630217313fcd38fa0071206ab832c081d0eac37.diff LOG: [WebAssembly] fix __stack_pointer being added to .debug_aranges When emitting a reloc for the Wasm global __stack_pointer, it was inadvertedly added to the symbols used for generating aranges, which caused some aranges to use it as the end symbol in a symbol diff, which caused a reloc for it to be emitted, which then caused an assert in `wasm64` since we have no 64-bit relocs for Wasm globals. Fixes: https://bugs.llvm.org/show_bug.cgi?id=52376 Differential Revision: https://reviews.llvm.org/D113438 Added: Modified: llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp llvm/test/MC/WebAssembly/debug-info.ll llvm/test/MC/WebAssembly/debug-info64.ll Removed: diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index b4c27dc86d8d8..f51fb041f5599 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -490,7 +490,6 @@ DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) { addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC); if (!isDwoUnit()) { addLabel(*Loc, dwarf::DW_FORM_data4, SPSym); - DD->addArangeLabel(SymbolCU(this, SPSym)); } else { // FIXME: when writing dwo, we need to avoid relocations. Probably // the "right" solution is to treat globals the way func and data diff --git a/llvm/test/MC/WebAssembly/debug-info.ll b/llvm/test/MC/WebAssembly/debug-info.ll index a4a9ed9ed1936..d2a815f097164 100644 --- a/llvm/test/MC/WebAssembly/debug-info.ll +++ b/llvm/test/MC/WebAssembly/debug-info.ll @@ -1,4 +1,4 @@ -; RUN: llc -filetype=obj %s -o - | llvm-readobj -S -r --symbols - | FileCheck %s +; RUN: llc -generate-arange-section -filetype=obj %s -o - | llvm-readobj -S -r --symbols - | FileCheck %s ; CHECK: Format: WASM ; CHECK-NEXT:Arch: wasm32 @@ -65,68 +65,80 @@ ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) -; CHECK-NEXT:Size: 121 +; CHECK-NEXT:Size: 48 ; CHECK-NEXT:Offset: 406 +; CHECK-NEXT:Name: .debug_aranges +; CHECK-NEXT: } +; CHECK-NEXT: Section { +; CHECK-NEXT:Type: CUSTOM (0x0) +; CHECK-NEXT:Size: 121 +; CHECK-NEXT:Offset: 475 ; CHECK-NEXT:Name: .debug_str ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 42 -; CHECK-NEXT:Offset: 544 +; CHECK-NEXT:Offset: 613 ; CHECK-NEXT:Name: .debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 26 -; CHECK-NEXT:Offset: 608 +; CHECK-NEXT:Offset: 677 ; CHECK-NEXT:Name: .debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 57 -; CHECK-NEXT:Offset: 656 +; CHECK-NEXT:Offset: 725 ; CHECK-NEXT:Name: .debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 91 -; CHECK-NEXT:Offset: 731 +; CHECK-NEXT:Offset: 800 ; CHECK-NEXT:Name: linking ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 9 -; CHECK-NEXT:Offset: 836 +; CHECK-NEXT:Offset: 905 ; CHECK-NEXT:Name: reloc.DATA ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 61 -; CHECK-NEXT:Offset: 862 +; CHECK-NEXT:Offset: 931 ; CHECK-NEXT:Name: reloc..debug_info ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) +; CHECK-NEXT:Size: 18 +; CHECK-NEXT:Offset: 1016 +; CHECK-NEXT:Name: reloc..debug_aranges +; CHECK-NEXT: } +; CHECK-NEXT: Section { +; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 6 -; CHECK-NEXT:Offset: 947 +; CHECK-NEXT:Offset: 1061 ; CHECK-NEXT:Name: reloc..debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 6 -; CHECK-NEXT:Offset: 981 +; CHECK-NEXT:Offset: 1095 ; CHECK-NEXT:Name: reloc..debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 6 -; CHECK-NEXT:Offset: 1015 +; CHECK-NEXT:Offset: 1129 ; CHECK-NEXT:Name: reloc..debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT:Type: CUSTOM (0x0) ; CHECK-NEXT:Size: 77 -; CHECK-NEXT:Offset: 1045 +; CHECK-NEXT:Offset: 1159 ; CHECK-NEXT:Name: producers ; CHECK-NEXT: } ; CHECK-N
[llvm-branch-commits] [lld] 5c38ae3 - [WebAssembly] Fixed byval args missing DWARF DW_AT_LOCATION
Author: Wouter van Oortmerssen Date: 2021-01-07T10:31:38-08:00 New Revision: 5c38ae36c58f5b6bb4a32e9ec2187fde86cf94b8 URL: https://github.com/llvm/llvm-project/commit/5c38ae36c58f5b6bb4a32e9ec2187fde86cf94b8 DIFF: https://github.com/llvm/llvm-project/commit/5c38ae36c58f5b6bb4a32e9ec2187fde86cf94b8.diff LOG: [WebAssembly] Fixed byval args missing DWARF DW_AT_LOCATION A struct in C passed by value did not get debug information. Such values are currently lowered to a Wasm local even in -O0 (not to an alloca like on other archs), which becomes a Target Index operand (TI_LOCAL). The DWARF writing code was not emitting locations in for TI's specifically if the location is a single range (not a list). In addition, the ExplicitLocals pass which removes the ARGUMENT pseudo instructions did not update the associated DBG_VALUEs, and couldn't even find these values since the code assumed such instructions are adjacent, which is not the case here. Also fixed asm printing of TIs needed by a test. Differential Revision: https://reviews.llvm.org/D94140 Added: llvm/test/MC/WebAssembly/debug-byval-struct.ll Modified: lld/test/wasm/debuginfo.test llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp llvm/lib/Target/WebAssembly/WebAssemblyDebugValueManager.cpp llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp llvm/test/CodeGen/WebAssembly/dbgvalue.ll Removed: diff --git a/lld/test/wasm/debuginfo.test b/lld/test/wasm/debuginfo.test index 94d183a3c1d4..9cb1cc31e515 100644 --- a/lld/test/wasm/debuginfo.test +++ b/lld/test/wasm/debuginfo.test @@ -21,6 +21,7 @@ CHECK-NEXT:DW_AT_decl_line(3) CHECK-NEXT:DW_AT_prototyped(true) CHECK: DW_TAG_formal_parameter +CHECK-NEXT: DW_AT_location (DW_OP_WASM_location 0x0 0x0, DW_OP_stack_value) CHECK-NEXT: DW_AT_name("t") CHECK-NEXT: DW_AT_decl_file ("/Users/yury/llvmwasm{{(/|\\)}}hi.c") CHECK-NEXT: DW_AT_decl_line (3) @@ -45,7 +46,7 @@ CHECK-NEXT: DW_AT_name ("hi_foo.c") CHECK: DW_TAG_variable CHECK-NEXT:DW_AT_name ("y") -CHECK-NEXT:DW_AT_type (0x00a7 "int[2]") +CHECK-NEXT:DW_AT_type (0x00ac "int[2]") CHECK-NEXT:DW_AT_external (true) CHECK-NEXT:DW_AT_decl_file ("{{.*}}hi_foo.c") CHECK-NEXT:DW_AT_decl_line (1) @@ -67,7 +68,7 @@ CHECK-NEXT:DW_AT_encoding (DW_ATE_unsigned) CHECK: DW_TAG_variable CHECK-NEXT:DW_AT_name ("z") -CHECK-NEXT:DW_AT_type (0x00a7 "int[2]") +CHECK-NEXT:DW_AT_type (0x00ac "int[2]") CHECK-NEXT:DW_AT_external (true) CHECK-NEXT:DW_AT_decl_file ("{{.*}}hi_foo.c") CHECK-NEXT:DW_AT_decl_line (8) @@ -82,6 +83,7 @@ CHECK-NEXT:DW_AT_decl_file ("{{.*}}hi_foo.c") CHECK-NEXT:DW_AT_decl_line (3) CHECK: DW_TAG_formal_parameter +CHECK-NEXT: DW_AT_location (DW_OP_WASM_location 0x0 0x0, DW_OP_stack_value) CHECK-NEXT: DW_AT_name("p") CHECK-NEXT: DW_AT_decl_file ("{{.*}}hi_foo.c") CHECK-NEXT: DW_AT_decl_line (3) diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 85a5d0c59b83..d72a91825061 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -948,6 +948,8 @@ static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) { } else if (MI->getDebugOperand(0).isTargetIndex()) { auto Op = MI->getDebugOperand(0); OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")"; +// NOTE: Want this comment at start of line, don't emit with AddComment. +AP.OutStreamer->emitRawComment(OS.str()); return true; } else { Register Reg; diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index ea279e4914b0..befc4bba19a2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -720,6 +720,13 @@ DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV, addConstantFPValue(*VariableDie, DVal->getConstantFP()); } else if (DVal->isConstantInt()) { addConstantValue(*VariableDie, DVal->getConstantInt(), DV.getType()); +} else if (DVal->isTargetIndexLocation()) { + DIELoc *Loc = new (DIEValueAllocator) DIELoc; + DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); + const DIBasicType *BT = dyn_cast( +
[llvm-branch-commits] [lld] fd65e48 - [WebAssembly] Fixed Writer::createInitMemoryFunction to work for wasm64
Author: Wouter van Oortmerssen Date: 2020-12-03T16:20:55-08:00 New Revision: fd65e4815cb2019c5e02679ede0c5f6fbd7e19ad URL: https://github.com/llvm/llvm-project/commit/fd65e4815cb2019c5e02679ede0c5f6fbd7e19ad DIFF: https://github.com/llvm/llvm-project/commit/fd65e4815cb2019c5e02679ede0c5f6fbd7e19ad.diff LOG: [WebAssembly] Fixed Writer::createInitMemoryFunction to work for wasm64 Differential Revision: https://reviews.llvm.org/D92348 Added: Modified: lld/test/wasm/data-segment-merging.ll lld/test/wasm/data-segments.ll lld/wasm/Writer.cpp lld/wasm/WriterUtils.cpp lld/wasm/WriterUtils.h Removed: diff --git a/lld/test/wasm/data-segment-merging.ll b/lld/test/wasm/data-segment-merging.ll index a7d2e5552483..bc347d193574 100644 --- a/lld/test/wasm/data-segment-merging.ll +++ b/lld/test/wasm/data-segment-merging.ll @@ -1,5 +1,3 @@ -target triple = "wasm32-unknown-unknown" - @a = hidden global [6 x i8] c"hello\00", align 1 @b = hidden global [8 x i8] c"goodbye\00", align 1 @c = hidden global [9 x i8] c"whatever\00", align 1 @@ -8,8 +6,9 @@ target triple = "wasm32-unknown-unknown" @e = private constant [9 x i8] c"constant\00", align 1 @f = private constant i8 43, align 4 -; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.passive.o -; RUN: llc -filetype=obj %s -o %t.o +; RUN: llc --mtriple=wasm32-unknown-unknown -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.passive.o +; RUN: llc --mtriple=wasm64-unknown-unknown -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.passive64.o +; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.o ; RUN: wasm-ld -no-gc-sections --no-entry -o %t.merged.wasm %t.o ; RUN: obj2yaml %t.merged.wasm | FileCheck %s --check-prefix=MERGE @@ -76,6 +75,8 @@ target triple = "wasm32-unknown-unknown" ; RUN: wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 -o %t.merged.passive.wasm %t.passive.o ; RUN: obj2yaml %t.merged.passive.wasm | FileCheck %s --check-prefix=PASSIVE-MERGE +; RUN: wasm-ld -mwasm64 -no-gc-sections --no-entry --shared-memory --max-memory=131072 -o %t.merged.passive64.wasm %t.passive64.o +; RUN: obj2yaml %t.merged.passive64.wasm | FileCheck %s --check-prefix=PASSIVE-MERGE ; PASSIVE-MERGE-LABEL: - Type:DATACOUNT ; PASSIVE-MERGE-NEXT:Count: 2 @@ -99,6 +100,8 @@ target triple = "wasm32-unknown-unknown" ; RUN: wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 -no-merge-data-segments -o %t.separate.passive.wasm %t.passive.o ; RUN: obj2yaml %t.separate.passive.wasm | FileCheck %s --check-prefix=PASSIVE-SEPARATE +; RUN: wasm-ld -mwasm64 -no-gc-sections --no-entry --shared-memory --max-memory=131072 -no-merge-data-segments -o %t.separate.passive64.wasm %t.passive64.o +; RUN: obj2yaml %t.separate.passive64.wasm | FileCheck %s --check-prefix=PASSIVE-SEPARATE ; PASSIVE-SEPARATE-LABEL: - Type:DATACOUNT ; PASSIVE-SEPARATE-NEXT:Count: 6 diff --git a/lld/test/wasm/data-segments.ll b/lld/test/wasm/data-segments.ll index 835aa31b7ab1..a31fe467e942 100644 --- a/lld/test/wasm/data-segments.ll +++ b/lld/test/wasm/data-segments.ll @@ -1,6 +1,7 @@ -; RUN: llc -filetype=obj %s -o %t.atomics.o -mattr=+atomics -; RUN: llc -filetype=obj %s -o %t.bulk-mem.o -mattr=+bulk-memory -; RUN: llc -filetype=obj %s -o %t.atomics.bulk-mem.o -mattr=+atomics,+bulk-memory +; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.atomics.o -mattr=+atomics +; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.bulk-mem.o -mattr=+bulk-memory +; RUN: llc --mtriple=wasm32-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem.o -mattr=+atomics,+bulk-memory +; RUN: llc --mtriple=wasm64-unknown-unknown -filetype=obj %s -o %t.atomics.bulk-mem64.o -mattr=+atomics,+bulk-memory ; atomics, shared memory => error ; RUN: not wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.o -o %t.atomics.wasm 2>&1 | FileCheck %s --check-prefix ERROR @@ -11,14 +12,16 @@ ; atomics, bulk memory, shared memory => passive segments ; RUN: wasm-ld -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem.o -o %t.atomics.bulk-mem.wasm -; RUN: obj2yaml %t.atomics.bulk-mem.wasm | FileCheck %s --check-prefixes PASSIVE +; RUN: obj2yaml %t.atomics.bulk-mem.wasm | FileCheck %s --check-prefixes PASSIVE,PASSIVE32 + +; Also test with wasm64 +; RUN: wasm-ld -mwasm64 -no-gc-sections --no-entry --shared-memory --max-memory=131072 %t.atomics.bulk-mem64.o -o %t.atomics.bulk-mem64.wasm +; RUN: obj2yaml %t.atomics.bulk-mem64.wasm | FileCheck %s --check-prefixes PASSIVE,PASSIVE64 ; Also test in combination with PIC/pie -; RUN: llc -filetype=obj -relocation-model=pic %s -o %t.atomics.bulk-mem.pic.o -mattr=+atomics,+bulk-memory,+mutable-globals +; RUN: llc --mtriple=wasm32-unknown-unknown