[compiler-rt] r302210 - [XRay][compiler-rt] Add function id utilities for XRay
Bill Seurer via llvm-commits
llvm-commits at lists.llvm.org
Fri May 5 10:13:53 PDT 2017
The new test here also fails on powerpcle:
http://lab.llvm.org:8011/builders/clang-ppc64le-linux/builds/6079/steps/ninja%20check%201/logs/FAIL%3A%20XRay-powerpc64le-linux%3A%3Afunc-id-utils.cc
If this is something that can't be immediately fixed please xfail the
test like I did for coverage-samples.cc. I won't be available to take
care of it today.
On 05/04/2017 08:27 PM, Dean Michael Berris via llvm-commits wrote:
> Author: dberris
> Date: Thu May 4 20:27:11 2017
> New Revision: 302210
>
> URL: http://llvm.org/viewvc/llvm-project?rev=302210&view=rev
> Log:
> [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
>
> Added:
> compiler-rt/trunk/test/xray/TestCases/Linux/func-id-utils.cc
> Modified:
> compiler-rt/trunk/include/xray/xray_interface.h
> compiler-rt/trunk/lib/xray/xray_interface.cc
>
> Modified: compiler-rt/trunk/include/xray/xray_interface.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/xray/xray_interface.h?rev=302210&r1=302209&r2=302210&view=diff
> ==============================================================================
> --- compiler-rt/trunk/include/xray/xray_interface.h (original)
> +++ compiler-rt/trunk/include/xray/xray_interface.h Thu May 4 20:27:11 2017
> @@ -15,6 +15,7 @@
> #define XRAY_XRAY_INTERFACE_H
>
> #include <cstdint>
> +#include <stddef.h>
>
> extern "C" {
>
> @@ -86,6 +87,14 @@ extern XRayPatchingStatus __xray_patch_f
> /// result values.
> extern XRayPatchingStatus __xray_unpatch_function(int32_t FuncId);
>
> +/// This function returns the address of the function provided a valid function
> +/// id. We return 0 if we encounter any error, even if 0 may be a valid function
> +/// address.
> +extern uintptr_t __xray_function_address(int32_t FuncId);
> +
> +/// This function returns the maximum valid function id. Returns 0 if we
> +/// encounter errors (when there are no instrumented functions, etc.).
> +extern size_t __xray_max_function_id();
>
> }
>
>
> Modified: compiler-rt/trunk/lib/xray/xray_interface.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_interface.cc?rev=302210&r1=302209&r2=302210&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/xray/xray_interface.cc (original)
> +++ compiler-rt/trunk/lib/xray/xray_interface.cc Thu May 4 20:27:11 2017
> @@ -255,7 +255,7 @@ XRayPatchingStatus patchFunction(int32_t
>
> // 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 (*Handl
> 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;
> +}
>
> Added: compiler-rt/trunk/test/xray/TestCases/Linux/func-id-utils.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/xray/TestCases/Linux/func-id-utils.cc?rev=302210&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/xray/TestCases/Linux/func-id-utils.cc (added)
> +++ compiler-rt/trunk/test/xray/TestCases/Linux/func-id-utils.cc Thu May 4 20:27:11 2017
> @@ -0,0 +1,46 @@
> +// Check that we can turn a function id to a function address, and also get the
> +// maximum function id for the current binary.
> +//
> +// RUN: %clangxx_xray -std=c++11 %s -o %t
> +// RUN: XRAY_OPTIONS="patch_premain=false xray_naive_log=false" %run %t | FileCheck %s
> +
> +#include "xray/xray_interface.h"
> +#include <algorithm>
> +#include <cstdio>
> +#include <set>
> +#include <iterator>
> +
> +[[clang::xray_always_instrument]] void bar(){
> + // do nothing!
> +}
> +
> + [[clang::xray_always_instrument]] void foo() {
> + bar();
> +}
> +
> +[[clang::xray_always_instrument]] int main(int argc, char *argv[]) {
> + printf("max function id: %zu\n", __xray_max_function_id());
> + // CHECK: max function id: [[MAX:.*]]
> +
> + std::set<void *> must_be_instrumented;
> + must_be_instrumented.insert(reinterpret_cast<void*>(&foo));
> + must_be_instrumented.insert(reinterpret_cast<void*>(&bar));
> + printf("addresses:\n");
> + std::set<void *> all_instrumented;
> + for (auto i = __xray_max_function_id(); i != 0; --i) {
> + auto addr = __xray_function_address(i);
> + printf("#%lu -> @%04lx\n", i, addr);
> + all_instrumented.insert(reinterpret_cast<void *>(addr));
> + }
> +
> + // CHECK-LABEL: addresses:
> + // CHECK: #[[MAX]] -> @[[ADDR:.*]]
> + // CHECK-NOT: #0 -> @{{.*}}
> + std::set<void *> common;
> +
> + std::set_intersection(all_instrumented.begin(), all_instrumented.end(),
> + must_be_instrumented.begin(),
> + must_be_instrumented.end(),
> + std::inserter(common, common.begin()));
> + return common == must_be_instrumented ? 0 : 1;
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
--
-Bill Seurer
More information about the llvm-commits
mailing list