| //===- Config.h -------------------------------------------------*- C++ -*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLD_WASM_CONFIG_H | 
 | #define LLD_WASM_CONFIG_H | 
 |  | 
 | #include "llvm/ADT/SmallVector.h" | 
 | #include "llvm/ADT/StringRef.h" | 
 | #include "llvm/ADT/StringSet.h" | 
 | #include "llvm/ADT/Twine.h" | 
 | #include "llvm/BinaryFormat/Wasm.h" | 
 | #include "llvm/Support/CachePruning.h" | 
 | #include <optional> | 
 |  | 
 | namespace llvm { | 
 | enum class CodeGenOptLevel; | 
 | } // namespace llvm | 
 |  | 
 | namespace lld::wasm { | 
 |  | 
 | class InputFile; | 
 | class StubFile; | 
 | class ObjFile; | 
 | class SharedFile; | 
 | class BitcodeFile; | 
 | class InputTable; | 
 | class InputGlobal; | 
 | class InputFunction; | 
 | class Symbol; | 
 | class DefinedData; | 
 | class GlobalSymbol; | 
 | class DefinedFunction; | 
 | class UndefinedGlobal; | 
 | class TableSymbol; | 
 |  | 
 | // For --unresolved-symbols. | 
 | enum class UnresolvedPolicy { ReportError, Warn, Ignore, ImportDynamic }; | 
 |  | 
 | // For --build-id. | 
 | enum class BuildIdKind { None, Fast, Sha1, Hexstring, Uuid }; | 
 |  | 
 | // This struct contains the global configuration for the linker. | 
 | // Most fields are direct mapping from the command line options | 
 | // and such fields have the same name as the corresponding options. | 
 | // Most fields are initialized by the driver. | 
 | struct Config { | 
 |   bool allowMultipleDefinition; | 
 |   bool bsymbolic; | 
 |   bool checkFeatures; | 
 |   bool compressRelocations; | 
 |   bool demangle; | 
 |   bool disableVerify; | 
 |   bool experimentalPic; | 
 |   bool emitRelocs; | 
 |   bool exportAll; | 
 |   bool exportDynamic; | 
 |   bool exportTable; | 
 |   bool extendedConst; | 
 |   bool growableTable; | 
 |   bool gcSections; | 
 |   llvm::StringSet<> keepSections; | 
 |   std::optional<std::pair<llvm::StringRef, llvm::StringRef>> memoryImport; | 
 |   std::optional<llvm::StringRef> memoryExport; | 
 |   bool sharedMemory; | 
 |   bool importTable; | 
 |   bool importUndefined; | 
 |   std::optional<bool> is64; | 
 |   bool mergeDataSegments; | 
 |   bool noinhibitExec; | 
 |   bool pie; | 
 |   bool printGcSections; | 
 |   bool relocatable; | 
 |   bool saveTemps; | 
 |   bool shared; | 
 |   bool shlibSigCheck; | 
 |   bool stripAll; | 
 |   bool stripDebug; | 
 |   bool stackFirst; | 
 |   // Because dyamanic linking under Wasm is still experimental we default to | 
 |   // static linking | 
 |   bool isStatic = true; | 
 |   bool thinLTOEmitImportsFiles; | 
 |   bool thinLTOEmitIndexFiles; | 
 |   bool thinLTOIndexOnly; | 
 |   bool trace; | 
 |   uint64_t globalBase; | 
 |   uint64_t initialHeap; | 
 |   uint64_t initialMemory; | 
 |   uint64_t maxMemory; | 
 |   bool noGrowableMemory; | 
 |   // The table offset at which to place function addresses.  We reserve zero | 
 |   // for the null function pointer.  This gets set to 1 for executables and 0 | 
 |   // for shared libraries (since they always added to a dynamic offset at | 
 |   // runtime). | 
 |   uint64_t tableBase; | 
 |   uint64_t zStackSize; | 
 |   uint64_t pageSize; | 
 |   unsigned ltoPartitions; | 
 |   unsigned ltoo; | 
 |   llvm::CodeGenOptLevel ltoCgo; | 
 |   unsigned optimize; | 
 |   bool ltoDebugPassManager; | 
 |   UnresolvedPolicy unresolvedSymbols; | 
 |   BuildIdKind buildId = BuildIdKind::None; | 
 |  | 
 |   llvm::StringRef entry; | 
 |   llvm::StringRef ltoObjPath; | 
 |   llvm::StringRef mapFile; | 
 |   llvm::StringRef outputFile; | 
 |   llvm::StringRef soName; | 
 |   llvm::StringRef thinLTOCacheDir; | 
 |   llvm::StringRef thinLTOJobs; | 
 |   llvm::StringRef thinLTOIndexOnlyArg; | 
 |   std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; | 
 |   llvm::StringRef thinLTOPrefixReplaceOld; | 
 |   llvm::StringRef thinLTOPrefixReplaceNew; | 
 |   llvm::StringRef thinLTOPrefixReplaceNativeObject; | 
 |   llvm::StringRef whyExtract; | 
 |  | 
 |   llvm::StringSet<> allowUndefinedSymbols; | 
 |   llvm::StringSet<> exportedSymbols; | 
 |   std::vector<llvm::StringRef> requiredExports; | 
 |   llvm::SmallVector<llvm::StringRef, 0> searchPaths; | 
 |   llvm::SmallVector<llvm::StringRef, 0> rpath; | 
 |   llvm::CachePruningPolicy thinLTOCachePolicy; | 
 |   std::optional<std::vector<std::string>> features; | 
 |   std::optional<std::vector<std::string>> extraFeatures; | 
 |   llvm::SmallVector<uint8_t, 0> buildIdVector; | 
 | }; | 
 |  | 
 | // The Ctx object hold all other (non-configuration) global state. | 
 | struct Ctx { | 
 |   Config arg; | 
 |  | 
 |   llvm::SmallVector<ObjFile *, 0> objectFiles; | 
 |   llvm::SmallVector<StubFile *, 0> stubFiles; | 
 |   llvm::SmallVector<SharedFile *, 0> sharedFiles; | 
 |   llvm::SmallVector<BitcodeFile *, 0> bitcodeFiles; | 
 |   llvm::SmallVector<BitcodeFile *, 0> lazyBitcodeFiles; | 
 |   llvm::SmallVector<InputFunction *, 0> syntheticFunctions; | 
 |   llvm::SmallVector<InputGlobal *, 0> syntheticGlobals; | 
 |   llvm::SmallVector<InputTable *, 0> syntheticTables; | 
 |  | 
 |   // linker-generated symbols | 
 |   struct WasmSym { | 
 |     // __global_base | 
 |     // Symbol marking the start of the global section. | 
 |     DefinedData *globalBase; | 
 |  | 
 |     // __stack_pointer/__stack_low/__stack_high | 
 |     // Global that holds current value of stack pointer and data symbols marking | 
 |     // the start and end of the stack region.  stackPointer is initialized to | 
 |     // stackHigh and grows downwards towards stackLow | 
 |     GlobalSymbol *stackPointer; | 
 |     DefinedData *stackLow; | 
 |     DefinedData *stackHigh; | 
 |  | 
 |     // __tls_base | 
 |     // Global that holds the address of the base of the current thread's | 
 |     // TLS block. | 
 |     GlobalSymbol *tlsBase; | 
 |  | 
 |     // __tls_size | 
 |     // Symbol whose value is the size of the TLS block. | 
 |     GlobalSymbol *tlsSize; | 
 |  | 
 |     // __tls_size | 
 |     // Symbol whose value is the alignment of the TLS block. | 
 |     GlobalSymbol *tlsAlign; | 
 |  | 
 |     // __data_end | 
 |     // Symbol marking the end of the data and bss. | 
 |     DefinedData *dataEnd; | 
 |  | 
 |     // __heap_base/__heap_end | 
 |     // Symbols marking the beginning and end of the "heap". It starts at the end | 
 |     // of the data, bss and explicit stack, and extends to the end of the linear | 
 |     // memory allocated by wasm-ld. This region of memory is not used by the | 
 |     // linked code, so it may be used as a backing store for `sbrk` or `malloc` | 
 |     // implementations. | 
 |     DefinedData *heapBase; | 
 |     DefinedData *heapEnd; | 
 |  | 
 |     // __wasm_first_page_end | 
 |     // A symbol whose address is the end of the first page in memory (if any). | 
 |     DefinedData *firstPageEnd; | 
 |  | 
 |     // __wasm_init_memory_flag | 
 |     // Symbol whose contents are nonzero iff memory has already been | 
 |     // initialized. | 
 |     DefinedData *initMemoryFlag; | 
 |  | 
 |     // __wasm_init_memory | 
 |     // Function that initializes passive data segments during instantiation. | 
 |     DefinedFunction *initMemory; | 
 |  | 
 |     // __wasm_call_ctors | 
 |     // Function that directly calls all ctors in priority order. | 
 |     DefinedFunction *callCtors; | 
 |  | 
 |     // __wasm_call_dtors | 
 |     // Function that calls the libc/etc. cleanup function. | 
 |     DefinedFunction *callDtors; | 
 |  | 
 |     // __wasm_apply_global_relocs | 
 |     // Function that applies relocations to wasm globals post-instantiation. | 
 |     // Unlike __wasm_apply_data_relocs this needs to run on every thread. | 
 |     DefinedFunction *applyGlobalRelocs; | 
 |  | 
 |     // __wasm_apply_tls_relocs | 
 |     // Like __wasm_apply_data_relocs but for TLS section.  These must be | 
 |     // delayed until __wasm_init_tls. | 
 |     DefinedFunction *applyTLSRelocs; | 
 |  | 
 |     // __wasm_apply_global_tls_relocs | 
 |     // Like applyGlobalRelocs but for globals that hold TLS addresses.  These | 
 |     // must be delayed until __wasm_init_tls. | 
 |     DefinedFunction *applyGlobalTLSRelocs; | 
 |  | 
 |     // __wasm_init_tls | 
 |     // Function that allocates thread-local storage and initializes it. | 
 |     DefinedFunction *initTLS; | 
 |  | 
 |     // Pointer to the function that is to be used in the start section. | 
 |     // (normally an alias of initMemory, or applyGlobalRelocs). | 
 |     DefinedFunction *startFunction; | 
 |  | 
 |     // __dso_handle | 
 |     // Symbol used in calls to __cxa_atexit to determine current DLL | 
 |     DefinedData *dsoHandle; | 
 |  | 
 |     // __table_base | 
 |     // Used in PIC code for offset of indirect function table | 
 |     UndefinedGlobal *tableBase; | 
 |     DefinedData *definedTableBase; | 
 |  | 
 |     // __memory_base | 
 |     // Used in PIC code for offset of global data | 
 |     UndefinedGlobal *memoryBase; | 
 |     DefinedData *definedMemoryBase; | 
 |  | 
 |     // __indirect_function_table | 
 |     // Used as an address space for function pointers, with each function that | 
 |     // is used as a function pointer being allocated a slot. | 
 |     TableSymbol *indirectFunctionTable; | 
 |   }; | 
 |   WasmSym sym; | 
 |  | 
 |   // True if we are creating position-independent code. | 
 |   bool isPic = false; | 
 |  | 
 |   // True if we have an MVP input that uses __indirect_function_table and which | 
 |   // requires it to be allocated to table number 0. | 
 |   bool legacyFunctionTable = false; | 
 |  | 
 |   // Will be set to true if bss data segments should be emitted. In most cases | 
 |   // this is not necessary. | 
 |   bool emitBssSegments = false; | 
 |  | 
 |   // A tuple of (reference, extractedFile, sym). Used by --why-extract=. | 
 |   llvm::SmallVector<std::tuple<std::string, const InputFile *, const Symbol &>, | 
 |                     0> | 
 |       whyExtractRecords; | 
 |  | 
 |   Ctx(); | 
 |   void reset(); | 
 | }; | 
 |  | 
 | extern Ctx ctx; | 
 |  | 
 | void errorOrWarn(const llvm::Twine &msg); | 
 |  | 
 | } // namespace lld::wasm | 
 |  | 
 | #endif |