- firmEvaluator (VusualStudio 6/7/8 debug extension) added
[libfirm] / win32 / firmEvaluator / firmEvaluator.c
1 /*
2  * Firm - Evaluator
3  *
4  * (C) 2005 Michael Beck    beck@ipd.info.uni-karlsruhe.de
5  */
6 #include <windows.h>
7 #include <stdio.h>
8 #include <malloc.h>
9 #include <tchar.h>
10 #include "firm.h"
11 #include "firmEvaluator.h"
12
13 /**
14  * Get the initial address. As the interface allows only 32 bit
15  * transmitted, new I/F must be asked for 64bit support.
16  */
17 static void *GetInitialAddress(DWORD dwAddress, DEBUGHELPER *pHelper) {
18   if (pHelper->dwVersion < 0x20000) {
19     /* VC 6.0 access */
20     return (void *)dwAddress;
21   }
22   else {
23     /* VC 7.0+ access */
24     return (void *)pHelper->GetRealAddress(pHelper);
25   }
26 }
27
28 /**
29  * Copy from debuggee.
30  */
31 HRESULT copy_from_debuggee(const void *address, DEBUGHELPER *pHelper, void *dst, DWORD size)
32 {
33   DWORD nGot;
34
35   if (pHelper->dwVersion < 0x20000) {
36     /* VC 6.0 access */
37     if (pHelper->ReadDebuggeeMemory(pHelper, (DWORD)address, size, dst, &nGot) != S_OK)
38       return E_FAIL;
39     if (nGot != size)
40       return E_FAIL;
41   }
42   else {
43     /* VC 7.0+ access */
44     if (pHelper->ReadDebuggeeMemoryEx(pHelper, (DWORDLONG)address, size, dst, &nGot) != S_OK)
45       return E_FAIL;
46     if (nGot != size)
47       return E_FAIL;
48   }
49   return S_OK;
50 }
51
52 /**
53  * Evaluate an firm * object
54  */
55 HRESULT WINAPI firm_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
56 {
57   firm_kind kind;
58   int size;
59   void *address = GetInitialAddress(dwAddress, pHelper);
60
61   if (address == NULL) {
62     _tcsncpy(pResult, "NULL", max);
63     return S_OK;
64   }
65
66   if (copy_from_debuggee(address, pHelper, &kind, sizeof(kind)) != S_OK)
67     return E_FAIL;
68
69   size = get_firm_object_size(kind);
70   if (size <= 0)
71     return E_FAIL;
72
73   return FormatFirmObject(pHelper, nBase, kind, address, pResult, max);
74 }
75
76 /**
77  * Evaluate an ident * object
78  */
79 HRESULT WINAPI firm_ident_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
80 {
81   char *data = NULL;
82   void *address = GetInitialAddress(dwAddress, pHelper);
83
84   if (address == NULL) {
85     _tcsncpy(pResult, "NULL", max);
86     return S_OK;
87   }
88
89   return format_ident(pHelper, address, pResult, max);
90 }
91
92 /**
93  * Evaluate a pset * object
94  */
95 HRESULT WINAPI firm_pset_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
96 {
97   char *data = NULL;
98   void *address = GetInitialAddress(dwAddress, pHelper);
99
100   if (address == NULL) {
101     _tcsncpy(pResult, "NULL", max);
102     return S_OK;
103   }
104
105   return format_pset(pHelper, nBase, address, pResult, max);
106 }
107
108 /**
109  * Evaluate a set * object
110  */
111 HRESULT WINAPI firm_set_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
112 {
113   char *data = NULL;
114   void *address = GetInitialAddress(dwAddress, pHelper);
115
116   if (address == 0) {
117     _tcsncpy(pResult, "NULL", max);
118     return S_OK;
119   }
120
121   return format_set(pHelper, nBase, address, pResult, max);
122 }
123
124 /**
125  * Evaluate a _arr_descr * object
126  */
127 HRESULT WINAPI firm_arr_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
128 {
129   char *data = NULL;
130   void *address = GetInitialAddress(dwAddress, pHelper);
131
132   if (address == NULL) {
133     _tcsncpy(pResult, "NULL", max);
134     return S_OK;
135   }
136
137   return format_arr_descr(pHelper, nBase, address, pResult, max);
138 }
139
140 /**
141  * Evaluate a pdeq * object
142  */
143 HRESULT WINAPI firm_pdeq_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
144 {
145   char *data = NULL;
146   void *address = GetInitialAddress(dwAddress, pHelper);
147
148   if (address == 0) {
149     _tcsncpy(pResult, "NULL", max);
150     return S_OK;
151   }
152
153   return format_pdeq(pHelper, nBase, address, pResult, max);
154 }
155
156 /**
157  * Evaluate a bitset_t * object
158  */
159 HRESULT WINAPI firm_bitset_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
160 {
161   char *data = NULL;
162   void *address = GetInitialAddress(dwAddress, pHelper);
163
164   if (address == 0) {
165     _tcsncpy(pResult, "NULL", max);
166     return S_OK;
167   }
168
169   return format_bitset(pHelper, nBase, address, pResult, max);
170 }
171
172 /**
173  * Evaluate a ir_op
174  */
175 HRESULT WINAPI firm_op_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
176 {
177   char *data = NULL;
178   void *address = GetInitialAddress(dwAddress, pHelper);
179
180   if (address == 0) {
181     _tcsncpy(pResult, "NULL", max);
182     return S_OK;
183   }
184
185   return format_op(pHelper, address, pResult, max);
186 }