about summary refs log tree commit diff stats
path: root/html/linux/bootstrap/037global_variables.cc.html
blob: 04c77f10aca5403405883f237ca221950a0a8308 (plain) (blame)
1
2
3
4
5
6
7
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
<?php

/**
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * 
 * @author Marton Sebok <sebokmarton@gmail.com>
 */
$lang['__background_site__']   = 'Lap színe (a tartalom mögött)';
$lang['__link__']              = 'Hivatkozás általános színe';
$lang['__existing__']          = 'Hivatkozása színe létező lapoknál';
$lang['__missing__']           = 'Hivatkozása színe nem létező lapoknál';
$lang['__site_width__']        = 'Az oldal teljes szélessége (tetszőleges mértékegységgel: %, px, em, ...)';
$lang['__sidebar_width__']     = 'Az oldalsáv szélessége (tetszőleges mértékegységgel: %, px, em, ...)';
$lang['__tablet_width__']      = 'Váltás tablet-módra ezen szélesség alatt';
$lang['__phone_width__']       = 'Váltás mobiltelefon-módra ezen szélesség alatt';
n254'>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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - linux/bootstrap/037global_variables.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #ffffd7; padding-bottom: 1px; }
.cSpecial { color: #008000; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/linux/bootstrap/037global_variables.cc'>https://github.com/akkartik/mu/blob/main/linux/bootstrap/037global_variables.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment">//: Global variables.</span>
<span id="L2" class="LineNr">  2 </span><span class="Comment">//:</span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//: Global variables are just labels in the data segment.</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment">//: However, they can only be used in imm32 and not disp32 arguments. And they</span>
<span id="L5" class="LineNr">  5 </span><span class="Comment">//: can't be used with jump and call instructions.</span>
<span id="L6" class="LineNr">  6 </span><span class="Comment">//:</span>
<span id="L7" class="LineNr">  7 </span><span class="Comment">//: This layer has much the same structure as rewriting labels.</span>
<span id="L8" class="LineNr">  8 </span>
<span id="L9" class="LineNr">  9 </span><span class="Delimiter">:(code)</span>
<span id="L10" class="LineNr"> 10 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L10'>test_global_variable</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L11" class="LineNr"> 11 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L12" class="LineNr"> 12 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L13" class="LineNr"> 13 </span>      <span class="Constant">&quot;b9  x/imm32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L14" class="LineNr"> 14 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L15" class="LineNr"> 15 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L16" class="LineNr"> 16 </span>      <span class="Constant">&quot;  00 00 00 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L17" class="LineNr"> 17 </span>  <span class="Delimiter">);</span>
<span id="L18" class="LineNr"> 18 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L19" class="LineNr"> 19 </span>      <span class="Constant">&quot;transform: global variable 'x' is at address 0x00002000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L20" class="LineNr"> 20 </span>  <span class="Delimiter">);</span>
<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">}</span>
<span id="L22" class="LineNr"> 22 </span>
<span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before &quot;End Transforms&quot;)</span>
<span id="L24" class="LineNr"> 24 </span><a href='031transforms.cc.html#L4'>Transform</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='037global_variables.cc.html#L26'>rewrite_global_variables</a><span class="Delimiter">);</span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(code)</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L26'>rewrite_global_variables</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L27" class="LineNr"> 27 </span>  <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- rewrite global variables&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span>  <span class="Comment">// Begin rewrite_global_variables</span>
<span id="L29" class="LineNr"> 29 </span>  map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt; address<span class="Delimiter">;</span>
<span id="L30" class="LineNr"> 30 </span>  compute_addresses_for_global_variables<span class="Delimiter">(</span>p<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span>  <a href='037global_variables.cc.html#L73'>drop_global_variables</a><span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span>  <a href='037global_variables.cc.html#L80'>replace_global_variables_with_addresses</a><span class="Delimiter">(</span>p<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
<span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span>
<span id="L35" class="LineNr"> 35 </span>
<span id="L36" class="LineNr"> 36 </span><span class="Normal">void</span> compute_addresses_for_global_variables<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;&amp; address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L111'>name</a> != <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span>
<span id="L39" class="LineNr"> 39 </span>      compute_addresses_for_global_variables<span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> address<span class="Delimiter">);</span>
<span id="L40" class="LineNr"> 40 </span>  <span class="Delimiter">}</span>
<span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span>
<span id="L42" class="LineNr"> 42 </span>
<span id="L43" class="LineNr"> 43 </span><span class="Normal">void</span> compute_addresses_for_global_variables<span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;&amp; address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L44" class="LineNr"> 44 </span>  <span class="Normal">int</span> current_address = s<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L46" class="LineNr"> 46 </span>    <span class="Normal">const</span> line&amp; inst = s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L47" class="LineNr"> 47 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L48" class="LineNr"> 48 </span>      <span class="Normal">const</span> word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>*curr<span class="Delimiter">.</span>data<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">':'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L50" class="LineNr"> 50 </span>        current_address += size_of<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span>      <span class="Delimiter">}</span>
<span id="L52" class="LineNr"> 52 </span>      <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L53" class="LineNr"> 53 </span>        string variable = <a href='036labels.cc.html#L276'>drop_last</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span>        <span class="Comment">// ensure variables look sufficiently different from raw hex</span>
<span id="L55" class="LineNr"> 55 </span>        <a href='036labels.cc.html#L84'>check_valid_name</a><span class="Delimiter">(</span>variable<span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L57" class="LineNr"> 57 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L58" class="LineNr"> 58 </span>          <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': global variable names can only be the first <a href='011run.cc.html#L127'>word</a> in a line.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='036labels.cc.html#L183'>Labels_file</a><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L60" class="LineNr"> 60 </span>          <a href='036labels.cc.html#L183'>Labels_file</a> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; variable &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L231'>contains_key</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L62" class="LineNr"> 62 </span>          <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;duplicate global '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span>          <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span>        <span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span>        <a href='001help.cc.html#L227'>put</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">,</span> current_address<span class="Delimiter">);</span>
<span id="L66" class="LineNr"> 66 </span>        <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;global variable '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;' is at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; end<span class="Delimiter">();</span>
<span id="L67" class="LineNr"> 67 </span>        <span class="Comment">// no modifying current_address; global variable definitions won't be in the final binary</span>
<span id="L68" class="LineNr"> 68 </span>      <span class="Delimiter">}</span>
<span id="L69" class="LineNr"> 69 </span>    <span class="Delimiter">}</span>
<span id="L70" class="LineNr"> 70 </span>  <span class="Delimiter">}</span>
<span id="L71" class="LineNr"> 71 </span><span class="Delimiter">}</span>
<span id="L72" class="LineNr"> 72 </span>
<span id="L73" class="LineNr"> 73 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L73'>drop_global_variables</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L74" class="LineNr"> 74 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L75" class="LineNr"> 75 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L111'>name</a> != <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span>
<span id="L76" class="LineNr"> 76 </span>      <a href='036labels.cc.html#L205'>drop_labels</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L77" class="LineNr"> 77 </span>  <span class="Delimiter">}</span>
<span id="L78" class="LineNr"> 78 </span><span class="Delimiter">}</span>
<span id="L79" class="LineNr"> 79 </span>
<span id="L80" class="LineNr"> 80 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L80'>replace_global_variables_with_addresses</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;&amp; address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L81" class="LineNr"> 81 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L82" class="LineNr"> 82 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span>    segment&amp; curr = p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span><a href='011run.cc.html#L111'>name</a> == <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span>
<span id="L85" class="LineNr"> 85 </span>      <a href='037global_variables.cc.html#L91'>replace_global_variables_in_code_segment</a><span class="Delimiter">(</span>curr<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
<span id="L86" class="LineNr"> 86 </span>    <span class="Normal">else</span>
<span id="L87" class="LineNr"> 87 </span>      <a href='037global_variables.cc.html#L114'>replace_global_variables_in_data_segment</a><span class="Delimiter">(</span>curr<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span>  <span class="Delimiter">}</span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L91'>replace_global_variables_in_code_segment</a><span class="Delimiter">(</span>segment&amp; code<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;&amp; address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L93" class="LineNr"> 93 </span>    line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span>    <a href='011run.cc.html#L121'>line</a> new_inst<span class="Delimiter">;</span>
<span id="L95" class="LineNr"> 95 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L96" class="LineNr"> 96 </span>      <span class="Normal">const</span> word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L97" class="LineNr"> 97 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L98" class="LineNr"> 98 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>!looks_like_hex_int<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span>
<span id="L99" class="LineNr"> 99 </span>          <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;missing reference to global '&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L100" class="LineNr">100 </span>        new_inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L101" class="LineNr">101 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L102" class="LineNr">102 </span>      <span class="Delimiter">}</span>
<span id="L103" class="LineNr">103 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!valid_use_of_global_variable<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L104" class="LineNr">104 </span>        <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': can't refer to global variable '&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L105" class="LineNr">105 </span>        <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L106" class="LineNr">106 </span>      <span class="Delimiter">}</span>
<span id="L107" class="LineNr">107 </span>      emit_hex_bytes<span class="Delimiter">(</span>new_inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">),</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L108" class="LineNr">108 </span>    <span class="Delimiter">}</span>
<span id="L109" class="LineNr">109 </span>    inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>
<span id="L110" class="LineNr">110 </span>    <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction after transform: '&quot;</span> &lt;&lt; data_to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L111" class="LineNr">111 </span>  <span class="Delimiter">}</span>
<span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span>
<span id="L113" class="LineNr">113 </span>
<span id="L114" class="LineNr">114 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L114'>replace_global_variables_in_data_segment</a><span class="Delimiter">(</span>segment&amp; data<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;&amp; address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L115" class="LineNr">115 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L116" class="LineNr">116 </span>    line&amp; l = data<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L117" class="LineNr">117 </span>    <a href='011run.cc.html#L121'>line</a> new_l<span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span>      <span class="Normal">const</span> word&amp; curr = l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L120" class="LineNr">120 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L121" class="LineNr">121 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L593'>looks_like_hex_int</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L122" class="LineNr">122 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm32&quot;</span><span class="Delimiter">))</span>
<span id="L123" class="LineNr">123 </span>            emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L124" class="LineNr">124 </span>          <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm16&quot;</span><span class="Delimiter">))</span>
<span id="L125" class="LineNr">125 </span>            emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L126" class="LineNr">126 </span>          <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm8&quot;</span><span class="Delimiter">))</span>
<span id="L127" class="LineNr">127 </span>            emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L128" class="LineNr">128 </span>          <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp8&quot;</span><span class="Delimiter">))</span>
<span id="L129" class="LineNr">129 </span>            <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;can't use /disp8 in a non-code segment</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L130" class="LineNr">130 </span>          <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">))</span>
<span id="L131" class="LineNr">131 </span>            <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;can't use /disp16 in a non-code segment</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L132" class="LineNr">132 </span>          <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">))</span>
<span id="L133" class="LineNr">133 </span>            <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;can't use /disp32 in a non-code segment</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L134" class="LineNr">134 </span>          <span class="Normal">else</span>
<span id="L135" class="LineNr">135 </span>            new_l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L136" class="LineNr">136 </span>        <span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span>        <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L138" class="LineNr">138 </span>          <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;missing reference to global '&quot;</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L139" class="LineNr">139 </span>          new_l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>        <span class="Delimiter">}</span>
<span id="L141" class="LineNr">141 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span>      <span class="Delimiter">}</span>
<span id="L143" class="LineNr">143 </span>      <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot; maps to &quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L144" class="LineNr">144 </span>      emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">),</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L145" class="LineNr">145 </span>    <span class="Delimiter">}</span>
<span id="L146" class="LineNr">146 </span>    l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>
<span id="L147" class="LineNr">147 </span>    <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;after transform: '&quot;</span> &lt;&lt; data_to_string<span class="Delimiter">(</span>l<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L148" class="LineNr">148 </span>  <span class="Delimiter">}</span>
<span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span>
<span id="L150" class="LineNr">150 </span>
<span id="L151" class="LineNr">151 </span><span class="Normal">bool</span> <a href='037global_variables.cc.html#L151'>valid_use_of_global_variable</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L152" class="LineNr">152 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm32&quot;</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L153" class="LineNr">153 </span>  <span class="Comment">// End Valid Uses Of Global Variable(curr)</span>
<span id="L154" class="LineNr">154 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L155" class="LineNr">155 </span><span class="Delimiter">}</span>
<span id="L156" class="LineNr">156 </span>
<span id="L157" class="LineNr">157 </span><span class="Comment">//:: a more complex sanity check for how we use global variables</span>
<span id="L158" class="LineNr">158 </span><span class="Comment">//: requires first saving some data early before we pack arguments</span>
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="Delimiter">:(after &quot;Begin Transforms&quot;)</span>
<span id="L161" class="LineNr">161 </span><a href='031transforms.cc.html#L4'>Transform</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='037global_variables.cc.html#L163'>correlate_disp32_with_mod</a><span class="Delimiter">);</span>
<span id="L162" class="LineNr">162 </span><span class="Delimiter">:(code)</span>
<span id="L163" class="LineNr">163 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L163'>correlate_disp32_with_mod</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L164" class="LineNr">164 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L165" class="LineNr">165 </span>  segment&amp; code = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">);</span>
<span id="L166" class="LineNr">166 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L167" class="LineNr">167 </span>    line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L168" class="LineNr">168 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L169" class="LineNr">169 </span>      word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L170" class="LineNr">170 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">)</span>
<span id="L171" class="LineNr">171 </span>          &amp;&amp; has_argument_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">))</span>
<span id="L172" class="LineNr">172 </span>        curr<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">&quot;has_mod&quot;</span><span class="Delimiter">);</span>
<span id="L173" class="LineNr">173 </span>    <span class="Delimiter">}</span>
<span id="L174" class="LineNr">174 </span>  <span class="Delimiter">}</span>
<span id="L175" class="LineNr">175 </span><span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">:(before &quot;End Valid Uses Of Global Variable(curr)&quot;)</span>
<span id="L178" class="LineNr">178 </span><span class="Normal">if</span> <span class="Delimiter">(</span>has_argument_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">))</span>
<span id="L179" class="LineNr">179 </span>  <span class="Identifier">return</span> <a href='037global_variables.cc.html#L184'>has_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;has_mod&quot;</span><span class="Delimiter">);</span>
<span id="L180" class="LineNr">180 </span><span class="Comment">// todo: more sophisticated check, to ensure we don't use global variable</span>
<span id="L181" class="LineNr">181 </span><span class="Comment">// addresses as a real displacement added to other arguments.</span>
<span id="L182" class="LineNr">182 </span>
<span id="L183" class="LineNr">183 </span><span class="Delimiter">:(code)</span>
<span id="L184" class="LineNr">184 </span><span class="Normal">bool</span> <a href='037global_variables.cc.html#L184'>has_metadata</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; m<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L185" class="LineNr">185 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L186" class="LineNr">186 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == m<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L187" class="LineNr">187 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
<span id="L189" class="LineNr">189 </span>
<span id="L190" class="LineNr">190 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L190'>test_global_variable_disallowed_in_jump</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L191" class="LineNr">191 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L192" class="LineNr">192 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L193" class="LineNr">193 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L194" class="LineNr">194 </span>      <span class="Constant">&quot;eb/jump  x/disp8</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L195" class="LineNr">195 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L196" class="LineNr">196 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L197" class="LineNr">197 </span>      <span class="Constant">&quot;  00 00 00 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L198" class="LineNr">198 </span>  <span class="Delimiter">);</span>
<span id="L199" class="LineNr">199 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L200" class="LineNr">200 </span>      <span class="Constant">&quot;error: 'eb/jump x/disp8': can't refer to global variable 'x'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L201" class="LineNr">201 </span>      <span class="Comment">// sub-optimal error message; should be</span>
<span id="L202" class="LineNr">202 </span><span class="CommentedCode">//?       &quot;error: can't jump to data (variable 'x')\n&quot;</span>
<span id="L203" class="LineNr">203 </span>  <span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span><span class="Delimiter">}</span>
<span id="L205" class="LineNr">205 </span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L206'>test_global_variable_disallowed_in_call</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L209" class="LineNr">209 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L210" class="LineNr">210 </span>      <span class="Constant">&quot;e8/call  x/disp32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L211" class="LineNr">211 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L212" class="LineNr">212 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L213" class="LineNr">213 </span>      <span class="Constant">&quot;  00 00 00 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L214" class="LineNr">214 </span>  <span class="Delimiter">);</span>
<span id="L215" class="LineNr">215 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L216" class="LineNr">216 </span>      <span class="Constant">&quot;error: 'e8/call x/disp32': can't refer to global variable 'x'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L217" class="LineNr">217 </span>      <span class="Comment">// sub-optimal error message; should be</span>
<span id="L218" class="LineNr">218 </span><span class="CommentedCode">//?       &quot;error: can't call to the data segment ('x')\n&quot;</span>
<span id="L219" class="LineNr">219 </span>  <span class="Delimiter">);</span>
<span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span>
<span id="L222" class="LineNr">222 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L222'>test_global_variable_in_data_segment</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L223" class="LineNr">223 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L224" class="LineNr">224 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L225" class="LineNr">225 </span>      <span class="Constant">&quot;b9  x/imm32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L226" class="LineNr">226 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L227" class="LineNr">227 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L228" class="LineNr">228 </span>      <span class="Constant">&quot;  y/imm32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L229" class="LineNr">229 </span>      <span class="Constant">&quot;y:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L230" class="LineNr">230 </span>      <span class="Constant">&quot;  00 00 00 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L231" class="LineNr">231 </span>  <span class="Delimiter">);</span>
<span id="L232" class="LineNr">232 </span>  <span class="Comment">// check that we loaded 'x' with the address of 'y'</span>
<span id="L233" class="LineNr">233 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L234" class="LineNr">234 </span>      <span class="Constant">&quot;load: 0x00002000 -&gt; 04</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L235" class="LineNr">235 </span>      <span class="Constant">&quot;load: 0x00002001 -&gt; 20</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L236" class="LineNr">236 </span>      <span class="Constant">&quot;load: 0x00002002 -&gt; 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L237" class="LineNr">237 </span>      <span class="Constant">&quot;load: 0x00002003 -&gt; 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L238" class="LineNr">238 </span>  <span class="Delimiter">);</span>
<span id="L239" class="LineNr">239 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span>
<span id="L242" class="LineNr">242 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L242'>test_raw_number_with_imm32_in_data_segment</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L243" class="LineNr">243 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L244" class="LineNr">244 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L245" class="LineNr">245 </span>      <span class="Constant">&quot;b9  x/imm32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L246" class="LineNr">246 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L247" class="LineNr">247 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L248" class="LineNr">248 </span>      <span class="Constant">&quot;  1/imm32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L249" class="LineNr">249 </span>  <span class="Delimiter">);</span>
<span id="L250" class="LineNr">250 </span>  <span class="Comment">// check that we loaded 'x' with the address of 1</span>
<span id="L251" class="LineNr">251 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L252" class="LineNr">252 </span>      <span class="Constant">&quot;load: 0x00002000 -&gt; 01</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L253" class="LineNr">253 </span>      <span class="Constant">&quot;load: 0x00002001 -&gt; 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L254" class="LineNr">254 </span>      <span class="Constant">&quot;load: 0x00002002 -&gt; 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L255" class="LineNr">255 </span>      <span class="Constant">&quot;load: 0x00002003 -&gt; 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L256" class="LineNr">256 </span>  <span class="Delimiter">);</span>
<span id="L257" class="LineNr">257 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L258" class="LineNr">258 </span><span class="Delimiter">}</span>
<span id="L259" class="LineNr">259 </span>
<span id="L260" class="LineNr">260 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L260'>test_duplicate_global_variable</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L261" class="LineNr">261 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L262" class="LineNr">262 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L263" class="LineNr">263 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L264" class="LineNr">264 </span>      <span class="Constant">&quot;40/increment-EAX</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L265" class="LineNr">265 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L266" class="LineNr">266 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L267" class="LineNr">267 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L268" class="LineNr">268 </span>      <span class="Constant">&quot;  00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L269" class="LineNr">269 </span>  <span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L271" class="LineNr">271 </span>      <span class="Constant">&quot;error: duplicate global 'x'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L272" class="LineNr">272 </span>  <span class="Delimiter">);</span>
<span id="L273" class="LineNr">273 </span><span class="Delimiter">}</span>
<span id="L274" class="LineNr">274 </span>
<span id="L275" class="LineNr">275 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L275'>test_global_variable_disp32_with_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L276" class="LineNr">276 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L277" class="LineNr">277 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L278" class="LineNr">278 </span>      <span class="Constant">&quot;8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX x/disp32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L279" class="LineNr">279 </span>      <span class="Constant">&quot;== data 0x2000</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L280" class="LineNr">280 </span>      <span class="Constant">&quot;x:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L281" class="LineNr">281 </span>      <span class="Constant">&quot;  00 00 00 00</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L282" class="LineNr">282 </span>  <span class="Delimiter">);</span>
<span id="L283" class="LineNr">283 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L284" class="LineNr">284 </span><span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span>
<span id="L286" class="LineNr">286 </span><span class="Normal">void</span> <a href='037global_variables.cc.html#L286'>test_global_variable_disp32_with_call</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L287" class="LineNr">287 </span>  transform<span class="Delimiter">(</span>
<span id="L288" class="LineNr">288 </span>      <span class="Constant">&quot;== code 0x1</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L289" class="LineNr">289 </span>      <span class="Constant">&quot;foo:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L290" class="LineNr">290 </span>      <span class="Constant">&quot;  e8/call bar/disp32</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L291" class="LineNr">291 </span>      <span class="Constant">&quot;bar:</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
<span id="L292" class="LineNr">292 </span>  <span class="Delimiter">);</span>
<span id="L293" class="LineNr">293 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span>
<span id="L295" class="LineNr">295 </span>
<span id="L296" class="LineNr">296 </span>string <a href='037global_variables.cc.html#L296'>to_full_string</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L297" class="LineNr">297 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L298" class="LineNr">298 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span>    out &lt;&lt; in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">;</span>
<span id="L301" class="LineNr">301 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L168'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>metadata<span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span>
<span id="L302" class="LineNr">302 </span>      out &lt;&lt; <span class="Constant">'/'</span> &lt;&lt; in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L303" class="LineNr">303 </span>  <span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->