beifg: Simplify the implementation of be_ifg_foreach_node().
[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 {
19   if (pHelper->dwVersion < 0x20000) {
20     /* VC 6.0 access */
21     return (void *)dwAddress;
22   }
23   else {
24     /* VC 7.0+ access */
25     return (void *)pHelper->GetRealAddress(pHelper);
26   }
27 }
28
29 /**
30  * Copy from debuggee.
31  */
32 HRESULT copy_from_debuggee(const void *address, DEBUGHELPER *pHelper, void *dst, DWORD size)
33 {
34   DWORD nGot;
35
36   if (pHelper->dwVersion < 0x20000) {
37     /* VC 6.0 access */
38     if (pHelper->ReadDebuggeeMemory(pHelper, (DWORD)address, size, dst, &nGot) != S_OK)
39       return E_FAIL;
40     if (nGot != size)
41       return E_FAIL;
42   }
43   else {
44     /* VC 7.0+ access */
45     if (pHelper->ReadDebuggeeMemoryEx(pHelper, (DWORDLONG)address, size, dst, &nGot) != S_OK)
46       return E_FAIL;
47     if (nGot != size)
48       return E_FAIL;
49   }
50   return S_OK;
51 }
52
53 /**
54  * Evaluate an firm * object
55  */
56 HRESULT WINAPI firm_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
57 {
58   firm_kind kind;
59   int size;
60   void *address = GetInitialAddress(dwAddress, pHelper);
61
62   if (address == NULL) {
63     _tcsncpy(pResult, "NULL", max);
64     return S_OK;
65   }
66
67   if (copy_from_debuggee(address, pHelper, &kind, sizeof(kind)) != S_OK)
68     return E_FAIL;
69
70   size = get_firm_object_size(kind);
71   if (size <= 0)
72     return E_FAIL;
73
74   return FormatFirmObject(pHelper, nBase, kind, address, pResult, max);
75 }
76
77 /**
78  * Evaluate an ident * object
79  */
80 HRESULT WINAPI firm_ident_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
81 {
82   char *data = NULL;
83   void *address = GetInitialAddress(dwAddress, pHelper);
84
85   if (address == NULL) {
86     _tcsncpy(pResult, "NULL", max);
87     return S_OK;
88   }
89
90   return format_ident(pHelper, address, pResult, max);
91 }
92
93 /**
94  * Evaluate a pset * object
95  */
96 HRESULT WINAPI firm_pset_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
97 {
98   char *data = NULL;
99   void *address = GetInitialAddress(dwAddress, pHelper);
100
101   if (address == NULL) {
102     _tcsncpy(pResult, "NULL", max);
103     return S_OK;
104   }
105
106   return format_pset(pHelper, nBase, address, pResult, max);
107 }
108
109 /**
110  * Evaluate a set * object
111  */
112 HRESULT WINAPI firm_set_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
113 {
114   char *data = NULL;
115   void *address = GetInitialAddress(dwAddress, pHelper);
116
117   if (address == 0) {
118     _tcsncpy(pResult, "NULL", max);
119     return S_OK;
120   }
121
122   return format_set(pHelper, nBase, address, pResult, max);
123 }
124
125 /**
126  * Evaluate a _arr_descr * object
127  */
128 HRESULT WINAPI firm_arr_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
129 {
130   char *data = NULL;
131   void *address = GetInitialAddress(dwAddress, pHelper);
132
133   if (address == NULL) {
134     _tcsncpy(pResult, "NULL", max);
135     return S_OK;
136   }
137
138   return format_arr_descr(pHelper, nBase, address, pResult, max);
139 }
140
141 /**
142  * Evaluate a pdeq * object
143  */
144 HRESULT WINAPI firm_pdeq_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
145 {
146   char *data = NULL;
147   void *address = GetInitialAddress(dwAddress, pHelper);
148
149   if (address == 0) {
150     _tcsncpy(pResult, "NULL", max);
151     return S_OK;
152   }
153
154   return format_pdeq(pHelper, nBase, address, pResult, max);
155 }
156
157 /**
158  * Evaluate a bitset_t * object
159  */
160 HRESULT WINAPI firm_bitset_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
161 {
162   char *data = NULL;
163   void *address = GetInitialAddress(dwAddress, pHelper);
164
165   if (address == 0) {
166     _tcsncpy(pResult, "NULL", max);
167     return S_OK;
168   }
169
170   return format_bitset(pHelper, nBase, address, pResult, max);
171 }
172
173 /**
174  * Evaluate a ir_op
175  */
176 HRESULT WINAPI firm_op_Evaluate(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved )
177 {
178   char *data = NULL;
179   void *address = GetInitialAddress(dwAddress, pHelper);
180
181   if (address == 0) {
182     _tcsncpy(pResult, "NULL", max);
183     return S_OK;
184   }
185
186   return format_op(pHelper, address, pResult, max);
187 }