1 /// D wrapper for the Valgrind client API. 2 /// Note that you must include this file into your program's compilation 3 /// and compile with `-debug=VALGRIND` to access the declarations below. 4 module etc.valgrind.valgrind; 5 6 version (StdDdoc) 7 { 8 /// Mark the memory covered by `mem` as unaddressable. 9 void makeMemNoAccess (const(void)[] mem) nothrow @nogc; 10 11 /// Similarly, mark memory covered by `mem` as addressable but undefined. 12 void makeMemUndefined(const(void)[] mem) nothrow @nogc; 13 14 /// Similarly, mark memory covered by `mem` as addressable and defined. 15 void makeMemDefined (const(void)[] mem) nothrow @nogc; 16 17 /// Get the validity data for the address range covered by `mem` and copy it 18 /// into the provided `bits` array. 19 /// Returns: 20 /// - 0 if not running on valgrind 21 /// - 1 success 22 /// - 2 [previously indicated unaligned arrays; these are now allowed] 23 /// - 3 if any parts of `mem`/`bits` are not addressable. 24 /// The metadata is not copied in cases 0, 2 or 3 so it should be 25 /// impossible to segfault your system by using this call. 26 uint getVBits(const(void)[] mem, ubyte[] bits) nothrow @nogc; 27 28 /// Set the validity data for the address range covered by `mem`, copying it 29 /// from the provided `bits` array. 30 /// Returns: 31 /// - 0 if not running on valgrind 32 /// - 1 success 33 /// - 2 [previously indicated unaligned arrays; these are now allowed] 34 /// - 3 if any parts of `mem`/`bits` are not addressable. 35 /// The metadata is not copied in cases 0, 2 or 3 so it should be 36 /// impossible to segfault your system by using this call. 37 uint setVBits(const(void)[] mem, ubyte[] bits) nothrow @nogc; 38 39 /// Disable and re-enable reporting of addressing errors in the 40 /// address range covered by `mem`. 41 void disableAddrReportingInRange(const(void)[] mem) nothrow @nogc; 42 43 /// ditto 44 void enableAddrReportingInRange(const(void)[] mem) nothrow @nogc; 45 } 46 else: 47 48 debug(VALGRIND): 49 50 private extern(C) nothrow @nogc 51 { 52 void _d_valgrind_make_mem_noaccess (const(void)* addr, size_t len); 53 void _d_valgrind_make_mem_undefined(const(void)* addr, size_t len); 54 void _d_valgrind_make_mem_defined (const(void)* addr, size_t len); 55 uint _d_valgrind_get_vbits(const(void)* addr, ubyte* bits, size_t len); 56 uint _d_valgrind_set_vbits(const(void)* addr, ubyte* bits, size_t len); 57 void _d_valgrind_disable_addr_reporting_in_range(const(void)* addr, size_t len); 58 void _d_valgrind_enable_addr_reporting_in_range (const(void)* addr, size_t len); 59 } 60 61 void makeMemNoAccess (const(void)[] mem) nothrow @nogc { _d_valgrind_make_mem_noaccess (mem.ptr, mem.length); } 62 void makeMemUndefined(const(void)[] mem) nothrow @nogc { _d_valgrind_make_mem_undefined(mem.ptr, mem.length); } 63 void makeMemDefined (const(void)[] mem) nothrow @nogc { _d_valgrind_make_mem_defined (mem.ptr, mem.length); } 64 65 uint getVBits(const(void)[] mem, ubyte[] bits) nothrow @nogc 66 { 67 assert(mem.length == bits.length); 68 return _d_valgrind_get_vbits(mem.ptr, bits.ptr, mem.length); 69 } 70 71 uint setVBits(const(void)[] mem, ubyte[] bits) nothrow @nogc 72 { 73 assert(mem.length == bits.length); 74 return _d_valgrind_set_vbits(mem.ptr, bits.ptr, mem.length); 75 } 76 77 void disableAddrReportingInRange(const(void)[] mem) nothrow @nogc 78 { 79 _d_valgrind_disable_addr_reporting_in_range(mem.ptr, mem.length); 80 } 81 82 void enableAddrReportingInRange(const(void)[] mem) nothrow @nogc 83 { 84 _d_valgrind_enable_addr_reporting_in_range(mem.ptr, mem.length); 85 }