[cfe-dev] How to inline a C-function during code generation ?

Nat! nat at mulle-kybernetik.com
Tue May 26 12:56:51 PDT 2015


> Am 26.05.2015 um 18:57 schrieb David Blaikie <dblaikie at gmail.com>:
> 
> 
> 
> On Mon, May 25, 2015 at 11:05 AM, Nat! <nat at mulle-kybernetik.com> wrote:
> Hi
> 
> I started hacking on clang itself and I have some questions, that I couldn't figure out with the help of the source code or the documentation.
> 
> Looking at the IR code generated by -O2 and -O0 it seems, that function inlining is done in clang already. But I haven't figured out, how that is actually done.
> 
> Here's some useful terminology for this discussion:
> 
> IRGen: Clang's generation of LLVM IR from Clang ASTs

> CodeGen: LLVM's generation of machine code/assembly from LLVM IR
OK, clang unfortunately calls IR generation also code generation, which makes it a bit confusing for the newcomer. 

> Clang: The Clang frontend, down to the point that it generates and passes LLVM IR to the LLVM libraries.
> LLVM: Everything else. (the middle and backend)
> 
> Clang does not do inlining.
> LLVM does inlining.
> Clang produces code that can be/is encouraged to be/is required to be inlined by LLVM.
> 
> For example, if the user writes source code with the always_inline (or is it "alwaysinline", I forget) attribute, then Clang produces LLVM IR with the matching attribute and LLVM obeys the request (where possibly) and inlines all calls to that function during LLVM's optimization passes.

My mental model of what was happening was:

<file.c> > cc1 > <file.ir> and then llc < file.ir > file.o

and I expected all optimizations to be done after cc1 is complete. This is not the case. The inlining is done in the cc1 stage, during EmitBackendOutput. So that what you would call the "middle" and the code that does the inlining is linked in from the llvm project. The ir that I got from -cc1 -emit-llvm was therefore not created by "pure" clang as I expected but a mix of clang and llvm.

I hope I can get substitute my debugging clang by doing cc1 -emit-llvm -O0 and then llc these with optimization on, as it would be a lot easier to debug, why my code does not get inlined.

Thanks for the helpful reply!

Ciao
   Nat!
------------------------------------------------------
Wir haben das Beste gewollt, aber es kam wie immer.
                                    - W.Tschernomyrdin
 





More information about the cfe-dev mailing list