[LLVMdev] How can I remove Intrinsic Functions during llvm-gcc compilation?
SHEN Hao
hao.shen at imag.fr
Wed May 12 06:53:16 PDT 2010
On Mon, May 10, 2010 at 7:19 PM, John Criswell <criswell at uiuc.edu> wrote:
> SHEN Hao wrote:
>> Thanks a lot for your answer.
>> As what you said, I can not have any options to avoid generating this kind
>> of intrinsic for byte code. Is it possible to modify gcc and ask it take
>> all memset liked functions as a general function call? I know this solution
>> is less performance efficient, but I would like to have it for my llvm
>> assembly level modification works.
>>
>
> It's possible to write an LLVM pass that converts calls to llvm.memset()
> into calls to an external memset() function. You could then modify your
> version of llvm-gcc to run this pass.
>
> However, is there really a problem with letting llvm-gcc use the
> intrinsic, even if you're compiling a C library? If the code generator
> replaces llvm.memset() with inline assembly code that does the same
> thing, then you get the correct behavior. If it modifies the
> llvm.memset() call to call an external memset() function, then the
> program ends up using the implementation of memset() from the C library
> that you're compiling. Either way, I'd think you'd get correct behavior.
Thanks for your suggestion. I am using the LLVM for a simulator related
research project. I need to modify all memory address related instructions
such as load/store, br and call. As I should modify all the call related
instructions, I can only support general functional calls. That's why I do not
like all these intrinsic instructions.
I like your suggestion of adding a LLVM pass. I think it's a good way to solve
this problem with some works. Now I am now taking a look of existing
LLVM code and I wish I can solve it ASAP.
Best regards,
Hao
>
> -- John T.
>
>> But anyway, thanks for you help.
>> Hao
>>
>> On Mon, May 10, 2010 at 6:30 AM, Duncan Sands <baldrick at free.fr> wrote:
>>
>>> Hi Hao Shen,
>>>
>>>
>>>> I am using llvm-gcc --emit-llvm to generate byte code. With llvm
>>>> readable ll format, I found some standard C library function such as
>>>> llvm.memset.
>>>>
>>> this is not a C library function, it is an LLVM intrinsic. An intrinsic is
>>> analogous to a builtin in gcc. An intrinsic may be expanded out into a code
>>> sequence by the compiler, or may get turned into a library call (which sounds
>>> like is what you are seeing).
>>>
>>>
>>>> In fact, I'm trying to compile newlibc with llvm, I do not need this
>>>> kind of llvm functions. How can I remove them during the compilation?
>>>>
>>> You can't avoid them. The same problem exists with gcc: you can't always
>>> avoid having gcc use the gcc memset builtin. However it has to be said
>>> that gcc generates its memset builtin less often than llvm-gcc generates
>>> llvm.memset, so this is not as visible. Also (I'm not sure about this)
>>> it may be that on some platforms gcc always expands builtin_memset into a
>>> code sequence rather than generating a call to the library memset function.
>>> However, gcc is not obliged to use a code sequence even in a freestanding
>>> environment. The environment is always required to provide memset. Here's
>>> what the gcc docs say:
>>>
>>> GCC requires the freestanding environment provide `memcpy', `memmove',
>>> `memset' and `memcmp'.
>>>
>>> Ciao,
>>>
>>> Duncan.
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>>
>>
>>
>>
>>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
--
Hao Shen
More information about the llvm-dev
mailing list