Re: Sparse-LLVM issue compiling NULL pointers

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

 



On 2 March 2017 at 16:29, Dibyendu Majumdar <mobile@xxxxxxxxxxxxxxx> wrote:
> Hi Luc,
>
> On 2 March 2017 at 16:04, Luc Van Oostenryck
> <luc.vanoostenryck@xxxxxxxxx> wrote:
>> On Thu, Mar 02, 2017 at 02:33:09PM +0000, Dibyendu Majumdar wrote:
>>> This occurs in calc_memop_addr() function when it tries to do following:
>>>
>>>  as = LLVMGetPointerAddressSpace(LLVMTypeOf(src));
>>>
>>> If I dump insn, insn->src, and the LLVM value and type before this line, I get:
>>>
>>> 1) insn load.64     %r18 <- 8[%r2]
>>> 2) pseudo %r2
>>> 3) store %struct.buffer_type_st* %R2, %struct.buffer_type_st** %26
>>> 4) void
>>>
>>> The type of the LLVM store instruction is 'void'.
>>>
>>> My guess is that something is going horribly wrong in the way member
>>> access is handled.
>>>
>>> If you are able to reproduce this and have any suggestions then please
>>> let me know.
>>
>> Why I try your code (without LLVM assertions), I got indeed several
>> problems:
>>         Call parameter type does not match function signature!
>>         i0 16
>>          i64  %1 = call i8* @malloc(i0 16)
>
> I have the function argument fix so I don't get the malloc error.
>
>>         Invalid bitcast
>>           %27 = bitcast void <badref> to i8**
>>         Both operands to a binary operator are not of the same type!
>
> I think this corresponds to the code that fails - the type of the LLVM
> instruction is 'void' and the code is trying to cast to it or
> something.
>
>>           %R31 = add void <badref>, i64 %R30
>>         Stored value type does not match pointer operand type!
>>           store void %R31, i8** %46
>>
>
> The code aborts at previous step
>
>> The first one is really weird but I think you don't see it.
>
> It is the function call issue, for which I have a fix I described.
>
>> The next two I have no idea.
>> The fourth have something obviously wrong with the type of its 'target'.
>
>> However, while running sparse-llvm on some code sample I use to test
>> the linearization, I see that most errors are type errors and are
>> related to pointer arithmetic, exactly where LLVM's getelemptr is used.
>> Most offending instructions are OP_ADD (but since I have tests for
>> bitfields I see also errors for OP_AND, OP_OR & OP_LSR).
>> I guess that if you test OP_ADD instruction with pointer on one side
>> and integer on tne other side and issue an appropriate LLVMBuildGEP(),
>> things will already be much better.
>>
>
> Here is the output from linearize. I think the way stores and loads
> are handled is broken. It appears that the last store / load
> instruction is stored in insn->target->priv, and then used later on
> ... I do not understand what the code is trying to do. Is it trying to
> optimize away stores and loads?
>
> grow_allocator:
> .L0000022DAFA94A88:
>         <entry-point>
>         call.64     %r1 <- malloc, $16
>         ptrcast.64  %r2 <- (64) %r1
>         load.64     %r4 <- 32[%arg1]
>         load.64     %r6 <- 40[%arg1]
>         mulu.64     %r7 <- %r4, %r6
>         call.64     %r8 <- malloc, %r7
>         ptrcast.64  %r9 <- (64) %r8
>         store.64    %r9 -> 8[%r2]
>         load.64     %r12 <- 0[%arg1]
>         store.64    %r12 -> 0[%r2]
>         store.64    %r2 -> 0[%arg1]
>         load.64     %r18 <- 8[%r2]
>         store.64    %r18 -> 16[%arg1]
>         load.64     %r23 <- 32[%arg1]
>         load.64     %r25 <- 40[%arg1]
>         mulu.64     %r26 <- %r23, %r25
>         add.64      %r27 <- %r18, %r26
>         store.64    %r27 -> 24[%arg1]
>         ret

Just to clarify I mean above that the way Sparse-LLVM handles it is broken.
--
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