Index: include/llvm/MC/MCStreamer.h =================================================================== --- include/llvm/MC/MCStreamer.h +++ include/llvm/MC/MCStreamer.h @@ -139,6 +139,7 @@ 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'); Index: lib/Target/ARM/ARMArchExtName.h =================================================================== --- /dev/null +++ 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 Index: lib/Target/ARM/ARMArchExtName.def =================================================================== --- /dev/null +++ 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 Index: lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp =================================================================== --- lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ 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 @@ 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 @@ 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::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'; } Index: lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp =================================================================== --- lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp +++ lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp @@ -63,6 +63,7 @@ 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() {}