[cfe-dev] preserving type signatures

Chris Lattner clattner at apple.com
Wed Mar 24 09:53:34 PDT 2010


On Mar 24, 2010, at 7:36 AM, Naoya Maruyama wrote:

> Victor, thanks for pointing out the discussion, though unfortunately
> there is no way to work around the ABI issue.

You can probably work around this by implementing your own target, and having it lower the ABI types in a way that you would prefer.  X86-64 is one of the more brutal targets for type hacking.

-Chris

> 
> Thanks,
> Naoya
> 
> On Wed, Mar 24, 2010 at 11:09 PM, Victor Zverovich
> <victor.zverovich at googlemail.com> wrote:
>> It has been discussed on the list recently:
>> http://old.nabble.com/64bit-MRV-problem:-{-float,-float,-float}-->-{-double,-float-}-td27304830.html
>> 
>> Best regards,
>> Victor
>> On 24 March 2010 13:24, Naoya Maruyama <naoya.maruyama at gmail.com> wrote:
>>> 
>>> Renato,
>>> 
>>> Here's a sample code that is compiled as I wrote:
>>> 
>>> -------------------------------------------------
>>> struct dim2
>>> {
>>>    float x;
>>>    float y;
>>> };
>>> 
>>> struct dim2 kernel(struct dim2 *g)
>>> {
>>>    return *g;
>>> }
>>> -------------------------------------------------
>>> 
>>> When this code is compiled with the clang command in the LLVM/Clang
>>> 2.6 binary tarball:
>>> 
>>> -------------------------------------------------
>>> $ clang --version
>>> clang version 1.0
>>> (https://llvm.org/svn/llvm-project/cfe/branches/release_26 exported)
>>> Target: x86_64-unknown-linux-gnu
>>> Thread model: posix
>>> $ clang -Wall -emit-llvm -S test.c -o -
>>> ; ModuleID = 'test.c'
>>> target datalayout =
>>> 
>>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
>>> target triple = "x86_64-unknown-linux-gnu"
>>> 
>>> %struct.dim2 = type { float, float }
>>> 
>>> define double @kernel(%struct.dim2* %g) nounwind {
>>> entry:
>>>  %retval = alloca %struct.dim2                   ; <%struct.dim2*>
>>> [#uses=2]
>>>  %g.addr = alloca %struct.dim2*                  ; <%struct.dim2**>
>>> [#uses=2]
>>>  store %struct.dim2* %g, %struct.dim2** %g.addr
>>>  %tmp = load %struct.dim2** %g.addr              ; <%struct.dim2*>
>>> [#uses=1]
>>>  %tmp1 = bitcast %struct.dim2* %retval to i8*    ; <i8*> [#uses=1]
>>>  %tmp2 = bitcast %struct.dim2* %tmp to i8*       ; <i8*> [#uses=1]
>>>  call void @llvm.memcpy.i64(i8* %tmp1, i8* %tmp2, i64 8, i32 4)
>>>  %0 = bitcast %struct.dim2* %retval to double*   ; <double*> [#uses=1]
>>>  %1 = load double* %0, align 1                   ; <double> [#uses=1]
>>>  ret double %1
>>> }
>>> 
>>> declare void @llvm.memcpy.i64(i8* nocapture, i8* nocapture, i64, i32)
>>> nounwind
>>> -------------------------------------------------
>>> 
>>> What I want to see is the exactly same signature of the function named
>>> "kernel" as in the source code.
>>> 
>>> Let me know if I'm doing anything wrong.
>>> 
>>> Thanks,
>>> Naoya
>>> 
>>> On Wed, Mar 24, 2010 at 8:58 PM, Renato Golin <rengolin at systemcall.org>
>>> wrote:
>>>> On 24 March 2010 07:34, Naoya Maruyama <naoya.maruyama at gmail.com> wrote:
>>>>> However, for example, with Clang, if a function
>>>>> returns struct {float, float}, then the compiled function in the llvm
>>>>> bitcode returns a double that aggregates the two floats.
>>>> 
>>>> It's completely wrong to convert { float, float } into double. Just
>>>> because they have the same size doesn't mean they're identical.
>>>> 
>>>> Can you give us a simple example where this occurs?
>>>> 
>>>> 
>>>> --
>>>> cheers,
>>>> --renato
>>>> 
>>>> http://systemcall.org/
>>>> 
>>>> Reclaim your digital rights, eliminate DRM, learn more at
>>>> http://www.defectivebydesign.org/what_is_drm
>>>> 
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>> 
>> 
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





More information about the cfe-dev mailing list