From 226d19314c1636302ad2baffbe7dc88c687ec601 Mon Sep 17 00:00:00 2001 From: Zakk Chen Date: Wed, 5 May 2021 15:53:41 +0800 Subject: [PATCH 1/2] [RISCV][NFC] Don't need to create a new STI in RISCVAsmPrinter. RISCVAsmPrinter already has MCSubtargetInfo. Reviewed By: HsiangKai Differential Revision: https://reviews.llvm.org/D101889 Original commit: 446ed6394bd36631508056ffac08bd740d401a00. Signed-off-by: Ivan Kulikov --- llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp index 0a915cbcc1af..74e54cd859b0 100644 --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -193,16 +193,7 @@ void RISCVAsmPrinter::emitEndOfAsmFile(Module &M) { void RISCVAsmPrinter::emitAttributes() { RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); - - const Triple &TT = TM.getTargetTriple(); - StringRef CPU = TM.getTargetCPU(); - StringRef FS = TM.getTargetFeatureString(); - const RISCVTargetMachine &RTM = static_cast(TM); - /* TuneCPU doesn't impact emission of ELF attributes, ELF attributes only - care about arch related features, so we can set TuneCPU as CPU. */ - const RISCVSubtarget STI(TT, CPU, /*TuneCPU=*/CPU, FS, /*ABIName=*/"", RTM); - - RTS.emitTargetAttributes(STI); + RTS.emitTargetAttributes(*STI); } // Force static initialization. -- Gitee From 31ac51e87ed4254df249047b9a2295fa51e9a419 Mon Sep 17 00:00:00 2001 From: luxufan Date: Tue, 8 Mar 2022 13:55:13 +0800 Subject: [PATCH 2/2] [PORT][RISCV] Generate correct ELF EFlags when .ll file has target-abi attribute In the past, when construct RISCVAsmBackend, MCTargetOptions.ABIName would be passed and stored in RISCVAsmBackend. But MCTargetOptions.ABIName can only be specified by -target-abi xxx in command line, if the .ll file has target-abi attribute, the codegen module will ignore it. And the generated object file would have incorrect EFlags value. https://github.com/llvm/llvm-project/issues/50591 also caused by this problem. This patch override the AsmPrinter::emitFunctionEntryLabel function and use it to set the target abi value that get from .ll file's target-abi attribute. And storing the target-abi in RISCVTargetStreamer instead of RISCVAsmBackend. Differential Revision: https://reviews.llvm.org/D121183 Original commit: 227496dc09cf46df233aad041d6dc6113822e4bb. This commit is a backport only and is expected to be replaceable with the original commit during rebase. Signed-off-by: Ivan Kulikov --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 7 ++ .../RISCV/MCTargetDesc/RISCVAsmBackend.h | 12 ++-- .../RISCV/MCTargetDesc/RISCVELFStreamer.cpp | 70 +++++++++++-------- .../RISCV/MCTargetDesc/RISCVELFStreamer.h | 5 ++ .../MCTargetDesc/RISCVTargetStreamer.cpp | 6 ++ .../RISCV/MCTargetDesc/RISCVTargetStreamer.h | 9 +++ llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp | 28 ++++++-- llvm/test/CodeGen/RISCV/module-target-abi2.ll | 4 +- 8 files changed, 102 insertions(+), 39 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index dcf7525d7458..64bebac5efe7 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -247,6 +247,13 @@ public: "target-abi)\n"; } + // OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb + // Use computeTargetABI to check if ABIName is valid. If invalid, output + // error message. + RISCVABI::computeTargetABI(STI.getTargetTriple(), STI.getFeatureBits(), + ABIName); + // OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb + const MCObjectFileInfo *MOFI = Parser.getContext().getObjectFileInfo(); ParserOptions.IsPicEnabled = MOFI->isPositionIndependent(); } diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h index 56991ccf010a..3f82e32a29f4 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h @@ -27,15 +27,18 @@ class RISCVAsmBackend : public MCAsmBackend { bool Is64Bit; bool ForceRelocs = false; const MCTargetOptions &TargetOptions; - RISCVABI::ABI TargetABI = RISCVABI::ABI_Unknown; + // OHOS_LOCAL removal backported from 227496dc09cf46df233aad041d6dc6113822e4bb + // RISCVABI::ABI TargetABI = RISCVABI::ABI_Unknown; public: RISCVAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit, const MCTargetOptions &Options) : MCAsmBackend(support::little), STI(STI), OSABI(OSABI), Is64Bit(Is64Bit), TargetOptions(Options) { - TargetABI = RISCVABI::computeTargetABI( - STI.getTargetTriple(), STI.getFeatureBits(), Options.getABIName()); + // OHOS_LOCAL removal backported from 227496dc09cf46df233aad041d6dc6113822e4bb + // TargetABI = RISCVABI::computeTargetABI( + // STI.getTargetTriple(), STI.getFeatureBits(), Options.getABIName()); + RISCVFeatures::validate(STI.getTargetTriple(), STI.getFeatureBits()); } ~RISCVAsmBackend() override {} @@ -111,7 +114,8 @@ public: bool writeNopData(raw_ostream &OS, uint64_t Count) const override; const MCTargetOptions &getTargetOptions() const { return TargetOptions; } - RISCVABI::ABI getTargetABI() const { return TargetABI; } + // OHOS_LOCAL removal backported from 227496dc09cf46df233aad041d6dc6113822e4bb + // RISCVABI::ABI getTargetABI() const { return TargetABI; } }; } diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp index 7df454be8729..8fa8fa89e24a 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp @@ -26,38 +26,15 @@ using namespace llvm; // This part is for ELF object output. RISCVTargetELFStreamer::RISCVTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI) - : RISCVTargetStreamer(S), CurrentVendor("riscv") { + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + : RISCVTargetStreamer(S), CurrentVendor("riscv"), STI(STI) { MCAssembler &MCA = getStreamer().getAssembler(); const FeatureBitset &Features = STI.getFeatureBits(); auto &MAB = static_cast(MCA.getBackend()); - RISCVABI::ABI ABI = MAB.getTargetABI(); - assert(ABI != RISCVABI::ABI_Unknown && "Improperly initialised target ABI"); - - unsigned EFlags = MCA.getELFHeaderEFlags(); - - if (Features[RISCV::FeatureStdExtC]) - EFlags |= ELF::EF_RISCV_RVC; - - switch (ABI) { - case RISCVABI::ABI_ILP32: - case RISCVABI::ABI_LP64: - break; - case RISCVABI::ABI_ILP32F: - case RISCVABI::ABI_LP64F: - EFlags |= ELF::EF_RISCV_FLOAT_ABI_SINGLE; - break; - case RISCVABI::ABI_ILP32D: - case RISCVABI::ABI_LP64D: - EFlags |= ELF::EF_RISCV_FLOAT_ABI_DOUBLE; - break; - case RISCVABI::ABI_ILP32E: - EFlags |= ELF::EF_RISCV_RVE; - break; - case RISCVABI::ABI_Unknown: - llvm_unreachable("Improperly initialised target ABI"); - } - - MCA.setELFHeaderEFlags(EFlags); + // OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb + setTargetABI(RISCVABI::computeTargetABI(STI.getTargetTriple(), Features, + MAB.getTargetOptions().getABIName())); + // OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb } MCELFStreamer &RISCVTargetELFStreamer::getStreamer() { @@ -167,3 +144,38 @@ size_t RISCVTargetELFStreamer::calculateContentSize() const { } return Result; } + +// OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb +void RISCVTargetELFStreamer::finish() { + RISCVTargetStreamer::finish(); + MCAssembler &MCA = getStreamer().getAssembler(); + const FeatureBitset &Features = STI.getFeatureBits(); + RISCVABI::ABI ABI = getTargetABI(); + + unsigned EFlags = MCA.getELFHeaderEFlags(); + + if (Features[RISCV::FeatureStdExtC]) + EFlags |= ELF::EF_RISCV_RVC; + + switch (ABI) { + case RISCVABI::ABI_ILP32: + case RISCVABI::ABI_LP64: + break; + case RISCVABI::ABI_ILP32F: + case RISCVABI::ABI_LP64F: + EFlags |= ELF::EF_RISCV_FLOAT_ABI_SINGLE; + break; + case RISCVABI::ABI_ILP32D: + case RISCVABI::ABI_LP64D: + EFlags |= ELF::EF_RISCV_FLOAT_ABI_DOUBLE; + break; + case RISCVABI::ABI_ILP32E: + EFlags |= ELF::EF_RISCV_RVE; + break; + case RISCVABI::ABI_Unknown: + llvm_unreachable("Improperly initialised target ABI"); + } + + MCA.setELFHeaderEFlags(EFlags); +} +// OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h index 392c87054d43..8ef2b6f59aaa 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h @@ -29,6 +29,8 @@ private: SmallVector Contents; MCSection *AttributeSection = nullptr; + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + const MCSubtargetInfo &STI; AttributeItem *getAttributeItem(unsigned Attribute) { for (size_t i = 0; i < Contents.size(); ++i) @@ -103,6 +105,9 @@ public: void emitDirectiveOptionNoRVC() override; void emitDirectiveOptionRelax() override; void emitDirectiveOptionNoRelax() override; + + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + void finish() override; }; } #endif diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp index 13c4b84aa300..4e3c26d21b50 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp @@ -36,6 +36,12 @@ void RISCVTargetStreamer::emitTextAttribute(unsigned Attribute, void RISCVTargetStreamer::emitIntTextAttribute(unsigned Attribute, unsigned IntValue, StringRef StringValue) {} +// OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb +void RISCVTargetStreamer::setTargetABI(RISCVABI::ABI ABI) { + assert(ABI != RISCVABI::ABI_Unknown && "Improperly initialized target ABI"); + TargetABI = ABI; +} +// OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb void RISCVTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) { if (STI.hasFeature(RISCV::FeatureRV32E)) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h index 32fa20f25d82..0def42ec43d5 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h @@ -9,12 +9,17 @@ #ifndef LLVM_LIB_TARGET_RISCV_RISCVTARGETSTREAMER_H #define LLVM_LIB_TARGET_RISCV_RISCVTARGETSTREAMER_H +// OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb +#include "RISCV.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" namespace llvm { class RISCVTargetStreamer : public MCTargetStreamer { + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + RISCVABI::ABI TargetABI = RISCVABI::ABI_Unknown; + public: RISCVTargetStreamer(MCStreamer &S); void finish() override; @@ -34,6 +39,10 @@ public: StringRef StringValue); void emitTargetAttributes(const MCSubtargetInfo &STI); + // OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb + void setTargetABI(RISCVABI::ABI ABI); + RISCVABI::ABI getTargetABI() const { return TargetABI; } + // OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb }; // This part is for ascii assembly output diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp index 74e54cd859b0..889e9cc5946a 100644 --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -38,12 +38,16 @@ STATISTIC(RISCVNumInstrsCompressed, namespace { class RISCVAsmPrinter : public AsmPrinter { - const MCSubtargetInfo *STI; + // OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb + const MCSubtargetInfo *MCSTI; + const RISCVSubtarget *STI; + // OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb public: explicit RISCVAsmPrinter(TargetMachine &TM, std::unique_ptr Streamer) - : AsmPrinter(TM, std::move(Streamer)), STI(TM.getMCSubtargetInfo()) {} + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + : AsmPrinter(TM, std::move(Streamer)), MCSTI(TM.getMCSubtargetInfo()) {} StringRef getPassName() const override { return "RISCV Assembly Printer"; } @@ -68,6 +72,9 @@ public: void emitStartOfAsmFile(Module &M) override; void emitEndOfAsmFile(Module &M) override; + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + void emitFunctionEntryLabel() override; + private: void emitAttributes(); }; @@ -170,7 +177,10 @@ bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) { MCSubtargetInfo &NewSTI = OutStreamer->getContext().getSubtargetCopy(*TM.getMCSubtargetInfo()); NewSTI.setFeatureBits(MF.getSubtarget().getFeatureBits()); - STI = &NewSTI; + // OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb + MCSTI = &NewSTI; + STI = &MF.getSubtarget(); + // OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb SetupMachineFunction(MF); emitFunctionBody(); @@ -193,8 +203,18 @@ void RISCVAsmPrinter::emitEndOfAsmFile(Module &M) { void RISCVAsmPrinter::emitAttributes() { RISCVTargetStreamer &RTS = static_cast(*OutStreamer->getTargetStreamer()); - RTS.emitTargetAttributes(*STI); + // OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb + RTS.emitTargetAttributes(*MCSTI); +} + +// OHOS_LOCAL begin backported from 227496dc09cf46df233aad041d6dc6113822e4bb +void RISCVAsmPrinter::emitFunctionEntryLabel() { + AsmPrinter::emitFunctionEntryLabel(); + RISCVTargetStreamer &RTS = + static_cast(*OutStreamer->getTargetStreamer()); + RTS.setTargetABI(STI->getTargetABI()); } +// OHOS_LOCAL end backported from 227496dc09cf46df233aad041d6dc6113822e4bb // Force static initialization. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVAsmPrinter() { diff --git a/llvm/test/CodeGen/RISCV/module-target-abi2.ll b/llvm/test/CodeGen/RISCV/module-target-abi2.ll index 8664c9add069..bd41c2afddff 100644 --- a/llvm/test/CodeGen/RISCV/module-target-abi2.ll +++ b/llvm/test/CodeGen/RISCV/module-target-abi2.ll @@ -8,8 +8,8 @@ ; RV32IF-ILP32: -target-abi option != target-abi module flag -; FLAGS: Flags: 0x0 -; // this should be "Flags :0x2, single-float ABI", it will be fixed later. +; OHOS_LOCAL backported from 227496dc09cf46df233aad041d6dc6113822e4bb +; FLAGS: Flags: 0x2, single-float ABI define float @foo(i32 %a) nounwind #0 { ; DEFAULT: # %bb.0: -- Gitee