mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-02 17:55:18 +00:00
MC'ize the '.code 16' and '.thumb_func' ARM directives.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118301 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
36fa3ea566
commit
ce79299f78
@ -44,7 +44,8 @@ enum MCSymbolAttr {
|
|||||||
|
|
||||||
enum MCAssemblerFlag {
|
enum MCAssemblerFlag {
|
||||||
MCAF_SyntaxUnified, ///< .syntax (ARM/ELF)
|
MCAF_SyntaxUnified, ///< .syntax (ARM/ELF)
|
||||||
MCAF_SubsectionsViaSymbols ///< .subsections_via_symbols (MachO)
|
MCAF_SubsectionsViaSymbols, ///< .subsections_via_symbols (MachO)
|
||||||
|
MCAF_Code16 ///< .code 16
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
@ -126,6 +126,10 @@ namespace llvm {
|
|||||||
/// EmitAssemblerFlag - Note in the output the specified @p Flag
|
/// EmitAssemblerFlag - Note in the output the specified @p Flag
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0;
|
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.
|
/// EmitAssignment - Emit an assignment of @p Value to @p Symbol.
|
||||||
///
|
///
|
||||||
/// This corresponds to an assembler statement such as:
|
/// This corresponds to an assembler statement such as:
|
||||||
|
@ -111,6 +111,7 @@ public:
|
|||||||
virtual void EmitLabel(MCSymbol *Symbol);
|
virtual void EmitLabel(MCSymbol *Symbol);
|
||||||
|
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||||
|
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
||||||
@ -253,10 +254,20 @@ void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
|||||||
default: assert(0 && "Invalid flag!");
|
default: assert(0 && "Invalid flag!");
|
||||||
case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break;
|
case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break;
|
||||||
case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
|
case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
|
||||||
|
case MCAF_Code16: OS << "\t.code\t16"; break;
|
||||||
}
|
}
|
||||||
EmitEOL();
|
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) {
|
void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||||
OS << *Symbol << " = " << *Value;
|
OS << *Symbol << " = " << *Value;
|
||||||
EmitEOL();
|
EmitEOL();
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
virtual void InitSections();
|
virtual void InitSections();
|
||||||
virtual void EmitLabel(MCSymbol *Symbol);
|
virtual void EmitLabel(MCSymbol *Symbol);
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
||||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||||
@ -178,7 +179,8 @@ void MCELFStreamer::EmitLabel(MCSymbol *Symbol) {
|
|||||||
|
|
||||||
void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||||
switch (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:
|
case MCAF_SubsectionsViaSymbols:
|
||||||
getAssembler().setSubsectionsViaSymbols(true);
|
getAssembler().setSubsectionsViaSymbols(true);
|
||||||
return;
|
return;
|
||||||
@ -187,6 +189,10 @@ void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
|||||||
assert(0 && "invalid assembler 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) {
|
void MCELFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
||||||
// MCObjectStreamer.
|
// MCObjectStreamer.
|
||||||
|
@ -69,6 +69,11 @@ public:
|
|||||||
return Child->EmitAssemblerFlag(Flag);
|
return Child->EmitAssemblerFlag(Flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func) {
|
||||||
|
LogCall("EmitThumbFunc");
|
||||||
|
return Child->EmitThumbFunc(Func);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||||
LogCall("EmitAssignment");
|
LogCall("EmitAssignment");
|
||||||
return Child->EmitAssignment(Symbol, Value);
|
return Child->EmitAssignment(Symbol, Value);
|
||||||
|
@ -45,6 +45,7 @@ public:
|
|||||||
virtual void InitSections();
|
virtual void InitSections();
|
||||||
virtual void EmitLabel(MCSymbol *Symbol);
|
virtual void EmitLabel(MCSymbol *Symbol);
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||||
@ -149,7 +150,8 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
|
|||||||
|
|
||||||
void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||||
switch (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:
|
case MCAF_SubsectionsViaSymbols:
|
||||||
getAssembler().setSubsectionsViaSymbols(true);
|
getAssembler().setSubsectionsViaSymbols(true);
|
||||||
return;
|
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) {
|
void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||||
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
// TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
|
||||||
// MCObjectStreamer.
|
// MCObjectStreamer.
|
||||||
|
@ -40,6 +40,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {}
|
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {}
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func) {}
|
||||||
|
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
|
||||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){}
|
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol){}
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
virtual void InitSections();
|
virtual void InitSections();
|
||||||
virtual void EmitLabel(MCSymbol *Symbol);
|
virtual void EmitLabel(MCSymbol *Symbol);
|
||||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||||
|
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||||
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
|
||||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||||
@ -202,6 +203,10 @@ void WinCOFFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
|||||||
llvm_unreachable("not implemented");
|
llvm_unreachable("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WinCOFFStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||||
|
llvm_unreachable("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
void WinCOFFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
void WinCOFFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
|
||||||
assert((Symbol->isInSection()
|
assert((Symbol->isInSection()
|
||||||
? Symbol->getSection().getVariant() == MCSection::SV_COFF
|
? Symbol->getSection().getVariant() == MCSection::SV_COFF
|
||||||
|
@ -299,17 +299,8 @@ namespace {
|
|||||||
|
|
||||||
void ARMAsmPrinter::EmitFunctionEntryLabel() {
|
void ARMAsmPrinter::EmitFunctionEntryLabel() {
|
||||||
if (AFI->isThumbFunction()) {
|
if (AFI->isThumbFunction()) {
|
||||||
OutStreamer.EmitRawText(StringRef("\t.code\t16"));
|
OutStreamer.EmitAssemblerFlag(MCAF_Code16);
|
||||||
if (!Subtarget->isTargetDarwin())
|
OutStreamer.EmitThumbFunc(Subtarget->isTargetDarwin()? CurrentFnSym : 0);
|
||||||
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.EmitLabel(CurrentFnSym);
|
OutStreamer.EmitLabel(CurrentFnSym);
|
||||||
|
Loading…
Reference in New Issue
Block a user