mirror of
https://github.com/RPCSX/llvm.git
synced 2025-05-13 10:56:01 +00:00
First in a sequence of ARM/MC/*ELF* specific work.
Lifted the EmitRawText calls to ARMAsmPrinter::emitAttribute() Added ARMAsmPrinter::emitAttributes() (plural s). TODO: .cpu attribute needs to be refactored git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115859 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d8e0bfe07a
commit
def9ac48b7
@ -107,6 +107,12 @@ namespace {
|
|||||||
void EmitStartOfAsmFile(Module &M);
|
void EmitStartOfAsmFile(Module &M);
|
||||||
void EmitEndOfAsmFile(Module &M);
|
void EmitEndOfAsmFile(Module &M);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
|
||||||
|
void emitAttributes();
|
||||||
|
void emitAttribute(ARMBuildAttrs::AttrType attr, int v);
|
||||||
|
|
||||||
|
public:
|
||||||
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
|
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
|
||||||
|
|
||||||
MachineLocation getDebugValueLocation(const MachineInstr *MI) const {
|
MachineLocation getDebugValueLocation(const MachineInstr *MI) const {
|
||||||
@ -407,45 +413,8 @@ void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
|||||||
|
|
||||||
// Emit ARM Build Attributes
|
// Emit ARM Build Attributes
|
||||||
if (Subtarget->isTargetELF()) {
|
if (Subtarget->isTargetELF()) {
|
||||||
// CPU Type
|
|
||||||
std::string CPUString = Subtarget->getCPUString();
|
|
||||||
if (CPUString != "generic")
|
|
||||||
OutStreamer.EmitRawText("\t.cpu " + Twine(CPUString));
|
|
||||||
|
|
||||||
// FIXME: Emit FPU type
|
emitAttributes();
|
||||||
if (Subtarget->hasVFP2())
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::VFP_arch) + ", 2");
|
|
||||||
|
|
||||||
// Signal various FP modes.
|
|
||||||
if (!UnsafeFPMath) {
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_FP_denormal) + ", 1");
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_FP_exceptions) + ", 1");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NoInfsFPMath && NoNaNsFPMath)
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_FP_number_model)+ ", 1");
|
|
||||||
else
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_FP_number_model)+ ", 3");
|
|
||||||
|
|
||||||
// 8-bytes alignment stuff.
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_align8_needed) + ", 1");
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_align8_preserved) + ", 1");
|
|
||||||
|
|
||||||
// Hard float. Use both S and D registers and conform to AAPCS-VFP.
|
|
||||||
if (Subtarget->isAAPCS_ABI() && FloatABIType == FloatABI::Hard) {
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_HardFP_use) + ", 3");
|
|
||||||
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
|
||||||
Twine(ARMBuildAttrs::ABI_VFP_args) + ", 1");
|
|
||||||
}
|
|
||||||
// FIXME: Should we signal R9 usage?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,6 +487,58 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Helper routines for EmitStartOfAsmFile() and EmitEndOfAsmFile()
|
||||||
|
// FIXME:
|
||||||
|
// The following seem like one-off assembler flags, but they actually need
|
||||||
|
// to appear in the .ARM.attributes section in ELF.
|
||||||
|
// Instead of subclassing the MCELFStreamer, we do the work here.
|
||||||
|
|
||||||
|
void ARMAsmPrinter::emitAttributes() {
|
||||||
|
// FIXME: Add in ELF specific section handling here.
|
||||||
|
|
||||||
|
// FIXME: unify this: .cpu and CPUString with enum attributes
|
||||||
|
std::string CPUString = Subtarget->getCPUString();
|
||||||
|
if (CPUString != "generic")
|
||||||
|
OutStreamer.EmitRawText("\t.cpu " + Twine(CPUString));
|
||||||
|
|
||||||
|
// FIXME: Emit FPU type
|
||||||
|
if (Subtarget->hasVFP2())
|
||||||
|
emitAttribute(ARMBuildAttrs::VFP_arch, 2);
|
||||||
|
|
||||||
|
// Signal various FP modes.
|
||||||
|
if (!UnsafeFPMath) {
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_FP_denormal, 1);
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NoInfsFPMath && NoNaNsFPMath)
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_FP_number_model, 1);
|
||||||
|
else
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_FP_number_model, 3);
|
||||||
|
|
||||||
|
// 8-bytes alignment stuff.
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_align8_needed, 1);
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_align8_preserved, 1);
|
||||||
|
|
||||||
|
// Hard float. Use both S and D registers and conform to AAPCS-VFP.
|
||||||
|
if (Subtarget->isAAPCS_ABI() && FloatABIType == FloatABI::Hard) {
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_HardFP_use, 3);
|
||||||
|
emitAttribute(ARMBuildAttrs::ABI_VFP_args, 1);
|
||||||
|
}
|
||||||
|
// FIXME: Should we signal R9 usage?
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARMAsmPrinter::emitAttribute(ARMBuildAttrs::AttrType attr, int v) {
|
||||||
|
if (OutStreamer.hasRawTextSupport()) {
|
||||||
|
OutStreamer.EmitRawText("\t.eabi_attribute " +
|
||||||
|
Twine(attr) + ", " + Twine(v));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
assert(0 && "ELF .ARM.attributes unimplemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber,
|
static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber,
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define __TARGET_ARMBUILDATTRS_H__
|
#define __TARGET_ARMBUILDATTRS_H__
|
||||||
|
|
||||||
namespace ARMBuildAttrs {
|
namespace ARMBuildAttrs {
|
||||||
enum {
|
enum AttrType {
|
||||||
File = 1,
|
File = 1,
|
||||||
Section = 2,
|
Section = 2,
|
||||||
Symbol = 3,
|
Symbol = 3,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user