summaryrefslogtreecommitdiffstats
path: root/runtime/loc2c-runtime.h
diff options
context:
space:
mode:
authorgraydon <graydon>2005-07-29 01:47:56 +0000
committergraydon <graydon>2005-07-29 01:47:56 +0000
commit77de5e9eca19f041e85681439f41ea35d30a37c9 (patch)
tree0d4ec2f749ace9659df8f1082f1a8a8e2797e148 /runtime/loc2c-runtime.h
parentb2d5d95caa573e486b6503406b688da824cd20a9 (diff)
downloadsystemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.tar.gz
systemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.tar.xz
systemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.zip
2005-07-28 Graydon Hoare <graydon@redhat.com>
* elaborate.cxx (derived_probe::derived_probe): Accept NULL probe. * staptree.cxx (provide, require): Move from here... * staptree.h: to here, and virtualize deep-copy methods. * translate.cxx (c_unparser::emit_common_header): Include loc2c-runtime.h * tapsets.cxx (dwflpp::iterate_over_modules): Use new, faster getmodules loop. (dwflpp::literal_stmt_for_local): New method, call loc2c. (var_expanding_copy_visitor): New struct which expands $-vars. (dwarf_derived_probe): Rebuild this->body using var expander. (query_function): Refactor logic a bit for speed. * loc2c.{c,h}: Copies (with minor changes) of Roland's work from elfutils CVS. * Makefile.am (AM_CFLAGS): Set to elfutils-style. (stap_SOURCES): Add loc2c.c. * Makefile.in: Regenerate. 2005-07-28 Graydon Hoare <graydon@redhat.com> * loc2c-runtime.h: New file from elfutils CVS.
Diffstat (limited to 'runtime/loc2c-runtime.h')
-rw-r--r--runtime/loc2c-runtime.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
new file mode 100644
index 00000000..6385ec83
--- /dev/null
+++ b/runtime/loc2c-runtime.h
@@ -0,0 +1,125 @@
+/* target operations */
+
+#include <linux/types.h>
+#define intptr_t long
+#define uintptr_t unsigned long
+
+
+/* These three macro definitions are generic, just shorthands
+ used by the generated code. */
+
+#define op_abs(x) (x < 0 ? -x : x)
+
+#define fetch_bitfield(target, base, higherbits, nbits) \
+ target = (((base) >> (sizeof (base) * 8 - (higherbits) - (nbits))) \
+ & (((__typeof (base)) 1 << (nbits)) - 1))
+
+#define store_bitfield(target, base, higherbits, nbits) \
+ target = (target \
+ &~ ((((__typeof (base)) 1 << (nbits)) - 1) \
+ << (sizeof (base) * 8 - (higherbits) - (nbits))) \
+ | ((__typeof (base)) (value) \
+ << (sizeof (base) * 8 - (higherbits) - (nbits))))
+
+
+/* These operations are target-specific. */
+#include <asm/uaccess.h>
+
+#define fetch_register(regno) ((intptr_t) c->regs->dwarf_register_##regno)
+
+#if defined __i386__
+
+#define dwarf_register_0 eax
+#define dwarf_register_1 ecx
+#define dwarf_register_2 edx
+#define dwarf_register_3 ebx
+#define dwarf_register_4 esp
+#define dwarf_register_5 ebp
+#define dwarf_register_6 esi
+#define dwarf_register_7 edi
+
+#elif defined __x86_64__
+
+#define dwarf_register_0 eax
+#define dwarf_register_1 edx
+#define dwarf_register_2 ecx
+#define dwarf_register_3 ebx
+#define dwarf_register_4 esi
+#define dwarf_register_5 edi
+#define dwarf_register_6 ebp
+#define dwarf_register_7 esp
+#define dwarf_register_8 r8
+#define dwarf_register_9 r9
+#define dwarf_register_10 r10
+#define dwarf_register_11 r11
+#define dwarf_register_12 r12
+#define dwarf_register_13 r13
+#define dwarf_register_14 r14
+#define dwarf_register_15 r15
+
+#elif defined __powerpc__
+
+#undef fetch_register
+#define fetch_register(regno) ((intptr_t) c->regs->gpr[regno])
+
+#endif
+
+#if defined __i386__ || defined __x86_64__
+
+#define deref(size, addr) \
+ ({ \
+ int _bad = 0; \
+ u8 _b; u16 _w; u32 _l; u64 _q; \
+ intptr_t _v; \
+ switch (size) \
+ { \
+ case 1: __get_user_asm(_b,addr,_bad,"b","b","=q",1); _v = _b; break; \
+ case 2: __get_user_asm(_w,addr,_bad,"w","w","=r",1); _v = _w; break; \
+ case 4: __get_user_asm(_l,addr,_bad,"l","","=r",1); _v = _l; break; \
+ case 8: __get_user_asm(_q,addr,_bad,"q","","=r",1); _v = _q; break; \
+ default: _v = __get_user_bad(); \
+ } \
+ if (_bad) \
+ goto deref_fault; \
+ _v; \
+ })
+
+#elif defined __powerpc64__
+
+#define deref(size, addr) \
+ ({ \
+ int _bad = 0; \
+ intptr_t _v; \
+ switch (size) \
+ { \
+ case 1: __get_user_asm(_v,addr,_bad,"lbz",1); break; \
+ case 2: __get_user_asm(_v,addr,_bad,"lhz",1); break; \
+ case 4: __get_user_asm(_v,addr,_bad,"lwz",1); break; \
+ case 8: __get_user_asm(_v,addr,_bad,"ld",1); break; \
+ default: _v = __get_user_bad(); \
+ } \
+ if (_bad) \
+ goto deref_fault; \
+ _v; \
+ })
+
+#elif defined __powerpc__
+
+#define deref(size, addr) \
+ ({ \
+ int _bad = 0; \
+ intptr_t _v; \
+ switch (size) \
+ { \
+ case 1: __get_user_asm(_v,addr,_bad,"lbz"); break; \
+ case 2: __get_user_asm(_v,addr,_bad,"lhz"); break; \
+ case 4: __get_user_asm(_v,addr,_bad,"lwz"); break; \
+ case 8: __get_user_asm(_v,addr,_bad,"ld"); break; \
+ default: _v = __get_user_bad(); \
+ } \
+ if (_bad) \
+ goto deref_fault; \
+ _v; \
+ })
+
+#endif