Shared objects are hard. After this commit, we do the right thing when
profiling two separate shared objects that have been dlopen'd with
`RTLD_LOCAL`, when the main executable is *not* being profiled.
This mainly simplifies the writer logic.
- At initialization, determine the output filename and truncate the
file. Depending on whether shared objects can see each other, this
may happen multiple times.
- At exit, each executable writes its own profile in append mode.
<rdar://problem/16918688>
llvm-svn: 209053
31 lines
650 B
C++
31 lines
650 B
C++
//===- InstrProfilingRuntime.cpp - PGO runtime initialization -------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extern "C" {
|
|
|
|
#include "InstrProfiling.h"
|
|
|
|
__attribute__((visibility("hidden"))) int __llvm_profile_runtime;
|
|
|
|
}
|
|
|
|
namespace {
|
|
|
|
class RegisterRuntime {
|
|
public:
|
|
RegisterRuntime() {
|
|
__llvm_profile_register_write_file_atexit();
|
|
__llvm_profile_initialize_file();
|
|
}
|
|
};
|
|
|
|
RegisterRuntime Registration;
|
|
|
|
}
|