]> granicus.if.org Git - llvm/commitdiff
[WebAssembly] Add symbol flag to the binary format llvm.used
authorSam Clegg <sbc@chromium.org>
Thu, 7 Feb 2019 01:24:44 +0000 (01:24 +0000)
committerSam Clegg <sbc@chromium.org>
Thu, 7 Feb 2019 01:24:44 +0000 (01:24 +0000)
Summary:
Rather than add a new attribute
See https://github.com/WebAssembly/tool-conventions/issues/64

Subscribers: dschuff, jgravelle-google, aheejin, sunfish, rupprecht, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D57864

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353360 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BinaryFormat/Wasm.h
include/llvm/MC/MCSymbolWasm.h
lib/MC/MCAsmInfoWasm.cpp
lib/MC/MCWasmStreamer.cpp
lib/MC/WasmObjectWriter.cpp
lib/ObjectYAML/WasmYAML.cpp
test/MC/WebAssembly/no-dead-strip.ll [new file with mode: 0644]
tools/llvm-readobj/WasmDumper.cpp

index 84832766858fa72882143aa948407f7e2e7a5b0f..348fa11542f9d19250e8187e75678977f4242116 100644 (file)
@@ -289,6 +289,7 @@ const unsigned WASM_SYMBOL_BINDING_LOCAL = 0x2;
 const unsigned WASM_SYMBOL_VISIBILITY_DEFAULT = 0x0;
 const unsigned WASM_SYMBOL_VISIBILITY_HIDDEN = 0x4;
 const unsigned WASM_SYMBOL_UNDEFINED = 0x10;
+const unsigned WASM_SYMBOL_EXPORTED = 0x20;
 
 #define WASM_RELOC(name, value) name = value,
 
index a39d1ce4b778a0447ab76ef278d8d9ec125a4867..88759fe4d9e6b72c570cf9d06a2d27718578f296 100644 (file)
@@ -46,6 +46,13 @@ public:
   wasm::WasmSymbolType getType() const { return Type; }
   void setType(wasm::WasmSymbolType type) { Type = type; }
 
+  bool isExported() const {
+    return getFlags() & wasm::WASM_SYMBOL_EXPORTED;
+  }
+  void setExported() const {
+    modifyFlags(wasm::WASM_SYMBOL_EXPORTED, wasm::WASM_SYMBOL_EXPORTED);
+  }
+
   bool isWeak() const { return IsWeak; }
   void setWeak(bool isWeak) { IsWeak = isWeak; }
 
index 65a937b7716f2d39981a547b4041d02fcb77478f..ce6ec7ef211e5199c7939f0cedce4e311f97e9b4 100644 (file)
@@ -18,6 +18,7 @@ void MCAsmInfoWasm::anchor() {}
 
 MCAsmInfoWasm::MCAsmInfoWasm() {
   HasIdentDirective = true;
+  HasNoDeadStrip = true;
   WeakRefDirective = "\t.weak\t";
   PrivateGlobalPrefix = ".L";
   PrivateLabelPrefix = ".L";
index 36571fce062e34172ec53fe28a3f1917063c4ce4..86fa72197855bdf8f5f16600c8ec0930c8fc397f 100644 (file)
@@ -121,6 +121,10 @@ bool MCWasmStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
   case MCSA_Cold:
     break;
 
+  case MCSA_NoDeadStrip:
+    Symbol->setExported();
+    break;
+
   default:
     // unrecognized directive
     llvm_unreachable("unexpected MCSymbolAttr");
index b5260bbceae567ef392eac93d5a6a8e6224a905f..00d48659890bdc6f85ee0df68c5f994ab972ea72 100644 (file)
@@ -1454,6 +1454,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
       Flags |= wasm::WASM_SYMBOL_BINDING_LOCAL;
     if (WS.isUndefined())
       Flags |= wasm::WASM_SYMBOL_UNDEFINED;
+    if (WS.isExported())
+      Flags |= wasm::WASM_SYMBOL_EXPORTED;
 
     wasm::WasmSymbolInfo Info;
     Info.Name = WS.getName();
index f2030eb740e4988271a2d4138f146e302d5d2df0..def4d58a1016428b70c9137b1941e6a2a545a257 100644 (file)
@@ -486,6 +486,7 @@ void ScalarBitSetTraits<WasmYAML::SymbolFlags>::bitset(
   // BCaseMask(VISIBILITY_MASK, VISIBILITY_DEFAULT);
   BCaseMask(VISIBILITY_MASK, VISIBILITY_HIDDEN);
   BCaseMask(UNDEFINED, UNDEFINED);
+  BCaseMask(EXPORTED, EXPORTED);
 #undef BCaseMask
 }
 
diff --git a/test/MC/WebAssembly/no-dead-strip.ll b/test/MC/WebAssembly/no-dead-strip.ll
new file mode 100644 (file)
index 0000000..1810c49
--- /dev/null
@@ -0,0 +1,21 @@
+; RUN: llc -filetype=obj -wasm-keep-registers %s -o - | llvm-readobj --symbols | FileCheck %s
+
+target triple = "wasm32-unknown-unknown"
+
+@llvm.used = appending global [1 x i8*] [i8* bitcast (i32 ()* @foo to i8*)], 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 [ (0x20)
+; CHECK-NEXT:       EXPORTED (0x20)
+; CHECK-NEXT:     ]
+; CHECK-NEXT:     ElementIndex: 0x0
+; CHECK-NEXT:   }
+; CHECK-NEXT: ]
index 42851ab68320cc617659721aead8d327734f42cb..9ff222e96073aed3c465884e4e82b2c323239a52 100644 (file)
@@ -49,6 +49,7 @@ static const EnumEntry<unsigned> WasmSymbolFlags[] = {
   ENUM_ENTRY(VISIBILITY_DEFAULT),
   ENUM_ENTRY(VISIBILITY_HIDDEN),
   ENUM_ENTRY(UNDEFINED),
+  ENUM_ENTRY(EXPORTED),
 #undef ENUM_ENTRY
 };