<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Mar 28, 2014 at 10:53 AM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Fri Mar 28 12:53:22 2014<br>
New Revision: 205023<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=205023&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=205023&view=rev</a><br>
Log:<br>
InstrProf: Emit runtime hook directly in IRGen<br>
<br>
-u behaviour is apparently not portable between linkers (see cfe-commits<br>
discussions for r204379 and r205012). I've moved the logic to IRGen,<br>
where it should have been in the first place.<br>
<br>
I don't have a Linux system to test this on, so it's possible this logic<br>
*still* doesn't pull in the instrumented profiling runtime on Linux.<br>
<br>
I'm in the process of getting tests going on the compiler-rt side<br>
(llvm-commits "[PATCH] InstrProf: Add initial compiler-rt test"). Once<br>
we have tests for the full flow there, the runtime logic should get a<br>
whole lot less brittle.<br>
<br>
<rdar://problem/16458307><br>
<br>
Modified:<br>
cfe/trunk/lib/CodeGen/CodeGenPGO.cpp<br>
cfe/trunk/lib/Driver/ToolChains.cpp<br>
cfe/trunk/lib/Driver/Tools.cpp<br>
cfe/trunk/test/Profile/c-linkage.c<br>
cfe/trunk/test/Profile/cxx-linkage.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=205023&r1=205022&r2=205023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=205023&r1=205022&r2=205023&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Fri Mar 28 12:53:22 2014<br>
@@ -814,6 +814,35 @@ namespace {<br>
};<br>
}<br>
<br>
+static void emitRuntimeHook(CodeGenModule &CGM) {<br>
+ constexpr const char *RuntimeVarName = "__llvm_profile_runtime";<br>
+ constexpr const char *RuntimeUserName = "__llvm_profile_runtime_user";<br></blockquote><div><br></div><div>MSVC2012 doesn't support 'constexpr'.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ if (CGM.getModule().getGlobalVariable(RuntimeVarName))<br>
+ return;<br>
+<br>
+ // Declare the runtime hook.<br>
+ llvm::LLVMContext &Ctx = CGM.getLLVMContext();<br>
+ auto *Int32Ty = llvm::Type::getInt32Ty(Ctx);<br>
+ auto *Var = new llvm::GlobalVariable(CGM.getModule(), Int32Ty, false,<br>
+ llvm::GlobalValue::ExternalLinkage,<br>
+ nullptr, RuntimeVarName);<br>
+<br>
+ // Make a function that uses it.<br>
+ auto *User = llvm::Function::Create(llvm::FunctionType::get(Int32Ty, false),<br>
+ llvm::GlobalValue::LinkOnceODRLinkage,<br>
+ RuntimeUserName, &CGM.getModule());<br>
+ User->addFnAttr(llvm::Attribute::NoInline);<br>
+ if (CGM.getCodeGenOpts().DisableRedZone)<br>
+ User->addFnAttr(llvm::Attribute::NoRedZone);<br>
+ CGBuilderTy Builder(llvm::BasicBlock::Create(CGM.getLLVMContext(), "", User));<br>
+ auto *Load = Builder.CreateLoad(Var);<br>
+ Builder.CreateRet(Load);<br>
+<br>
+ // Create a use of the function. Now the definition of the runtime variable<br>
+ // should get pulled in, along with any static initializears.<br>
+ CGM.addUsedGlobal(User);<br>
+}<br>
+<br>
void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) {<br>
bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate;<br>
PGOProfileData *PGOData = CGM.getPGOData();<br>
@@ -839,8 +868,10 @@ void CodeGenPGO::assignRegionCounters(co<br>
}<br>
<br>
mapRegionCounters(D);<br>
- if (InstrumentRegions)<br>
+ if (InstrumentRegions) {<br>
+ emitRuntimeHook(CGM);<br>
emitCounterVariables();<br>
+ }<br>
if (PGOData) {<br>
loadRegionCounts(PGOData);<br>
computeRegionCounts(D);<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=205023&r1=205022&r2=205023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=205023&r1=205022&r2=205023&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains.cpp Fri Mar 28 12:53:22 2014<br>
@@ -325,13 +325,6 @@ void DarwinClang::AddLinkRuntimeLibArgs(<br>
Args.hasArg(options::OPT_fprofile_instr_generate) ||<br>
Args.hasArg(options::OPT_fcreate_profile) ||<br>
Args.hasArg(options::OPT_coverage)) {<br>
- // Pull in runtime for -fprofile-inst-generate. This is required since<br>
- // there are no calls to the runtime in the code.<br>
- if (Args.hasArg(options::OPT_fprofile_instr_generate)) {<br>
- CmdArgs.push_back("-u");<br>
- CmdArgs.push_back("___llvm_profile_runtime");<br>
- }<br>
-<br>
// Select the appropriate runtime library for the target.<br>
if (isTargetIOSBased())<br>
AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=205023&r1=205022&r2=205023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=205023&r1=205022&r2=205023&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Fri Mar 28 12:53:22 2014<br>
@@ -1817,13 +1817,6 @@ static void addProfileRT(<br>
Args.hasArg(options::OPT_coverage)))<br>
return;<br>
<br>
- // Pull in runtime for -fprofile-inst-generate. This is required since there<br>
- // are no calls to the runtime in the code.<br>
- if (Args.hasArg(options::OPT_fprofile_instr_generate)) {<br>
- CmdArgs.push_back("-u");<br>
- CmdArgs.push_back("___llvm_profile_runtime");<br>
- }<br>
-<br>
SmallString<128> LibProfile = getCompilerRTLibDir(TC);<br>
llvm::sys::path::append(LibProfile,<br>
Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");<br>
<br>
Modified: cfe/trunk/test/Profile/c-linkage.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/c-linkage.c?rev=205023&r1=205022&r2=205023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/c-linkage.c?rev=205023&r1=205022&r2=205023&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Profile/c-linkage.c (original)<br>
+++ cfe/trunk/test/Profile/c-linkage.c Fri Mar 28 12:53:22 2014<br>
@@ -1,6 +1,7 @@<br>
// Check the data structures emitted by instrumentation.<br>
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-linkage.c %s -o - -emit-llvm -fprofile-instr-generate | FileCheck %s<br>
<br>
+// CHECK: @__llvm_profile_runtime = external global i32<br>
// CHECK: @__llvm_profile_counters_foo = global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8<br>
// CHECK: @__llvm_profile_name_foo = constant [3 x i8] c"foo", section "__DATA,__llvm_prf_names", align 1<br>
// CHECK: @__llvm_profile_data_foo = constant { i32, i32, i64, i8*, i64* } { i32 3, i32 1, i64 1, i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64]* @__llvm_profile_counters_foo, i32 0, i32 0) }, section "__DATA,__llvm_prf_data", align 8<br>
@@ -28,4 +29,9 @@ int main(void) {<br>
// CHECK: @__llvm_profile_data_foo_internal = internal constant { i32, i32, i64, i8*, i64* } { i32 24, i32 3, i64 3, i8* getelementptr inbounds ([24 x i8]* @__llvm_profile_name_foo_internal, i32 0, i32 0), i64* getelementptr inbounds ([3 x i64]* @__llvm_profile_counters_foo_internal, i32 0, i32 0) }, section "__DATA,__llvm_prf_data", align 8<br>
static void foo_internal(void) { if (0){} if (0){} }<br>
<br>
-// CHECK: @llvm.used = appending global [4 x i8*] [i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo_weak to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_main to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo_internal to i8*)], section "llvm.metadata"<br>
+// CHECK: @llvm.used = appending global [5 x i8*] [i8* bitcast (i32 ()* @__llvm_profile_runtime_user to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo_weak to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_main to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_foo_internal to i8*)], section "llvm.metadata"<br>
+<br>
+// CHECK: define linkonce_odr i32 @__llvm_profile_runtime_user() {{.*}} {<br>
+// CHECK: %[[REG:.*]] = load i32* @__llvm_profile_runtime<br>
+// CHECK: ret i32 %[[REG]]<br>
+// CHECK: }<br>
<br>
Modified: cfe/trunk/test/Profile/cxx-linkage.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/cxx-linkage.cpp?rev=205023&r1=205022&r2=205023&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/cxx-linkage.cpp?rev=205023&r1=205022&r2=205023&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Profile/cxx-linkage.cpp (original)<br>
+++ cfe/trunk/test/Profile/cxx-linkage.cpp Fri Mar 28 12:53:22 2014<br>
@@ -1,5 +1,6 @@<br>
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -emit-llvm -main-file-name cxx-linkage.cpp %s -o - -fprofile-instr-generate | FileCheck %s<br>
<br>
+// CHECK: @__llvm_profile_runtime = external global i32<br>
// CHECK: @__llvm_profile_counters__Z3foov = global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8<br>
// CHECK: @__llvm_profile_name__Z3foov = constant [7 x i8] c"_Z3foov", section "__DATA,__llvm_prf_names", align 1<br>
// CHECK: @__llvm_profile_data__Z3foov = constant { i32, i32, i64, i8*, i64* } { i32 7, i32 1, i64 1, i8* getelementptr inbounds ([7 x i8]* @__llvm_profile_name__Z3foov, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64]* @__llvm_profile_counters__Z3foov, i32 0, i32 0) }, section "__DATA,__llvm_prf_data", align 8<br>
@@ -27,4 +28,9 @@ int main(void) {<br>
// CHECK: @__llvm_profile_data__Z10foo_inlinev = linkonce_odr constant { i32, i32, i64, i8*, i64* } { i32 15, i32 7, i64 7, i8* getelementptr inbounds ([15 x i8]* @__llvm_profile_name__Z10foo_inlinev, i32 0, i32 0), i64* getelementptr inbounds ([7 x i64]* @__llvm_profile_counters__Z10foo_inlinev, i32 0, i32 0) }, section "__DATA,__llvm_prf_data", align 8<br>
inline void foo_inline(void) { if (0){} if (0){} if (0){} if (0){} if (0){} if (0){}}<br>
<br>
-// CHECK: @llvm.used = appending global [4 x i8*] [i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z3foov to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z8foo_weakv to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_main to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z10foo_inlinev to i8*)], section "llvm.metadata"<br>
+// CHECK: @llvm.used = appending global [5 x i8*] [i8* bitcast (i32 ()* @__llvm_profile_runtime_user to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z3foov to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z8foo_weakv to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data_main to i8*), i8* bitcast ({ i32, i32, i64, i8*, i64* }* @__llvm_profile_data__Z10foo_inlinev to i8*)], section "llvm.metadata"<br>
+<br>
+// CHECK: define linkonce_odr i32 @__llvm_profile_runtime_user() {{.*}} {<br>
+// CHECK: %[[REG:.*]] = load i32* @__llvm_profile_runtime<br>
+// CHECK: ret i32 %[[REG]]<br>
+// CHECK: }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>