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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta name="robots" content="index,nofollow">
<title>PortingMLton - MLton Standard ML Compiler (SML Compiler)</title>
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="common.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="screen" href="screen.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="print" href="print.css">
<link rel="Start" href="Home">
</head>
<body lang="en" dir="ltr">
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-833377-1";
urchinTracker();
</script>
<table bgcolor = lightblue cellspacing = 0 style = "border: 0px;" width = 100%>
<tr>
<td style = "
border: 0px;
color: darkblue;
font-size: 150%;
text-align: left;">
<a class = mltona href="Home">MLton MLTONWIKIVERSION</a>
<td style = "
border: 0px;
font-size: 150%;
text-align: center;
width: 50%;">
PortingMLton
<td style = "
border: 0px;
text-align: right;">
<table cellspacing = 0 style = "border: 0px">
<tr style = "vertical-align: middle;">
</table>
<tr style = "background-color: white;">
<td colspan = 3
style = "
border: 0px;
font-size:70%;
text-align: right;">
<a href = "Home">Home</a>
<a href = "TitleIndex">Index</a>
</table>
<div id="content" lang="en" dir="ltr">
Porting MLton to a new target platform (architecture or OS) involves the following steps.
<ol type="1">
<li>
<p>
Make the necessary changes to the scripts, runtime system, <a href="BasisLibrary"> Basis Library</a> implementation, and compiler.
</p>
</li>
<li class="gap">
<p>
Get the regressions working using a cross compiler.
</p>
</li>
<li class="gap">
<p>
<a href="CrossCompiling"> Cross compile</a> MLton and bootstrap on the target.
</p>
</li>
</ol>
<p>
MLton has a native code generator only for AMD64 and X86, so, if you are porting to another architecture, you must use the C code generator. These notes do not cover building a new native code generator.
</p>
<p>
Some of the following steps will not be necessary if MLton already supports the architecture or operating system you are porting to.
</p>
<h2 id="head-54fc2e14a2d5b38e69a028f12f443994b939305a">What code to change</h2>
<ul>
<li>
<p>
Scripts.
</p>
</li>
<ul>
<li>
<p>
In <tt>bin/platform</tt>, add new cases to define <tt>$HOST_OS</tt> and <tt>$HOST_ARCH</tt>.
</p>
</li>
</ul>
<li class="gap">
<p>
Runtime system.
</p>
<p>
The goal of this step is to be able to successfully run <tt>make</tt> in the <tt>runtime</tt> directory on the target machine.
</p>
</li>
<ul>
<li>
<p>
In <tt>platform.h</tt>, add a new case to include <tt>platform/<arch>.h</tt> and <tt>platform/<os>.h</tt>.
</p>
</li>
<li class="gap">
<p>
In <tt>platform/<arch>.h</tt>:
</p>
</li>
<ul>
<li>
<p>
define <tt>MLton_Platform_Arch_host</tt>.
</p>
</li>
</ul>
<li class="gap">
<p>
In <tt>platform/<os>.h</tt>:
</p>
</li>
<ul>
<li>
<p>
include platform-specific includes.
</p>
</li>
<li>
<p>
define <tt>MLton_Platform_OS_host</tt>.
</p>
</li>
<li>
<p>
define all of the <tt>HAS_*</tt> macros.
</p>
</li>
</ul>
<li class="gap">
<p>
In <tt>platform/<os>.c</tt> implement any platform-dependent functions that the runtime needs.
</p>
</li>
<li class="gap">
<p>
Add rounding mode control to <tt>basis/Real/IEEEReal.c</tt> for the new arch (if not <tt>HAS_FEROUND</tt>)
</p>
</li>
<li class="gap">
<p>
Compile and install the <a href="GnuMP">GnuMP</a>. This varies from platform to platform. In <tt>platform/<os>.h</tt>, you need to include the appropriate <tt>gmp.h</tt>.
</p>
</li>
</ul>
<li class="gap">
<p>
Basis Library implementation (<tt>basis-library/*</tt>)
</p>
</li>
<ul>
<li>
<p>
In <tt>primitive/prim-mlton.sml</tt>,
</p>
</li>
<ul>
<li>
<p>
Add a new variant to the <tt>MLton.Platform.Arch.t</tt> datatype.
</p>
</li>
<li class="gap">
<p>
modify the constants that define <tt>MLton.Platform.Arch.host</tt> to match with <tt>MLton_Platform_Arch_host</tt>, as set in <tt>runtime/platform/<arch>.h</tt>.
</p>
</li>
<li class="gap">
<p>
Add a new variant to the <tt>MLton.Platform.OS.t</tt> datatype.
</p>
</li>
<li class="gap">
<p>
modify the constants that define <tt>MLton.Platform.OS.host</tt> to match with <tt>MLton_Platform_OS_host</tt>, as set in <tt>runtime/platform/<os>.h</tt>.
</p>
</li>
</ul>
<li class="gap">
<p>
In <tt>mlton/platform.{sig,sml} </tt> add a new variant.
</p>
</li>
<li class="gap">
<p>
In <tt>sml-nj/sml-nj.sml</tt>, modify <tt>getOSKind</tt>.
</p>
</li>
<li class="gap">
<p>
Look at all the uses of <tt>MLton.Platform</tt> in the Basis Library implementation and see if you need to do anything special. You might use the following command to see where to look.
<pre> find basis-library -type f | xargs grep 'MLton\.Platform'</pre> If in doubt, leave the code alone and wait to see what happens when you run the regression tests.
</p>
</li>
</ul>
<li class="gap">
<p>
Compiler.
</p>
</li>
<ul>
<li>
<p>
In <tt>lib/stubs/mlton-stubs/platform.sig</tt> add any new variants, as was done in the Basis Library.
</p>
</li>
<li class="gap">
<p>
In <tt>lib/stubs/mlton-stubs/mlton.sml</tt> add any new variants in <tt>MLton.Platform</tt>, as was done in the Basis Library.
</p>
</li>
</ul>
</ul>
<p>
The string used to identify a particular architecture or operating system must be the same (except for possibly case of letters) in the scripts, runtime, Basis Library implementation, and compiler (stubs). In <tt>mlton/main/main.fun</tt>, MLton itself uses the conversions to and from strings:
</p>
<ul>
<tt>MLton.Platform.{Arch,OS}.{from,to}String</tt>
</ul>
<p>
If the there is a mismatch, you may see the error message <tt>strange arch</tt> or <tt>strange os</tt>.
</p>
<h2 id="head-d7908c004a8540632014119d432f4daa14496746">Running the regressions with a cross compiler</h2>
<p>
When porting to a new platform, it is always best to get all (or as many as possible) of the regressions working before moving to a self compile. It is easiest to do this by modifying and rebuilding the compiler on a working machine and then running the regressions with a cross compiler. It is not easy to build a gcc cross compiler, so we recommend generating the C and assembly on a working machine (using MLton's <tt>-target</tt> and <tt>-stop g</tt> flags, copying the generated files to the target machine, then compiling and linking there.
</p>
<ol type="1">
<li>
<p>
Remake the compiler on a working machine.
</p>
</li>
<li class="gap">
<p>
Use <tt>bin/add-cross</tt> to add support for the new target. In particular, this should create <tt>build/lib/<target>/</tt> with the platform-specific necessary cross-compilation information.
</p>
</li>
<li class="gap">
<p>
Run the regression tests with the cross-compiler. To cross-compile all the tests, do
<pre> bin/regression -cross <target></pre> This will create all the executables. Then, copy <tt>bin/regression</tt> and the <tt>regression</tt> directory to the target machine, and do
<pre> bin/regression -run-only <target></pre> This should run all the tests.
</p>
</li>
</ol>
<p>
Repeat this step, interleaved with appropriate compiler modifications, until all the regressions pass.
</p>
<h2 id="head-89ec4ec2bf400e823f3ca49d0cb938b0fedd7bab">Bootstrap</h2>
<p>
Once you've got all the regressions working, you can build MLton for the new target. As with the regressions, the idea for bootstrapping is to generate the C and assembly on a working machine, copy it to the target machine, and then compile and link there. Here's the sequence of steps.
</p>
<ol type="1">
<li>
<p>
On a working machine, with the newly rebuilt compiler, in the <tt>mlton</tt> directory, do:
<pre> mlton -stop g -target <target> mlton.mlb</pre>
</p>
</li>
<li class="gap">
<p>
Copy to the target machine.
</p>
</li>
<li class="gap">
<p>
On the target machine, move the libraries to the right place. That is, in <tt>build/lib</tt>, do:
<pre> rm -rf self target-map
mv <target> self</pre>
</p>
</li>
<li class="gap">
<p>
On the target machine, compile and link MLton. That is, in the mlton directory, do something like:
<pre> gcc -c -Ibuild/lib/include -Ibuild/lib/self/include -O1 -w mlton/mlton.*.[cS]
gcc -o build/lib/mlton-compile \
-Lbuild/lib/self \
-L/usr/local/lib \
mlton.*.o \
-lmlton -lgmp -lgdtoa -lm</pre>
</p>
</li>
<li class="gap">
<p>
At this point, MLton should be working and you can finish the rest of a usual make on the target machine.
<pre> make basis-no-check script mlbpathmap targetmap constants libraries tools</pre>
</p>
</li>
</ol>
<p>
There are other details to get right, like making sure that the tools directories were clean so that the tools are rebuilt on the new platform, but hopefully this structure works. Once you've got a compiler on the target machine, you should test it by running all the regressions normally (i.e. without the <tt>-cross</tt> flag) and by running a couple rounds of self compiles.
</p>
<h2 id="head-a4bc8bf5caf54b18cea9f58e83dd4acb488deb17">Also see</h2>
<p>
The above description is based on the following emails sent to the MLton list.
</p>
<ul>
<li>
<p>
<a class="external" href="http://mlton.org/pipermail/mlton/2002-October/013110.html"><img src="moin-www.png" alt="[WWW]" height="11" width="11">http://mlton.org/pipermail/mlton/2002-October/013110.html</a>
</p>
</li>
<li>
<p>
<a class="external" href="http://mlton.org/pipermail/mlton/2004-July/016029.html"><img src="moin-www.png" alt="[WWW]" height="11" width="11">http://mlton.org/pipermail/mlton/2004-July/016029.html</a>
</p>
</li>
</ul>
</div>
<p>
<hr>
Last edited on 2009-06-10 18:37:14 by <span title="fenrir.uchicago.edu"><a href="MatthewFluet">MatthewFluet</a></span>.
</body></html>
|