diff options
author | Yuta Saito <kateinoigakukun@gmail.com> | 2024-02-21 03:35:36 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-21 03:35:36 +0900 |
commit | ba3c1f9ce30cf4f8aee5f1961df74d65e11d53bc (patch) | |
tree | 78b965013f5d43f4126f86547cda69deb93a8a3c /llvm/test/MC | |
parent | fb615cf3b9c2d887441a4c0cca326eddc592351a (diff) | |
download | llvm-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.ll | 76 |
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 ] |