Files
clang-p2996/lldb/tools/intel-mpx/test/main.cpp
Valentina Giusti c0eeee7a78 Add a command to access and manipulate the Intel(R) MPX Boundary Tables.
Summary:
The Boundary Table Entries are stored in the application memory and allow
to store boundary info for all the pointers of the program, also those that
otherwise wouldn't fit in the 4 bound registers provided by the HW.

Here is an example of how it works:
 * mpx-table show <pointer>
        lbound = 0x..., ubound = 0x..., (pointer value = 0x..., metadata = 0x...)
 * mpx-table set <pointer>

Signed-off-by: Valentina Giusti <valentina.giusti@intel.com>

Reviewers: labath, clayborg

Reviewed By: clayborg

Subscribers: lldb-commits, mgorny

Differential Revision: https://reviews.llvm.org/D29078

llvm-svn: 293660
2017-01-31 18:02:54 +00:00

49 lines
1.2 KiB
C++

//===-- main.cpp ------------------------------------------------*- C++ -*-===//
////
//// The LLVM Compiler Infrastructure
////
//// This file is distributed under the University of Illinois Open Source
//// License. See LICENSE.TXT for details.
////
////===----------------------------------------------------------------------===//
//
const int size = 5;
#include <cstddef>
#include <cstdlib>
#include <sys/prctl.h>
void func(int *ptr) {
int *tmp;
#if defined __GNUC__ && !defined __INTEL_COMPILER
__builtin___bnd_store_ptr_bounds ((void**)&ptr, ptr);
#endif
tmp = ptr + size - 1;
#if defined __GNUC__ && !defined __INTEL_COMPILER
__builtin___bnd_store_ptr_bounds ((void**)&tmp, tmp);
#endif
tmp = (int*)0x2; // Break 2.
return; // Break 3.
}
int
main(int argc, char const *argv[])
{
// This call returns 0 only if the CPU and the kernel support Intel(R) MPX.
if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0)
return -1;
int* a = (int *) calloc(size, sizeof(int));
#if defined __GNUC__ && !defined __INTEL_COMPILER
__builtin___bnd_store_ptr_bounds ((void**)&a, a);
#endif
func(a); // Break 1.
free(a); // Break 4.
return 0;
}