[LLVMdev] Assertion: replaceAllUses of value with new value of different type! being thrown all of a sudden
Christian Schafmeister
chris.schaf at verizon.net
Mon Jan 19 13:41:39 PST 2015
Some more data.
I upgraded to todays llvm/clang/clang-extra-tools top-of-trunk and I upgraded my compiler to deal with all of the changes in llvm/clang since last September.
My current ToT llvm commit is 4b678bff4ebae28ec7e04ec936cf924ee8d289df
I am still getting an assertion failure at exactly the same point, when I’m calling DIBuilder::finalize but the assertion has changed (but similar)- it is now:
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file /Users/meister/Development/externals-clasp/llvm36/include/llvm/Support/Casting.h, line 237.
Below is some info that may answer your (Duncan and Frederic) questions:
1) Duncan asked “are you using two different `LLVMContext`s?”
Answer: I may be - in frame 6 the DbgNode->Context reference looks mangled
2) Frederic asked “is TempEnumTypes null at this point”
Answer: No, it has the value 0x000000011c81fda8
Below is an lldb session where I’m looking at the backtrace.
(lldb) up
frame #4: 0x0000000103de1811 clasp_boehm_d`__assert_rtn(func=0x00000001043a5749, file=0x00000001043a574e, line=237, expr=0x00000001043a579f) + 129 at Signals.inc:533
530 else
531 fprintf(stderr, "Assertion failed: (%s), file %s, line %d.\n",
532 expr, file, line);
-> 533 abort();
534 }
535
536 void abort() {
(lldb) up
frame #5: 0x0000000103cf47dc clasp_boehm_d`llvm::cast_retty<llvm::MDNodeFwdDecl, llvm::MDNode*>::ret_type llvm::cast<llvm::MDNodeFwdDecl, llvm::MDNode>(Val=0x000000011c81fda8) + 108 at Casting.h:237
234
235 template <class X, class Y>
236 inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
-> 237 assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
238 return cast_convert_val<X, Y*,
239 typename simplify_type<Y*>::SimpleType>::doit(Val);
240 }
(lldb) up
frame #6: 0x0000000103b6bf6a clasp_boehm_d`llvm::DIDescriptor::replaceAllUsesWith(this=0x00007fff5fbdba18, D=0x0000000109d24380) + 218 at DebugInfo.cpp:349
346 void DIDescriptor::replaceAllUsesWith(MDNode *D) {
347 assert(DbgNode && "Trying to replace an unverified type!");
348 assert(DbgNode != D && "This replacement should always happen");
-> 349 auto *Node = cast<MDNodeFwdDecl>(const_cast<MDNode *>(DbgNode));
350 Node->replaceAllUsesWith(D);
351 MDNode::deleteTemporary(Node);
352 }
(lldb) up
frame #7: 0x0000000103b4ff19 clasp_boehm_d`llvm::DIBuilder::finalize(this=0x000000011c81feb0) + 185 at DIBuilder.cpp:74
71
72 void DIBuilder::finalize() {
73 DIArray Enums = getOrCreateArray(AllEnumTypes);
-> 74 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
75
76 SmallVector<Metadata *, 16> RetainValues;
77 // Declarations and definitions of the same type may be retained. Some
(lldb) print TempEnumTypes
(llvm::MDNode *) $0 = 0x000000011c81fda8
;;; Later on
(lldb) down
frame #6: 0x0000000103b6bf6a clasp_boehm_d`llvm::DIDescriptor::replaceAllUsesWith(this=0x00007fff5fbdba18, D=0x0000000109d24380) + 218 at DebugInfo.cpp:349
346 void DIDescriptor::replaceAllUsesWith(MDNode *D) {
347 assert(DbgNode && "Trying to replace an unverified type!");
348 assert(DbgNode != D && "This replacement should always happen");
-> 349 auto *Node = cast<MDNodeFwdDecl>(const_cast<MDNode *>(DbgNode));
350 Node->replaceAllUsesWith(D);
351 MDNode::deleteTemporary(Node);
352 }
(lldb) print DbgNode
(const llvm::MDNode *) $1 = 0x000000011c81fda8
(lldb) call DbgNode->dump()
!{error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).
The process has been returned to the state before expression evaluation.
(lldb) frame variable
(llvm::DIDescriptor *) this = 0x00007fff5fbdba18
(llvm::MDNode *) D = 0x0000000109d24380
(llvm::MDNodeFwdDecl *) Node = 0x0000000102f55985
(lldb) call D->dump()
!{}
(lldb) call DbgNode
(const llvm::MDNode *) $2 = 0x000000011c81fda8
(lldb) print *DbgNode
(const llvm::MDNode) $3 = {
llvm::Metadata = {
SubclassID = '\0'
IsDistinctInContext = false
SubclassData16 = 0
SubclassData32 = 2415919104
}
Context = 0x0000000109e00009
NumOperands = 1
MDNodeSubclassData = 0
}
(lldb) print *D
(llvm::MDNode) $4 = {
llvm::Metadata = {
SubclassID = '\0'
IsDistinctInContext = false
SubclassData16 = 0
SubclassData32 = 0
}
Context = 0x0000000109e02430
NumOperands = 0
MDNodeSubclassData = 3267742850
}
(lldb) print D->Context
(llvm::LLVMContext) $5 = {
pImpl = 0x000000010b003000
}
(lldb) print DbgNode->Context
(llvm::LLVMContext) $6 = {
pImpl = 0xd00000000109d003
}
(lldb)
On Jan 19, 2015, at 3:49 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>
>> On 2015-Jan-19, at 12:38, Frédéric Riss <friss at apple.com> wrote:
>>
>>
>>> On Jan 19, 2015, at 12:04 PM, Christian Schafmeister <chris.schaf at verizon.net> wrote:
>>>
>>>
>>> I forgot to mention this in my initial email.
>>>
>>> The build of LLVM that I was using was commit a0d5d7aed8e177cea381b3d054d80c212ece9f2c
>>> The date on the commit is: Date: Fri Sep 26 12:34:06 2014
>>>
>>> Also:
>>> Today I grabbed the ToT llvm/clang/clang-extra-tools and I’m working on getting my code to be compatible with it.
>>>
>>> I can switch back and forth between the current ToT llvm and the old one.
>>
>> Hmmm, I didn’t look closely enough and I thought you were hitting an assertions I added a few weeks after that commit in the Metadata RAUW method. But it is the equivalent assertion in Value::RAUW that you are hitting and that has been there forever. Looking at your exact revision, the assertion seems to trigger while executing:
>>
>> DIType(TempEnumTypes).replaceAllUsesWith(Enums);
>>
>> in DIBuilder::finalize(). Can you check if TempEnumTypes is null at this point? If that is the issue (which I’m not sure), then you need to call DIBuilder::createCompileUnit() at some point.
>>
>> Fred
>
> I had a thought, too: are you using two different `LLVMContext`s? That
> would cause the `metadata` type to compare unequal.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150119/492f006b/attachment.html>
More information about the llvm-dev
mailing list