forked from OSchip/llvm-project
MachO: direct-to-object attribute for data-in-code markers.
The target backend can support data-in-code load commands even when the assembler doesn't, or vice-versa. Allow targets to opt-in for direct-to-object. PR13973. llvm-svn: 164974
This commit is contained in:
parent
83c85e4193
commit
745c52dd4e
|
@ -36,6 +36,7 @@ protected: // Can only create subclasses.
|
|||
MCAsmBackend();
|
||||
|
||||
unsigned HasReliableSymbolDifference : 1;
|
||||
unsigned HasDataInCodeSupport : 1;
|
||||
|
||||
public:
|
||||
virtual ~MCAsmBackend();
|
||||
|
@ -65,6 +66,12 @@ public:
|
|||
return HasReliableSymbolDifference;
|
||||
}
|
||||
|
||||
/// hasDataInCodeSupport - Check whether this target implements data-in-code
|
||||
/// markers. If not, data region directives will be ignored.
|
||||
bool hasDataInCodeSupport() const {
|
||||
return HasDataInCodeSupport;
|
||||
}
|
||||
|
||||
/// doesSectionRequireSymbols - Check whether the given section requires that
|
||||
/// all symbols (even temporaries) have symbol table entries.
|
||||
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
|
||||
|
|
|
@ -12,12 +12,9 @@
|
|||
using namespace llvm;
|
||||
|
||||
MCAsmBackend::MCAsmBackend()
|
||||
: HasReliableSymbolDifference(false)
|
||||
{
|
||||
}
|
||||
: HasReliableSymbolDifference(false), HasDataInCodeSupport(false) {}
|
||||
|
||||
MCAsmBackend::~MCAsmBackend() {
|
||||
}
|
||||
MCAsmBackend::~MCAsmBackend() {}
|
||||
|
||||
const MCFixupKindInfo &
|
||||
MCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
|
||||
|
|
|
@ -139,6 +139,8 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
|
|||
}
|
||||
|
||||
void MCMachOStreamer::EmitDataRegion(DataRegionData::KindTy Kind) {
|
||||
if (!getAssembler().getBackend().hasDataInCodeSupport())
|
||||
return;
|
||||
// Create a temporary label to mark the start of the data region.
|
||||
MCSymbol *Start = getContext().CreateTempSymbol();
|
||||
EmitLabel(Start);
|
||||
|
@ -149,6 +151,8 @@ void MCMachOStreamer::EmitDataRegion(DataRegionData::KindTy Kind) {
|
|||
}
|
||||
|
||||
void MCMachOStreamer::EmitDataRegionEnd() {
|
||||
if (!getAssembler().getBackend().hasDataInCodeSupport())
|
||||
return;
|
||||
std::vector<DataRegionData> &Regions = getAssembler().getDataRegions();
|
||||
assert(Regions.size() && "Mismatched .end_data_region!");
|
||||
DataRegionData &Data = Regions.back();
|
||||
|
|
|
@ -593,7 +593,9 @@ public:
|
|||
const object::mach::CPUSubtypeARM Subtype;
|
||||
DarwinARMAsmBackend(const Target &T, const StringRef TT,
|
||||
object::mach::CPUSubtypeARM st)
|
||||
: ARMAsmBackend(T, TT), Subtype(st) { }
|
||||
: ARMAsmBackend(T, TT), Subtype(st) {
|
||||
HasDataInCodeSupport = true;
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createARMMachObjectWriter(OS, /*Is64Bit=*/false,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
config.suffixes = ['.s']
|
||||
config.suffixes = ['.s', '.ll']
|
||||
|
||||
targets = set(config.root.targets_to_build.split())
|
||||
if not 'X86' in targets:
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
; RUN: llc -O0 -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | macho-dump | FileCheck %s
|
||||
|
||||
; There should not be a data-in-code load command (type 0x29) for x86_64
|
||||
; jump tables, even though they are in the text section.
|
||||
; CHECK: 'num_load_commands'
|
||||
; CHECK-NOT: (('command', 41)
|
||||
|
||||
define void @foo(i32* %ptr) nounwind ssp {
|
||||
%tmp = load i32* %ptr, align 4
|
||||
switch i32 %tmp, label %default [
|
||||
i32 11, label %bb0
|
||||
i32 10, label %bb1
|
||||
i32 8, label %bb2
|
||||
i32 4, label %bb3
|
||||
i32 2, label %bb4
|
||||
i32 6, label %bb5
|
||||
i32 9, label %bb6
|
||||
i32 15, label %bb7
|
||||
i32 1, label %bb8
|
||||
i32 3, label %bb9
|
||||
i32 5, label %bb10
|
||||
i32 30, label %bb11
|
||||
i32 31, label %bb12
|
||||
i32 13, label %bb13
|
||||
i32 14, label %bb14
|
||||
i32 20, label %bb15
|
||||
i32 19, label %bb16
|
||||
i32 17, label %bb17
|
||||
i32 18, label %bb18
|
||||
i32 21, label %bb19
|
||||
i32 22, label %bb20
|
||||
i32 16, label %bb21
|
||||
i32 24, label %bb22
|
||||
i32 25, label %bb23
|
||||
i32 26, label %bb24
|
||||
i32 27, label %bb25
|
||||
i32 28, label %bb26
|
||||
i32 23, label %bb27
|
||||
i32 12, label %bb28
|
||||
]
|
||||
|
||||
default:
|
||||
br label %exit
|
||||
bb0:
|
||||
br label %exit
|
||||
bb1:
|
||||
br label %exit
|
||||
bb2:
|
||||
br label %exit
|
||||
bb3:
|
||||
br label %exit
|
||||
bb4:
|
||||
br label %exit
|
||||
bb5:
|
||||
br label %exit
|
||||
bb6:
|
||||
br label %exit
|
||||
bb7:
|
||||
br label %exit
|
||||
bb8:
|
||||
br label %exit
|
||||
bb9:
|
||||
br label %exit
|
||||
bb10:
|
||||
br label %exit
|
||||
bb11:
|
||||
br label %exit
|
||||
bb12:
|
||||
br label %exit
|
||||
bb13:
|
||||
br label %exit
|
||||
bb14:
|
||||
br label %exit
|
||||
bb15:
|
||||
br label %exit
|
||||
bb16:
|
||||
br label %exit
|
||||
bb17:
|
||||
br label %exit
|
||||
bb18:
|
||||
br label %exit
|
||||
bb19:
|
||||
br label %exit
|
||||
bb20:
|
||||
br label %exit
|
||||
bb21:
|
||||
br label %exit
|
||||
bb22:
|
||||
br label %exit
|
||||
bb23:
|
||||
br label %exit
|
||||
bb24:
|
||||
br label %exit
|
||||
bb25:
|
||||
br label %exit
|
||||
bb26:
|
||||
br label %exit
|
||||
bb27:
|
||||
br label %exit
|
||||
bb28:
|
||||
br label %exit
|
||||
|
||||
|
||||
exit:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue