diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 4ad13d76d84..f0be77f70a7 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -139,6 +139,7 @@ public: StringRef StringValue = ""); virtual void emitFPU(unsigned FPU); virtual void emitArch(unsigned Arch); + virtual void emitArchExtension(unsigned ArchExt); virtual void emitObjectArch(unsigned Arch); virtual void finishAttributeSection(); virtual void emitInst(uint32_t Inst, char Suffix = '\0'); diff --git a/lib/Target/ARM/ARMArchExtName.def b/lib/Target/ARM/ARMArchExtName.def new file mode 100644 index 00000000000..d6da50c59e5 --- /dev/null +++ b/lib/Target/ARM/ARMArchExtName.def @@ -0,0 +1,30 @@ +//===-- ARMArchExtName.def - List of the ARM Extension names ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains the list of the supported ARM Architecture Extension +// names. These can be used to enable the extension through .arch_extension +// attribute +// +//===----------------------------------------------------------------------===// + +// NOTE: NO INCLUDE GUARD DESIRED! + +#ifndef ARM_ARCHEXT_NAME +#error "You must define ARM_ARCHEXT_NAME(NAME, ID) before including ARMArchExtName.h" +#endif + +ARM_ARCHEXT_NAME("crc", CRC) +ARM_ARCHEXT_NAME("crypto", CRYPTO) +ARM_ARCHEXT_NAME("fp", FP) +ARM_ARCHEXT_NAME("idiv", HWDIV) +ARM_ARCHEXT_NAME("mp", MP) +ARM_ARCHEXT_NAME("sec", SEC) +ARM_ARCHEXT_NAME("virt", VIRT) + +#undef ARM_ARCHEXT_NAME diff --git a/lib/Target/ARM/ARMArchExtName.h b/lib/Target/ARM/ARMArchExtName.h new file mode 100644 index 00000000000..bc1157acdbe --- /dev/null +++ b/lib/Target/ARM/ARMArchExtName.h @@ -0,0 +1,26 @@ +//===-- ARMArchExtName.h - List of the ARM Extension names ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_ARM_ARMARCHEXTNAME_H +#define LLVM_LIB_TARGET_ARM_ARMARCHEXTNAME_H + +namespace llvm { +namespace ARM { + +enum ArchExtKind { + INVALID_ARCHEXT = 0 + +#define ARM_ARCHEXT_NAME(NAME, ID) , ID +#include "ARMArchExtName.def" +}; + +} // namespace ARM +} // namespace llvm + +#endif diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index 34dcd1e876c..2b655202c28 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -15,6 +15,7 @@ #include "ARMArchName.h" #include "ARMFPUName.h" +#include "ARMArchExtName.h" #include "ARMRegisterInfo.h" #include "ARMUnwindOpAsm.h" #include "llvm/ADT/StringExtras.h" @@ -105,6 +106,19 @@ static unsigned GetArchDefaultCPUArch(unsigned ID) { return 0; } +static const char *GetArchExtName(unsigned ID) { + switch (ID) { + default: + llvm_unreachable("Unknown ARCH Extension kind"); + break; +#define ARM_ARCHEXT_NAME(NAME, ID) \ + case ARM::ID: \ + return NAME; +#include "ARMArchExtName.def" + } + return nullptr; +} + namespace { class ARMELFStreamer; @@ -134,6 +148,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer { void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, StringRef StrinValue) override; void emitArch(unsigned Arch) override; + void emitArchExtension(unsigned ArchExt) override; void emitObjectArch(unsigned Arch) override; void emitFPU(unsigned FPU) override; void emitInst(uint32_t Inst, char Suffix = '\0') override; @@ -249,6 +264,9 @@ void ARMTargetAsmStreamer::emitIntTextAttribute(unsigned Attribute, void ARMTargetAsmStreamer::emitArch(unsigned Arch) { OS << "\t.arch\t" << GetArchName(Arch) << "\n"; } +void ARMTargetAsmStreamer::emitArchExtension(unsigned ArchExt) { + OS << "\t.arch_extension\t" << GetArchExtName(ArchExt) << "\n"; +} void ARMTargetAsmStreamer::emitObjectArch(unsigned Arch) { OS << "\t.object_arch\t" << GetArchName(Arch) << '\n'; } diff --git a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp index 8acd7aff6bc..b680db5c3a7 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp @@ -63,6 +63,7 @@ void ARMTargetStreamer::emitIntTextAttribute(unsigned Attribute, unsigned IntValue, StringRef StringValue) {} void ARMTargetStreamer::emitArch(unsigned Arch) {} +void ARMTargetStreamer::emitArchExtension(unsigned ArchExt) {} void ARMTargetStreamer::emitObjectArch(unsigned Arch) {} void ARMTargetStreamer::emitFPU(unsigned FPU) {} void ARMTargetStreamer::finishAttributeSection() {}