mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +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:
@@ -1,4 +1,3 @@
|
||||
//===- lib/MC/MCMachOStreamer.cpp - Mach-O Object Output ------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@@ -33,6 +32,8 @@ class MCMachOStreamer : public MCObjectStreamer {
|
||||
private:
|
||||
virtual void EmitInstToData(const MCInst &Inst);
|
||||
|
||||
void EmitDataRegion(DataRegionData::KindTy Kind);
|
||||
void EmitDataRegionEnd();
|
||||
public:
|
||||
MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter)
|
||||
@@ -46,6 +47,7 @@ public:
|
||||
virtual void EmitEHSymAttributes(const MCSymbol *Symbol,
|
||||
MCSymbol *EHSymbol);
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitDataRegion(MCDataRegionType Kind);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
@@ -138,6 +140,26 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
SD.setFlags(SD.getFlags() & ~SF_ReferenceTypeMask);
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitDataRegion(DataRegionData::KindTy Kind) {
|
||||
// Create a temporary label to mark the start of the data region.
|
||||
MCSymbol *Start = getContext().CreateTempSymbol();
|
||||
EmitLabel(Start);
|
||||
// Record the region for the object writer to use.
|
||||
DataRegionData Data = { Kind, Start, NULL };
|
||||
std::vector<DataRegionData> &Regions = getAssembler().getDataRegions();
|
||||
Regions.push_back(Data);
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitDataRegionEnd() {
|
||||
std::vector<DataRegionData> &Regions = getAssembler().getDataRegions();
|
||||
assert(Regions.size() && "Mismatched .end_data_region!");
|
||||
DataRegionData &Data = Regions.back();
|
||||
assert(Data.End == NULL && "Mismatched .end_data_region!");
|
||||
// Create a temporary label to mark the end of the data region.
|
||||
Data.End = getContext().CreateTempSymbol();
|
||||
EmitLabel(Data.End);
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
// Let the target do whatever target specific stuff it needs to do.
|
||||
getAssembler().getBackend().handleAssemblerFlag(Flag);
|
||||
@@ -153,6 +175,26 @@ void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
}
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitDataRegion(MCDataRegionType Kind) {
|
||||
switch (Kind) {
|
||||
case MCDR_DataRegion:
|
||||
EmitDataRegion(DataRegionData::Data);
|
||||
return;
|
||||
case MCDR_DataRegionJT8:
|
||||
EmitDataRegion(DataRegionData::JumpTable8);
|
||||
return;
|
||||
case MCDR_DataRegionJT16:
|
||||
EmitDataRegion(DataRegionData::JumpTable16);
|
||||
return;
|
||||
case MCDR_DataRegionJT32:
|
||||
EmitDataRegion(DataRegionData::JumpTable32);
|
||||
return;
|
||||
case MCDR_DataRegionEnd:
|
||||
EmitDataRegionEnd();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitThumbFunc(MCSymbol *Symbol) {
|
||||
// Remember that the function is a thumb function. Fixup and relocation
|
||||
// values will need adjusted.
|
||||
|
Reference in New Issue
Block a user