Re: [RFC/PATCH] sparse, llvm: Fix string globals access

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux