[RISCV] Make it explicit that attributes use the MCSubtargetInfo from TargetMachine...
authorCraig Topper <craig.topper@sifive.com>
Wed, 18 Jan 2023 19:31:29 +0000 (11:31 -0800)
committerCraig Topper <craig.topper@sifive.com>
Wed, 18 Jan 2023 19:31:45 +0000 (11:31 -0800)
The MCSTI variable is initialized to TM.getMCSubtargetInfo(), but is
re-assigned in every call to runOnMachineFunction. emitAttributes is
called before any call to runOnMachineFunction, but it's not
immediately obvious.

This patch removes the MCSTI variable, and instead queries
TM.getMCSubtargetInfo() at the time emitAttributes is called.

Reviewed By: reames

Differential Revision: https://reviews.llvm.org/D142037

llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp

index c315758..0edb81c 100644 (file)
@@ -46,13 +46,12 @@ STATISTIC(RISCVNumInstrsCompressed,
 
 namespace {
 class RISCVAsmPrinter : public AsmPrinter {
-  const MCSubtargetInfo *MCSTI;
   const RISCVSubtarget *STI;
 
 public:
   explicit RISCVAsmPrinter(TargetMachine &TM,
                            std::unique_ptr<MCStreamer> Streamer)
-      : AsmPrinter(TM, std::move(Streamer)), MCSTI(TM.getMCSubtargetInfo()) {}
+      : AsmPrinter(TM, std::move(Streamer)) {}
 
   StringRef getPassName() const override { return "RISCV Assembly Printer"; }
 
@@ -189,12 +188,6 @@ bool RISCVAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
 }
 
 bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
-  // Set the current MCSubtargetInfo to a copy which has the correct
-  // feature bits for the current MachineFunction
-  MCSubtargetInfo &NewSTI =
-    OutStreamer->getContext().getSubtargetCopy(*TM.getMCSubtargetInfo());
-  NewSTI.setFeatureBits(MF.getSubtarget().getFeatureBits());
-  MCSTI = &NewSTI;
   STI = &MF.getSubtarget<RISCVSubtarget>();
 
   SetupMachineFunction(MF);
@@ -224,7 +217,10 @@ void RISCVAsmPrinter::emitEndOfAsmFile(Module &M) {
 void RISCVAsmPrinter::emitAttributes() {
   RISCVTargetStreamer &RTS =
       static_cast<RISCVTargetStreamer &>(*OutStreamer->getTargetStreamer());
-  RTS.emitTargetAttributes(*MCSTI);
+  // Use MCSubtargetInfo from TargetMachine. Individual functions may have
+  // attributes that differ from other functions in the module and we have no
+  // way to know which function is correct.
+  RTS.emitTargetAttributes(*TM.getMCSubtargetInfo());
 }
 
 void RISCVAsmPrinter::emitFunctionEntryLabel() {