summary refs log tree commit diff stats
path: root/README
blob: 84bf30a3c39c7ba9d82c85a15b165533653c34a7 (plain) (blame)
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
ranger v.1.5.2
==============
ranger is a console file manager with VI key bindings.  It provides a
minimalistic and nice curses interface with a view on the directory hierarchy.
The secondary task of ranger is to figure out which program you want to use to
open your files with.

This file describes ranger and how to get it to run.  For instructions on the
usage, please read the man page.  See doc/HACKING for development specific
information.  For configuration, check the files in ranger/defaults/.  They
are usually installed to /usr/lib/python*/site-packages/ranger/defaults/
and can be obtained with ranger's --copy-config option.

A note to packagers:  Versions meant for packaging are listed in the changelog
on the website.


About
-----
* Authors:     Check the copyright notices in each source file
* License:     GNU General Public License Version 3

* Website:     http://ranger.nongnu.org/
* Download:    http://ranger.nongnu.org/ranger-stable.tar.gz
* Bug reports: https://savannah.nongnu.org/bugs/?group=ranger&func=additem
* git clone    http://git.sv.gnu.org/r/ranger.git


Design Goals
------------
* An easily maintainable file manager in a high level language
* A quick way to switch directories and browse the file system
* Keep it small but useful, do one thing and do it well
* Console based, with smooth integration into the unix shell


Features
--------
* UTF-8 Support  (if your python copy supports it)
* Multi-column display
* Preview of the selected file/directory
* Common file operations (create/chmod/copy/delete/...)
* Renaming multiple files at once
* VIM-like console and hotkeys
* Automatically determine file types and run them with correct programs
* Change the directory of your shell after exiting ranger
* Tabs, Bookmarks, Mouse support


Dependencies
------------
* Python (tested with version 2.6, 2.7, 3.1, 3.2) with support for ncurses
  and (optionally) wide-unicode.
* A pager ("less" by default)

Optional:
* The "file" program for determining file types
* The python module "chardet", in case of encoding detection problems

Optional, for enhanced file previews (with "scope.sh"):
* img2txt (from caca-utils) for previewing images
* highlight for syntax highlighting of code
* atool for previews of archives
* lynx, w3m or elinks for previews of html pages
* pdftotext for pdf previews
* transmission-show for viewing bit-torrent information
* mediainfo for viewing information about media files


Installing
----------
Use the package manager of your operating system to install ranger.
Note that ranger can be started without installing by simply running ranger.py.

To install ranger manually:
    sudo make install

This translates roughly to:
    sudo python setup.py install --optimize=1 --record=install_log.txt

This also saves a list of all installed files to install_log.txt, which you can
use to uninstall ranger.


Getting Started
---------------
After starting ranger, you can use the Arrow Keys (or hjkl) to navigate, Enter
to open a file or type Q to quit.  The third column shows a preview of the
current file.  The second is the main column and the first shows the parent
directory.

Ranger will automatically copy simple configuration files to ~/.config/ranger.
If you mess them up, just delete them and ranger will copy them again. Run
ranger with --dont-copy-config to disable this.  Also check ranger/defaults/
for the default configuration.
0'>350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
<!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 - 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: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.CommentedCode { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Constant { color: #008787; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.cSpecial { color: #008000; }
.SalientComment { color: #0000af; }
-->
</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/master/037global_variables.cc'>https://github.com/akkartik/mu/blob/master/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\n&quot;</span>
<span id="L13" class="LineNr"> 13 </span>      <span class="Constant">&quot;b9  x/imm32\n&quot;</span>
<span id="L14" class="LineNr"> 14 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L15" class="LineNr"> 15 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L16" class="LineNr"> 16 </span>      <span class="Constant">&quot;  00 00 00 00\n&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\n&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><span class="SpecialChar"><a href='031transforms.cc.html#L4'>Transform</a></span><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#L166'>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#L166'>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#L166'>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#L263'>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.\n&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><span class="SpecialChar"><a href='036labels.cc.html#L183'>Labels_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L60" class="LineNr"> 60 </span>          <span class="SpecialChar"><a href='036labels.cc.html#L183'>Labels_file</a></span> &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#L229'>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;'\n&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#L225'>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#L166'>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#L166'>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#L166'>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#L166'>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;'\n&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;'\n&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#L166'>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#L166'>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#L591'>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\n&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\n&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\n&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;'\n&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="SalientComment">//:: 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><span class="SpecialChar"><a href='031transforms.cc.html#L4'>Transform</a></span><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#L166'>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#L166'>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#L166'>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>  <span class="SpecialChar">Hide_errors</span> = <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\n&quot;</span>
<span id="L194" class="LineNr">194 </span>      <span class="Constant">&quot;eb/jump  x/disp8\n&quot;</span>
<span id="L195" class="LineNr">195 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L196" class="LineNr">196 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L197" class="LineNr">197 </span>      <span class="Constant">&quot;  00 00 00 00\n&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'\n&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>  <span class="SpecialChar">Hide_errors</span> = <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\n&quot;</span>
<span id="L210" class="LineNr">210 </span>      <span class="Constant">&quot;e8/call  x/disp32\n&quot;</span>
<span id="L211" class="LineNr">211 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L212" class="LineNr">212 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L213" class="LineNr">213 </span>      <span class="Constant">&quot;  00 00 00 00\n&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'\n&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\n&quot;</span>
<span id="L225" class="LineNr">225 </span>      <span class="Constant">&quot;b9  x/imm32\n&quot;</span>
<span id="L226" class="LineNr">226 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L227" class="LineNr">227 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L228" class="LineNr">228 </span>      <span class="Constant">&quot;  y/imm32\n&quot;</span>
<span id="L229" class="LineNr">229 </span>      <span class="Constant">&quot;y:\n&quot;</span>
<span id="L230" class="LineNr">230 </span>      <span class="Constant">&quot;  00 00 00 00\n&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\n&quot;</span>
<span id="L235" class="LineNr">235 </span>      <span class="Constant">&quot;load: 0x00002001 -&gt; 20\n&quot;</span>
<span id="L236" class="LineNr">236 </span>      <span class="Constant">&quot;load: 0x00002002 -&gt; 00\n&quot;</span>
<span id="L237" class="LineNr">237 </span>      <span class="Constant">&quot;load: 0x00002003 -&gt; 00\n&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\n&quot;</span>
<span id="L245" class="LineNr">245 </span>      <span class="Constant">&quot;b9  x/imm32\n&quot;</span>
<span id="L246" class="LineNr">246 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L247" class="LineNr">247 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L248" class="LineNr">248 </span>      <span class="Constant">&quot;  1/imm32\n&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\n&quot;</span>
<span id="L253" class="LineNr">253 </span>      <span class="Constant">&quot;load: 0x00002001 -&gt; 00\n&quot;</span>
<span id="L254" class="LineNr">254 </span>      <span class="Constant">&quot;load: 0x00002002 -&gt; 00\n&quot;</span>
<span id="L255" class="LineNr">255 </span>      <span class="Constant">&quot;load: 0x00002003 -&gt; 00\n&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>  <span class="SpecialChar">Hide_errors</span> = <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\n&quot;</span>
<span id="L264" class="LineNr">264 </span>      <span class="Constant">&quot;40/increment-EAX\n&quot;</span>
<span id="L265" class="LineNr">265 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L266" class="LineNr">266 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L267" class="LineNr">267 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L268" class="LineNr">268 </span>      <span class="Constant">&quot;  00\n&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'\n&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\n&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\n&quot;</span>
<span id="L279" class="LineNr">279 </span>      <span class="Constant">&quot;== data 0x2000\n&quot;</span>
<span id="L280" class="LineNr">280 </span>      <span class="Constant">&quot;x:\n&quot;</span>
<span id="L281" class="LineNr">281 </span>      <span class="Constant">&quot;  00 00 00 00\n&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\n&quot;</span>
<span id="L289" class="LineNr">289 </span>      <span class="Constant">&quot;foo:\n&quot;</span>
<span id="L290" class="LineNr">290 </span>      <span class="Constant">&quot;  e8/call bar/disp32\n&quot;</span>
<span id="L291" class="LineNr">291 </span>      <span class="Constant">&quot;bar:\n&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#L166'>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#L166'>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 : -->