Vladimir Merzliakov
2005-Mar-09 13:05 UTC
[LLVMdev] Recursive Types using the llvm support library
----- Original Message ----- From: "Chris Lattner" <sabre at nondot.org> To: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu> Sent: Tuesday, March 08, 2005 6:31 PM Subject: Re: [LLVMdev] Recursive Types using the llvm support library> On Tue, 8 Mar 2005, Vladimir Merzliakov wrote: > >>>> An example where something really simple like the line below was output >>>> would be perfect. >>>> >>>> %struct.linked_list = type { %struct.linked_list*, %sbyte* } >>> >>> Use something like this: >>> >>> PATypeHolder StructTy = OpaqueType::get(); >>> std::vector<const Type*> Elts; >>> Elts.push_back(PointerType::get(StructTy)); >>> Elts.push_back(PointerType::get(Type::SByteTy)); >>> StructType *NewSTy = StructType::get(Elts); >>> >>> // At this point, NewSTy = "{ opaque*, sbyte* }", tell VMCore that >>> // the struct and the opaque type are actually the same. >>> cast<OpaqueType>(StructTy.get())->refineAbstractTypeTo(NewSTy); >>> >>> // NewSTy is potentially invalidated, but StructTy (a PATypeHolder) is >>> // kept up-to-date. >>> NewSTy = StructTy.get(); >>> >> Is assert(!NewSTy->isAbstract()) must pass after this line? > > In this case, yup. >I create test program and assert failed in it: { \2 *, sbyte * } Assertion failed: (!NewSTy->isAbstract()), function main, file /usr/home/wanderer/work/LLVMTest/obj/../src/tools/tool/Test.cc, line 28. Testcase source attached. Vladimir -------------- next part -------------- A non-text attachment was scrubbed... Name: Test.cc Type: application/octet-stream Size: 796 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20050309/f9463a01/attachment.obj>
Chris Lattner
2005-Mar-09 18:08 UTC
[LLVMdev] Recursive Types using the llvm support library
On Wed, 9 Mar 2005, Vladimir Merzliakov wrote:> I create test program and assert failed in it: > > { \2 *, sbyte * } > Assertion failed: (!NewSTy->isAbstract()), function main, file > /usr/home/wanderer/work/LLVMTest/obj/../src/tools/tool/Test.cc, line 28. > > Testcase source attached.Thanks, that definitely is a bug. Patch here: http://mail.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20050307/024522.html BTW, what are you using the isAbstract bit for? -Chris -- http://nondot.org/sabre/ http://llvm.cs.uiuc.edu/
Vladimir Merzliakov
2005-Mar-09 18:30 UTC
[LLVMdev] Recursive Types using the llvm support library
> On Wed, 9 Mar 2005, Vladimir Merzliakov wrote: >> I create test program and assert failed in it: >> >> { \2 *, sbyte * } >> Assertion failed: (!NewSTy->isAbstract()), function main, file >> /usr/home/wanderer/work/LLVMTest/obj/../src/tools/tool/Test.cc, line 28. >> >> Testcase source attached. > > Thanks, that definitely is a bug. Patch here: > http://mail.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20050307/024522.html > > BTW, what are you using the isAbstract bit for?In some asserts in my YAFL frontend (may be i will have free time to finish it). Vladimir
John Carrino
2005-Mar-21 00:29 UTC
[LLVMdev] Recursive Types using the llvm support library
On Wed, Mar 09, 2005 at 04:05:32PM +0300, Vladimir Merzliakov wrote:> >>Is assert(!NewSTy->isAbstract()) must pass after this line? > > > >In this case, yup. > > > I create test program and assert failed in it: > > { \2 *, sbyte * }How do I decode the \2 in this? I am creating types through this interface and I get quite a mess seen below. And this is relatively simple. Any ideas? -John alloca { { int, uint, sbyte*, \4* (), \4* (\4*), { { int, uint, sbyte*, \4* (), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*), \4* (\4*), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*, \4*), \4* (\4*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*) } }* (\4*), \4* (\4*) } } ; <{ { int, uint, sbyte*, \4* (), \4* (\4*), { { int, uint, sbyte*, \4* (), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*), \4* (\4*), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*, \4*), \4* (\4*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*) } }* (\4*), \4* (\4*) } }*>:2 [#uses=0]
Chris Lattner
2005-Mar-21 01:01 UTC
[LLVMdev] Recursive Types using the llvm support library
On Sun, 20 Mar 2005, John Carrino wrote:> On Wed, Mar 09, 2005 at 04:05:32PM +0300, Vladimir Merzliakov wrote: >>>> Is assert(!NewSTy->isAbstract()) must pass after this line? >>> >>> In this case, yup. >>> >> I create test program and assert failed in it: >> >> { \2 *, sbyte * } > > How do I decode the \2 in this? I am creating types through this > interface and I get quite a mess seen below. And this is relatively > simple. Any ideas?"\2" is an upreference, which refers to a containing type. For example, this type: \1* Is a pointer to pointer to pointer to pointer.... In "{\2*}", the upreference refers to the structure type, not the pointer, with \4, it means go 4 types up etc. In practice, this is leads to a horrible mess, as you've noticed. As such, I'd suggest using Module::addTypeName to give these things names so that you have a hope to understand them and so they are more compact :) -Chris> alloca { { int, uint, sbyte*, \4* (), \4* (\4*), { { int, uint, sbyte*, \4* (), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*), \4* (\4*), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*, \4*), \4* (\4*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*) } }* (\4*), \4* (\4*) } } ; <{ { int, uint, sbyte*, \4* (), \4* (\4*), { { int, uint, sbyte*, \4* (), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*), \4* (\4*), { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }* (\4*), \4* (\4*, \4*), \4* (\4*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*, { { int, uint, sbyte*, \4 (), \4 (\4), \8* (\4), \4 (\4) } }*) } }* (\4*), \4* (\4*) } }*>:2 [#uses=0] > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev >-Chris -- http://nondot.org/sabre/ http://llvm.cs.uiuc.edu/
Reasonably Related Threads
- [LLVMdev] Recursive Types using the llvm support library
- [LLVMdev] Recursive Types using the llvm support library
- [LLVMdev] Recursive Types using the llvm support library
- [LLVMdev] Recursive Types using the llvm support library
- [LLVMdev] Recursive Types using the llvm support library