Hello, Can I define a named type ? %rt = {%rt} llvm-as can parse this definition without errors. JIT executes '%0 = alloca %rt' as allocating a memory with size 0. Because the llvm::TargetData::getTypeAllocSize accually returns 0 in this case. The function that calculates %rt's size is by the TargetData::getStructLayout, which calculates the a layout of %rt. It can only returns 0 when the element type %rt is not defined yet, since the result is infinite otherwise. Is %rt = {%rt} still a valid or useful type for LLVM IR? %rt = {%rt*}, { \2 }* or even \1* are definitely good types to represent recursive data types. In which case do we need %rt = {%rt}? Thanks -- Jianzhou
On Nov 11, 2010, at 8:45 AM, Jianzhou Zhao wrote:> Hello, > > Can I define a named type ? %rt = {%rt} > llvm-as can parse this definition without errors. > > JIT executes '%0 = alloca %rt' as allocating a memory with size 0. > Because the llvm::TargetData::getTypeAllocSize accually returns 0 in > this case. The function that calculates %rt's size is by the > TargetData::getStructLayout, which calculates the a layout of %rt. It > can only returns 0 when the element type %rt is not defined yet, since > the result is infinite otherwise. > > Is %rt = {%rt} still a valid or useful type for LLVM IR?No, that's not (or shouldn't be) a valid type. In this case, zero bytes is correct, but something like %rt = {%rt,i8} has infinite size. -Chris
On Thu, Nov 11, 2010 at 12:11 PM, Chris Lattner <clattner at apple.com> wrote:> > On Nov 11, 2010, at 8:45 AM, Jianzhou Zhao wrote: > >> Hello, >> >> Can I define a named type ? %rt = {%rt} >> llvm-as can parse this definition without errors. >> >> JIT executes '%0 = alloca %rt' as allocating a memory with size 0. >> Because the llvm::TargetData::getTypeAllocSize accually returns 0 in >> this case. The function that calculates %rt's size is by the >> TargetData::getStructLayout, which calculates the a layout of %rt. It >> can only returns 0 when the element type %rt is not defined yet, since >> the result is infinite otherwise. >> >> Is %rt = {%rt} still a valid or useful type for LLVM IR? > > No, that's not (or shouldn't be) a valid type. In this case, zero bytes is correct, but something like %rt = {%rt,i8} has infinite size.I tried %rt = {%rt,i8}, Its type size is 1. Does ' infinite size' mean the getTypeAllocSize function may not terminate? I am still using 2.6, whose getStructLayout stops, and assigns 1 as StructSize. Will 2.8 return a larger number? We could even define %rt = {%rt} %rt1 = {%rt2} %rt2 = {%rt1} and LLVM can eventually unify all of them to be %rt. If these %rt are not valid, will any pass of LLVM check and report such types, or this is supposed to be a requirement of frontends?> > -Chris-- Jianzhou