[M3devel] representing word size in IR target-independently?
Jay K
jay.krell at cornell.edu
Sat Jul 18 10:48:09 CEST 2015
Ideally there would be one target-independent IR for, for example:
VAR a := BYTESIZE(INTEGER); VAR b := BITSIZE(INTEGER) = 64; TYPE T1 = RECORD a,b:INTEGER END; CONST pt1: REF T1 = NIL; VAR offset_of_b := LOOPHOLE(INTEGER, ADR(pt1.b));
so that it could be translated to target-independent C something like:
#if ...almost always true... typedef ptrdiff_t INTEGER; #else ... #endif INTEGER a = sizeof(INTEGER); typedef unsigned char BOOLEAN; BOOLEAN b = (sizeof(INTEGER) * 8) == 64; typedef struct { a,b:INTEGER; } T1; T1* pt1; // ideal but unlikely: INTEGER offset_of_b = offsetof(T1, b); // more likely: INTEGER offset_of_b; void module_initializer() { offset_of_b = (INTEGER)&pt1->b; }
Is this feasible?
Can instances of "INTEGER" somehow be left higher level for resolution by the backend? Or can they be left "dual", both "resolved" and "symbolic"? Or would this require too much change?
I would be very reluctantly satisfied if the frontend ran a certain portion of itself twice, once for each word size, indicating the start/end of the passes to the backend, so the generated C would be doubled up with an #if something like:
#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__) ...
... everything ...
#else // 32 bit
... everything ...
#endif
The agenda is target-independent C output from the C backend,as a portable redistributable form.This is approximately one of the three problems to solve to achieve that.
Thanks, - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20150718/68359d67/attachment-0001.html>
More information about the M3devel
mailing list