[llvm] e45087f - [RISCV] Fix state persistence bugs (PR55548)

Kito Cheng via llvm-commits llvm-commits at lists.llvm.org
Thu May 26 01:09:06 PDT 2022


Author: Kito Cheng
Date: 2022-05-26T16:09:00+08:00
New Revision: e45087fd53d5946f47efa7bb7be088c668c386a1

URL: https://github.com/llvm/llvm-project/commit/e45087fd53d5946f47efa7bb7be088c668c386a1
DIFF: https://github.com/llvm/llvm-project/commit/e45087fd53d5946f47efa7bb7be088c668c386a1.diff

LOG: [RISCV] Fix state persistence bugs (PR55548)

We didn't implement RISCVELFStreamer::reset and cause some very strange
section output for attribute section...just reference D15950 to see how
ARM implement that.

Reviewed By: MaskRay

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

Added: 
    llvm/test/MC/RISCV/twice.ll

Modified: 
    llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
    llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h
    llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp
    llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
index 88c417e974eb8..52e6af1224f59 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
@@ -180,6 +180,11 @@ void RISCVTargetELFStreamer::finish() {
   MCA.setELFHeaderEFlags(EFlags);
 }
 
+void RISCVTargetELFStreamer::reset() {
+  AttributeSection = nullptr;
+  Contents.clear();
+}
+
 namespace {
 class RISCVELFStreamer : public MCELFStreamer {
   static std::pair<unsigned, unsigned> getRelocPairForSize(unsigned Size) {
@@ -226,6 +231,13 @@ class RISCVELFStreamer : public MCELFStreamer {
                             : !B.getName().empty());
   }
 
+  void reset() override {
+    MCTargetStreamer &TS = *getTargetStreamer();
+    RISCVTargetStreamer &RTS = static_cast<RISCVTargetStreamer &>(TS);
+    RTS.reset();
+    MCELFStreamer::reset();
+  }
+
 public:
   RISCVELFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> MAB,
                    std::unique_ptr<MCObjectWriter> MOW,

diff  --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h
index eb2759f2c217f..7ca2f5ab56234 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.h
@@ -92,6 +92,8 @@ class RISCVTargetELFStreamer : public RISCVTargetStreamer {
   void finishAttributeSection() override;
   size_t calculateContentSize() const;
 
+  void reset() override;
+
 public:
   MCELFStreamer &getStreamer();
   RISCVTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);

diff  --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp
index 349116d6b106a..5f9ed77d07cf5 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp
@@ -22,6 +22,7 @@ using namespace llvm;
 RISCVTargetStreamer::RISCVTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
 
 void RISCVTargetStreamer::finish() { finishAttributeSection(); }
+void RISCVTargetStreamer::reset() {}
 
 void RISCVTargetStreamer::emitDirectiveOptionPush() {}
 void RISCVTargetStreamer::emitDirectiveOptionPop() {}

diff  --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h
index 6f09016139b03..0d35d0b698a9f 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.h
@@ -23,6 +23,7 @@ class RISCVTargetStreamer : public MCTargetStreamer {
 public:
   RISCVTargetStreamer(MCStreamer &S);
   void finish() override;
+  virtual void reset();
 
   virtual void emitDirectiveOptionPush();
   virtual void emitDirectiveOptionPop();

diff  --git a/llvm/test/MC/RISCV/twice.ll b/llvm/test/MC/RISCV/twice.ll
new file mode 100644
index 0000000000000..c95f344f3a2cf
--- /dev/null
+++ b/llvm/test/MC/RISCV/twice.ll
@@ -0,0 +1,17 @@
+; Check for state persistence bugs in the RISC-V MC backend
+; This should neither fail (in the comparison that the second object
+; is bit-identical to the first) nor crash. Either failure would most
+; likely indicate some state that is not properly reset in the
+; appropriate ::reset method.
+; RUN: llc -compile-twice -filetype=obj -mtriple=riscv64 %s -o - \
+; RUN:     | llvm-objdump --section-headers - \
+; RUN:     | FileCheck %s
+
+; CHECK:      Sections:
+; CHECK-NEXT: Idx Name              Size     VMA              Type
+; CHECK-NEXT:  0
+; CHECK-NEXT:  1 .strtab
+; CHECK-NEXT:  2 .text
+; CHECK-NEXT:  3 .note.GNU-stack
+; CHECK-NEXT:  4 .riscv.attributes
+; CHECK-NEXT:  5 .symtab


        


More information about the llvm-commits mailing list