summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/xray/xray_interface.cc
diff options
context:
space:
mode:
authorDean Michael Berris <dberris@google.com>2017-05-05 01:27:11 +0000
committerDean Michael Berris <dberris@google.com>2017-05-05 01:27:11 +0000
commitd45003ca19361d17866378e6ca9ba45ba73ff3bf (patch)
treefb484ff0793eccdf3a48758453a8d8eef227d97d /compiler-rt/lib/xray/xray_interface.cc
parenta75d0da91b1ec01900bc7247a9f877cce832fc48 (diff)
downloadbcm5719-llvm-d45003ca19361d17866378e6ca9ba45ba73ff3bf.tar.gz
bcm5719-llvm-d45003ca19361d17866378e6ca9ba45ba73ff3bf.zip
[XRay][compiler-rt] Add function id utilities for XRay
Summary: This change allows us to provide users and implementers of XRay handlers a means of converting XRay function id's to addresses. This, in combination with the facilities provided in D32695, allows users to find out: - How many function id's there are defined in the current binary. - Get the address of the function associated with this function id. - Patch only specific functions according to their requirements. While we don't directly provide symbolization support in XRay, having the function's address lets users determine this information easily either during runtime, or offline with tools like 'addr2line'. Reviewers: dblaikie, echristo, pelikan Subscribers: kpw, llvm-commits Differential Revision: https://reviews.llvm.org/D32846 llvm-svn: 302210
Diffstat (limited to 'compiler-rt/lib/xray/xray_interface.cc')
-rw-r--r--compiler-rt/lib/xray/xray_interface.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/compiler-rt/lib/xray/xray_interface.cc b/compiler-rt/lib/xray/xray_interface.cc
index 73cca80bc3a..26f0ab122db 100644
--- a/compiler-rt/lib/xray/xray_interface.cc
+++ b/compiler-rt/lib/xray/xray_interface.cc
@@ -255,7 +255,7 @@ XRayPatchingStatus patchFunction(int32_t FuncId,
// FuncId must be a positive number, less than the number of functions
// instrumented.
- if (FuncId <= 0 || static_cast<size_t>(FuncId) >= InstrMap.Functions) {
+ if (FuncId <= 0 || static_cast<size_t>(FuncId) > InstrMap.Functions) {
Report("Invalid function id provided: %d\n", FuncId);
return XRayPatchingStatus::FAILED;
}
@@ -302,3 +302,15 @@ int __xray_set_handler_arg1(void (*Handler)(int32_t, XRayEntryType, uint64_t)) {
return 1;
}
int __xray_remove_handler_arg1() { return __xray_set_handler_arg1(nullptr); }
+
+uintptr_t __xray_function_address(int32_t FuncId) XRAY_NEVER_INSTRUMENT {
+ __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex);
+ if (FuncId <= 0 || static_cast<size_t>(FuncId) > XRayInstrMap.Functions)
+ return 0;
+ return XRayInstrMap.SledsIndex[FuncId - 1].Begin->Address;
+}
+
+size_t __xray_max_function_id() XRAY_NEVER_INSTRUMENT {
+ __sanitizer::SpinMutexLock Guard(&XRayInstrMapMutex);
+ return XRayInstrMap.Functions;
+}
OpenPOWER on IntegriCloud