Index: include/lld/Core/DefinedAtom.h =================================================================== --- include/lld/Core/DefinedAtom.h +++ include/lld/Core/DefinedAtom.h @@ -197,6 +197,14 @@ codeARMThumb, // ARM Thumb instruction set }; + // Visibility of the Atom + enum Visibility { + visibilityDefault, + visibilityInternal, + visibilityHidden, + visibilityProtected, + }; + struct Alignment { Alignment(int p2, int m = 0) : powerOf2(p2) @@ -287,6 +295,9 @@ /// content. virtual ArrayRef rawContent() const = 0; + /// \brief returns visibility of an Atom. + virtual Visibility visibility() const { return visibilityDefault; } + /// This class abstracts iterating over the sequence of References /// in an Atom. Concrete instances of DefinedAtom must implement /// the derefIterator() and incrementIterator() methods. Index: lib/ReaderWriter/ELF/Atoms.h =================================================================== --- lib/ReaderWriter/ELF/Atoms.h +++ lib/ReaderWriter/ELF/Atoms.h @@ -807,6 +807,8 @@ ContentType contentType() const override { return typeGOT; } + Visibility visibility() const override { return visibilityHidden; } + uint64_t size() const override { return 0; } ContentPermissions permissions() const override { return permRW_; } Index: lib/ReaderWriter/ELF/SectionChunks.h =================================================================== --- lib/ReaderWriter/ELF/SectionChunks.h +++ lib/ReaderWriter/ELF/SectionChunks.h @@ -729,7 +729,7 @@ template void SymbolTable::addDefinedAtom(Elf_Sym &sym, const DefinedAtom *da, int64_t addr) { - unsigned char binding = 0, type = 0; + unsigned char binding = 0, type = 0, visibility = 0; sym.st_size = da->size(); DefinedAtom::ContentType ct; switch (ct = da->contentType()) { @@ -773,6 +773,21 @@ else binding = llvm::ELF::STB_GLOBAL; + switch (DefinedAtom::Visibility vt = da->visibility()) { + case DefinedAtom::visibilityDefault: + visibility = llvm::ELF::STV_DEFAULT; + break; + case DefinedAtom::visibilityInternal: + visibility = llvm::ELF::STV_INTERNAL; + break; + case DefinedAtom::visibilityHidden: + visibility = llvm::ELF::STV_HIDDEN; + break; + case DefinedAtom::visibilityProtected: + visibility = llvm::ELF::STV_PROTECTED; + break; + } + sym.setVisibility(visibility); sym.setBindingAndType(binding, type); }