83 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- xray_interface.h ----------------------------------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file is a part of XRay, a dynamic runtime instrumentation system.
 | 
						|
//
 | 
						|
// APIs for controlling XRay functionality explicitly.
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
#ifndef XRAY_XRAY_INTERFACE_H
 | 
						|
#define XRAY_XRAY_INTERFACE_H
 | 
						|
 | 
						|
#include <cstdint>
 | 
						|
 | 
						|
extern "C" {
 | 
						|
 | 
						|
// Synchronize this with AsmPrinter::SledKind in LLVM.
 | 
						|
enum XRayEntryType {
 | 
						|
  ENTRY = 0,
 | 
						|
  EXIT = 1,
 | 
						|
  TAIL = 2,
 | 
						|
  LOG_ARGS_ENTRY = 3,
 | 
						|
};
 | 
						|
 | 
						|
// Provide a function to invoke for when instrumentation points are hit. This is
 | 
						|
// a user-visible control surface that overrides the default implementation. The
 | 
						|
// function provided should take the following arguments:
 | 
						|
//
 | 
						|
//   - function id: an identifier that indicates the id of a function; this id
 | 
						|
//                  is generated by xray; the mapping between the function id
 | 
						|
//                  and the actual function pointer is available through
 | 
						|
//                  __xray_table.
 | 
						|
//   - entry type: identifies what kind of instrumentation point was encountered
 | 
						|
//                 (function entry, function exit, etc.). See the enum
 | 
						|
//                 XRayEntryType for more details.
 | 
						|
//
 | 
						|
// The user handler must handle correctly spurious calls after this handler is
 | 
						|
// removed or replaced with another handler, because it would be too costly for
 | 
						|
// XRay runtime to avoid spurious calls.
 | 
						|
// To prevent circular calling, the handler function itself and all its
 | 
						|
// direct&indirect callees must not be instrumented with XRay, which can be
 | 
						|
// achieved by marking them all with: __attribute__((xray_never_instrument))
 | 
						|
//
 | 
						|
// Returns 1 on success, 0 on error.
 | 
						|
extern int __xray_set_handler(void (*entry)(int32_t, XRayEntryType));
 | 
						|
 | 
						|
// This removes whatever the currently provided handler is. Returns 1 on
 | 
						|
// success, 0 on error.
 | 
						|
extern int __xray_remove_handler();
 | 
						|
 | 
						|
enum XRayPatchingStatus {
 | 
						|
  NOT_INITIALIZED = 0,
 | 
						|
  SUCCESS = 1,
 | 
						|
  ONGOING = 2,
 | 
						|
  FAILED = 3,
 | 
						|
};
 | 
						|
 | 
						|
// This tells XRay to patch the instrumentation points. See XRayPatchingStatus
 | 
						|
// for possible result values.
 | 
						|
extern XRayPatchingStatus __xray_patch();
 | 
						|
 | 
						|
// Reverses the effect of __xray_patch(). See XRayPatchingStatus for possible
 | 
						|
// result values.
 | 
						|
extern XRayPatchingStatus __xray_unpatch();
 | 
						|
 | 
						|
// Use XRay to log the first argument of each (instrumented) function call.
 | 
						|
// When this function exits, all threads will have observed the effect and
 | 
						|
// start logging their subsequent affected function calls (if patched).
 | 
						|
//
 | 
						|
// Returns 1 on success, 0 on error.
 | 
						|
extern int __xray_set_handler_arg1(void (*)(int32_t, XRayEntryType, uint64_t));
 | 
						|
 | 
						|
// Disables the XRay handler used to log first arguments of function calls.
 | 
						|
// Returns 1 on success, 0 on error.
 | 
						|
extern int __xray_remove_handler_arg1();
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |