Don't allocate the SmallVector of Registers. It gets messy figuring out who
authorBill Wendling <isanbard@gmail.com>
Thu, 18 Nov 2010 21:50:54 +0000 (21:50 +0000)
committerBill Wendling <isanbard@gmail.com>
Thu, 18 Nov 2010 21:50:54 +0000 (21:50 +0000)
should delete what when the object gets copied around. It's also making valgrind
upset.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119747 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmParser/ARMAsmParser.cpp

index b07fb6410a0af38cf51e327db9a709906a3c9bf6..b5f2e12e1c5d2a87a94b69c58174c6f67e532644 100644 (file)
@@ -113,6 +113,7 @@ class ARMOperand : public MCParsedAsmOperand {
   } Kind;
 
   SMLoc StartLoc, EndLoc;
+  SmallVector<unsigned, 8> Registers;
 
   union {
     struct {
@@ -129,10 +130,6 @@ class ARMOperand : public MCParsedAsmOperand {
       bool Writeback;
     } Reg;
 
-    struct {
-      SmallVector<unsigned, 32> *Registers;
-    } RegList;
-
     struct {
       const MCExpr *Val;
     } Imm;
@@ -172,7 +169,7 @@ public:
     case RegisterList:
     case DPRRegisterList:
     case SPRRegisterList:
-      RegList = o.RegList;
+      Registers = o.Registers;
       break;
     case Immediate:
       Imm = o.Imm;
@@ -182,10 +179,6 @@ public:
       break;
     }
   }
-  ~ARMOperand() {
-    if (isRegList())
-      delete RegList.Registers;
-  }
 
   /// getStartLoc - Get the location of the first token of this operand.
   SMLoc getStartLoc() const { return StartLoc; }
@@ -210,7 +203,7 @@ public:
   const SmallVectorImpl<unsigned> &getRegList() const {
     assert((Kind == RegisterList || Kind == DPRRegisterList ||
             Kind == SPRRegisterList) && "Invalid access!");
-    return *RegList.Registers;
+    return Registers;
   }
 
   const MCExpr *getImm() const {
@@ -350,11 +343,10 @@ public:
       Kind = SPRRegisterList;
 
     ARMOperand *Op = new ARMOperand(Kind);
-    Op->RegList.Registers = new SmallVector<unsigned, 32>();
     for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator
            I = Regs.begin(), E = Regs.end(); I != E; ++I)
-      Op->RegList.Registers->push_back(I->first);
-    std::sort(Op->RegList.Registers->begin(), Op->RegList.Registers->end());
+      Op->Registers.push_back(I->first);
+    std::sort(Op->Registers.begin(), Op->Registers.end());
     Op->StartLoc = StartLoc;
     Op->EndLoc = EndLoc;
     return Op;