[llvm] [SPIR-V] Add NonSemantic.AuxData emission (-spirv-preserve-auxdata) (PR #200002)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 01:27:23 PDT 2026


================
@@ -0,0 +1,268 @@
+//===-- SPIRVAuxDataHandler.cpp - NonSemantic.AuxData emitter -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "SPIRVAuxDataHandler.h"
+#include "MCTargetDesc/SPIRVMCTargetDesc.h"
+#include "SPIRVSubtarget.h"
+#include "SPIRVUtils.h"
+#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/IR/Attributes.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/GlobalObject.h"
+#include "llvm/IR/GlobalVariable.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/Module.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ErrorHandling.h"
+
+using namespace llvm;
+
+static cl::opt<bool> SPVPreserveAuxData(
+    "spirv-preserve-auxdata",
+    cl::desc("Preserve LLVM attributes and metadata as "
+             "NonSemantic.AuxData ExtInst annotations (requires "
+             "SPV_KHR_non_semantic_info)"),
+    cl::Optional, cl::Hidden, cl::init(false));
+
+namespace {
+enum AuxDataLinkageType : uint32_t {
+  AvailableExternally = 0,
+};
+
+constexpr unsigned NonSemanticAuxDataSet =
+    static_cast<unsigned>(SPIRV::InstructionSet::NonSemantic_AuxData);
+
+AttributeSet getGOAttrs(const GlobalObject *GO) {
+  if (const auto *F = dyn_cast<Function>(GO))
+    return F->getAttributes().getFnAttrs();
+  return cast<GlobalVariable>(GO)->getAttributes();
+}
+} // namespace
+
+SPIRVAuxDataHandler::SPIRVAuxDataHandler(AsmPrinter &AP, const Module &M)
+    : Asm(AP), Mod(M) {
+  for (const Function &F : M)
+    if (F.hasFnAttribute(SPIRV_WAS_AVAILABLE_EXTERNALLY_ATTR))
+      LinkagePreservedFns.push_back(&F);
+}
+
+bool SPIRVAuxDataHandler::hasWork() const { return SPVPreserveAuxData; }
+
+void SPIRVAuxDataHandler::prepareModuleOutput(const SPIRVSubtarget &ST,
+                                              SPIRV::ModuleAnalysisInfo &MAI) {
+  if (!hasWork())
+    return;
+  if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_non_semantic_info)) {
+    if (SPVPreserveAuxData)
+      report_fatal_error("-spirv-preserve-auxdata requires the "
+                         "SPV_KHR_non_semantic_info extension to be enabled.");
+    return;
+  }
+  MAI.Reqs.addExtension(SPIRV::Extension::SPV_KHR_non_semantic_info);
+  if (!MAI.ExtInstSetMap.count(NonSemanticAuxDataSet))
+    MAI.ExtInstSetMap[NonSemanticAuxDataSet] = MAI.getNextIDRegister();
+}
+
+MCRegister
+SPIRVAuxDataHandler::getOrEmitString(StringRef S,
+                                     SPIRV::ModuleAnalysisInfo &MAI) {
+  auto [It, Inserted] = StringRegs.try_emplace(S);
+  if (!Inserted)
+    return It->second;
+  MCRegister Reg = MAI.getNextIDRegister();
+  It->second = Reg;
+  MCInst Inst;
+  Inst.setOpcode(SPIRV::OpString);
+  Inst.addOperand(MCOperand::createReg(Reg));
+  addStringImm(S, Inst);
+  emitMCInst(Inst);
+  return Reg;
+}
+
+void SPIRVAuxDataHandler::collectAttributesFor(
+    const GlobalObject *GO, function_ref<MCRegister()> GetNameReg,
+    SPIRV::ModuleAnalysisInfo &MAI) {
+  AuxDataOpcode Opcode = isa<Function>(GO) ? FunctionAttributeOpcode
+                                           : GlobalVariableAttributeOpcode;
+  for (const Attribute &A : getGOAttrs(GO)) {
+    if (A.isStringAttribute() &&
+        A.getKindAsString() == SPIRV_WAS_AVAILABLE_EXTERNALLY_ATTR)
+      continue;
+    ExtInstRecord Rec;
+    Rec.Opcode = Opcode;
+    Rec.Operands.push_back(GetNameReg());
----------------
aobolensk wrote:

Fixed

https://github.com/llvm/llvm-project/pull/200002


More information about the llvm-commits mailing list