[LLVMdev] infinitely recursive named struct types

Török Edwin edwintorok at gmail.com
Wed Oct 5 04:58:34 PDT 2011


Looks like it is possible to create an infinitely recursive struct type, llvm-as accepts this:
%s = type { i32, i8, %s }

define %s @foo(%s* %a) {
    %y = load %s* %a
    ret %s %y

%s2 = type { i32, %s3}
%s3 = type { i8, %s2}

declare %s3 @foo2();

Similarly it is doable via the API: create a named struct, create elements where one refers directly to the
newly created struct (instead of pointer), and then setbody.

I can't see how such a type can be useful (I created it by accident, meant to use pointer-to struct,
not struct type directly), and in fact llvm-dis crashes on bitcodes with infinetely recursive struct types.

I'd suggest that such infinetely (mutually-)recursive struct types should be rejected on creation,
at least via an assert.

FWIW llvm-as itself crashes on this:
%s = type { i32, i8, %s }
define void @foo() {
    %x = alloca %s
    ret void

Best regards,

More information about the llvm-dev mailing list