diff options
author | Shankar Easwaran <shankare@codeaurora.org> | 2013-02-24 16:02:24 +0000 |
---|---|---|
committer | Shankar Easwaran <shankare@codeaurora.org> | 2013-02-24 16:02:24 +0000 |
commit | 596b40871a22973873da21fecb1f45e32ebbfcdc (patch) | |
tree | 2701aaa4452ee74a55777dfa790693358ddbc0d1 | |
parent | e08de3790256134ada4cf1c95b6fe038ab5e16d3 (diff) | |
download | bcm5719-llvm-596b40871a22973873da21fecb1f45e32ebbfcdc.tar.gz bcm5719-llvm-596b40871a22973873da21fecb1f45e32ebbfcdc.zip |
[ELF][Hexagon] add _SDA_BASE_(absolute symbol pointing to start of quickdata)
llvm-svn: 175997
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h | 31 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h | 1 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h | 22 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Writer.cpp | 3 | ||||
-rw-r--r-- | lld/test/elf/Hexagon/Inputs/sda-base.o | bin | 0 -> 1469 bytes | |||
-rw-r--r-- | lld/test/elf/Hexagon/sda-base.test | 4 |
7 files changed, 61 insertions, 2 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h new file mode 100644 index 00000000000..42a0b66e273 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h @@ -0,0 +1,31 @@ +//===- lib/ReaderWriter/ELF/Hexagon/HexagonExecutableAtoms.h --------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLD_READER_WRITER_ELF_HEXAGON_EXECUTABLE_ATOM_H +#define LLD_READER_WRITER_ELF_HEXAGON_EXECUTABLE_ATOM_H + +#include "ExecutableAtoms.h" + +namespace lld { +namespace elf { +typedef llvm::object::ELFType<llvm::support::little, 4, false> HexagonELFType; +class HexagonTargetInfo; + +template <class HexagonELFType> class HexagonRuntimeFile + : public CRuntimeFile<HexagonELFType> { +public: + HexagonRuntimeFile(const HexagonTargetInfo &hti) + :CRuntimeFile<HexagonELFType>(hti, "Hexagon runtime file") + {} + +}; +} // elf +} // lld + +#endif // LLD_READER_WRITER_ELF_HEXAGON_EXECUTABLE_ATOM_H diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h index ec81e31b0a1..4bbe3b698e7 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h @@ -25,6 +25,7 @@ public: HexagonTargetLayout<HexagonELFType>::ORDER_SDATA) { this->_type = SHT_PROGBITS; this->_flags = SHF_ALLOC | SHF_WRITE; + this->_align2 = 4096; } /// \brief Finalize the section contents before writing diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp index 5118877d2d8..c998a34b6ac 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp @@ -17,5 +17,5 @@ using namespace llvm::ELF; HexagonTargetHandler::HexagonTargetHandler(HexagonTargetInfo &targetInfo) : DefaultTargetHandler(targetInfo), _relocationHandler(targetInfo), - _targetLayout(targetInfo) { + _targetLayout(targetInfo), _hexagonRuntimeFile(targetInfo) { } diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 3efd9403b89..7b319decf0d 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -11,7 +11,7 @@ #define LLD_READER_WRITER_ELF_HEXAGON_TARGET_HANDLER_H #include "DefaultTargetHandler.h" -#include "ExecutableAtoms.h" +#include "HexagonExecutableAtoms.h" #include "HexagonRelocationHandler.h" #include "HexagonSectionChunks.h" #include "TargetLayout.h" @@ -132,6 +132,10 @@ public: return DefaultLayout<HexagonELFType>::getSegmentType(section); } + Section<HexagonELFType> *getSDataSection() const { + return _sdataSection; + } + private: llvm::BumpPtrAllocator _alloc; SDataSection<HexagonELFType> *_sdataSection; @@ -155,10 +159,26 @@ public: return _relocationHandler; } + void addDefaultAtoms() { + _hexagonRuntimeFile.addAbsoluteAtom("_SDA_BASE_"); + } + + virtual void addFiles(InputFiles &inputFiles) { + addDefaultAtoms(); + inputFiles.prependFile(_hexagonRuntimeFile); + } + + void finalizeSymbolValues() { + auto sdabaseAtomIter = _targetLayout.findAbsoluteAtom("_SDA_BASE_"); + (*sdabaseAtomIter)->_virtualAddr = + _targetLayout.getSDataSection()->virtualAddr(); + } + private: HexagonTargetRelocationHandler _relocationHandler; HexagonTargetLayout<HexagonELFType> _targetLayout; HexagonTargetAtomHandler<HexagonELFType> _targetAtomHandler; + HexagonRuntimeFile<HexagonELFType> _hexagonRuntimeFile; }; } // end namespace elf } // end namespace lld diff --git a/lld/lib/ReaderWriter/ELF/Writer.cpp b/lld/lib/ReaderWriter/ELF/Writer.cpp index b5d3b4d3324..1b9fcc862d1 100644 --- a/lld/lib/ReaderWriter/ELF/Writer.cpp +++ b/lld/lib/ReaderWriter/ELF/Writer.cpp @@ -229,6 +229,9 @@ void ExecutableWriter<ELFT>::finalizeDefaultAtomValues() { (*bssEndAtomIter)->_virtualAddr = (*phe)->p_vaddr + (*phe)->p_memsz; (*underScoreEndAtomIter)->_virtualAddr = (*phe)->p_vaddr + (*phe)->p_memsz; (*endAtomIter)->_virtualAddr = (*phe)->p_vaddr + (*phe)->p_memsz; + + // Give a chance for the target to finalize its atom values + _targetHandler.finalizeSymbolValues(); } template <class ELFT> diff --git a/lld/test/elf/Hexagon/Inputs/sda-base.o b/lld/test/elf/Hexagon/Inputs/sda-base.o Binary files differnew file mode 100644 index 00000000000..410a3d47d32 --- /dev/null +++ b/lld/test/elf/Hexagon/Inputs/sda-base.o diff --git a/lld/test/elf/Hexagon/sda-base.test b/lld/test/elf/Hexagon/sda-base.test new file mode 100644 index 00000000000..b7b730e4f73 --- /dev/null +++ b/lld/test/elf/Hexagon/sda-base.test @@ -0,0 +1,4 @@ +RUN: lld-core -arch hexagon -reader ELF %p/Inputs/sda-base.o -writer ELF -o %t1 +RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=sdabase + +sdabase: 00002000 A _SDA_BASE_ |