mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
MC'ize the '.code 16' and '.thumb_func' ARM directives.
llvm-svn: 118301
This commit is contained in:
parent
f26ea37db7
commit
bbef2c5fcc
@ -44,7 +44,8 @@ enum MCSymbolAttr {
|
||||
|
||||
enum MCAssemblerFlag {
|
||||
MCAF_SyntaxUnified, ///< .syntax (ARM/ELF)
|
||||
MCAF_SubsectionsViaSymbols ///< .subsections_via_symbols (MachO)
|
||||
MCAF_SubsectionsViaSymbols, ///< .subsections_via_symbols (MachO)
|
||||
MCAF_Code16 ///< .code 16
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -126,6 +126,10 @@ namespace llvm {
|
||||
/// EmitAssemblerFlag - Note in the output the specified @p Flag
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0;
|
||||
|
||||
/// EmitThumbFunc - Note in the output that the specified @p Func is
|
||||
/// a Thumb mode function (ARM target only).
|
||||
virtual void EmitThumbFunc(MCSymbol *Func) = 0;
|
||||
|
||||
/// EmitAssignment - Emit an assignment of @p Value to @p Symbol.
|
||||
///
|
||||
/// This corresponds to an assembler statement such as:
|
||||
|
@ -111,6 +111,7 @@ public:
|
||||
virtual void EmitLabel(MCSymbol *Symbol);
|
||||
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
||||
@ -253,10 +254,20 @@ void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
default: assert(0 && "Invalid flag!");
|
||||
case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break;
|
||||
case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
|
||||
case MCAF_Code16: OS << "\t.code\t16"; break;
|
||||
}
|
||||
EmitEOL();
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||
// This needs to emit to a temporary string to get properly quoted
|
||||
// MCSymbols when they have spaces in them.
|
||||
OS << "\t.thumb_func";
|
||||
if (Func)
|
||||
OS << '\t' << *Func;
|
||||
EmitEOL();
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||
OS << *Symbol << " = " << *Value;
|
||||
EmitEOL();
|
||||
|
@ -49,6 +49,7 @@ public:
|
||||
virtual void InitSections();
|
||||
virtual void EmitLabel(MCSymbol *Symbol);
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
@ -178,7 +179,8 @@ void MCELFStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
|
||||
void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
switch (Flag) {
|
||||
case MCAF_SyntaxUnified: return; // no-op here?
|
||||
case MCAF_SyntaxUnified: return; // no-op here.
|
||||
case MCAF_Code16: return; // no-op here.
|
||||
case MCAF_SubsectionsViaSymbols:
|
||||
getAssembler().setSubsectionsViaSymbols(true);
|
||||
return;
|
||||
@ -187,6 +189,10 @@ void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
assert(0 && "invalid assembler flag!");
|
||||
}
|
||||
|
||||
void MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||
// FIXME: Anything needed here to flag the function as thumb?
|
||||
}
|
||||
|
||||
void MCELFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
||||
// MCObjectStreamer.
|
||||
|
@ -69,6 +69,11 @@ public:
|
||||
return Child->EmitAssemblerFlag(Flag);
|
||||
}
|
||||
|
||||
virtual void EmitThumbFunc(MCSymbol *Func) {
|
||||
LogCall("EmitThumbFunc");
|
||||
return Child->EmitThumbFunc(Func);
|
||||
}
|
||||
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||
LogCall("EmitAssignment");
|
||||
return Child->EmitAssignment(Symbol, Value);
|
||||
|
@ -45,6 +45,7 @@ public:
|
||||
virtual void InitSections();
|
||||
virtual void EmitLabel(MCSymbol *Symbol);
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
@ -149,7 +150,8 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
|
||||
|
||||
void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
switch (Flag) {
|
||||
case MCAF_SyntaxUnified: return; // no-op here.
|
||||
case MCAF_SyntaxUnified: return; // no-op here.
|
||||
case MCAF_Code16: return; // no-op here.
|
||||
case MCAF_SubsectionsViaSymbols:
|
||||
getAssembler().setSubsectionsViaSymbols(true);
|
||||
return;
|
||||
@ -158,6 +160,10 @@ void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
}
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||
// FIXME: Flag the function ISA as thumb with DW_AT_APPLE_isa.
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
||||
// MCObjectStreamer.
|
||||
|
@ -40,6 +40,7 @@ namespace {
|
||||
}
|
||||
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {}
|
||||
virtual void EmitThumbFunc(MCSymbol *Func) {}
|
||||
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
|
||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){}
|
||||
|
@ -51,6 +51,7 @@ public:
|
||||
virtual void InitSections();
|
||||
virtual void EmitLabel(MCSymbol *Symbol);
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
@ -202,6 +203,10 @@ void WinCOFFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
llvm_unreachable("not implemented");
|
||||
}
|
||||
|
||||
void WinCOFFStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||
llvm_unreachable("not implemented");
|
||||
}
|
||||
|
||||
void WinCOFFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||
assert((Symbol->isInSection()
|
||||
? Symbol->getSection().getVariant() == MCSection::SV_COFF
|
||||
|
@ -299,17 +299,8 @@ namespace {
|
||||
|
||||
void ARMAsmPrinter::EmitFunctionEntryLabel() {
|
||||
if (AFI->isThumbFunction()) {
|
||||
OutStreamer.EmitRawText(StringRef("\t.code\t16"));
|
||||
if (!Subtarget->isTargetDarwin())
|
||||
OutStreamer.EmitRawText(StringRef("\t.thumb_func"));
|
||||
else {
|
||||
// This needs to emit to a temporary string to get properly quoted
|
||||
// MCSymbols when they have spaces in them.
|
||||
SmallString<128> Tmp;
|
||||
raw_svector_ostream OS(Tmp);
|
||||
OS << "\t.thumb_func\t" << *CurrentFnSym;
|
||||
OutStreamer.EmitRawText(OS.str());
|
||||
}
|
||||
OutStreamer.EmitAssemblerFlag(MCAF_Code16);
|
||||
OutStreamer.EmitThumbFunc(Subtarget->isTargetDarwin()? CurrentFnSym : 0);
|
||||
}
|
||||
|
||||
OutStreamer.EmitLabel(CurrentFnSym);
|
||||
|
Loading…
Reference in New Issue
Block a user