[lld] r175901 - add changes for typeDataFast
Shankar Easwaran
shankare at codeaurora.org
Fri Feb 22 09:18:54 PST 2013
Author: shankare
Date: Fri Feb 22 11:18:53 2013
New Revision: 175901
URL: http://llvm.org/viewvc/llvm-project?rev=175901&view=rev
Log:
add changes for typeDataFast
Added:
lld/trunk/test/elf/Inputs/quickdata-test.elf-hexagon (with props)
lld/trunk/test/elf/quickdata.test
Modified:
lld/trunk/include/lld/Core/DefinedAtom.h
lld/trunk/lib/Core/DefinedAtom.cpp
lld/trunk/lib/ReaderWriter/ELF/Atoms.h
lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
lld/trunk/lib/ReaderWriter/ELF/File.h
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
lld/trunk/lib/ReaderWriter/ELF/TargetHandler.h
lld/trunk/lib/ReaderWriter/ELF/Writer.cpp
lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
lld/trunk/test/elf/branch.objtxt
Modified: lld/trunk/include/lld/Core/DefinedAtom.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/DefinedAtom.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/DefinedAtom.h (original)
+++ lld/trunk/include/lld/Core/DefinedAtom.h Fri Feb 22 11:18:53 2013
@@ -123,6 +123,7 @@ public:
typeLiteral8, // an eight-btye read-only constant
typeLiteral16, // a sixteen-btye read-only constant
typeData, // read-write data
+ typeDataFast, // allow data to be quickly accessed
typeZeroFill, // zero-fill data
typeConstData, // read-only data after dynamic linker is done
typeObjC1Class, // ObjC1 class [Darwin]
Modified: lld/trunk/lib/Core/DefinedAtom.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/DefinedAtom.cpp?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/Core/DefinedAtom.cpp (original)
+++ lld/trunk/lib/Core/DefinedAtom.cpp Fri Feb 22 11:18:53 2013
@@ -44,6 +44,7 @@ DefinedAtom::ContentPermissions DefinedA
return permR__;
case typeData:
+ case typeDataFast:
case typeZeroFill:
case typeObjC1Class:
case typeLazyPointer:
Modified: lld/trunk/lib/ReaderWriter/ELF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Atoms.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Atoms.h Fri Feb 22 11:18:53 2013
@@ -183,7 +183,8 @@ public:
, _contentData(contentData)
, _referenceStartIndex(referenceStart)
, _referenceEndIndex(referenceEnd)
- , _referenceList(referenceList) {
+ , _referenceList(referenceList)
+ , _targetAtomHandler(nullptr) {
static uint64_t orderNumber = 0;
_ordinal = ++orderNumber;
}
@@ -200,12 +201,28 @@ public:
return _ordinal;
}
+ const Elf_Sym *symbol() const { return _symbol; }
+
+ const Elf_Shdr *section() const { return _section; }
+
virtual uint64_t size() const {
// Common symbols are not allocated in object files,
// so use st_size to tell how many bytes are required.
- if ((_symbol->getType() == llvm::ELF::STT_COMMON)
- || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
- return (uint64_t)_symbol->st_size;
+
+ // Treat target defined common symbols
+ if ((_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
+ _symbol->st_shndx < llvm::ELF::SHN_HIPROC)) {
+ if (!_targetAtomHandler) {
+ const ELFTargetInfo &eti = (_owningFile.getTargetInfo());
+ TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
+ _targetAtomHandler = &TargetHandler.targetAtomHandler();
+ }
+ if (_targetAtomHandler->getType(_symbol) == llvm::ELF::STT_COMMON)
+ return (uint64_t) _symbol->st_size;
+ }
+ if ((_symbol->getType() == llvm::ELF::STT_COMMON) ||
+ _symbol->st_shndx == llvm::ELF::SHN_COMMON)
+ return (uint64_t) _symbol->st_size;
return _contentData.size();
}
@@ -229,8 +246,22 @@ public:
if (_symbol->getBinding() == llvm::ELF::STB_WEAK)
return mergeAsWeak;
- if ((_symbol->getType() == llvm::ELF::STT_COMMON)
- || _symbol->st_shndx == llvm::ELF::SHN_COMMON)
+ // If the symbol is a target defined and if the target
+ // defines the symbol as a common symbol treat it as
+ // mergeTentative
+ if ((_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
+ _symbol->st_shndx < llvm::ELF::SHN_HIPROC)) {
+ if (!_targetAtomHandler) {
+ const ELFTargetInfo &eti = (_owningFile.getTargetInfo());
+ TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
+ _targetAtomHandler = &TargetHandler.targetAtomHandler();
+ }
+ if (_targetAtomHandler->getType(_symbol) == llvm::ELF::STT_COMMON)
+ return mergeAsTentative;
+ }
+
+ if ((_symbol->getType() == llvm::ELF::STT_COMMON) ||
+ _symbol->st_shndx == llvm::ELF::SHN_COMMON)
return mergeAsTentative;
return mergeNo;
@@ -240,15 +271,16 @@ public:
ContentType ret = typeUnknown;
uint64_t flags = _section->sh_flags;
- if (_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
- _symbol->st_shndx < llvm::ELF::SHN_HIPROC) {
- const ELFTargetInfo &eti =
- (_owningFile.getTargetInfo());
- TargetHandler<ELFT> &TargetHandler =
- eti.getTargetHandler<ELFT>();
- TargetAtomHandler<ELFT> &elfAtomHandler =
- TargetHandler.targetAtomHandler();
- return elfAtomHandler.contentType(this);
+ // Treat target defined symbols
+ if ((_section->sh_flags & llvm::ELF::SHF_MASKPROC) ||
+ ((_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
+ _symbol->st_shndx < llvm::ELF::SHN_HIPROC))) {
+ if (!_targetAtomHandler) {
+ const ELFTargetInfo &eti = (_owningFile.getTargetInfo());
+ TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
+ _targetAtomHandler = &TargetHandler.targetAtomHandler();
+ }
+ return _targetAtomHandler->contentType(this);
}
if (_section->sh_flags ==
@@ -303,8 +335,21 @@ public:
virtual Alignment alignment() const {
// Unallocated common symbols specify their alignment constraints in
// st_value.
- if ((_symbol->getType() == llvm::ELF::STT_COMMON)
- || _symbol->st_shndx == llvm::ELF::SHN_COMMON) {
+
+ // Treat target defined common symbols
+ if ((_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
+ _symbol->st_shndx < llvm::ELF::SHN_HIPROC)) {
+ if (!_targetAtomHandler) {
+ const ELFTargetInfo &eti = (_owningFile.getTargetInfo());
+ TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
+ _targetAtomHandler = &TargetHandler.targetAtomHandler();
+ }
+ if (_targetAtomHandler->getType(_symbol) == llvm::ELF::STT_COMMON)
+ return Alignment(llvm::Log2_64(_symbol->st_value));
+ }
+
+ if ((_symbol->getType() == llvm::ELF::STT_COMMON) ||
+ _symbol->st_shndx == llvm::ELF::SHN_COMMON) {
return Alignment(llvm::Log2_64(_symbol->st_value));
}
return Alignment(llvm::Log2_64(_section->sh_addralign),
@@ -439,6 +484,8 @@ private:
unsigned int _referenceStartIndex;
unsigned int _referenceEndIndex;
std::vector<ELFReference<ELFT> *> &_referenceList;
+ // Cached size of the TLS segment.
+ mutable TargetAtomHandler<ELFT> *_targetAtomHandler;
};
/// \brief This atom stores mergeable Strings
Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Fri Feb 22 11:18:53 2013
@@ -293,12 +293,13 @@ Layout::SectionOrder DefaultLayout<ELFT>
case DefinedAtom::typeConstant:
return ORDER_RODATA;
-
+
case DefinedAtom::typeData:
+ case DefinedAtom::typeDataFast:
return llvm::StringSwitch<Reference::Kind>(name)
- .StartsWith(".init_array", ORDER_INIT_ARRAY)
- .Default(ORDER_DATA);
-
+ .StartsWith(".init_array", ORDER_INIT_ARRAY)
+ .Default(ORDER_DATA);
+
case DefinedAtom::typeZeroFill:
return ORDER_BSS;
Modified: lld/trunk/lib/ReaderWriter/ELF/File.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/File.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/File.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/File.h Fri Feb 22 11:18:53 2013
@@ -358,18 +358,16 @@ public:
bool isCommon = (*si)->getType() == llvm::ELF::STT_COMMON ||
(*si)->st_shndx == llvm::ELF::SHN_COMMON;
- DefinedAtom::ContentType c;
-
- if (((*si)->st_shndx >= llvm::ELF::SHN_LOPROC) &&
- ((*si)->st_shndx <= llvm::ELF::SHN_HIPROC)) {
+ if ((section && section->sh_flags & llvm::ELF::SHF_MASKPROC) ||
+ (((*si)->st_shndx >= llvm::ELF::SHN_LOPROC) &&
+ ((*si)->st_shndx <= llvm::ELF::SHN_HIPROC))) {
TargetHandler<ELFT> &TargetHandler =
- _elfTargetInfo.getTargetHandler<ELFT>();
+ _elfTargetInfo.template getTargetHandler<ELFT>();
TargetAtomHandler<ELFT> &elfAtomHandler =
TargetHandler.targetAtomHandler();
- c = elfAtomHandler.contentType(*si);
+ int64_t targetSymType = elfAtomHandler.getType(*si);
- if (c == DefinedAtom::typeZeroFill ||
- c == DefinedAtom::typeTLVInitialZeroFill)
+ if (targetSymType == llvm::ELF::STT_COMMON)
isCommon = true;
}
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Fri Feb 22 11:18:53 2013
@@ -11,6 +11,7 @@
#define LLD_READER_WRITER_ELF_HEXAGON_TARGET_HANDLER_H
#include "DefaultTargetHandler.h"
+#include "ExecutableAtoms.h"
#include "HexagonRelocationHandler.h"
#include "TargetLayout.h"
@@ -19,8 +20,64 @@ namespace elf {
typedef llvm::object::ELFType<llvm::support::little, 4, false> HexagonELFType;
class HexagonTargetInfo;
-class HexagonTargetHandler LLVM_FINAL
- : public DefaultTargetHandler<HexagonELFType> {
+
+/// \brief Handle Hexagon specific Atoms
+template <class HexagonELFType>
+class HexagonTargetAtomHandler LLVM_FINAL :
+ public TargetAtomHandler<HexagonELFType> {
+ typedef llvm::object::Elf_Sym_Impl<HexagonELFType> Elf_Sym;
+ typedef llvm::object::Elf_Shdr_Impl<HexagonELFType> Elf_Shdr;
+public:
+
+ virtual DefinedAtom::ContentType
+ contentType(const ELFDefinedAtom<HexagonELFType> *atom) const {
+ return contentType(atom->section(), atom->symbol());
+ }
+
+ virtual DefinedAtom::ContentType
+ contentType(const Elf_Shdr *section, const Elf_Sym *sym) const {
+ switch (sym->st_shndx) {
+ // Common symbols
+ case llvm::ELF::SHN_HEXAGON_SCOMMON:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_1:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_2:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_4:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_8:
+ return DefinedAtom::typeZeroFill;
+
+ default:
+ if (section->sh_flags & llvm::ELF::SHF_HEX_GPREL)
+ return DefinedAtom::typeDataFast;
+ else
+ llvm_unreachable("unknown symbol type");
+ }
+ }
+
+ virtual DefinedAtom::ContentPermissions
+ contentPermissions(const ELFDefinedAtom<HexagonELFType> *atom) const {
+ // All of the hexagon specific symbols belong in the data segment
+ return DefinedAtom::permRW_;
+ }
+
+ virtual int64_t getType(const Elf_Sym *sym) const {
+ switch (sym->st_shndx) {
+ // Common symbols
+ case llvm::ELF::SHN_HEXAGON_SCOMMON:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_1:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_2:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_4:
+ case llvm::ELF::SHN_HEXAGON_SCOMMON_8:
+ return llvm::ELF::STT_COMMON;
+
+ default:
+ return sym->getType();
+ }
+ }
+};
+
+/// \brief TargetHandler for Hexagon
+class HexagonTargetHandler LLVM_FINAL :
+ public DefaultTargetHandler<HexagonELFType> {
public:
HexagonTargetHandler(HexagonTargetInfo &targetInfo);
@@ -28,6 +85,10 @@ public:
return _targetLayout;
}
+ virtual TargetAtomHandler<HexagonELFType> &targetAtomHandler() {
+ return _targetAtomHandler;
+ }
+
virtual const HexagonTargetRelocationHandler &getRelocationHandler() const {
return _relocationHandler;
}
@@ -35,6 +96,7 @@ public:
private:
HexagonTargetRelocationHandler _relocationHandler;
TargetLayout<HexagonELFType> _targetLayout;
+ HexagonTargetAtomHandler<HexagonELFType> _targetAtomHandler;
};
} // end namespace elf
} // end namespace lld
Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Fri Feb 22 11:18:53 2013
@@ -113,6 +113,7 @@ public:
this->setOrder(order);
switch (contentType) {
case DefinedAtom::typeCode:
+ case DefinedAtom::typeDataFast:
case DefinedAtom::typeData:
case DefinedAtom::typeConstant:
case DefinedAtom::typeGOT:
@@ -153,7 +154,7 @@ public:
// \brief Append an atom to a Section. The atom gets pushed into a vector
// contains the atom, the atom file offset, the atom virtual address
// the atom file offset is aligned appropriately as set by the Reader
- const AtomLayout &appendAtom(const Atom *atom);
+ virtual const AtomLayout &appendAtom(const Atom *atom);
/// \brief Set the virtual address of each Atom in the Section. This
/// routine gets called after the linker fixes up the virtual address
@@ -261,6 +262,7 @@ const AtomLayout &AtomSection<ELFT>::app
case DefinedAtom::typeStub:
case DefinedAtom::typeResolver:
case DefinedAtom::typeTLVInitialData:
+ case DefinedAtom::typeDataFast:
_atoms.push_back(new (_alloc) AtomLayout(atom, fOffset, 0));
this->_fsize = fOffset + definedAtom->size();
this->_msize = mOffset + definedAtom->size();
@@ -600,6 +602,7 @@ void SymbolTable<ELFT>::addSymbol(const
symbol->st_value = addr;
type = llvm::ELF::STT_GNU_IFUNC;
break;
+ case DefinedAtom::typeDataFast:
case DefinedAtom::typeData:
case DefinedAtom::typeConstant:
case DefinedAtom::typeGOT:
Modified: lld/trunk/lib/ReaderWriter/ELF/TargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/TargetHandler.h?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/TargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/TargetHandler.h Fri Feb 22 11:18:53 2013
@@ -44,14 +44,16 @@ template <class ELFT> class TargetLayout
/// type of atom and its permissions
template <class ELFT> class TargetAtomHandler {
public:
+ typedef llvm::object::Elf_Shdr_Impl<ELFT> Elf_Shdr;
typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
- virtual DefinedAtom::ContentType contentType(
- const ELFDefinedAtom<ELFT> *atom) const {
+ virtual DefinedAtom::ContentType
+ contentType(const ELFDefinedAtom<ELFT> *atom) const {
return atom->contentType();
}
- virtual DefinedAtom::ContentType contentType(const Elf_Sym *sym) const {
+ virtual DefinedAtom::ContentType
+ contentType(const Elf_Shdr *shdr, const Elf_Sym *sym) const {
return DefinedAtom::typeZeroFill;
}
@@ -60,6 +62,9 @@ public:
return atom->permissions();
}
+ virtual int64_t getType(const Elf_Sym *sym) const {
+ return llvm::ELF::STT_NOTYPE;
+ }
};
template <class ELFT> class TargetRelocationHandler {
Modified: lld/trunk/lib/ReaderWriter/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Writer.cpp?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Writer.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Writer.cpp Fri Feb 22 11:18:53 2013
@@ -235,6 +235,7 @@ template<class ELFT>
error_code
ExecutableWriter<ELFT>::writeFile(const File &file, StringRef path) {
buildChunks(file);
+
// Create the default sections like the symbol table, string table, and the
// section string table
createDefaultSections();
Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
+++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Fri Feb 22 11:18:53 2013
@@ -395,14 +395,11 @@ struct ScalarEnumerationTraits<lld::Defi
lld::DefinedAtom::typeCode);
io.enumCase(value, "stub",
lld::DefinedAtom::typeStub);
- io.enumCase(value, "constant",
- lld::DefinedAtom::typeConstant);
- io.enumCase(value, "data",
- lld::DefinedAtom::typeData);
- io.enumCase(value, "zero-fill",
- lld::DefinedAtom::typeZeroFill);
- io.enumCase(value, "const-data",
- lld::DefinedAtom::typeConstData);
+ io.enumCase(value, "constant", lld::DefinedAtom::typeConstant);
+ io.enumCase(value, "data", lld::DefinedAtom::typeData);
+ io.enumCase(value, "quick-data", lld::DefinedAtom::typeDataFast);
+ io.enumCase(value, "zero-fill", lld::DefinedAtom::typeZeroFill);
+ io.enumCase(value, "const-data", lld::DefinedAtom::typeConstData);
io.enumCase(value, "got",
lld::DefinedAtom::typeGOT);
io.enumCase(value, "resolver",
Added: lld/trunk/test/elf/Inputs/quickdata-test.elf-hexagon
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/quickdata-test.elf-hexagon?rev=175901&view=auto
==============================================================================
Binary file - no diff available.
Propchange: lld/trunk/test/elf/Inputs/quickdata-test.elf-hexagon
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: lld/trunk/test/elf/branch.objtxt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/branch.objtxt?rev=175901&r1=175900&r2=175901&view=diff
==============================================================================
--- lld/trunk/test/elf/branch.objtxt (original)
+++ lld/trunk/test/elf/branch.objtxt Fri Feb 22 11:18:53 2013
@@ -1,4 +1,4 @@
-RUN: lld-core -reader ELF %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon | FileCheck %s -check-prefix hexagon-yaml
+RUN: lld-core -arch hexagon -reader ELF %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon | FileCheck %s -check-prefix hexagon-yaml
RUN: lld-core -arch hexagon -reader ELF -writer ELF -o %t1 %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon
RUN: elf-dump %t1 | FileCheck -check-prefix=hexagon-elfdump %s
Added: lld/trunk/test/elf/quickdata.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/quickdata.test?rev=175901&view=auto
==============================================================================
--- lld/trunk/test/elf/quickdata.test (added)
+++ lld/trunk/test/elf/quickdata.test Fri Feb 22 11:18:53 2013
@@ -0,0 +1,14 @@
+RUN: lld-core -arch hexagon -reader ELF %p/Inputs/quickdata-test.elf-hexagon | FileCheck %s -check-prefix hexagon
+
+hexagon: - name: init
+hexagon: scope: global
+hexagon: type: quick-data
+hexagon: - name: bss1
+hexagon: scope: global
+hexagon: type: quick-data
+hexagon: - name: ac1
+hexagon: scope: global
+hexagon: type: zero-fill
+hexagon: size: 1
+hexagon: merge: as-tentative
+hexagon: permissions: ---
More information about the llvm-commits
mailing list