1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>GlueGen Code Generator</title>
</head>
<body>
<h2><i>JogAmp GlueGen</i> Code Generator</h2>
<h4>GlueGen Data Type Mapping</h4>
Gluegen has build-in types (terminal symbols) for:<br/>
<br/>
<table border="1">
<tr><th>type</th> <th>java bits</th> <th colspan="2">native bits</th> <th>type</th> <th>signed</th> <th>origin</th></tr>
<tr><th></th> <th></th> <th>x32</th> <th>x64</th> <th></th> <th></th> <th></th></tr>
<tr><td>void</td> <td> 0</td> <td> 0</td> <td> 0</td> <td>void</td> <td>void</td> <td>ANSI-C</td></tr>
<tr><td>char</td> <td> 8</td> <td> 8</td> <td> 8</td> <td>integer</td><td>any</td> <td>ANSI-C</td></tr>
<tr><td>short</td> <td>16</td> <td>16</td> <td>16</td> <td>integer</td><td>any</td> <td>ANSI-C</td></tr>
<tr><td>int</td> <td>32</td> <td>32</td> <td>32</td> <td>integer</td><td>any</td> <td>ANSI-C</td></tr>
<tr><td>long</td> <td>64</td> <td>32</td> <td><b>32<sup>1</sup></b></td> <td>integer</td><td>any</td> <td>ANSI-C - Windows</td></tr>
<tr><td>long</td> <td>64</td> <td>32</td> <td><b>64</b></td> <td>integer</td><td>any</td> <td>ANSI-C - Unix</td></tr>
<tr><td>float</td> <td>32</td> <td>32</td> <td>32</td> <td>float</td> <td>signed</td> <td>ANSI-C</td></tr>
<tr><td>double</td> <td>64</td> <td>64</td> <td>64</td> <td>double</td> <td>signed</td> <td>ANSI-C</td></tr>
<tr><td>__int32</td> <td>32</td> <td>32</td> <td>32</td> <td>integer</td><td>any</td> <td>windows</td></tr>
<tr><td>__int64</td> <td>64</td> <td>64</td> <td>64</td> <td>integer</td><td>any</td> <td>windows</td></tr>
<tr><td>int8_t</td> <td> 8</td> <td> 8</td> <td> 8</td> <td>integer</td><td>signed</td> <td>stdint.h</td></tr>
<tr><td>uint8_t</td> <td> 8</td> <td> 8</td> <td> 8</td> <td>integer</td><td>unsigned</td> <td>stdint.h</td></tr>
<tr><td>int16_t</td> <td>16</td> <td>16</td> <td>16</td> <td>integer</td><td>signed</td> <td>stdint.h</td></tr>
<tr><td>uint16_t</td> <td>16</td> <td>16</td> <td>16</td> <td>integer</td><td>unsigned</td> <td>stdint.h</td></tr>
<tr><td>int32_t</td> <td>32</td> <td>32</td> <td>32</td> <td>integer</td><td>signed</td> <td>stdint.h</td></tr>
<tr><td>uint32_t</td> <td>32</td> <td>32</td> <td>32</td> <td>integer</td><td>unsigned</td> <td>stdint.h</td></tr>
<tr><td>int64_t</td> <td>64</td> <td>64</td> <td>64</td> <td>integer</td><td>signed</td> <td>stdint.h</td></tr>
<tr><td>uint64_t</td> <td>64</td> <td>64</td> <td>64</td> <td>integer</td><td>unsigned</td> <td>stdint.h</td></tr>
<tr><td>intptr_t</td> <td>64</td> <td>32</td> <td>64</td> <td>integer</td><td>signed</td> <td>stdint.h</td></tr>
<tr><td>uintptr_t</td> <td>64</td> <td>32</td> <td>64</td> <td>integer</td><td>unsigned</td> <td>stdint.h</td></tr>
<tr><td>ptrdiff_t</td> <td>64</td> <td>32</td> <td>64</td> <td>integer</td><td>signed</td> <td>stddef.h</td></tr>
<tr><td>size_t</td> <td>64</td> <td>32</td> <td>64</td> <td>integer</td><td>unsigned</td> <td>stddef.h</td></tr>
<tr><td>wchar_t</td> <td>32</td> <td>32</td> <td>32</td> <td>integer</td><td>signed</td> <td>stddef.h</td></tr>
</table>
<p>
<b>Warning:</b> Try to avoid unspecified bit sized types, especially <b>long</b>, since it differs on Unix and Windows!<br/>
<b>Notes:</b>
<ol>
<li>Type <b>long</b> will result in broken code on Windows, since we don't differentiate the OS and it's bit size is ambiguous.</li>
<li>Anonymous void-pointer <i>void*</i> are mapped to NIO <i>Buffer</i>.</li>
<li>Pointers to pointer-size types like <i>intptr_t*</i>, <i>uintptr_t*</i>, <i>ptrdiff_t*</i> and <i>size_t*</i> are mapped to <i>PointerBuffer</i>,
to reflect the architecture depending storage size.</li>
</ol>
</p>
<h4>GlueGen Internal Alignment for Compound Data</h4>
In general, depending on CPU and it's configuration (OS), alignment is set up
for each type (char, short, int, long, ..).
<p>Compounds (structures) are aligned naturally, i.e. their inner components are aligned<br>
and are itself aligned to it's largest element.</p>
See:<br>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Data_structure_alignment">Wikipedia Data Structure Alignment</a></li>
<li><a href="http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding">Wikipedia Data Structure Alignment - Padding</a></li>
<li><a href="http://www.viva64.com/en/l/0021/">Viva64 Data Alignment</a></li>
<li><a href="http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/64bitPorting/transition/transition.html#//apple_ref/doc/uid/TP40001064-CH207-SW1">Apple: Darwin 64bit Porting - Data Type Size & Alignment</a></li>
</ul>
<h5>Simple alignment arithmetic</h5>
<blockquote>remainder = offset % alignment</blockquote>
since alignment is a multiple of 2 <code>-> x % 2n == x & (2n - 1)</code><br>
<blockquote>remainder = offset & ( alignment - 1 )</blockquote>
<blockquote>
padding = (remainder > 0) ? alignment - remainder : 0 ;<br>
aligned_offset = offset + padding ;
</blockquote>
<h5>Type Size & Alignment for x86, x86_64, armv6l-32bit-eabi and Window(mingw/mingw64)</h5>
Runtime query is implemented as follows:
<pre>
typedef struct {
char fill; // nibble one byte
// padding to align s1: padding_0
type_t s1; //
} test_struct_type_t;
padding_0 = sizeof(test_struct_type_t) - sizeof(type_t) - sizeof(char) ;
alignmentOf(type_t) = sizeof(test_struct_type_t) - sizeof(type_t) ;
</pre>
<table border="1">
<tr><th>type</th> <th colspan="2">32 bits</th><th colspan="2">64 bits</th></tr>
<tr><th></th> <th>size</th><th>alignment</th><th>size</th><th>alignment</th></tr>
<tr><td>char</td> <td> 1</td> <td> 1</td> <td> 1</td> <td> 1</td></tr>
<tr><td>short</td> <td> 2</td> <td> 2</td> <td> 2</td> <td> 2</td></tr>
<tr><td>int</td> <td> 4</td> <td> 4</td> <td> 4</td> <td> 4</td></tr>
<tr><td>float</td> <td> 4</td> <td> 4</td> <td> 4</td> <td> 4</td></tr>
<tr><td>long</td> <td> 4</td> <td> 4</td> <td> 8<sup>†</sup>,4<sup>∗</sup></td> <td> 8<sup>†</sup>,4<sup>∗</sup></td></tr>
<tr><td>pointer</td> <td> 4</td> <td> 4</td> <td> 8</td> <td> 8</td></tr>
<tr><td>long long</td> <td> 8</td> <td>4<sup>†</sup>,8<sup>∗</sup><sup>+</sup></td> <td> 8</td> <td> 8</td></tr>
<tr><td>double</td> <td> 8</td> <td>4<sup>†</sup>,8<sup>∗</sup><sup>+</sup></td> <td> 8</td> <td> 8</td></tr>
<tr><td>long double</td><td>12<sup>†</sup><sup>∗</sup>,8<sup>+</sup>,16<sup>-</sup></td> <td>4<sup>†</sup><sup>∗</sup>,8<sup>+</sup>,16<sup>-</sup></td> <td> 16</td> <td>16</td></tr>
</table><br>
<sup>†</sup> Linux, Darwin<br>
<sup>+</sup>armv7l-eabi<br>
<sup>-</sup> MacOsX-32bit-gcc4<br>
<sup>∗</sup> Windows<br>
</P>
<h4>GlueGen Platform Header Files</h4>
GlueGen provides convenient platform headers,<br/>
which can be included in your C header files for native compilation and GlueGen code generation.<br/>
<br/>
Example:<br/>
<pre>
#include <gluegen_stdint.h>
#include <gluegen_stddef.h>
uint64_t test64;
size_t size1;
ptrdiff_t ptr1;
</pre>
<br/>
To compile this file you have to include the following folder to your compilers system includes, ie <code>-I</code>:<br/>
<pre>
gluegen/make/stub_includes/platform
</pre>
<br>
To generate code for this file you have to include the following folder to your GlueGen <code>includeRefid</code> element:<br>
<pre>
gluegen/make/stub_includes/gluegen
</pre>
<h4>GlueGen Pre-Defined Macros</h4>
To identity a GlueGen code generation run, GlueGen defines the following macros:<br/>
<pre>
#define __GLUEGEN__ 2
</pre>
<br>
<br>
</body>
</html>
|