[Hexagon] Allocate MCInst in the MCContext to avoid leaking it.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 12 Nov 2015 19:30:40 +0000 (19:30 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 12 Nov 2015 19:30:40 +0000 (19:30 +0000)
Found by leaksanitizer.

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

lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp
lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.cpp
lib/Target/Hexagon/MCTargetDesc/HexagonMCInstrInfo.h

index 289d2676bf218d7dc5fa1c4d0ac615101e13aec9..369bb46c44eb9f34f03a7b3dfc9897a35a17b269 100644 (file)
@@ -871,7 +871,7 @@ bool HexagonAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
                           MatchingInlineAsm, MustExtend))
     return true;
   HexagonMCInstrInfo::extendIfNeeded(
-      MCII, MCB, *SubInst,
+      getParser().getContext(), MCII, MCB, *SubInst,
       HexagonMCInstrInfo::isExtended(MCII, *SubInst) || MustExtend);
   MCB.addOperand(MCOperand::createInst(SubInst));
   if (!InBrackets)
index 2940612080344e407f6746d3f2ce32ed499da7a6..2145fb7f4234501fc9551f17c4017efbcd623d8b 100644 (file)
@@ -28,7 +28,8 @@ void HexagonMCInstrInfo::addConstant(MCInst &MI, uint64_t Value,
   MI.addOperand(MCOperand::createExpr(MCConstantExpr::create(Value, Context)));
 }
 
-void HexagonMCInstrInfo::addConstExtender(MCInstrInfo const &MCII, MCInst &MCB,
+void HexagonMCInstrInfo::addConstExtender(MCContext &Context,
+                                          MCInstrInfo const &MCII, MCInst &MCB,
                                           MCInst const &MCI) {
   assert(HexagonMCInstrInfo::isBundle(MCB));
   MCOperand const &exOp =
@@ -36,7 +37,7 @@ void HexagonMCInstrInfo::addConstExtender(MCInstrInfo const &MCII, MCInst &MCB,
 
   // Create the extender.
   MCInst *XMCI =
-      new MCInst(HexagonMCInstrInfo::deriveExtender(MCII, MCI, exOp));
+      new (Context) MCInst(HexagonMCInstrInfo::deriveExtender(MCII, MCI, exOp));
 
   MCB.addOperand(MCOperand::createInst(XMCI));
 }
@@ -150,10 +151,11 @@ MCInst const *HexagonMCInstrInfo::extenderForIndex(MCInst const &MCB,
   return nullptr;
 }
 
-void HexagonMCInstrInfo::extendIfNeeded(MCInstrInfo const &MCII, MCInst &MCB,
+void HexagonMCInstrInfo::extendIfNeeded(MCContext &Context,
+                                        MCInstrInfo const &MCII, MCInst &MCB,
                                         MCInst const &MCI, bool MustExtend) {
   if (isConstExtended(MCII, MCI) || MustExtend)
-    addConstExtender(MCII, MCB, MCI);
+    addConstExtender(Context, MCII, MCB, MCI);
 }
 
 HexagonII::MemAccessSize
index a3230d2ae7305ba4ed1dd78da25fb91099fdd5c5..f8c6f395ee10743e41bbdededb5eeaf09e6ec187 100644 (file)
@@ -53,7 +53,8 @@ int64_t const memStoreReorderEnabledMask = 1 << memStoreReorderEnabledOffset;
 size_t const bundleInstructionsOffset = 1;
 
 void addConstant(MCInst &MI, uint64_t Value, MCContext &Context);
-void addConstExtender(MCInstrInfo const &MCII, MCInst &MCB, MCInst const &MCI);
+void addConstExtender(MCContext &Context, MCInstrInfo const &MCII, MCInst &MCB,
+                      MCInst const &MCI);
 
 // Returns a iterator range of instructions in this bundle
 iterator_range<MCInst::const_iterator> bundleInstructions(MCInst const &MCI);
@@ -71,8 +72,8 @@ void clampExtended(MCInstrInfo const &MCII, MCContext &Context, MCInst &MCI);
 
 // Return the extender for instruction at Index or nullptr if none
 MCInst const *extenderForIndex(MCInst const &MCB, size_t Index);
-void extendIfNeeded(MCInstrInfo const &MCII, MCInst &MCB, MCInst const &MCI,
-                    bool MustExtend);
+void extendIfNeeded(MCContext &Context, MCInstrInfo const &MCII, MCInst &MCB,
+                    MCInst const &MCI, bool MustExtend);
 
 // Create a duplex instruction given the two subinsts
 MCInst *deriveDuplex(MCContext &Context, unsigned iClass, MCInst const &inst0,