]> granicus.if.org Git - llvm/commitdiff
[XRay][tools] Support new kinds of instrumentation map entries
authorDean Michael Berris <dberris@google.com>
Mon, 21 Aug 2017 00:14:06 +0000 (00:14 +0000)
committerDean Michael Berris <dberris@google.com>
Mon, 21 Aug 2017 00:14:06 +0000 (00:14 +0000)
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

include/llvm/XRay/InstrumentationMap.h
lib/XRay/InstrumentationMap.cpp
test/tools/llvm-xray/X86/Inputs/all-sleds.o [new file with mode: 0644]
test/tools/llvm-xray/X86/extract-all-sledtypes.txt [new file with mode: 0644]

index 0342da0a2f0fa61f97984d198a40c85cf6860b4f..42bfca36a20bc0fde9eb2b2d9b32de33cdb4bf09 100644 (file)
@@ -38,7 +38,7 @@ Expected<InstrumentationMap> 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<xray::SledEntry::FunctionKinds> {
     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);
   }
 };
 
index d9ce255bc68871eec4bb60d47b8a182d56140b26..a7d6600b0d8ab4a3090a87408c5e1ee3ea3f1ea3 100644 (file)
@@ -104,7 +104,8 @@ loadELF64(StringRef Filename, object::OwningBinary<object::ObjectFile> &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 (file)
index 0000000..d36d2bb
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 (file)
index 0000000..a4ac925
--- /dev/null
@@ -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}}