To fix an issue with structs that refer to themselves: struct symbol { struct symbol *next; }; convert the code to use new type system API introduced in LLVM 3.0 so that there's a LLVMTypeRef of the struct we can look up while walking through the struct members. Cc: Christopher Li <sparse@xxxxxxxxxxx> Cc: Jeff Garzik <jgarzik@xxxxxxxxxx> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Pekka Enberg <penberg@xxxxxxxxxx> --- sparse-llvm.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sparse-llvm.c b/sparse-llvm.c index fc0c2e9..14744e5 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -40,15 +40,26 @@ static LLVMTypeRef sym_struct_type(struct symbol *sym) { LLVMTypeRef elem_types[MAX_STRUCT_MEMBERS]; struct symbol *member; + char buffer[256]; + LLVMTypeRef ret; unsigned nr = 0; + sprintf(buffer, "%.*s", sym->ident->len, sym->ident->name); + + ret = LLVMStructCreateNamed(LLVMGetGlobalContext(), buffer); + FOR_EACH_PTR(sym->symbol_list, member) { + LLVMTypeRef member_type; + assert(nr < MAX_STRUCT_MEMBERS); - elem_types[nr++] = symbol_type(member); + member_type = symbol_type(member); + + elem_types[nr++] = member_type; } END_FOR_EACH_PTR(member); - return LLVMStructType(elem_types, nr, 0 /* packed? */); + LLVMStructSetBody(ret, elem_types, nr, 0 /* packed? */); + return ret; } static LLVMTypeRef sym_ptr_type(struct symbol *sym) -- 1.7.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html