[cfe-dev] preserving type signatures

Naoya Maruyama naoya.maruyama at gmail.com
Wed Mar 24 06:24:05 PDT 2010


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
>



More information about the cfe-dev mailing list