mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-30 16:17:05 +00:00
This patch improves the MCJIT runtime dynamic loader by adding new handling
of zero-initialized sections, virtual sections and common symbols and preventing the loading of sections which are not required for execution such as debug information. Patch by Andy Kaylor! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154610 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -126,6 +126,10 @@ protected:
|
||||
virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Res) const;
|
||||
virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
|
||||
bool &Result) const;
|
||||
virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
namespace llvm {
|
||||
namespace object {
|
||||
|
||||
// Subclasses of ELFObjectFile may need this for template instantiation
|
||||
inline std::pair<unsigned char, unsigned char>
|
||||
getElfArchType(MemoryBuffer *Object) {
|
||||
if (Object->getBufferSize() < ELF::EI_NIDENT)
|
||||
return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);
|
||||
return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]
|
||||
, (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);
|
||||
}
|
||||
|
||||
// Templates to choose Elf_Addr and Elf_Off depending on is64Bits.
|
||||
template<support::endianness target_endianness>
|
||||
struct ELFDataTypeTypedefHelperCommon {
|
||||
@@ -540,6 +549,10 @@ protected:
|
||||
virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Res) const;
|
||||
virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
|
||||
bool &Result) const;
|
||||
virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
|
||||
@@ -1092,6 +1105,43 @@ error_code ELFObjectFile<target_endianness, is64Bits>
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
template<support::endianness target_endianness, bool is64Bits>
|
||||
error_code ELFObjectFile<target_endianness, is64Bits>
|
||||
::isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
|
||||
if (sec->sh_flags & ELF::SHF_ALLOC)
|
||||
Result = true;
|
||||
else
|
||||
Result = false;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
template<support::endianness target_endianness, bool is64Bits>
|
||||
error_code ELFObjectFile<target_endianness, is64Bits>
|
||||
::isSectionVirtual(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
|
||||
if (sec->sh_type == ELF::SHT_NOBITS)
|
||||
Result = true;
|
||||
else
|
||||
Result = false;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
template<support::endianness target_endianness, bool is64Bits>
|
||||
error_code ELFObjectFile<target_endianness, is64Bits>::isSectionZeroInit(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
|
||||
// For ELF, all zero-init sections are virtual (that is, they occupy no space
|
||||
// in the object image) and vice versa.
|
||||
if (sec->sh_flags & ELF::SHT_NOBITS)
|
||||
Result = true;
|
||||
else
|
||||
Result = false;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
template<support::endianness target_endianness, bool is64Bits>
|
||||
error_code ELFObjectFile<target_endianness, is64Bits>
|
||||
::sectionContainsSymbol(DataRefImpl Sec,
|
||||
|
||||
@@ -72,6 +72,10 @@ protected:
|
||||
virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Res) const;
|
||||
virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
|
||||
virtual error_code sectionContainsSymbol(DataRefImpl DRI, DataRefImpl S,
|
||||
bool &Result) const;
|
||||
virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
|
||||
|
||||
@@ -158,11 +158,16 @@ public:
|
||||
error_code isText(bool &Result) const;
|
||||
error_code isData(bool &Result) const;
|
||||
error_code isBSS(bool &Result) const;
|
||||
error_code isRequiredForExecution(bool &Result) const;
|
||||
error_code isVirtual(bool &Result) const;
|
||||
error_code isZeroInit(bool &Result) const;
|
||||
|
||||
error_code containsSymbol(SymbolRef S, bool &Result) const;
|
||||
|
||||
relocation_iterator begin_relocations() const;
|
||||
relocation_iterator end_relocations() const;
|
||||
|
||||
DataRefImpl getRawDataRefImpl() const;
|
||||
};
|
||||
typedef content_iterator<SectionRef> section_iterator;
|
||||
|
||||
@@ -217,6 +222,9 @@ public:
|
||||
/// Get symbol flags (bitwise OR of SymbolRef::Flags)
|
||||
error_code getFlags(uint32_t &Result) const;
|
||||
|
||||
/// @brief Return true for common symbols such as uninitialized globals
|
||||
error_code isCommon(bool &Result) const;
|
||||
|
||||
/// @brief Get section this symbol is defined in reference to. Result is
|
||||
/// end_sections() if it is undefined or is an absolute symbol.
|
||||
error_code getSection(section_iterator &Result) const;
|
||||
@@ -299,6 +307,11 @@ protected:
|
||||
virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
|
||||
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
|
||||
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
|
||||
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Res) const = 0;
|
||||
// A section is 'virtual' if its contents aren't present in the object image.
|
||||
virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const = 0;
|
||||
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const = 0;
|
||||
virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
|
||||
bool &Result) const = 0;
|
||||
virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0;
|
||||
@@ -481,6 +494,18 @@ inline error_code SectionRef::isBSS(bool &Result) const {
|
||||
return OwningObject->isSectionBSS(SectionPimpl, Result);
|
||||
}
|
||||
|
||||
inline error_code SectionRef::isRequiredForExecution(bool &Result) const {
|
||||
return OwningObject->isSectionRequiredForExecution(SectionPimpl, Result);
|
||||
}
|
||||
|
||||
inline error_code SectionRef::isVirtual(bool &Result) const {
|
||||
return OwningObject->isSectionVirtual(SectionPimpl, Result);
|
||||
}
|
||||
|
||||
inline error_code SectionRef::isZeroInit(bool &Result) const {
|
||||
return OwningObject->isSectionZeroInit(SectionPimpl, Result);
|
||||
}
|
||||
|
||||
inline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
|
||||
return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
|
||||
Result);
|
||||
@@ -494,6 +519,9 @@ inline relocation_iterator SectionRef::end_relocations() const {
|
||||
return OwningObject->getSectionRelEnd(SectionPimpl);
|
||||
}
|
||||
|
||||
inline DataRefImpl SectionRef::getRawDataRefImpl() const {
|
||||
return SectionPimpl;
|
||||
}
|
||||
|
||||
/// RelocationRef
|
||||
inline RelocationRef::RelocationRef(DataRefImpl RelocationP,
|
||||
|
||||
Reference in New Issue
Block a user