//===- Symbols.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_MACHO_SYMBOLS_H #define LLD_MACHO_SYMBOLS_H #include "Config.h" #include "InputFiles.h" #include "Target.h" #include "llvm/Object/Archive.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/MathExtras.h" namespace lld { namespace macho { class MachHeaderSection; class Symbol { … }; class Defined : public Symbol { … }; // This enum does double-duty: as a symbol property, it indicates whether & how // a dylib symbol is referenced. As a DylibFile property, it indicates the kind // of referenced symbols contained within the file. If there are both weak // and strong references to the same file, we will count the file as // strongly-referenced. enum class RefState : uint8_t { … }; class Undefined : public Symbol { … }; // On Unix, it is traditionally allowed to write variable definitions without // initialization expressions (such as "int foo;") to header files. These are // called tentative definitions. // // Using tentative definitions is usually considered a bad practice; you should // write only declarations (such as "extern int foo;") to header files. // Nevertheless, the linker and the compiler have to do something to support // bad code by allowing duplicate definitions for this particular case. // // The compiler creates common symbols when it sees tentative definitions. // (You can suppress this behavior and let the compiler create a regular // defined symbol by passing -fno-common. -fno-common is the default in clang // as of LLVM 11.0.) When linking the final binary, if there are remaining // common symbols after name resolution is complete, the linker converts them // to regular defined symbols in a __common section. class CommonSymbol : public Symbol { … }; class DylibSymbol : public Symbol { … }; class LazyArchive : public Symbol { … }; // A defined symbol in an ObjFile/BitcodeFile surrounded by --start-lib and // --end-lib. class LazyObject : public Symbol { … }; // Represents N_INDR symbols. Note that if we are given valid, linkable inputs, // then all AliasSymbol instances will be converted into one of the other Symbol // types after `createAliases()` runs. class AliasSymbol final : public Symbol { … }; SymbolUnion; template <typename T, typename... ArgT> T *replaceSymbol(Symbol *s, ArgT &&...arg) { … } // Can a symbol's address only be resolved at runtime? inline bool needsBinding(const Symbol *sym) { … } // Symbols with `l` or `L` as a prefix are linker-private and never appear in // the output. inline bool isPrivateLabel(StringRef name) { … } } // namespace macho std::string toString(const macho::Symbol &); std::string toMachOString(const llvm::object::Archive::Symbol &); } // namespace lld #endif