[llvm] [CSKY] Emit build attributes in assembly output (PR #213507)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 1 22:43:25 PDT 2026


https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/213507

Fixes CodeGen/CSKY/fpu-abi-attribute.ll, failing since #212975.

emitTargetAttributes is implemented only by CSKYTargetELFStreamer, so
llc -filetype=asm drops every .csky_attribute directive. Move it to
CSKYTargetStreamer, as ARM and RISC-V do.

>From 180e96fb0501a7b4d6e430bc00ac6e391e0c519f Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 1 Aug 2026 22:08:26 -0700
Subject: [PATCH] [CSKY] Emit build attributes in assembly output

Fixes CodeGen/CSKY/fpu-abi-attribute.ll, failing since #212975.

emitTargetAttributes is implemented only by CSKYTargetELFStreamer, so
llc -filetype=asm drops every .csky_attribute directive. Move it to
CSKYTargetStreamer, as ARM and RISC-V do.
---
 .../Target/CSKY/AsmParser/CSKYAsmParser.cpp   |   6 +-
 .../CSKY/MCTargetDesc/CSKYELFStreamer.cpp     | 164 -----------------
 .../CSKY/MCTargetDesc/CSKYELFStreamer.h       |   3 -
 .../CSKY/MCTargetDesc/CSKYTargetStreamer.cpp  | 172 +++++++++++++++++-
 .../CSKY/MCTargetDesc/CSKYTargetStreamer.h    |   5 +-
 llvm/test/MC/CSKY/default-build-attributes.s  |  13 ++
 6 files changed, 192 insertions(+), 171 deletions(-)
 create mode 100644 llvm/test/MC/CSKY/default-build-attributes.s

diff --git a/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp b/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
index 356df0cda0bf8..3f8e9a2f78842 100644
--- a/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
+++ b/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
@@ -51,6 +51,9 @@ static cl::opt<bool>
                          cl::init(false),
                          cl::desc("Enable C-SKY asm compressed instruction"));
 
+static cl::opt<bool> AddBuildAttributes("csky-add-build-attributes",
+                                        cl::init(true));
+
 namespace {
 struct CSKYOperand;
 
@@ -137,7 +140,8 @@ class CSKYAsmParser : public MCTargetAsmParser {
     MRI = getContext().getRegisterInfo();
 
     setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
-    getTargetStreamer().emitTargetAttributes(STI);
+    if (AddBuildAttributes)
+      getTargetStreamer().emitTargetAttributes(STI, /*HardFloatABI=*/false);
   }
 };
 
diff --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp
index 5a74a5adab558..61c4f9ea40334 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp
@@ -21,10 +21,8 @@
 #include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/MC/MCSymbolELF.h"
-#include "llvm/Support/CSKYAttributes.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/LEB128.h"
-#include "llvm/TargetParser/CSKYTargetParser.h"
 
 using namespace llvm;
 
@@ -176,165 +174,3 @@ void CSKYELFStreamer::EmitMappingSymbol(StringRef Name) {
   Symbol->setType(ELF::STT_NOTYPE);
   Symbol->setBinding(ELF::STB_LOCAL);
 }
-
-void CSKYTargetELFStreamer::emitTargetAttributes(const MCSubtargetInfo &STI,
-                                                 bool HardFloatABI) {
-  StringRef CPU = STI.getCPU();
-  CSKY::ArchKind ArchID = CSKY::parseCPUArch(CPU);
-
-  if (ArchID == CSKY::ArchKind::CK804)
-    ArchID = CSKY::ArchKind::CK803;
-
-  StringRef CPU_ARCH = CSKY::getArchName(ArchID);
-
-  if (ArchID == CSKY::ArchKind::INVALID) {
-    CPU = "ck810";
-    CPU_ARCH = "ck810";
-  }
-  emitTextAttribute(CSKYAttrs::CSKY_ARCH_NAME, CPU_ARCH);
-  emitTextAttribute(CSKYAttrs::CSKY_CPU_NAME, CPU);
-
-  unsigned ISAFlag = 0;
-  if (STI.hasFeature(CSKY::HasE1))
-    ISAFlag |= CSKYAttrs::V2_ISA_E1;
-
-  if (STI.hasFeature(CSKY::HasE2))
-    ISAFlag |= CSKYAttrs::V2_ISA_1E2;
-
-  if (STI.hasFeature(CSKY::Has2E3))
-    ISAFlag |= CSKYAttrs::V2_ISA_2E3;
-
-  if (STI.hasFeature(CSKY::HasMP))
-    ISAFlag |= CSKYAttrs::ISA_MP;
-
-  if (STI.hasFeature(CSKY::Has3E3r1))
-    ISAFlag |= CSKYAttrs::V2_ISA_3E3R1;
-
-  if (STI.hasFeature(CSKY::Has3r1E3r2))
-    ISAFlag |= CSKYAttrs::V2_ISA_3E3R2;
-
-  if (STI.hasFeature(CSKY::Has3r2E3r3))
-    ISAFlag |= CSKYAttrs::V2_ISA_3E3R3;
-
-  if (STI.hasFeature(CSKY::Has3E7))
-    ISAFlag |= CSKYAttrs::V2_ISA_3E7;
-
-  if (STI.hasFeature(CSKY::HasMP1E2))
-    ISAFlag |= CSKYAttrs::ISA_MP_1E2;
-
-  if (STI.hasFeature(CSKY::Has7E10))
-    ISAFlag |= CSKYAttrs::V2_ISA_7E10;
-
-  if (STI.hasFeature(CSKY::Has10E60))
-    ISAFlag |= CSKYAttrs::V2_ISA_10E60;
-
-  if (STI.hasFeature(CSKY::FeatureTrust))
-    ISAFlag |= CSKYAttrs::ISA_TRUST;
-
-  if (STI.hasFeature(CSKY::FeatureJAVA))
-    ISAFlag |= CSKYAttrs::ISA_JAVA;
-
-  if (STI.hasFeature(CSKY::FeatureCache))
-    ISAFlag |= CSKYAttrs::ISA_CACHE;
-
-  if (STI.hasFeature(CSKY::FeatureNVIC))
-    ISAFlag |= CSKYAttrs::ISA_NVIC;
-
-  if (STI.hasFeature(CSKY::FeatureDSP))
-    ISAFlag |= CSKYAttrs::ISA_DSP;
-
-  if (STI.hasFeature(CSKY::HasDSP1E2))
-    ISAFlag |= CSKYAttrs::ISA_DSP_1E2;
-
-  if (STI.hasFeature(CSKY::HasDSPE60))
-    ISAFlag |= CSKYAttrs::V2_ISA_DSPE60;
-
-  if (STI.hasFeature(CSKY::FeatureDSPV2))
-    ISAFlag |= CSKYAttrs::ISA_DSP_ENHANCE;
-
-  if (STI.hasFeature(CSKY::FeatureDSP_Silan))
-    ISAFlag |= CSKYAttrs::ISA_DSP_SILAN;
-
-  if (STI.hasFeature(CSKY::FeatureVDSPV1_128))
-    ISAFlag |= CSKYAttrs::ISA_VDSP;
-
-  if (STI.hasFeature(CSKY::FeatureVDSPV2))
-    ISAFlag |= CSKYAttrs::ISA_VDSP_2;
-
-  if (STI.hasFeature(CSKY::HasVDSP2E3))
-    ISAFlag |= CSKYAttrs::ISA_VDSP_2E3;
-
-  if (STI.hasFeature(CSKY::HasVDSP2E60F))
-    ISAFlag |= CSKYAttrs::ISA_VDSP_2E60F;
-
-  emitAttribute(CSKYAttrs::CSKY_ISA_FLAGS, ISAFlag);
-
-  unsigned ISAExtFlag = 0;
-  if (STI.hasFeature(CSKY::HasFLOATE1))
-    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_E1;
-
-  if (STI.hasFeature(CSKY::HasFLOAT1E2))
-    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E2;
-
-  if (STI.hasFeature(CSKY::HasFLOAT1E3))
-    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E3;
-
-  if (STI.hasFeature(CSKY::HasFLOAT3E4))
-    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_3E4;
-
-  if (STI.hasFeature(CSKY::HasFLOAT7E60))
-    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_7E60;
-
-  emitAttribute(CSKYAttrs::CSKY_ISA_EXT_FLAGS, ISAExtFlag);
-
-  if (STI.hasFeature(CSKY::FeatureDSP))
-    emitAttribute(CSKYAttrs::CSKY_DSP_VERSION,
-                  CSKYAttrs::DSP_VERSION_EXTENSION);
-  if (STI.hasFeature(CSKY::FeatureDSPV2))
-    emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, CSKYAttrs::DSP_VERSION_2);
-
-  if (STI.hasFeature(CSKY::FeatureVDSPV2))
-    emitAttribute(CSKYAttrs::CSKY_VDSP_VERSION, CSKYAttrs::VDSP_VERSION_2);
-
-  if (STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
-      STI.hasFeature(CSKY::FeatureFPUV2_DF))
-    emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_2);
-  else if (STI.hasFeature(CSKY::FeatureFPUV3_HF) ||
-           STI.hasFeature(CSKY::FeatureFPUV3_SF) ||
-           STI.hasFeature(CSKY::FeatureFPUV3_DF))
-    emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_3);
-
-  bool hasAnyFloatExt = STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
-                        STI.hasFeature(CSKY::FeatureFPUV2_DF) ||
-                        STI.hasFeature(CSKY::FeatureFPUV3_HF) ||
-                        STI.hasFeature(CSKY::FeatureFPUV3_SF) ||
-                        STI.hasFeature(CSKY::FeatureFPUV3_DF);
-
-  // The hard-float *ABI* (FP values in FP registers at call boundaries) is
-  // selected by the "float-abi" module flag, resolved by the caller; it does
-  // not depend on ModeHardFloat, which only distinguishes the soft-float ABI
-  // that still uses hard-float instructions (SOFTFP) from pure soft float.
-  if (hasAnyFloatExt && HardFloatABI)
-    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_HARD);
-  else if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat))
-    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFTFP);
-  else
-    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFT);
-
-  unsigned HardFPFlag = 0;
-  if (STI.hasFeature(CSKY::FeatureFPUV3_HF))
-    HardFPFlag |= CSKYAttrs::FPU_HARDFP_HALF;
-  if (STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
-      STI.hasFeature(CSKY::FeatureFPUV3_SF))
-    HardFPFlag |= CSKYAttrs::FPU_HARDFP_SINGLE;
-  if (STI.hasFeature(CSKY::FeatureFPUV2_DF) ||
-      STI.hasFeature(CSKY::FeatureFPUV3_DF))
-    HardFPFlag |= CSKYAttrs::FPU_HARDFP_DOUBLE;
-
-  if (HardFPFlag != 0) {
-    emitAttribute(CSKYAttrs::CSKY_FPU_DENORMAL, CSKYAttrs::NEEDED);
-    emitAttribute(CSKYAttrs::CSKY_FPU_EXCEPTION, CSKYAttrs::NEEDED);
-    emitTextAttribute(CSKYAttrs::CSKY_FPU_NUMBER_MODULE, "IEEE 754");
-    emitAttribute(CSKYAttrs::CSKY_FPU_HARDFP, HardFPFlag);
-  }
-}
diff --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.h
index 876f8a1cf6759..69cdda683f51a 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.h
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.h
@@ -91,9 +91,6 @@ class CSKYTargetELFStreamer : public CSKYTargetStreamer {
   void finishAttributeSection() override;
   size_t calculateContentSize() const;
 
-  void emitTargetAttributes(const MCSubtargetInfo &STI,
-                            bool HardFloatABI = false) override;
-
 public:
   MCELFStreamer &getStreamer();
   CSKYTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
diff --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
index 97d9ef98d88d3..16a37ac9b58dd 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
@@ -7,12 +7,16 @@
 //===----------------------------------------------------------------------===//
 
 #include "CSKYTargetStreamer.h"
+#include "CSKYMCTargetDesc.h"
 #include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCSectionELF.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Support/CSKYAttributes.h"
 #include "llvm/Support/FormattedStream.h"
+#include "llvm/TargetParser/CSKYTargetParser.h"
 
 using namespace llvm;
 
@@ -125,7 +129,173 @@ void CSKYTargetStreamer::finish() {
 }
 
 void CSKYTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI,
-                                              bool HardFloatABI) {}
+                                              bool HardFloatABI) {
+  // AsmPrinter emits the attributes once for the module. Ignore the repeated
+  // requests from the parser instantiated for each inline asm block, which
+  // knows neither the CPU nor the float ABI selected for the module.
+  if (EmittedTargetAttributes)
+    return;
+  EmittedTargetAttributes = true;
+
+  StringRef CPU = STI.getCPU();
+  CSKY::ArchKind ArchID = CSKY::parseCPUArch(CPU);
+
+  if (ArchID == CSKY::ArchKind::CK804)
+    ArchID = CSKY::ArchKind::CK803;
+
+  StringRef CPU_ARCH = CSKY::getArchName(ArchID);
+
+  if (ArchID == CSKY::ArchKind::INVALID) {
+    CPU = "ck810";
+    CPU_ARCH = "ck810";
+  }
+  emitTextAttribute(CSKYAttrs::CSKY_ARCH_NAME, CPU_ARCH);
+  emitTextAttribute(CSKYAttrs::CSKY_CPU_NAME, CPU);
+
+  unsigned ISAFlag = 0;
+  if (STI.hasFeature(CSKY::HasE1))
+    ISAFlag |= CSKYAttrs::V2_ISA_E1;
+
+  if (STI.hasFeature(CSKY::HasE2))
+    ISAFlag |= CSKYAttrs::V2_ISA_1E2;
+
+  if (STI.hasFeature(CSKY::Has2E3))
+    ISAFlag |= CSKYAttrs::V2_ISA_2E3;
+
+  if (STI.hasFeature(CSKY::HasMP))
+    ISAFlag |= CSKYAttrs::ISA_MP;
+
+  if (STI.hasFeature(CSKY::Has3E3r1))
+    ISAFlag |= CSKYAttrs::V2_ISA_3E3R1;
+
+  if (STI.hasFeature(CSKY::Has3r1E3r2))
+    ISAFlag |= CSKYAttrs::V2_ISA_3E3R2;
+
+  if (STI.hasFeature(CSKY::Has3r2E3r3))
+    ISAFlag |= CSKYAttrs::V2_ISA_3E3R3;
+
+  if (STI.hasFeature(CSKY::Has3E7))
+    ISAFlag |= CSKYAttrs::V2_ISA_3E7;
+
+  if (STI.hasFeature(CSKY::HasMP1E2))
+    ISAFlag |= CSKYAttrs::ISA_MP_1E2;
+
+  if (STI.hasFeature(CSKY::Has7E10))
+    ISAFlag |= CSKYAttrs::V2_ISA_7E10;
+
+  if (STI.hasFeature(CSKY::Has10E60))
+    ISAFlag |= CSKYAttrs::V2_ISA_10E60;
+
+  if (STI.hasFeature(CSKY::FeatureTrust))
+    ISAFlag |= CSKYAttrs::ISA_TRUST;
+
+  if (STI.hasFeature(CSKY::FeatureJAVA))
+    ISAFlag |= CSKYAttrs::ISA_JAVA;
+
+  if (STI.hasFeature(CSKY::FeatureCache))
+    ISAFlag |= CSKYAttrs::ISA_CACHE;
+
+  if (STI.hasFeature(CSKY::FeatureNVIC))
+    ISAFlag |= CSKYAttrs::ISA_NVIC;
+
+  if (STI.hasFeature(CSKY::FeatureDSP))
+    ISAFlag |= CSKYAttrs::ISA_DSP;
+
+  if (STI.hasFeature(CSKY::HasDSP1E2))
+    ISAFlag |= CSKYAttrs::ISA_DSP_1E2;
+
+  if (STI.hasFeature(CSKY::HasDSPE60))
+    ISAFlag |= CSKYAttrs::V2_ISA_DSPE60;
+
+  if (STI.hasFeature(CSKY::FeatureDSPV2))
+    ISAFlag |= CSKYAttrs::ISA_DSP_ENHANCE;
+
+  if (STI.hasFeature(CSKY::FeatureDSP_Silan))
+    ISAFlag |= CSKYAttrs::ISA_DSP_SILAN;
+
+  if (STI.hasFeature(CSKY::FeatureVDSPV1_128))
+    ISAFlag |= CSKYAttrs::ISA_VDSP;
+
+  if (STI.hasFeature(CSKY::FeatureVDSPV2))
+    ISAFlag |= CSKYAttrs::ISA_VDSP_2;
+
+  if (STI.hasFeature(CSKY::HasVDSP2E3))
+    ISAFlag |= CSKYAttrs::ISA_VDSP_2E3;
+
+  if (STI.hasFeature(CSKY::HasVDSP2E60F))
+    ISAFlag |= CSKYAttrs::ISA_VDSP_2E60F;
+
+  emitAttribute(CSKYAttrs::CSKY_ISA_FLAGS, ISAFlag);
+
+  unsigned ISAExtFlag = 0;
+  if (STI.hasFeature(CSKY::HasFLOATE1))
+    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_E1;
+
+  if (STI.hasFeature(CSKY::HasFLOAT1E2))
+    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E2;
+
+  if (STI.hasFeature(CSKY::HasFLOAT1E3))
+    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E3;
+
+  if (STI.hasFeature(CSKY::HasFLOAT3E4))
+    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_3E4;
+
+  if (STI.hasFeature(CSKY::HasFLOAT7E60))
+    ISAExtFlag |= CSKYAttrs::ISA_FLOAT_7E60;
+
+  emitAttribute(CSKYAttrs::CSKY_ISA_EXT_FLAGS, ISAExtFlag);
+
+  if (STI.hasFeature(CSKY::FeatureDSP))
+    emitAttribute(CSKYAttrs::CSKY_DSP_VERSION,
+                  CSKYAttrs::DSP_VERSION_EXTENSION);
+  if (STI.hasFeature(CSKY::FeatureDSPV2))
+    emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, CSKYAttrs::DSP_VERSION_2);
+
+  if (STI.hasFeature(CSKY::FeatureVDSPV2))
+    emitAttribute(CSKYAttrs::CSKY_VDSP_VERSION, CSKYAttrs::VDSP_VERSION_2);
+
+  if (STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
+      STI.hasFeature(CSKY::FeatureFPUV2_DF))
+    emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_2);
+  else if (STI.hasFeature(CSKY::FeatureFPUV3_HF) ||
+           STI.hasFeature(CSKY::FeatureFPUV3_SF) ||
+           STI.hasFeature(CSKY::FeatureFPUV3_DF))
+    emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_3);
+
+  bool hasAnyFloatExt = STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
+                        STI.hasFeature(CSKY::FeatureFPUV2_DF) ||
+                        STI.hasFeature(CSKY::FeatureFPUV3_HF) ||
+                        STI.hasFeature(CSKY::FeatureFPUV3_SF) ||
+                        STI.hasFeature(CSKY::FeatureFPUV3_DF);
+
+  // The hard-float *ABI* (FP values in FP registers at call boundaries) is
+  // selected by the "float-abi" module flag, resolved by the caller; it does
+  // not depend on ModeHardFloat, which only distinguishes the soft-float ABI
+  // that still uses hard-float instructions (SOFTFP) from pure soft float.
+  if (hasAnyFloatExt && HardFloatABI)
+    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_HARD);
+  else if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat))
+    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFTFP);
+  else
+    emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFT);
+
+  unsigned HardFPFlag = 0;
+  if (STI.hasFeature(CSKY::FeatureFPUV3_HF))
+    HardFPFlag |= CSKYAttrs::FPU_HARDFP_HALF;
+  if (STI.hasFeature(CSKY::FeatureFPUV2_SF) ||
+      STI.hasFeature(CSKY::FeatureFPUV3_SF))
+    HardFPFlag |= CSKYAttrs::FPU_HARDFP_SINGLE;
+  if (STI.hasFeature(CSKY::FeatureFPUV2_DF) ||
+      STI.hasFeature(CSKY::FeatureFPUV3_DF))
+    HardFPFlag |= CSKYAttrs::FPU_HARDFP_DOUBLE;
+
+  if (HardFPFlag != 0) {
+    emitAttribute(CSKYAttrs::CSKY_FPU_DENORMAL, CSKYAttrs::NEEDED);
+    emitAttribute(CSKYAttrs::CSKY_FPU_EXCEPTION, CSKYAttrs::NEEDED);
+    emitTextAttribute(CSKYAttrs::CSKY_FPU_NUMBER_MODULE, "IEEE 754");
+    emitAttribute(CSKYAttrs::CSKY_FPU_HARDFP, HardFPFlag);
+  }
+}
 
 void CSKYTargetStreamer::emitAttribute(unsigned Attribute, unsigned Value) {}
 void CSKYTargetStreamer::emitTextAttribute(unsigned Attribute,
diff --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
index f6709c5745194..5a8b0e4c773f3 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
@@ -57,6 +57,8 @@ class CSKYTargetStreamer : public MCTargetStreamer {
 
   unsigned ConstantCounter = 0;
 
+  bool EmittedTargetAttributes = false;
+
 public:
   CSKYTargetStreamer(MCStreamer &S);
 
@@ -64,8 +66,7 @@ class CSKYTargetStreamer : public MCTargetStreamer {
   virtual void emitAttribute(unsigned Attribute, unsigned Value);
   virtual void finishAttributeSection();
 
-  virtual void emitTargetAttributes(const MCSubtargetInfo &STI,
-                                    bool HardFloatABI = false);
+  void emitTargetAttributes(const MCSubtargetInfo &STI, bool HardFloatABI);
   /// Add a new entry to the constant pool for the current section and return an
   /// MCExpr that can be used to refer to the constant pool location.
   const MCExpr *addConstantPoolEntry(const MCExpr *, SMLoc Loc,
diff --git a/llvm/test/MC/CSKY/default-build-attributes.s b/llvm/test/MC/CSKY/default-build-attributes.s
new file mode 100644
index 0000000000000..f3d68b2302953
--- /dev/null
+++ b/llvm/test/MC/CSKY/default-build-attributes.s
@@ -0,0 +1,13 @@
+# RUN: llvm-mc %s -triple=csky | FileCheck %s
+# RUN: llvm-mc %s -triple=csky -mcpu=ck860 | FileCheck %s --check-prefix=CK860
+# RUN: llvm-mc %s -triple=csky -csky-add-build-attributes=false | FileCheck %s --check-prefix=OFF
+
+nop
+
+# CHECK: .csky_attribute 4, "ck810"
+# CHECK-NEXT: .csky_attribute 5, "ck810"
+
+# CK860: .csky_attribute 4, "ck860"
+# CK860-NEXT: .csky_attribute 5, "ck860"
+
+# OFF-NOT: .csky_attribute



More information about the llvm-commits mailing list