This is an archive of the discontinued LLVM Phabricator instance.

[InstrProf] Don't take the address of alwaysinline available_externally functions
ClosedPublic

Authored by vsk on Jun 12 2017, 7:32 PM.

Details

Summary

Doing so breaks compilation of the following C program
(under -fprofile-instr-generate):

__attribute__((always_inline)) inline int foo() { return 0; }

int main() { return foo(); }

At link time, we fail because taking the address of an
available_externally function creates an undefined external reference,
which the TU cannot provide.

Emitting the function definition into the object file at all appears to
be a violation of the langref: "Globals with 'available_externally'
linkage are never emitted into the object file corresponding to the LLVM
module."

Testing: check-llvm, check-profile

Diff Detail

Event Timeline

vsk created this revision.Jun 12 2017, 7:32 PM
davidxl added inline comments.Jun 12 2017, 8:00 PM
lib/Transforms/Instrumentation/InstrProfiling.cpp
346

Should you check always inline attribute here too to avoid missing indirect call profiling? AvailableExternally is very common in C++ (e.g, for extern template). Blindly dropping the address can lead to lots of missing value profiling.

475

This can not be readonly -- there is a pointer to the value profiling counter array from here.

vsk updated this revision to Diff 102380.Jun 13 2017, 12:12 PM
vsk marked 2 inline comments as done.
vsk retitled this revision from [InstrProf] Don't take the address of available_externally functions to [InstrProf] Don't take the address of alwaysinline available_externally functions.
vsk edited the summary of this revision. (Show Details)
  • Only change behavior when handling alwaysinline + available_externally functions.
davidxl accepted this revision.Jun 13 2017, 1:32 PM

lgtm ( The area of linkage handling has many subtle problems in the past with large C++ apps, so be prepared for any breakage introduced).

This revision is now accepted and ready to land.Jun 13 2017, 1:32 PM
This revision was automatically updated to reflect the committed changes.