diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -69,8 +69,6 @@ void emitStartOfAsmFile(Module &M) override; void emitEndOfAsmFile(Module &M) override; - void emitFunctionEntryLabel() override; - private: void emitAttributes(); }; @@ -185,6 +183,11 @@ } void RISCVAsmPrinter::emitStartOfAsmFile(Module &M) { + RISCVTargetStreamer &RTS = + static_cast(*OutStreamer->getTargetStreamer()); + if (const MDString *ModuleTargetABI = + dyn_cast_or_null(M.getModuleFlag("target-abi"))) + RTS.setTargetABI(RISCVABI::getTargetABI(ModuleTargetABI->getString())); if (TM.getTargetTriple().isOSBinFormatELF()) emitAttributes(); } @@ -203,13 +206,6 @@ RTS.emitTargetAttributes(*MCSTI); } -void RISCVAsmPrinter::emitFunctionEntryLabel() { - AsmPrinter::emitFunctionEntryLabel(); - RISCVTargetStreamer &RTS = - static_cast(*OutStreamer->getTargetStreamer()); - RTS.setTargetABI(STI->getTargetABI()); -} - // Force static initialization. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVAsmPrinter() { RegisterAsmPrinter X(getTheRISCV32Target()); diff --git a/llvm/test/CodeGen/RISCV/module-target-abi3.ll b/llvm/test/CodeGen/RISCV/module-target-abi3.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/module-target-abi3.ll @@ -0,0 +1,7 @@ +; RUN: llc -mtriple=riscv32 -filetype=obj < %s | llvm-readelf -h - | FileCheck %s + +; CHECK: Flags: 0x2, single-float ABI + +attributes #0 = { "target-features"="+f" } +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"target-abi", !"ilp32f"}