};
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,
private:
bool IsFunction = false;
bool IsWeak = false;
+ bool IsHidden = false;
std::string ModuleName;
SmallVector<wasm::ValType, 1> Returns;
SmallVector<wasm::ValType, 4> Params;
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 {
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
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);
<< 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;
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;
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:
--- /dev/null
+; 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: ...