[LLVMdev] How to tell whether a GlobalValue is user-defined

Rafael Espíndola
Mon, 25 Aug 2014 15:26:55 -0000

On 21 August 2014 19:32, Akira Hatanaka <ahatanak at gmail.com>
wrote:
> Is there a way to distinguish between GlobalValues that are user-defined
and
> those that are compiler-defined? I am looking for a function that I can use
> to tell if a GlobalValue is user-defined , something like
> "GlobalValue::isUserDefined", which returns true for user-defined
> GlobalValue.
>
> I'm trying to make changes to prevent llvm from placing user-defined
> constant arrays in the merge able constant sections. Currently, clang
places
> 16-byte constant arrays that are marked "unnamed_addr" into
__literal16 for
> macho (see following example).
>
> $ cat test1.c
>
> static const int s_dashArraysSize1[4] = {2, 2, 4, 6};
>
>
> int foo1(int a) {
>
>   return s_dashArraysSize1[a];
>
> }
>
>
> $ clang test1.c -S -O3 -o - | tail -n 10
>
> .section __TEXT,__literal16,16byte_literals
>
> .align 4                       ## @s_dashArraysSize1
>
> _s_dashArraysSize1:
>
> .long 2                       ## 0x2
>
> .long 2                       ## 0x2
>
> .long 4                       ## 0x4
>
> .long 6                       ## 0x6
>
>
>
> This is not desirable because macho linker wasn't originally designed
to
> handle user-defined symbols in those sections and having to handle them
> complicates the linker. Also, there is no benefit in doing so, since the
> linker currently doesn't try to merge user-defined variables anyway.

What does "user-defined" means in here? Since the linker can is
involved, I assume it has something to do with the final symbol name.

At the linker level (symbol names, sections, atoms, relocations, etc),
what exactly that is not supported?

Cheers,
Rafael