[PATCH] D12087: always_inline codegen rewrite

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 17 13:59:30 PDT 2015


On Mon, Aug 17, 2015 at 11:07 AM, Evgeniy Stepanov via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> eugenis created this revision.
> eugenis added reviewers: chandlerc, rsmith.
> eugenis added a subscriber: cfe-commits.
> eugenis set the repository for this revision to rL LLVM.
>
> Currently always_inline definitions are emitted as (in most cases) an
> available_externally llvm function with an alwaysinline attribute.


Naive dude missing some context here: How can that ^ be correct?

A basic test case doesn't seem to indicate that that's the case:

__attribute__((always_inline)) void f1() { }
void f2() { f1(); }

Compile with LLVM optimizations disabled, etc - the bitcode has no mention
of available_externally in it...



> This is not exactly right: always_inline functions are NOT available
> externally, and, for example, libc++ uses this semantics to preserve ABI
> stability.
>
> Emitting an undefined symbol for an always_inline function is always a
> bug. The current code can still do it in certain cases.
>  a. Inliner is an SCC pass. It traverses the graph starting from the
> roots, which are either main() function, or all externally-visible
> functions. Inlining does not happen in functions that are not reachable.
>  b. Dead code elimination is not perfect. There are cases where a function
> will become unreachable due to some late optimizations and will still be
> emitted into the binary.
>
> This patch changes the way always_inline functions are emitted in the
> Clang codegen to ensure this never happens. A function F is emitted as a
> pair of
>  a. internal F.inlinefunction() alwaysinline { **original function body** }
> and, depending on the function visibility, either
>  b1. declare F()
> or
>  b2. define external F() { musttail call F.inlinefunction() }
>
> Frontend ensures that all direct calls go to F.inlinefunction().
>
> This provides a simple invariant that all alwaysinline functions are
> internal, which can be checked in the IR verifier. Another invariant would
> be that alwaysinline functions never reach the backend.
>
> This patch is based on ideas by Chandler Carruth and Richard Smith.
>
>
> Repository:
>   rL LLVM
>
> http://reviews.llvm.org/D12087
>
> Files:
>   lib/CodeGen/CGCXX.cpp
>   lib/CodeGen/CodeGenModule.cpp
>   lib/CodeGen/CodeGenModule.h
>   lib/CodeGen/ItaniumCXXABI.cpp
>   test/CodeGen/2008-05-19-AlwaysInline.c
>   test/CodeGen/always-inline.c
>   test/CodeGen/always_inline.c
>   test/CodeGen/alwaysinline.c
>   test/CodeGen/dllimport.c
>   test/CodeGen/function-attributes.c
>   test/CodeGen/pr9614.c
>   test/CodeGenCXX/alwaysinline.cpp
>   test/CodeGenCXX/dllimport.cpp
>   test/Frontend/optimization-remark-line-directive.c
>   test/Frontend/optimization-remark.c
>   test/Modules/cxx-irgen.cpp
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150817/17a92601/attachment.html>


More information about the cfe-commits mailing list