1 //===- MCSymbolWasm.h - ----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef LLVM_MC_MCSYMBOLWASM_H 10 #define LLVM_MC_MCSYMBOLWASM_H 11 12 #include "llvm/BinaryFormat/Wasm.h" 13 #include "llvm/MC/MCSymbol.h" 14 15 namespace llvm { 16 17 class MCSymbolWasm : public MCSymbol { 18 wasm::WasmSymbolType Type = wasm::WASM_SYMBOL_TYPE_DATA; 19 bool IsWeak = false; 20 bool IsHidden = false; 21 bool IsComdat = false; 22 std::string ModuleName; 23 SmallVector<wasm::ValType, 1> Returns; 24 SmallVector<wasm::ValType, 4> Params; 25 wasm::WasmGlobalType GlobalType; 26 bool ParamsSet = false; 27 bool ReturnsSet = false; 28 bool GlobalTypeSet = false; 29 30 /// An expression describing how to calculate the size of a symbol. If a 31 /// symbol has no size this field will be NULL. 32 const MCExpr *SymbolSize = nullptr; 33 34 public: 35 // Use a module name of "env" for now, for compatibility with existing tools. 36 // This is temporary, and may change, as the ABI is not yet stable. MCSymbolWasm(const StringMapEntry<bool> * Name,bool isTemporary)37 MCSymbolWasm(const StringMapEntry<bool> *Name, bool isTemporary) 38 : MCSymbol(SymbolKindWasm, Name, isTemporary), 39 ModuleName("env") {} classof(const MCSymbol * S)40 static bool classof(const MCSymbol *S) { return S->isWasm(); } 41 getSize()42 const MCExpr *getSize() const { return SymbolSize; } setSize(const MCExpr * SS)43 void setSize(const MCExpr *SS) { SymbolSize = SS; } 44 isFunction()45 bool isFunction() const { return Type == wasm::WASM_SYMBOL_TYPE_FUNCTION; } isData()46 bool isData() const { return Type == wasm::WASM_SYMBOL_TYPE_DATA; } isGlobal()47 bool isGlobal() const { return Type == wasm::WASM_SYMBOL_TYPE_GLOBAL; } isSection()48 bool isSection() const { return Type == wasm::WASM_SYMBOL_TYPE_SECTION; } getType()49 wasm::WasmSymbolType getType() const { return Type; } setType(wasm::WasmSymbolType type)50 void setType(wasm::WasmSymbolType type) { Type = type; } 51 isWeak()52 bool isWeak() const { return IsWeak; } setWeak(bool isWeak)53 void setWeak(bool isWeak) { IsWeak = isWeak; } 54 isHidden()55 bool isHidden() const { return IsHidden; } setHidden(bool isHidden)56 void setHidden(bool isHidden) { IsHidden = isHidden; } 57 isComdat()58 bool isComdat() const { return IsComdat; } setComdat(bool isComdat)59 void setComdat(bool isComdat) { IsComdat = isComdat; } 60 getModuleName()61 const StringRef getModuleName() const { return ModuleName; } setModuleName(StringRef Name)62 void setModuleName(StringRef Name) { ModuleName = Name; } 63 getReturns()64 const SmallVector<wasm::ValType, 1> &getReturns() const { 65 assert(ReturnsSet); 66 return Returns; 67 } 68 setReturns(SmallVectorImpl<wasm::ValType> && Rets)69 void setReturns(SmallVectorImpl<wasm::ValType> &&Rets) { 70 ReturnsSet = true; 71 Returns = std::move(Rets); 72 } 73 getParams()74 const SmallVector<wasm::ValType, 4> &getParams() const { 75 assert(ParamsSet); 76 return Params; 77 } 78 setParams(SmallVectorImpl<wasm::ValType> && Pars)79 void setParams(SmallVectorImpl<wasm::ValType> &&Pars) { 80 ParamsSet = true; 81 Params = std::move(Pars); 82 } 83 getGlobalType()84 const wasm::WasmGlobalType &getGlobalType() const { 85 assert(GlobalTypeSet); 86 return GlobalType; 87 } 88 setGlobalType(wasm::WasmGlobalType GT)89 void setGlobalType(wasm::WasmGlobalType GT) { 90 GlobalTypeSet = true; 91 GlobalType = GT; 92 } 93 }; 94 95 } // end namespace llvm 96 97 #endif // LLVM_MC_MCSYMBOLWASM_H 98