mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
IR: Fix memory corruption in MDNode new/delete
There were two major problems with `MDNode` memory management. 1. `MDNode::operator new()` called a placement array constructor for `MDOperand`. What? Each operand needs to be placed individually. 2. `MDNode::operator delete()` failed to destruct the `MDOperand`s at all. Frankly it's hard to understand how this worked locally, how this survived an LTO bootstrap, or how it worked on most of the bots. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d465762cfd
commit
ea614a5025
@ -378,14 +378,18 @@ StringRef MDString::getString() const {
|
||||
|
||||
void *MDNode::operator new(size_t Size, unsigned NumOps) {
|
||||
void *Ptr = ::operator new(Size + NumOps * sizeof(MDOperand));
|
||||
MDOperand *First = new (Ptr) MDOperand[NumOps];
|
||||
return First + NumOps;
|
||||
MDOperand *O = static_cast<MDOperand *>(Ptr);
|
||||
for (MDOperand *E = O + NumOps; O != E; ++O)
|
||||
(void)new (O) MDOperand;
|
||||
return O;
|
||||
}
|
||||
|
||||
void MDNode::operator delete(void *Mem) {
|
||||
MDNode *N = static_cast<MDNode *>(Mem);
|
||||
MDOperand *Last = static_cast<MDOperand *>(Mem);
|
||||
::operator delete(Last - N->NumOperands);
|
||||
MDOperand *O = static_cast<MDOperand *>(Mem);
|
||||
for (MDOperand *E = O - N->NumOperands; O != E; --O)
|
||||
(O - 1)->~MDOperand();
|
||||
::operator delete(O);
|
||||
}
|
||||
|
||||
MDNode::MDNode(LLVMContext &Context, unsigned ID, ArrayRef<Metadata *> MDs)
|
||||
|
Loading…
x
Reference in New Issue
Block a user