mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
Refactor data-in-code annotations.
Use a dedicated MachO load command to annotate data-in-code regions. This is the same format the linker produces for final executable images, allowing consistency of representation and use of introspection tools for both object and executable files. Data-in-code regions are annotated via ".data_region"/".end_data_region" directive pairs, with an optional region type. data_region_directive := ".data_region" { region_type } region_type := "jt8" | "jt16" | "jt32" | "jta32" end_data_region_directive := ".end_data_region" The previous handling of ARM-style "$d.*" labels was broken and has been removed. Specifically, it didn't handle ARM vs. Thumb mode when marking the end of the section. rdar://11459456 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157062 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -21,6 +21,7 @@
|
||||
#include "llvm/MC/MCMachOSymbolFlags.h"
|
||||
#include "llvm/MC/MCValue.h"
|
||||
#include "llvm/Object/MachOFormat.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
||||
#include <vector>
|
||||
@ -351,6 +352,21 @@ void MachObjectWriter::WriteNlist(MachSymbolData &MSD,
|
||||
Write32(Address);
|
||||
}
|
||||
|
||||
void MachObjectWriter::WriteLinkeditLoadCommand(uint32_t Type,
|
||||
uint32_t DataOffset,
|
||||
uint32_t DataSize) {
|
||||
uint64_t Start = OS.tell();
|
||||
(void) Start;
|
||||
|
||||
Write32(Type);
|
||||
Write32(macho::LinkeditLoadCommandSize);
|
||||
Write32(DataOffset);
|
||||
Write32(DataSize);
|
||||
|
||||
assert(OS.tell() - Start == macho::LinkeditLoadCommandSize);
|
||||
}
|
||||
|
||||
|
||||
void MachObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
@ -654,6 +670,13 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
macho::DysymtabLoadCommandSize);
|
||||
}
|
||||
|
||||
// Add the data-in-code load command size, if used.
|
||||
unsigned NumDataRegions = Asm.getDataRegions().size();
|
||||
if (NumDataRegions) {
|
||||
++NumLoadCommands;
|
||||
LoadCommandsSize += macho::LinkeditLoadCommandSize;
|
||||
}
|
||||
|
||||
// Compute the total size of the section data, as well as its file size and vm
|
||||
// size.
|
||||
uint64_t SectionDataStart = (is64Bit() ? macho::Header64Size :
|
||||
@ -701,6 +724,15 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
RelocTableEnd += NumRelocs * macho::RelocationInfoSize;
|
||||
}
|
||||
|
||||
// Write the data-in-code load command, if used.
|
||||
uint64_t DataInCodeTableEnd = RelocTableEnd + NumDataRegions * 8;
|
||||
if (NumDataRegions) {
|
||||
uint64_t DataRegionsOffset = RelocTableEnd;
|
||||
uint64_t DataRegionsSize = NumDataRegions * 8;
|
||||
WriteLinkeditLoadCommand(macho::LCT_DataInCode, DataRegionsOffset,
|
||||
DataRegionsSize);
|
||||
}
|
||||
|
||||
// Write the symbol table load command, if used.
|
||||
if (NumSymbols) {
|
||||
unsigned FirstLocalSymbol = 0;
|
||||
@ -717,10 +749,10 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
|
||||
// If used, the indirect symbols are written after the section data.
|
||||
if (NumIndirectSymbols)
|
||||
IndirectSymbolOffset = RelocTableEnd;
|
||||
IndirectSymbolOffset = DataInCodeTableEnd;
|
||||
|
||||
// The symbol table is written after the indirect symbol data.
|
||||
uint64_t SymbolTableOffset = RelocTableEnd + IndirectSymbolSize;
|
||||
uint64_t SymbolTableOffset = DataInCodeTableEnd + IndirectSymbolSize;
|
||||
|
||||
// The string table is written after symbol table.
|
||||
uint64_t StringTableOffset =
|
||||
@ -760,6 +792,23 @@ void MachObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
}
|
||||
}
|
||||
|
||||
// Write out the data-in-code region payload, if there is one.
|
||||
for (MCAssembler::const_data_region_iterator
|
||||
it = Asm.data_region_begin(), ie = Asm.data_region_end();
|
||||
it != ie; ++it) {
|
||||
const DataRegionData *Data = &(*it);
|
||||
uint64_t Start = getSymbolAddress(&Layout.getAssembler().getSymbolData(*Data->Start), Layout);
|
||||
uint64_t End = getSymbolAddress(&Layout.getAssembler().getSymbolData(*Data->End), Layout);
|
||||
DEBUG(dbgs() << "data in code region-- kind: " << Data->Kind
|
||||
<< " start: " << Start << "(" << Data->Start->getName() << ")"
|
||||
<< " end: " << End << "(" << Data->End->getName() << ")"
|
||||
<< " size: " << End - Start
|
||||
<< "\n");
|
||||
Write32(Start);
|
||||
Write16(End - Start);
|
||||
Write16(Data->Kind);
|
||||
}
|
||||
|
||||
// Write the symbol table data, if used.
|
||||
if (NumSymbols) {
|
||||
// Write the indirect symbol entries.
|
||||
|
Reference in New Issue
Block a user