[XRay][compiler-rt] Allow for defining defaults at compile-time

Summary:
Currently, defaulted options cannot be overriden easily. As an example,
we always patch the binary pre-main unless the user defines the option
at the commandline to inhibit this behaviour. This change allows for
building different versions of the XRay archive with different defaults
(whether to patch pre-main, or whether to use FDR mode by default, etc.)
and giving that choice at link-time.

For now we don't create different archives that have different defaults,
but those could be added in later revisions. This change just enables
the possibility.

Reviewers: pelikan, kcc

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D30022

llvm-svn: 295534
This commit is contained in:
Dean Michael Berris 2017-02-18 02:09:51 +00:00
parent b6adf54204
commit 773c2ab9d6

View File

@ -37,6 +37,25 @@ static void registerXRayFlags(FlagParser *P, Flags *F) XRAY_NEVER_INSTRUMENT {
#undef XRAY_FLAG
}
// This function, as defined with the help of a macro meant to be introduced at
// build time of the XRay runtime, passes in a statically defined list of
// options that control XRay. This means users/deployments can tweak the
// defaults that override the hard-coded defaults in the xray_flags.inc at
// compile-time using the XRAY_DEFAULT_OPTIONS macro.
static const char *useCompilerDefinedFlags() XRAY_NEVER_INSTRUMENT {
#ifdef XRAY_DEFAULT_OPTIONS
// Do the double-layered string conversion to prevent badly crafted strings
// provided through the XRAY_DEFAULT_OPTIONS from causing compilation issues (or
// changing the semantics of the implementation through the macro). This ensures
// that we convert whatever XRAY_DEFAULT_OPTIONS is defined as a string literal.
#define XRAY_STRINGIZE(x) #x
#define XRAY_STRINGIZE_OPTIONS(options) XRAY_STRINGIZE(options)
return XRAY_STRINGIZE_OPTIONS(XRAY_DEFAULT_OPTIONS);
#else
return "";
#endif
}
void initializeFlags() XRAY_NEVER_INSTRUMENT {
SetCommonFlagsDefaults();
auto *F = flags();
@ -46,9 +65,14 @@ void initializeFlags() XRAY_NEVER_INSTRUMENT {
registerXRayFlags(&XRayParser, F);
RegisterCommonFlags(&XRayParser);
// Override from command line.
// Use options defaulted at compile-time for the runtime.
const char *XRayCompileFlags = useCompilerDefinedFlags();
XRayParser.ParseString(XRayCompileFlags);
// Override from environment variables.
XRayParser.ParseString(GetEnv("XRAY_OPTIONS"));
// Override from command line.
InitializeCommonFlags();
if (Verbosity())