On Sat, Jun 9, 2012 at 2:55 AM, Xi Wang <xi.wang@xxxxxxxxx> wrote: > On Jun 8, 2012, at 4:39 PM, Pekka Enberg wrote: >> >> Xi, so I guess your current work on linearize.c might fix the SIGSEGV >> I'm seeing? > > I guess the problem is that sparse-llvm generates an incorrect type > `load i64*' in llvm from the sparse instruction load.64. > > load.64 %r2 <- 0[foo] > call.32 %r1 <- puts, %r2 > ret.32 $0 > > With the new ->ctype in pseudo sparse-llvm should be able to generate > the correct type. I am playing with an LLVM backend with typed pseudos; > it generates the following code, which seems okay. > > @0 = internal global [7 x i8] c"Foo !\0A\00", align 1 > @foo = internal global i8* getelementptr inbounds ([7 x i8]* @0, i64 0, i64 0), align 8 > > define i32 @main(i32 %argc, i8** %argv) { > entry: > %0 = load i8** @foo > %1 = call i32 @puts(i8* %0) > ret i32 0 > } Right. Looking at your "splay" backend static value_t emit_gep(builder_t builder, struct pseudo *src, unsigned int offset, struct pseudo *dst) { type_t charp = LLVMPointerType(LLVMInt8Type(), 0); value_t base = LLVMBuildPointerCast(builder, emit_pseudo(src), charp, ""); value_t idx = LLVMConstInt(LLVMIntType(bits_in_pointer), offset, 0); value_t gep = LLVMBuildGEP(builder, base, &idx, 1, ""); type_t type = LLVMPointerType(emit_type(dst->ctype), 0); return LLVMBuildPointerCast(builder, gep, type, ""); } after which OP_LOAD translation becomes as simple as case OP_LOAD: return LLVMBuildLoad(builder, emit_gep(builder, insn->src, insn->offset, insn->target), ""); Jeff, I guess we should do this for output_load() and output_store() in sparse-llvm.c as well? -- 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