diff options
| author | Pekka Enberg <penberg@kernel.org> | 2011-10-23 10:16:19 +0300 |
|---|---|---|
| committer | Pekka Enberg <penberg@kernel.org> | 2011-10-24 18:31:23 +0300 |
| commit | ea97bb4c5221a9be275b2d93dc90354bd6081a8c (patch) | |
| tree | fcda088008e8e39a6aafb30edef5fc96e0148c35 | |
| parent | e6981551345b7284f6995556398b3564d02afc42 (diff) | |
| download | sparse-dev-ea97bb4c5221a9be275b2d93dc90354bd6081a8c.tar.gz | |
sparse, llvm: Use new LLVM type system API for structs
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@chrisli.org>
Cc: Jeff Garzik <jgarzik@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
| -rw-r--r-- | sparse-llvm.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index fc0c2e93..14744e59 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) |
