aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/MC
diff options
context:
space:
mode:
authorYuta Saito <kateinoigakukun@gmail.com>2024-02-21 03:35:36 +0900
committerGitHub <noreply@github.com>2024-02-21 03:35:36 +0900
commitba3c1f9ce30cf4f8aee5f1961df74d65e11d53bc (patch)
tree78b965013f5d43f4126f86547cda69deb93a8a3c /llvm/test/MC
parentfb615cf3b9c2d887441a4c0cca326eddc592351a (diff)
downloadllvm-ba3c1f9ce30cf4f8aee5f1961df74d65e11d53bc.zip
llvm-ba3c1f9ce30cf4f8aee5f1961df74d65e11d53bc.tar.gz
llvm-ba3c1f9ce30cf4f8aee5f1961df74d65e11d53bc.tar.bz2
[WebAssembly] Add segment RETAIN flag to support private retained data (#81539)
In WebAssembly, we have `WASM_SYMBOL_NO_STRIP` symbol flag to mark the referenced content as retained. However, the flag is not enough to express retained data that is not referenced by any symbol. This patch adds a new segment flag`WASM_SEG_FLAG_RETAIN` to support "private" linkage data that is retained by llvm.used. This kind of data that is not referenced but must be retained is usually used with encapsulation symbols (__start/__stop). Swift runtime uses this technique and depends on the fact "all metadata sections in live objects are retained", which was not guaranteed with `--gc-sections` before this patch. This is a revised version of https://reviews.llvm.org/D126950 (has been reverted) based on @MaskRay's comments
Diffstat (limited to 'llvm/test/MC')
-rw-r--r--llvm/test/MC/WebAssembly/no-dead-strip.ll76
1 files changed, 62 insertions, 14 deletions
diff --git a/llvm/test/MC/WebAssembly/no-dead-strip.ll b/llvm/test/MC/WebAssembly/no-dead-strip.ll
index 9b550ec..6b3f090 100644
--- a/llvm/test/MC/WebAssembly/no-dead-strip.ll
+++ b/llvm/test/MC/WebAssembly/no-dead-strip.ll
@@ -1,21 +1,69 @@
-; RUN: llc -filetype=obj -wasm-keep-registers %s -o - | llvm-readobj --symbols - | FileCheck %s
+; RUN: llc < %s --mtriple=wasm32-unknown-unknown -filetype=obj -wasm-keep-registers -o - | obj2yaml - | FileCheck %s
-target triple = "wasm32-unknown-unknown"
-
-@llvm.used = appending global [1 x ptr] [ptr @foo], section "llvm.metadata"
+@llvm.used = appending global [5 x ptr] [
+ ptr @foo, ptr @gv0, ptr @gv1, ptr @gv2, ptr @gv3
+], section "llvm.metadata"
define i32 @foo() {
entry:
ret i32 0
}
-; CHECK: Symbols [
-; CHECK-NEXT: Symbol {
-; CHECK-NEXT: Name: foo
-; CHECK-NEXT: Type: FUNCTION (0x0)
-; CHECK-NEXT: Flags [ (0x80)
-; CHECK-NEXT: NO_STRIP (0x80)
-; CHECK-NEXT: ]
-; CHECK-NEXT: ElementIndex: 0x0
-; CHECK-NEXT: }
-; CHECK-NEXT: ]
+; externally visible GV has NO_STRIP/RETAIN in both symtab entry and segment info
+@gv0 = global i32 42
+; internal GV has NO_STRIP/RETAIN in both symtab entry and segment info
+@gv1 = internal global i32 41
+; private GV has RETAIN in segment info only (no symtab entry)
+@gv2 = private global i32 40
+; explicit section names
+@gv3 = global i32 39, section "ddd.hello"
+@gv4.not.used = global i64 38, section "ddd.hello"
+
+; CHECK: SymbolTable:
+; CHECK-NEXT: - Index: 0
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Name: foo
+; CHECK-NEXT: Flags: [ NO_STRIP ]
+; CHECK-NEXT: Function: 0
+; CHECK-NEXT: - Index: 1
+; CHECK-NEXT: Kind: DATA
+; CHECK-NEXT: Name: gv0
+; CHECK-NEXT: Flags: [ NO_STRIP ]
+; CHECK-NEXT: Segment: 0
+; CHECK-NEXT: Size: 4
+; CHECK-NEXT: - Index: 2
+; CHECK-NEXT: Kind: DATA
+; CHECK-NEXT: Name: gv1
+; CHECK-NEXT: Flags: [ BINDING_LOCAL, NO_STRIP ]
+; CHECK-NEXT: Segment: 1
+; CHECK-NEXT: Size: 4
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: Kind: DATA
+; CHECK-NEXT: Name: gv3
+; CHECK-NEXT: Flags: [ NO_STRIP ]
+; CHECK-NEXT: Segment: 3
+; CHECK-NEXT: Size: 4
+; CHECK-NEXT: - Index: 4
+; CHECK-NEXT: Kind: DATA
+; CHECK-NEXT: Name: gv4.not.used
+; CHECK-NEXT: Flags: [ ]
+; CHECK-NEXT: Segment: 3
+; CHECK-NEXT: Offset: 8
+; CHECK-NEXT: Size: 8
+; CHECK-NEXT: SegmentInfo:
+; CHECK-NEXT: - Index: 0
+; CHECK-NEXT: Name: .data.gv0
+; CHECK-NEXT: Alignment: 2
+; CHECK-NEXT: Flags: [ RETAIN ]
+; CHECK-NEXT: - Index: 1
+; CHECK-NEXT: Name: .data.gv1
+; CHECK-NEXT: Alignment: 2
+; CHECK-NEXT: Flags: [ RETAIN ]
+; CHECK-NEXT: - Index: 2
+; CHECK-NEXT: Name: .data..Lgv2
+; CHECK-NEXT: Alignment: 2
+; CHECK-NEXT: Flags: [ RETAIN ]
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: Name: ddd.hello
+; CHECK-NEXT: Alignment: 3
+; CHECK-NEXT: Flags: [ RETAIN ]