[llvm] r319626 - Reland "[WebAssembly] Add visibility flag to Wasm symbol flags""

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 2 17:19:24 PST 2017


Author: sbc
Date: Sat Dec  2 17:19:23 2017
New Revision: 319626

URL: http://llvm.org/viewvc/llvm-project?rev=319626&view=rev
Log:
Reland "[WebAssembly] Add visibility flag to Wasm symbol flags""

Original change was rL319488.

This was reverted rL319602 due to a gcc 7.1 warning.

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

Added:
    llvm/trunk/test/MC/WebAssembly/visibility.ll
Modified:
    llvm/trunk/include/llvm/BinaryFormat/Wasm.h
    llvm/trunk/include/llvm/MC/MCSymbolWasm.h
    llvm/trunk/include/llvm/Object/Wasm.h
    llvm/trunk/lib/MC/MCWasmStreamer.cpp
    llvm/trunk/lib/MC/WasmObjectWriter.cpp
    llvm/trunk/lib/Object/WasmObjectFile.cpp

Modified: llvm/trunk/include/llvm/BinaryFormat/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/Wasm.h?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/include/llvm/BinaryFormat/Wasm.h (original)
+++ llvm/trunk/include/llvm/BinaryFormat/Wasm.h Sat Dec  2 17:19:23 2017
@@ -189,13 +189,14 @@ enum : unsigned {
   WASM_SEGMENT_INFO   = 0x5,
 };
 
-const unsigned WASM_SYMBOL_BINDING_MASK = 0x3;
+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,
-};
+const unsigned WASM_SYMBOL_BINDING_GLOBAL     = 0x0;
+const unsigned WASM_SYMBOL_BINDING_WEAK       = 0x1;
+const unsigned WASM_SYMBOL_BINDING_LOCAL      = 0x2;
+const unsigned WASM_SYMBOL_VISIBILITY_DEFAULT = 0x0;
+const unsigned WASM_SYMBOL_VISIBILITY_HIDDEN  = 0x4;
 
 #define WASM_RELOC(name, value) name = value,
 

Modified: llvm/trunk/include/llvm/MC/MCSymbolWasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSymbolWasm.h?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSymbolWasm.h (original)
+++ llvm/trunk/include/llvm/MC/MCSymbolWasm.h Sat Dec  2 17:19:23 2017
@@ -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 {

Modified: llvm/trunk/include/llvm/Object/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Wasm.h?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/Wasm.h (original)
+++ llvm/trunk/include/llvm/Object/Wasm.h Sat Dec  2 17:19:23 2017
@@ -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

Modified: llvm/trunk/lib/MC/MCWasmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCWasmStreamer.cpp?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCWasmStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCWasmStreamer.cpp Sat Dec  2 17:19:23 2017
@@ -98,10 +98,13 @@ bool MCWasmStreamer::EmitSymbolAttribute
   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);

Modified: llvm/trunk/lib/MC/WasmObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WasmObjectWriter.cpp?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WasmObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/WasmObjectWriter.cpp Sat Dec  2 17:19:23 2017
@@ -1180,10 +1180,14 @@ void WasmObjectWriter::writeObject(MCAss
                  << 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;

Modified: llvm/trunk/lib/Object/WasmObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WasmObjectFile.cpp?rev=319626&r1=319625&r2=319626&view=diff
==============================================================================
--- llvm/trunk/lib/Object/WasmObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/WasmObjectFile.cpp Sat Dec  2 17:19:23 2017
@@ -378,7 +378,7 @@ Error WasmObjectFile::parseLinkingSectio
         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(
     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:

Added: llvm/trunk/test/MC/WebAssembly/visibility.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/WebAssembly/visibility.ll?rev=319626&view=auto
==============================================================================
--- llvm/trunk/test/MC/WebAssembly/visibility.ll (added)
+++ llvm/trunk/test/MC/WebAssembly/visibility.ll Sat Dec  2 17:19:23 2017
@@ -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: ...




More information about the llvm-commits mailing list