diff options
Diffstat (limited to 'wasm/Symbols.cpp')
| -rw-r--r-- | wasm/Symbols.cpp | 52 | 
1 files changed, 48 insertions, 4 deletions
| diff --git a/wasm/Symbols.cpp b/wasm/Symbols.cpp index a11081cbcf779..4bef9761ec250 100644 --- a/wasm/Symbols.cpp +++ b/wasm/Symbols.cpp @@ -10,6 +10,7 @@  #include "Symbols.h"  #include "Config.h"  #include "InputChunks.h" +#include "InputEvent.h"  #include "InputFiles.h"  #include "InputGlobal.h"  #include "OutputSegment.h" @@ -27,7 +28,9 @@ DefinedFunction *WasmSym::CallCtors;  DefinedData *WasmSym::DsoHandle;  DefinedData *WasmSym::DataEnd;  DefinedData *WasmSym::HeapBase; -DefinedGlobal *WasmSym::StackPointer; +GlobalSymbol *WasmSym::StackPointer; +UndefinedGlobal *WasmSym::TableBase; +UndefinedGlobal *WasmSym::MemoryBase;  WasmSymbolType Symbol::getWasmType() const {    if (isa<FunctionSymbol>(this)) @@ -36,6 +39,8 @@ WasmSymbolType Symbol::getWasmType() const {      return WASM_SYMBOL_TYPE_DATA;    if (isa<GlobalSymbol>(this))      return WASM_SYMBOL_TYPE_GLOBAL; +  if (isa<EventSymbol>(this)) +    return WASM_SYMBOL_TYPE_EVENT;    if (isa<SectionSymbol>(this))      return WASM_SYMBOL_TYPE_SECTION;    llvm_unreachable("invalid symbol kind"); @@ -52,6 +57,8 @@ InputChunk *Symbol::getChunk() const {  bool Symbol::isLive() const {    if (auto *G = dyn_cast<DefinedGlobal>(this))      return G->Global->Live; +  if (auto *E = dyn_cast<DefinedEvent>(this)) +    return E->Event->Live;    if (InputChunk *C = getChunk())      return C->Live;    return Referenced; @@ -60,6 +67,8 @@ bool Symbol::isLive() const {  void Symbol::markLive() {    if (auto *G = dyn_cast<DefinedGlobal>(this))      G->Global->Live = true; +  if (auto *E = dyn_cast<DefinedEvent>(this)) +    E->Event->Live = true;    if (InputChunk *C = getChunk())      C->Live = true;    Referenced = true; @@ -105,7 +114,10 @@ bool Symbol::isExported() const {    if (ForceExport || Config->ExportAll)      return true; -  return !isHidden(); +  if (Config->ExportDynamic && !isHidden()) +    return true; + +  return false;  }  uint32_t FunctionSymbol::getFunctionIndex() const { @@ -207,6 +219,32 @@ DefinedGlobal::DefinedGlobal(StringRef Name, uint32_t Flags, InputFile *File,                     Global ? &Global->getType() : nullptr),        Global(Global) {} +uint32_t EventSymbol::getEventIndex() const { +  if (auto *F = dyn_cast<DefinedEvent>(this)) +    return F->Event->getEventIndex(); +  assert(EventIndex != INVALID_INDEX); +  return EventIndex; +} + +void EventSymbol::setEventIndex(uint32_t Index) { +  LLVM_DEBUG(dbgs() << "setEventIndex " << Name << " -> " << Index << "\n"); +  assert(EventIndex == INVALID_INDEX); +  EventIndex = Index; +} + +bool EventSymbol::hasEventIndex() const { +  if (auto *F = dyn_cast<DefinedEvent>(this)) +    return F->Event->hasEventIndex(); +  return EventIndex != INVALID_INDEX; +} + +DefinedEvent::DefinedEvent(StringRef Name, uint32_t Flags, InputFile *File, +                           InputEvent *Event) +    : EventSymbol(Name, DefinedEventKind, Flags, File, +                  Event ? &Event->getType() : nullptr, +                  Event ? &Event->Signature : nullptr), +      Event(Event) {} +  uint32_t SectionSymbol::getOutputSectionIndex() const {    LLVM_DEBUG(dbgs() << "getOutputSectionIndex: " << getName() << "\n");    assert(OutputSectionIndex != INVALID_INDEX); @@ -223,10 +261,14 @@ void SectionSymbol::setOutputSectionIndex(uint32_t Index) {  void LazySymbol::fetch() { cast<ArchiveFile>(File)->addMember(&ArchiveSymbol); }  std::string lld::toString(const wasm::Symbol &Sym) { +  return lld::maybeDemangleSymbol(Sym.getName()); +} + +std::string lld::maybeDemangleSymbol(StringRef Name) {    if (Config->Demangle) -    if (Optional<std::string> S = demangleItanium(Sym.getName())) +    if (Optional<std::string> S = demangleItanium(Name))        return *S; -  return Sym.getName(); +  return Name;  }  std::string lld::toString(wasm::Symbol::Kind Kind) { @@ -237,6 +279,8 @@ std::string lld::toString(wasm::Symbol::Kind Kind) {      return "DefinedData";    case wasm::Symbol::DefinedGlobalKind:      return "DefinedGlobal"; +  case wasm::Symbol::DefinedEventKind: +    return "DefinedEvent";    case wasm::Symbol::UndefinedFunctionKind:      return "UndefinedFunction";    case wasm::Symbol::UndefinedDataKind: | 
