<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:46345457;
        mso-list-template-ids:-1464404202;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1
        {mso-list-id:719013375;
        mso-list-template-ids:-179504470;}
@list l2
        {mso-list-id:738792340;
        mso-list-template-ids:-1879136274;}
@list l3
        {mso-list-id:1399093728;
        mso-list-template-ids:-1343613556;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level2
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l4
        {mso-list-id:1414625374;
        mso-list-template-ids:375133576;}
@list l5
        {mso-list-id:1780486733;
        mso-list-template-ids:-1566788844;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:black">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">I would like to implement macro debug info support in LLVM.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Below you will find 4 parts:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l1 level1 lfo1;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">Background  on what does it mean to debug macros.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l1 level1 lfo1;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">A brief explanation on how to represent macro debug info in DWARF 4.0.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l1 level1 lfo1;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">The suggested design.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l1 level1 lfo1;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">4.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">A full example: Source -> AST -> LLVM IR -> DWARF.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Feel free to skip first two parts if you think you know the background.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Please, let me know if you have any comment or feedback on this approach.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Amjad<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="color:black">[Background]</span></b><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">There are two kind of macro definition:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">1. Simple macro definition, e.g.  #define M1 Value1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">2. Function macro definition, e.g. #define M2(x, y)  (x) + (y)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Macro scope starts with the "#define" directive and ends with "#undef" directive.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">GDB supports debugging macros. This means, it can evaluate the macro expression for all macros, which have a scope that interleaves with the current breakpoint.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">For example:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">GDB command: print M2(3, 5)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">GDB Result: 8 <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">GDB can evaluate the macro expression based on the ".debug_macroinfo" section (DWARF 4.0).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="color:black">[DWARF 4.0 ".debug_macroinfo" section]<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="color:black">In this section there are 4 kinds of entries<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l5 level1 lfo2;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">DW_MACROINFO_define<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l5 level1 lfo2;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">DW_MACROINFO_undef<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l5 level1 lfo2;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">DW_MACROINFO_start_file<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l5 level1 lfo2;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">4.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">DW_MACROINFO_end_file<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Note: There is a 5th kind of entry for vendor specific macro information, that we do not need to support.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">The first two entries contain information about the line number where the macro is defined/undefined, and a null terminated string, which contain the macro name (followed by the replacement value in case of a definition,
 or a list of parameters then the replacement value in case of function macro definition).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">The third entry contains information about the line where the file was included followed by the file id (an offset into the files table in the debug line section).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">The fourth entry contains nothing, and it just close the previous entry of third kind (start_file) .<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Macro definition and file including entries must appear at the same order as they appear in the source file. Where all macro entries between "start_file" and "end_file" entries represent macros appears directly/indirectly
 in the included file.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Special cases:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l4 level1 lfo3;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">The main source file should be the first "start_file" entry in the sequence, and should have line number "0".<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l4 level1 lfo3;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">Command line/Compiler definitions must also have line number "0" but must appear before the first "start_file" entry.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l4 level1 lfo3;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">Command line include files, must also have line number "0" but will appear straight after the "start_file" of the main source.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="color:black">[Design]<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="color:black">To support macros the following components need to be modified: Clang, LLVM IR, Dwarf Debug emitter.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">In clang, we need to handle these source directives:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l2 level1 lfo4;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">#define<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l2 level1 lfo4;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">#undef<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l2 level1 lfo4;vertical-align:middle">
<![if !supportLists]><span style="color:black"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">#include<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">The idea is to make a use of "PPCallbacks" class, which allows preprocessor to notify the parser each time one of the above directives occurs.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">These are the callbacks that should be implemented:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">"MacroDefined", "MacroUndefined", "FileChanged", and "InclusionDirective".<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">AST will be extended to support two new DECL types: "MacroDecl" and "FileIncludeDecl".<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Where "FileIncludeDecl" AST might contain other "FileIncludeDecl"/"MacroDecl" ASTs.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">These two new AST DECLs are not part of TranslationUnitDecl and are handled separately (see AST example below).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">In the LLVM IR, metadata debug info will be extended to support new DIs as well:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">"DIMacro", "DIFileInclude", and "MacroNode".<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">The last, is needed as we cannot use DINode as a base class of "DIMacro" and DIFileInclude" nodes.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DIMacro will contain:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l0 level1 lfo5;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">type (definition/undefinition).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l0 level1 lfo5;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">line number (interger).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l0 level1 lfo5;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">name (null terminated string).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l0 level1 lfo5;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">replacement value  (null terminated string - optional).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DIFileMacro will contain:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l3 level1 lfo6;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">line number (interger).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l3 level1 lfo6;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">file (DIFile).<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:27.0pt;text-indent:-.25in;mso-list:l3 level1 lfo6;vertical-align:middle">
<![if !supportLists]><span style="font-size:10.0pt;font-family:Symbol;color:black"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]><span dir="LTR"></span><span style="color:black">macro list (MacroNodeArray) - optional.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">In addition, the DICompileUnit will contain a new optional field of macro list of type (MacroNodeArray).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Finally, I assume that macro support should be disabled by default, and there should be a flag to enable this feature. I would say that we should introduce a new specific flag, e.g. "-gmacro", that could be used
 with "-g". <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="color:black">[Example]<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="color:black">Here is an example that demonstrate the macro support from Source->AST->LLVM IR->DWARF.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Source<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">mainfile.c:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">1. #define M1 Value1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">2. #include "myfile.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">3. #define M2( x , y)   ( (x)    + (y)  * Value2)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">myfile.h:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">1.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">2.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">3.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">4. #undef M1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">5. #define M1 NewValue1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">myfile2.h:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">1. #define M4 Value4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Command line:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">clang -c -g -gmacro -O0 -DM3=Value3 -include myfile2.h mainfile.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">AST<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">MacroDecl 0xd6c5c0 <<invalid sloc>> <invalid sloc> __llvm__ defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">MacroDecl 0xd6c618 <<invalid sloc>> <invalid sloc> __clang__ defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">… <More compiler macros> …<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">MacroDecl 0x11c01b0 <<invalid sloc>> <invalid sloc> M3 defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">FileIncludeDecl 0x11c0208 <mainfile.c:1:1> col:1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-FileIncludeDecl 0x11c0238 <myfile2.h:1:1> col:1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">| `-MacroDecl 0x11c0268 <<invalid sloc>> <invalid sloc> M4 defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-MacroDecl 0x11c02c0 <mainfile.c:1:9> col:9 M1 defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-FileIncludeDecl 0x11c0318 <myfile.h:1:1> col:1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">| |-MacroDecl 0x11c0348 <line:4:8> col:8 M1 undefined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">| `-MacroDecl 0x11c03a0 <line:5:9> col:9 M1 defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">`-MacroDecl 0x11c03f8 <mainfile.c:3:9> col:9 M2 defined<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">TranslationUnitDecl 0xd6c078 <<invalid sloc>> <invalid sloc><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-TypedefDecl 0xd6c330 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-TypedefDecl 0xd6c370 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">|-TypedefDecl 0xd6c3c8 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">`-TypedefDecl 0xd6c590 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">LLVM IR<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">target triple = "x86_64-pc-linux"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!llvm.dbg.cu = !{!0}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!llvm.module.flags = !{!327}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!llvm.ident = !{!328}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.8.0 (trunk 251321)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, macros: !3)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!1 = !DIFile(filename: "mainfile.c", directory: "/")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!2 = !{}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!3 = !{!4, !5, … <More compiler macros> … , !312, !313}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!4 = !DIMacro(macro type: DW_MACINFO_define, name: "__llvm__", value: !"1")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!5 = !DIMacro(macro type: DW_MACINFO_define, name: "__clang__", value: !"1")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">… <More compiler macros> …<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!312 = !DIMacro(macro type: DW_MACINFO_define, name: "M3", value: !"Value3")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!313 = !DIFileInclude(file: !314, nodes: !315)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!314 = !DIFile(filename: "mainfile.c", directory: "/")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!315 = !{!316, !320, !321, !326}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!316 = !DIFileInclude(file: !317, nodes: !318)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!317 = !DIFile(filename: "myfile2.h", directory: "/")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!318 = !{!319}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!319 = !DIMacro(macro type: DW_MACINFO_define, name: "M4", value: !"Value4")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!320 = !DIMacro(macro type: DW_MACINFO_define, name: "M1", line: 1, value: !"Value1")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!321 = !DIFileInclude(line: 2, file: !322, nodes: !323)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!322 = !DIFile(filename: "myfile.h", directory: "/")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!323 = !{!324, !325}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!324 = !DIMacro(macro type: DW_MACINFO_undef, name: "M1", line: 4)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!325 = !DIMacro(macro type: DW_MACINFO_define, name: "M1", line: 5, value: !"NewValue1")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!326 = !DIMacro(macro type: DW_MACINFO_define, name: "M2(x,y)", line: 3, value: !"( (x) + (y) * Value2)")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!327 = !{i32 2, !"Debug Info Version", i32 3}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">!328 = !{!"clang version 3.8.0 (trunk 251321)"}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DWARF<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Command line: llvm-dwarfdump.exe -debug-dump=macro mainfile.o<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">mainfile3.o:  file format ELF64-x86-64<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">.debug_macinfo contents:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DW_MACINFO_define - lineno: 0 macro: __llvm__ 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DW_MACINFO_define - lineno: 0 macro: __clang__ 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">… <More compiler macros> …<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DW_MACINFO_define - lineno: 0 macro: M3 Value3<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DW_MACINFO_start_file - lineno: 0 filenum: 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_start_file - lineno: 0 filenum: 2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">    DW_MACINFO_define - lineno: 0 macro: M4 Value4<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_end_file<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_define - lineno: 1 macro: M1 Value1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_start_file - lineno: 2 filenum: 3<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">    DW_MACINFO_undef - lineno: 4 macro: M1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">    DW_MACINFO_define - lineno: 5 macro: M1 NewValue1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_end_file<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">  DW_MACINFO_define - lineno: 3 macro: M2(x,y) ( (x) + (y) * Value2)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">DW_MACINFO_end_file<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">Command line: llvm-dwarfdump.exe -debug-dump=line mainfile.o<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">--------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">.debug_line contents:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">… <Other line table Info> …<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">                Dir  Mod Time   File Len   File Name<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">                ---- ---------- ---------- ---------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">file_names[  1]    1 0x00000000 0x00000000 mainfile.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">file_names[  2]    1 0x00000000 0x00000000 myfile2.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">file_names[  3]    1 0x00000000 0x00000000 myfile.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black">=========================================================<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>