genoffsets.c revision 752f90673ebbb6b2f55fc5e46606dea371313713
12825ac47817cec603c74d7224981560299c1a3basewardj
27bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--------------------------------------------------------------------*/
3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin                                           genoffsets.c ---*/
47bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--------------------------------------------------------------------*/
57bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
67bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
97bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
10752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Copyright (C) 2004-2010 OpenWorks LLP
11752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
25752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
28752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
297bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
307bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Neither the names of the U.S. Department of Energy nor the
317bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   University of California nor the names of its contributors may be
327bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   used to endorse or promote products derived from this software
337bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   without prior written permission.
347bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj*/
357bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
362825ac47817cec603c74d7224981560299c1a3basewardj#include <stdio.h>
372825ac47817cec603c74d7224981560299c1a3basewardj
38ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj/* A program which, when compiled to assembly, exposes various guest
39ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   state offsets.  The program isn't executed, since that breaks
40d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   cross-compilation.
41d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj
42d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   It does rely on the assumption that 'my_offsetof(Ty,Field)' is
43d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   folded to a constant at a compile time, which seems a bit dodgy
44d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   to me.  On gcc4 it is possible to use __builtin_offsetof, which
45d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   sounds safer, but that doesn't exist on older gccs.  Oh Well.
46d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj*/
472825ac47817cec603c74d7224981560299c1a3basewardj
482825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_basictypes.h"
492825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_guest_x86.h"
508137b5baebea1d3e145ecc2ad56b871988aae167sewardj#include "../pub/libvex_guest_amd64.h"
51ed623dbefb52ca3211490d656abc999a129df060cerion#include "../pub/libvex_guest_ppc32.h"
52d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#include "../pub/libvex_guest_ppc64.h"
536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj#include "../pub/libvex_guest_arm.h"
542825ac47817cec603c74d7224981560299c1a3basewardj
55ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFZ(__str)  #__str
56ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFY(__str)  VG_STRINGIFZ(__str)
57ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
58d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj#define my_offsetof(__type,__field) (&((__type*)0)->__field)
59d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj
60d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj/* This forces gcc to evaluate the my_offsetof call at compile time,
61ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   and then emits it in the assembly, along with the nonsense string
62ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   "xyzzy", for easy greppability.  Once this file is compiled to
63ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   assembly, the lines containing "xyzzy" are grepped out and sed-ed
64ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   to produce the final result.  See the Makefile rule for
65ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   pub/libvex_guest_offsets.h. */
66ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define GENOFFSET(_structUppercase,_structLowercase,_fieldname)  \
67ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   __asm__ __volatile__ ( \
68ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      "\n#define OFFSET_" \
69ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      VG_STRINGIFY(_structLowercase) "_" \
70ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      VG_STRINGIFY(_fieldname) \
71ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      " xyzzy%0\n" : /*out*/ \
72ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj                   : /*in*/ "n" \
73d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj         (my_offsetof(VexGuest##_structUppercase##State, \
74ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj          guest_##_fieldname)) \
75ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   )
76ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
77ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void );
78ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj__attribute__((noinline))
79ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void )
802825ac47817cec603c74d7224981560299c1a3basewardj{
81ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // x86
82ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EAX);
83ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EBX);
84ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ECX);
85ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EDX);
86ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ESI);
87ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EDI);
88ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EBP);
89ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ESP);
90ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EIP);
91ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,CS);
92ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,DS);
93ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ES);
94ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,FS);
95ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,GS);
96ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,SS);
97ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
98ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // amd64
99ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RAX);
100ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RBX);
101ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RCX);
102ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RDX);
103ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RSI);
104ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RDI);
105ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RSP);
106ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RBP);
107ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R8);
108ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R9);
109ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R10);
110ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R11);
111ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R12);
112ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R13);
113ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R14);
114ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R15);
115ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RIP);
116ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
117ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // ppc32
118ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR0);
119445dbefd81807d22c2d2bb318c5334e163fac33bsewardj   GENOFFSET(PPC32,ppc32,GPR1);
120ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR2);
121ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR3);
122ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR4);
123ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR5);
124ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR6);
125ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR7);
126ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR8);
127ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR9);
128ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR10);
129ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,CIA);
130ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,CR0_0);
131ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
132ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // ppc64
133ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR0);
134445dbefd81807d22c2d2bb318c5334e163fac33bsewardj   GENOFFSET(PPC64,ppc64,GPR1);
135ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR2);
136ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR3);
137ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR4);
138ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR5);
139ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR6);
140ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR7);
141ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR8);
142ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR9);
143ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR10);
144ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,CIA);
145ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,CR0_0);
1466c299f3acab617581ea504e45fbb6cab24c2b29fsewardj
1476c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   // arm
1486c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R0);
1496c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R1);
1506c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R2);
1516c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R3);
1526c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R4);
1536c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R5);
1546c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R7);
155445dbefd81807d22c2d2bb318c5334e163fac33bsewardj   GENOFFSET(ARM,arm,R13);
156445dbefd81807d22c2d2bb318c5334e163fac33bsewardj   GENOFFSET(ARM,arm,R14);
1576c299f3acab617581ea504e45fbb6cab24c2b29fsewardj   GENOFFSET(ARM,arm,R15);
1582825ac47817cec603c74d7224981560299c1a3basewardj}
159752f90673ebbb6b2f55fc5e46606dea371313713sewardj
160752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--------------------------------------------------------------------*/
161752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- end                                             genoffsets.c ---*/
162752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--------------------------------------------------------------------*/
163