mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +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:
@ -356,6 +356,27 @@ error_code COFFObjectFile::isSectionBSS(DataRefImpl Sec,
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code COFFObjectFile::isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
// FIXME: Unimplemented
|
||||
Result = true;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code COFFObjectFile::isSectionVirtual(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
const coff_section *sec = toSec(Sec);
|
||||
Result = sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code COFFObjectFile::isSectionZeroInit(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
// FIXME: Unimplemented
|
||||
Result = false;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code COFFObjectFile::sectionContainsSymbol(DataRefImpl Sec,
|
||||
DataRefImpl Symb,
|
||||
bool &Result) const {
|
||||
|
@ -175,7 +175,12 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
|
||||
BeginOffset = Entry->Value;
|
||||
SectionIndex = Entry->SectionIndex;
|
||||
if (!SectionIndex) {
|
||||
Result = UnknownAddressOrSize;
|
||||
uint32_t flags = SymbolRef::SF_None;
|
||||
getSymbolFlags(DRI, flags);
|
||||
if (flags & SymbolRef::SF_Common)
|
||||
Result = Entry->Value;
|
||||
else
|
||||
Result = UnknownAddressOrSize;
|
||||
return object_error::success;
|
||||
}
|
||||
// Unfortunately symbols are unsorted so we need to touch all
|
||||
@ -198,7 +203,12 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
|
||||
BeginOffset = Entry->Value;
|
||||
SectionIndex = Entry->SectionIndex;
|
||||
if (!SectionIndex) {
|
||||
Result = UnknownAddressOrSize;
|
||||
uint32_t flags = SymbolRef::SF_None;
|
||||
getSymbolFlags(DRI, flags);
|
||||
if (flags & SymbolRef::SF_Common)
|
||||
Result = Entry->Value;
|
||||
else
|
||||
Result = UnknownAddressOrSize;
|
||||
return object_error::success;
|
||||
}
|
||||
// Unfortunately symbols are unsorted so we need to touch all
|
||||
@ -265,19 +275,22 @@ error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI,
|
||||
uint32_t &Result) const {
|
||||
uint16_t MachOFlags;
|
||||
uint8_t MachOType;
|
||||
uint8_t MachOSectionIndex;
|
||||
if (MachOObj->is64Bit()) {
|
||||
InMemoryStruct<macho::Symbol64TableEntry> Entry;
|
||||
getSymbol64TableEntry(DRI, Entry);
|
||||
MachOFlags = Entry->Flags;
|
||||
MachOType = Entry->Type;
|
||||
MachOSectionIndex = Entry->SectionIndex;
|
||||
} else {
|
||||
InMemoryStruct<macho::SymbolTableEntry> Entry;
|
||||
getSymbolTableEntry(DRI, Entry);
|
||||
MachOFlags = Entry->Flags;
|
||||
MachOType = Entry->Type;
|
||||
MachOSectionIndex = Entry->SectionIndex;
|
||||
}
|
||||
|
||||
// TODO: Correctly set SF_ThreadLocal and SF_Common.
|
||||
// TODO: Correctly set SF_ThreadLocal
|
||||
Result = SymbolRef::SF_None;
|
||||
|
||||
if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeUndefined)
|
||||
@ -286,8 +299,11 @@ error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI,
|
||||
if (MachOFlags & macho::STF_StabsEntryMask)
|
||||
Result |= SymbolRef::SF_FormatSpecific;
|
||||
|
||||
if (MachOType & MachO::NlistMaskExternal)
|
||||
if (MachOType & MachO::NlistMaskExternal) {
|
||||
Result |= SymbolRef::SF_Global;
|
||||
if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeUndefined)
|
||||
Result |= SymbolRef::SF_Common;
|
||||
}
|
||||
|
||||
if (MachOFlags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef))
|
||||
Result |= SymbolRef::SF_Weak;
|
||||
@ -566,6 +582,37 @@ error_code MachOObjectFile::isSectionBSS(DataRefImpl DRI,
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code MachOObjectFile::isSectionRequiredForExecution(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
// FIXME: Unimplemented
|
||||
Result = true;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code MachOObjectFile::isSectionVirtual(DataRefImpl Sec,
|
||||
bool &Result) const {
|
||||
// FIXME: Unimplemented
|
||||
Result = false;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code MachOObjectFile::isSectionZeroInit(DataRefImpl DRI,
|
||||
bool &Result) const {
|
||||
if (MachOObj->is64Bit()) {
|
||||
InMemoryStruct<macho::Section64> Sect;
|
||||
getSection64(DRI, Sect);
|
||||
Result = (Sect->Flags & MachO::SectionTypeZeroFill ||
|
||||
Sect->Flags & MachO::SectionTypeZeroFillLarge);
|
||||
} else {
|
||||
InMemoryStruct<macho::Section> Sect;
|
||||
getSection(DRI, Sect);
|
||||
Result = (Sect->Flags & MachO::SectionTypeZeroFill ||
|
||||
Sect->Flags & MachO::SectionTypeZeroFillLarge);
|
||||
}
|
||||
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec,
|
||||
DataRefImpl Symb,
|
||||
bool &Result) const {
|
||||
|
Reference in New Issue
Block a user