|
From: Bart V. A. <bar...@gm...> - 2008-06-19 19:06:55
|
Hello Julian,
I'm curious to know your opinion about the patch below ?
Bart.
---------- Forwarded message ----------
From: Bart Van Assche <bar...@gm...>
Date: Wed, Jun 4, 2008 at 6:57 PM
Subject: [Valgrind-developers] [PATCH] VEX: make cross-compilation
again possible
To: Julian Seward <js...@ac...>
Cc: Valgrind Developers <val...@li...>,
Paul Mackerras <pa...@sa...>
Hello Julian,
Can you please review the patch below and apply it to the VEX trunk (I don't
have commit rights for VEX). The patch below is based on an idea of Paul
Mackerras. The patch below makes cross-compilation of VEX again possible via
the following changes:
- auxprogs/genoffsets.c is no longer compiled into an object file (.o) but
only into assembly code (.s).
- The actual offsets are extracted via sed from the assembly code instead of
being generated by auxprogs/genoffsets.
Bart.
Index: VEX/auxprogs/genoffsets.c
===================================================================
--- VEX/auxprogs/genoffsets.c (revision 1849)
+++ VEX/auxprogs/genoffsets.c (working copy)
@@ -46,7 +46,9 @@
#include <stdio.h>
-/* A program which generates various guest state offsets. */
+/* A program that allows to compute guest state offsets by compiling it to */
+/* assembler code and by filtering the #define statements from the assembly */
+/* output. */
#include "../pub/libvex_basictypes.h"
#include "../pub/libvex_guest_x86.h"
@@ -54,184 +56,187 @@
#include "../pub/libvex_guest_ppc32.h"
#include "../pub/libvex_guest_ppc64.h"
+#define DEFINE(sym, val) \
+ asm volatile("\n#define " #sym " %0\n" #val : : "i" (val))
+
Int main ( void )
{
// x86
- printf("#define OFFSET_x86_EAX %3d\n",
+ DEFINE(OFFSET_x86_EAX,
offsetof(VexGuestX86State,guest_EAX));
- printf("#define OFFSET_x86_EBX %3d\n",
+ DEFINE(OFFSET_x86_EBX,
offsetof(VexGuestX86State,guest_EBX));
- printf("#define OFFSET_x86_ECX %3d\n",
+ DEFINE(OFFSET_x86_ECX,
offsetof(VexGuestX86State,guest_ECX));
- printf("#define OFFSET_x86_EDX %3d\n",
+ DEFINE(OFFSET_x86_EDX,
offsetof(VexGuestX86State,guest_EDX));
- printf("#define OFFSET_x86_ESI %3d\n",
+ DEFINE(OFFSET_x86_ESI,
offsetof(VexGuestX86State,guest_ESI));
- printf("#define OFFSET_x86_EDI %3d\n",
+ DEFINE(OFFSET_x86_EDI,
offsetof(VexGuestX86State,guest_EDI));
- printf("#define OFFSET_x86_EBP %3d\n",
+ DEFINE(OFFSET_x86_EBP,
offsetof(VexGuestX86State,guest_EBP));
- printf("#define OFFSET_x86_ESP %3d\n",
+ DEFINE(OFFSET_x86_ESP,
offsetof(VexGuestX86State,guest_ESP));
- printf("#define OFFSET_x86_EIP %3d\n",
+ DEFINE(OFFSET_x86_EIP,
offsetof(VexGuestX86State,guest_EIP));
- printf("#define OFFSET_x86_CS %3d\n",
+ DEFINE(OFFSET_x86_CS,
offsetof(VexGuestX86State,guest_CS));
- printf("#define OFFSET_x86_DS %3d\n",
+ DEFINE(OFFSET_x86_DS,
offsetof(VexGuestX86State,guest_DS));
- printf("#define OFFSET_x86_ES %3d\n",
+ DEFINE(OFFSET_x86_ES,
offsetof(VexGuestX86State,guest_ES));
- printf("#define OFFSET_x86_FS %3d\n",
+ DEFINE(OFFSET_x86_FS,
offsetof(VexGuestX86State,guest_FS));
- printf("#define OFFSET_x86_GS %3d\n",
+ DEFINE(OFFSET_x86_GS,
offsetof(VexGuestX86State,guest_GS));
- printf("#define OFFSET_x86_SS %3d\n",
+ DEFINE(OFFSET_x86_SS,
offsetof(VexGuestX86State,guest_SS));
printf("\n");
// amd64
- printf("#define OFFSET_amd64_RAX %3d\n",
+ DEFINE(OFFSET_amd64_RAX,
offsetof(VexGuestAMD64State,guest_RAX));
- printf("#define OFFSET_amd64_RBX %3d\n",
+ DEFINE(OFFSET_amd64_RBX,
offsetof(VexGuestAMD64State,guest_RBX));
- printf("#define OFFSET_amd64_RCX %3d\n",
+ DEFINE(OFFSET_amd64_RCX,
offsetof(VexGuestAMD64State,guest_RCX));
- printf("#define OFFSET_amd64_RDX %3d\n",
+ DEFINE(OFFSET_amd64_RDX,
offsetof(VexGuestAMD64State,guest_RDX));
- printf("#define OFFSET_amd64_RSI %3d\n",
+ DEFINE(OFFSET_amd64_RSI,
offsetof(VexGuestAMD64State,guest_RSI));
- printf("#define OFFSET_amd64_RDI %3d\n",
+ DEFINE(OFFSET_amd64_RDI,
offsetof(VexGuestAMD64State,guest_RDI));
- printf("#define OFFSET_amd64_RSP %3d\n",
+ DEFINE(OFFSET_amd64_RSP,
offsetof(VexGuestAMD64State,guest_RSP));
- printf("#define OFFSET_amd64_RBP %3d\n",
+ DEFINE(OFFSET_amd64_RBP,
offsetof(VexGuestAMD64State,guest_RBP));
- printf("#define OFFSET_amd64_R8 %3d\n",
+ DEFINE(OFFSET_amd64_R8,
offsetof(VexGuestAMD64State,guest_R8));
- printf("#define OFFSET_amd64_R9 %3d\n",
+ DEFINE(OFFSET_amd64_R9,
offsetof(VexGuestAMD64State,guest_R9));
- printf("#define OFFSET_amd64_R10 %3d\n",
+ DEFINE(OFFSET_amd64_R10,
offsetof(VexGuestAMD64State,guest_R10));
- printf("#define OFFSET_amd64_R11 %3d\n",
+ DEFINE(OFFSET_amd64_R11,
offsetof(VexGuestAMD64State,guest_R11));
- printf("#define OFFSET_amd64_R12 %3d\n",
+ DEFINE(OFFSET_amd64_R12,
offsetof(VexGuestAMD64State,guest_R12));
- printf("#define OFFSET_amd64_R13 %3d\n",
+ DEFINE(OFFSET_amd64_R13,
offsetof(VexGuestAMD64State,guest_R13));
- printf("#define OFFSET_amd64_R14 %3d\n",
+ DEFINE(OFFSET_amd64_R14,
offsetof(VexGuestAMD64State,guest_R14));
- printf("#define OFFSET_amd64_R15 %3d\n",
+ DEFINE(OFFSET_amd64_R15,
offsetof(VexGuestAMD64State,guest_R15));
- printf("#define OFFSET_amd64_RIP %3d\n",
+ DEFINE(OFFSET_amd64_RIP,
offsetof(VexGuestAMD64State,guest_RIP));
printf("\n");
// ppc32
- printf("#define OFFSET_ppc32_GPR0 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR0,
offsetof(VexGuestPPC32State,guest_GPR0));
- printf("#define OFFSET_ppc32_GPR2 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR2,
offsetof(VexGuestPPC32State,guest_GPR2));
- printf("#define OFFSET_ppc32_GPR3 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR3,
offsetof(VexGuestPPC32State,guest_GPR3));
- printf("#define OFFSET_ppc32_GPR4 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR4,
offsetof(VexGuestPPC32State,guest_GPR4));
- printf("#define OFFSET_ppc32_GPR5 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR5,
offsetof(VexGuestPPC32State,guest_GPR5));
- printf("#define OFFSET_ppc32_GPR6 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR6,
offsetof(VexGuestPPC32State,guest_GPR6));
- printf("#define OFFSET_ppc32_GPR7 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR7,
offsetof(VexGuestPPC32State,guest_GPR7));
- printf("#define OFFSET_ppc32_GPR8 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR8,
offsetof(VexGuestPPC32State,guest_GPR8));
- printf("#define OFFSET_ppc32_GPR9 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR9,
offsetof(VexGuestPPC32State,guest_GPR9));
- printf("#define OFFSET_ppc32_GPR10 %3d\n",
+ DEFINE(OFFSET_ppc32_GPR10,
offsetof(VexGuestPPC32State,guest_GPR10));
- printf("#define OFFSET_ppc32_CIA %3d\n",
+ DEFINE(OFFSET_ppc32_CIA,
offsetof(VexGuestPPC32State,guest_CIA));
- printf("#define OFFSET_ppc32_CR0_0 %3d\n",
+ DEFINE(OFFSET_ppc32_CR0_0,
offsetof(VexGuestPPC32State,guest_CR0_0));
printf("\n");
// ppc64
- printf("#define OFFSET_ppc64_GPR0 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR0,
offsetof(VexGuestPPC64State,guest_GPR0));
- printf("#define OFFSET_ppc64_GPR2 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR2,
offsetof(VexGuestPPC64State,guest_GPR2));
- printf("#define OFFSET_ppc64_GPR3 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR3,
offsetof(VexGuestPPC64State,guest_GPR3));
- printf("#define OFFSET_ppc64_GPR4 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR4,
offsetof(VexGuestPPC64State,guest_GPR4));
- printf("#define OFFSET_ppc64_GPR5 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR5,
offsetof(VexGuestPPC64State,guest_GPR5));
- printf("#define OFFSET_ppc64_GPR6 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR6,
offsetof(VexGuestPPC64State,guest_GPR6));
- printf("#define OFFSET_ppc64_GPR7 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR7,
offsetof(VexGuestPPC64State,guest_GPR7));
- printf("#define OFFSET_ppc64_GPR8 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR8,
offsetof(VexGuestPPC64State,guest_GPR8));
- printf("#define OFFSET_ppc64_GPR9 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR9,
offsetof(VexGuestPPC64State,guest_GPR9));
- printf("#define OFFSET_ppc64_GPR10 %4d\n",
+ DEFINE(OFFSET_ppc64_GPR10,
offsetof(VexGuestPPC64State,guest_GPR10));
- printf("#define OFFSET_ppc64_CIA %4d\n",
+ DEFINE(OFFSET_ppc64_CIA,
offsetof(VexGuestPPC64State,guest_CIA));
- printf("#define OFFSET_ppc64_CR0_0 %4d\n",
+ DEFINE(OFFSET_ppc64_CR0_0,
offsetof(VexGuestPPC64State,guest_CR0_0));
printf("\n");
Index: VEX/Makefile
===================================================================
--- VEX/Makefile (revision 1849)
+++ VEX/Makefile (working copy)
@@ -178,9 +178,10 @@
@cat priv/main/vex_svnversion.h
@echo
-pub/libvex_guest_offsets.h:
- $(CC) -Wall -g -o auxprogs/genoffsets auxprogs/genoffsets.c
- ./auxprogs/genoffsets > pub/libvex_guest_offsets.h
+pub/libvex_guest_offsets.h: auxprogs/genoffsets.c Makefile
+ $(CC) -Wall -g -S -o auxprogs/genoffsets.s auxprogs/genoffsets.c
+ sed -n 's/^\(#define.*\) \$$*\([0-9]*\)$$/\1 \2/p'
auxprogs/genoffsets.s\
+ > pub/libvex_guest_offsets.h
ALL_HEADERS = $(PUB_HEADERS) $(PRIV_HEADERS)
|