From: Dean Michael Berris Date: Mon, 21 Aug 2017 00:14:06 +0000 (+0000) Subject: [XRay][tools] Support new kinds of instrumentation map entries X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a082a40a266ad78cb99ac300bcf5a6f6a02b272;p=llvm [XRay][tools] Support new kinds of instrumentation map entries Summary: When extracting the instrumentation map from a binary, we should be able to recognize the new kinds of instrumentation sleds we've been emitting with the compiler using -fxray-instrument. This change adds a test for all the kinds of sleds we currently support (sans the tail-call sled, which is a bit harder to force in a simple prebuilt input). Reviewers: kpw, dblaikie Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D36819 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311305 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/XRay/InstrumentationMap.h b/include/llvm/XRay/InstrumentationMap.h index 0342da0a2f0..42bfca36a20 100644 --- a/include/llvm/XRay/InstrumentationMap.h +++ b/include/llvm/XRay/InstrumentationMap.h @@ -38,7 +38,7 @@ Expected loadInstrumentationMap(StringRef Filename); struct SledEntry { /// Each entry here represents the kinds of supported instrumentation map /// entries. - enum class FunctionKinds { ENTRY, EXIT, TAIL }; + enum class FunctionKinds { ENTRY, EXIT, TAIL, LOG_ARGS_ENTER, CUSTOM_EVENT }; /// The address of the sled. uint64_t Address; @@ -106,6 +106,10 @@ template <> struct ScalarEnumerationTraits { IO.enumCase(Kind, "function-enter", xray::SledEntry::FunctionKinds::ENTRY); IO.enumCase(Kind, "function-exit", xray::SledEntry::FunctionKinds::EXIT); IO.enumCase(Kind, "tail-exit", xray::SledEntry::FunctionKinds::TAIL); + IO.enumCase(Kind, "log-args-enter", + xray::SledEntry::FunctionKinds::LOG_ARGS_ENTER); + IO.enumCase(Kind, "custom-event", + xray::SledEntry::FunctionKinds::CUSTOM_EVENT); } }; diff --git a/lib/XRay/InstrumentationMap.cpp b/lib/XRay/InstrumentationMap.cpp index d9ce255bc68..a7d6600b0d8 100644 --- a/lib/XRay/InstrumentationMap.cpp +++ b/lib/XRay/InstrumentationMap.cpp @@ -104,7 +104,8 @@ loadELF64(StringRef Filename, object::OwningBinary &ObjFile, static constexpr SledEntry::FunctionKinds Kinds[] = { SledEntry::FunctionKinds::ENTRY, SledEntry::FunctionKinds::EXIT, SledEntry::FunctionKinds::TAIL, - }; + SledEntry::FunctionKinds::LOG_ARGS_ENTER, + SledEntry::FunctionKinds::CUSTOM_EVENT}; if (Kind >= sizeof(Kinds)) return errorCodeToError( std::make_error_code(std::errc::executable_format_error)); diff --git a/test/tools/llvm-xray/X86/Inputs/all-sleds.o b/test/tools/llvm-xray/X86/Inputs/all-sleds.o new file mode 100644 index 00000000000..d36d2bb8226 Binary files /dev/null and b/test/tools/llvm-xray/X86/Inputs/all-sleds.o differ diff --git a/test/tools/llvm-xray/X86/extract-all-sledtypes.txt b/test/tools/llvm-xray/X86/extract-all-sledtypes.txt new file mode 100644 index 00000000000..a4ac925cbd6 --- /dev/null +++ b/test/tools/llvm-xray/X86/extract-all-sledtypes.txt @@ -0,0 +1,11 @@ +# Test that we can extract all the sled types we know about. This is built with +# a a file with functions always instrumented, and using the built-ins and +# intrinsics supported by clang. Those are built with: +# +# clang++ -c all-sleds.cc -o all-sleds.o -fpic -std=c++11 -fxray-instrument +# +# RUN: llvm-xray extract %S/Inputs/all-sleds.o -s | FileCheck %s +# CHECK-DAG: {{kind:.function-enter}} +# CHECK-DAG: {{kind:.function-exit}} +# CHECK-DAG: {{kind:.custom-event}} +# CHECK-DAG: {{kind:.log-args-enter}}