]> granicus.if.org Git - llvm/commitdiff
Add visibility flag to Wasm symbol flags
authorSam Clegg <sbc@chromium.org>
Thu, 30 Nov 2017 22:34:58 +0000 (22:34 +0000)
committerSam Clegg <sbc@chromium.org>
Thu, 30 Nov 2017 22:34:58 +0000 (22:34 +0000)
The LLVM "hidden" flag needs to be passed through the Wasm
intermediate objects in order for the linker to apply
it to the final Wasm object.

The corresponding change in LLD is here: https://github.com/WebAssembly/lld/pull/14

Patch by Nicholas Wilson

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

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

include/llvm/BinaryFormat/Wasm.h
include/llvm/MC/MCSymbolWasm.h
include/llvm/Object/Wasm.h
lib/MC/MCWasmStreamer.cpp
lib/MC/WasmObjectWriter.cpp
lib/Object/WasmObjectFile.cpp
test/MC/WebAssembly/visibility.ll [new file with mode: 0644]

index 26475c27df3823a4a98e3f39dcbf8382cb9761c8..f3a58026ed745f1a4559a8be06614d2232d7792e 100644 (file)
@@ -190,11 +190,15 @@ enum : unsigned {
 };
 
 const unsigned WASM_SYMBOL_BINDING_MASK = 0x3;
+const unsigned WASM_SYMBOL_VISIBILITY_MASK = 0x4;
 
 enum : unsigned {
   WASM_SYMBOL_BINDING_GLOBAL = 0x0,
   WASM_SYMBOL_BINDING_WEAK   = 0x1,
   WASM_SYMBOL_BINDING_LOCAL  = 0x2,
+
+  WASM_SYMBOL_VISIBILITY_DEFAULT = 0x0,
+  WASM_SYMBOL_VISIBILITY_HIDDEN = 0x4,
 };
 
 #define WASM_RELOC(name, value) name = value,
index 9bae6c582faa3bf420b4b0828795ca22307ab0a5..309ebf96d1b0a986e4bb15ba650fff1c9fdf4620 100644 (file)
@@ -18,6 +18,7 @@ class MCSymbolWasm : public MCSymbol {
 private:
   bool IsFunction = false;
   bool IsWeak = false;
+  bool IsHidden = false;
   std::string ModuleName;
   SmallVector<wasm::ValType, 1> Returns;
   SmallVector<wasm::ValType, 4> Params;
@@ -45,6 +46,9 @@ public:
   bool isWeak() const { return IsWeak; }
   void setWeak(bool isWeak) { IsWeak = isWeak; }
 
+  bool isHidden() const { return IsHidden; }
+  void setHidden(bool isHidden) { IsHidden = isHidden; }
+
   const StringRef getModuleName() const { return ModuleName; }
 
   const SmallVector<wasm::ValType, 1> &getReturns() const {
index e138faeed34232fed541ed441a68cde7645ba8b4..504f1b49031402d806b6d71c1257cc7e67bb9fdf 100644 (file)
@@ -81,6 +81,14 @@ public:
     return Flags & wasm::WASM_SYMBOL_BINDING_MASK;
   }
 
+  bool isHidden() const {
+    return getVisibility() == wasm::WASM_SYMBOL_VISIBILITY_HIDDEN;
+  }
+
+  unsigned getVisibility() const {
+    return Flags & wasm::WASM_SYMBOL_VISIBILITY_MASK;
+  }
+
   void print(raw_ostream &Out) const {
     Out << "Name=" << Name << ", Type=" << static_cast<int>(Type)
         << ", Flags=" << Flags << " ElemIndex=" << ElementIndex
index 287b7cf7b23f12b7cd63975ab8793c78b2a61524..ef2a5621512b541ed44710ea687526fd35e13960 100644 (file)
@@ -98,10 +98,13 @@ bool MCWasmStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
   case MCSA_WeakDefAutoPrivate:
   case MCSA_Invalid:
   case MCSA_IndirectSymbol:
-  case MCSA_Hidden:
   case MCSA_Protected:
     return false;
 
+  case MCSA_Hidden:
+    Symbol->setHidden(true);
+    break;
+
   case MCSA_Weak:
   case MCSA_WeakReference:
     Symbol->setWeak(true);
index 6e9088b9d0dd87d129e0fc560f9baa5b68bc128f..42521ac72e2c3834d3369cdb8a543bdfa2123b52 100644 (file)
@@ -1180,10 +1180,14 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
                  << S.isExternal() << " isTemporary=" << S.isTemporary()
                  << " isFunction=" << WS.isFunction()
                  << " isWeak=" << WS.isWeak()
+                 << " isHidden=" << WS.isHidden()
                  << " isVariable=" << WS.isVariable() << "\n");
 
-    if (WS.isWeak())
-      SymbolFlags.emplace_back(WS.getName(), wasm::WASM_SYMBOL_BINDING_WEAK);
+    if (WS.isWeak() || WS.isHidden()) {
+      uint32_t Flags = (WS.isWeak() ? wasm::WASM_SYMBOL_BINDING_WEAK : 0) |
+          (WS.isHidden() ? wasm::WASM_SYMBOL_VISIBILITY_HIDDEN : 0);
+      SymbolFlags.emplace_back(WS.getName(), Flags);
+    }
 
     if (WS.isVariable())
       continue;
index 86ce9c2209c26da77b4b1848f1a0df2643cd453b..70ac598b89762cedb32b92b032becd183b73dedb 100644 (file)
@@ -378,7 +378,7 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr,
         Symbols[SymIndex].Flags = Flags;
         DEBUG(dbgs() << "Set symbol flags index:"
                      << SymIndex << " name:"
-                     << Symbols[SymIndex].Name << " exptected:"
+                     << Symbols[SymIndex].Name << " expected:"
                      << Symbol << " flags: " << Flags << "\n");
       }
       break;
@@ -766,6 +766,8 @@ uint32_t WasmObjectFile::getSymbolFlags(DataRefImpl Symb) const {
     Result |= SymbolRef::SF_Weak;
   if (!Sym.isLocal())
     Result |= SymbolRef::SF_Global;
+  if (Sym.isHidden())
+    Result |= SymbolRef::SF_Hidden;
 
   switch (Sym.Type) {
   case WasmSymbol::SymbolType::FUNCTION_IMPORT:
diff --git a/test/MC/WebAssembly/visibility.ll b/test/MC/WebAssembly/visibility.ll
new file mode 100644 (file)
index 0000000..b445bf4
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o - | obj2yaml | FileCheck %s
+
+; Function with __attribute__((visibility("default")))
+define void @defaultVis() #0 {
+entry:
+  ret void
+}
+
+; Function with __attribute__((visibility("hidden")))
+define hidden void @hiddenVis() #0 {
+entry:
+  ret void
+}
+
+; CHECK:        - Type:            CUSTOM
+
+; CHECK:        - Type:            CUSTOM
+; CHECK-NEXT:     Name:            linking
+; CHECK-NEXT:     DataSize:        0
+; CHECK-NEXT:     SymbolInfo:
+; CHECK-NEXT:       - Name:            hiddenVis
+; CHECK-NEXT:         Flags:           4
+; CHECK-NEXT: ...