[LLVMdev] Different signatures or smart casting?

Simon Atanasyan simon at atanasyan.com
Sat Apr 11 12:19:05 PDT 2015


Hello Ksenia,

Function names in the examples below are mangled names. _Z1aj means
function with name 'a' which accepts one argument of 'unsigned int'
type. The following declaration is correct from LLVM bitcode point of
view but the function name does not match type of the function's
argument.

declare i32 @_Z1aj(i64)

If you compile the following code by g++ you get _Z1ay name because
'unsigned long long' corresponds to 'y' in the mangled name.

int a(unsigned long long);

The linker does not know anything about real type of functions and
uses only mangled names for lookup. That is why the linker
successfully link this code.

In the real case 'void a(unsigned)' converts to the _Z1aj, while 'void
a(unsigned long long)' gets _Z1ay name and linker shows an error.

That is interesting why the code runs without any error. I think that
is because you run it on 64-bit systems and arguments passed by
registers. Probably it fails if you compile it and run on 32-bit
systems.

On Fri, Apr 10, 2015 at 4:03 PM, Ksenia Dolgorukova
<der.spiegel.sieht.mich at gmail.com> wrote:
> Hello!
> I linked two bitcode files like described below using LTO and find
> they are linked fine instead of making an error.
> ----------
> 1.bc
> ----------
> ...
> define i32 @main(i32 %argc, i8** %argv) #0 {
> entry:
> ...
> %call = call i32 @_Z1aj(i64 2)
> ...
> }
> declare i32 @_Z1aj(i64) #1
> ...
>
> ----------
> 2.bc
> ----------
> ...
> define i32 @_Z1aj(i32 %b) #0 {
> entry:
> ...
> }
> ...
>
> ----------
>
> In the first file function "_Z1aj" is declared as having i64 argument,
> whereas in the second file the function "_Z1aj" is described as having
> i32 argument!
>
> Are function signatures different?
> How does LLVM cast them?
> Could it be a bug?

Regards,
Simon Atanasyan



More information about the llvm-dev mailing list