1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821
|
<!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>Source Level Debugging with LLVM</title>
<link rel="stylesheet" href="llvm.css" type="text/css">
</head>
<body>
<h1>Source Level Debugging with LLVM</h1>
<table class="layout" style="width:100%">
<tr class="layout">
<td class="left">
<ul>
<li><a href="#introduction">Introduction</a>
<ol>
<li><a href="#phil">Philosophy behind LLVM debugging information</a></li>
<li><a href="#consumers">Debug information consumers</a></li>
<li><a href="#debugopt">Debugging optimized code</a></li>
</ol></li>
<li><a href="#format">Debugging information format</a>
<ol>
<li><a href="#debug_info_descriptors">Debug information descriptors</a>
<ul>
<li><a href="#format_compile_units">Compile unit descriptors</a></li>
<li><a href="#format_files">File descriptors</a></li>
<li><a href="#format_global_variables">Global variable descriptors</a></li>
<li><a href="#format_subprograms">Subprogram descriptors</a></li>
<li><a href="#format_blocks">Block descriptors</a></li>
<li><a href="#format_basic_type">Basic type descriptors</a></li>
<li><a href="#format_derived_type">Derived type descriptors</a></li>
<li><a href="#format_composite_type">Composite type descriptors</a></li>
<li><a href="#format_subrange">Subrange descriptors</a></li>
<li><a href="#format_enumeration">Enumerator descriptors</a></li>
<li><a href="#format_variables">Local variables</a></li>
</ul></li>
<li><a href="#format_common_intrinsics">Debugger intrinsic functions</a>
<ul>
<li><a href="#format_common_declare">llvm.dbg.declare</a></li>
<li><a href="#format_common_value">llvm.dbg.value</a></li>
</ul></li>
</ol></li>
<li><a href="#format_common_lifetime">Object lifetimes and scoping</a></li>
<li><a href="#ccxx_frontend">C/C++ front-end specific debug information</a>
<ol>
<li><a href="#ccxx_compile_units">C/C++ source file information</a></li>
<li><a href="#ccxx_global_variable">C/C++ global variable information</a></li>
<li><a href="#ccxx_subprogram">C/C++ function information</a></li>
<li><a href="#ccxx_basic_types">C/C++ basic types</a></li>
<li><a href="#ccxx_derived_types">C/C++ derived types</a></li>
<li><a href="#ccxx_composite_types">C/C++ struct/union types</a></li>
<li><a href="#ccxx_enumeration_types">C/C++ enumeration types</a></li>
</ol></li>
</ul>
</td>
<td class="right">
<img src="img/venusflytrap.jpg" alt="A leafy and green bug eater" width="247"
height="369">
</td>
</tr></table>
<div class="doc_author">
<p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>
and <a href="mailto:jlaskey@mac.com">Jim Laskey</a></p>
</div>
<!-- *********************************************************************** -->
<h2><a name="introduction">Introduction</a></h2>
<!-- *********************************************************************** -->
<div>
<p>This document is the central repository for all information pertaining to
debug information in LLVM. It describes the <a href="#format">actual format
that the LLVM debug information</a> takes, which is useful for those
interested in creating front-ends or dealing directly with the information.
Further, this document provides specific examples of what debug information
for C/C++ looks like.</p>
<!-- ======================================================================= -->
<h3>
<a name="phil">Philosophy behind LLVM debugging information</a>
</h3>
<div>
<p>The idea of the LLVM debugging information is to capture how the important
pieces of the source-language's Abstract Syntax Tree map onto LLVM code.
Several design aspects have shaped the solution that appears here. The
important ones are:</p>
<ul>
<li>Debugging information should have very little impact on the rest of the
compiler. No transformations, analyses, or code generators should need to
be modified because of debugging information.</li>
<li>LLVM optimizations should interact in <a href="#debugopt">well-defined and
easily described ways</a> with the debugging information.</li>
<li>Because LLVM is designed to support arbitrary programming languages,
LLVM-to-LLVM tools should not need to know anything about the semantics of
the source-level-language.</li>
<li>Source-level languages are often <b>widely</b> different from one another.
LLVM should not put any restrictions of the flavor of the source-language,
and the debugging information should work with any language.</li>
<li>With code generator support, it should be possible to use an LLVM compiler
to compile a program to native machine code and standard debugging
formats. This allows compatibility with traditional machine-code level
debuggers, like GDB or DBX.</li>
</ul>
<p>The approach used by the LLVM implementation is to use a small set
of <a href="#format_common_intrinsics">intrinsic functions</a> to define a
mapping between LLVM program objects and the source-level objects. The
description of the source-level program is maintained in LLVM metadata
in an <a href="#ccxx_frontend">implementation-defined format</a>
(the C/C++ front-end currently uses working draft 7 of
the <a href="http://www.eagercon.com/dwarf/dwarf3std.htm">DWARF 3
standard</a>).</p>
<p>When a program is being debugged, a debugger interacts with the user and
turns the stored debug information into source-language specific information.
As such, a debugger must be aware of the source-language, and is thus tied to
a specific language or family of languages.</p>
</div>
<!-- ======================================================================= -->
<h3>
<a name="consumers">Debug information consumers</a>
</h3>
<div>
<p>The role of debug information is to provide meta information normally
stripped away during the compilation process. This meta information provides
an LLVM user a relationship between generated code and the original program
source code.</p>
<p>Currently, debug information is consumed by DwarfDebug to produce dwarf
information used by the gdb debugger. Other targets could use the same
information to produce stabs or other debug forms.</p>
<p>It would also be reasonable to use debug information to feed profiling tools
for analysis of generated code, or, tools for reconstructing the original
source from generated code.</p>
<p>TODO - expound a bit more.</p>
</div>
<!-- ======================================================================= -->
<h3>
<a name="debugopt">Debugging optimized code</a>
</h3>
<div>
<p>An extremely high priority of LLVM debugging information is to make it
interact well with optimizations and analysis. In particular, the LLVM debug
information provides the following guarantees:</p>
<ul>
<li>LLVM debug information <b>always provides information to accurately read
the source-level state of the program</b>, regardless of which LLVM
optimizations have been run, and without any modification to the
optimizations themselves. However, some optimizations may impact the
ability to modify the current state of the program with a debugger, such
as setting program variables, or calling functions that have been
deleted.</li>
<li>As desired, LLVM optimizations can be upgraded to be aware of the LLVM
debugging information, allowing them to update the debugging information
as they perform aggressive optimizations. This means that, with effort,
the LLVM optimizers could optimize debug code just as well as non-debug
code.</li>
<li>LLVM debug information does not prevent optimizations from
happening (for example inlining, basic block reordering/merging/cleanup,
tail duplication, etc).</li>
<li>LLVM debug information is automatically optimized along with the rest of
the program, using existing facilities. For example, duplicate
information is automatically merged by the linker, and unused information
is automatically removed.</li>
</ul>
<p>Basically, the debug information allows you to compile a program with
"<tt>-O0 -g</tt>" and get full debug information, allowing you to arbitrarily
modify the program as it executes from a debugger. Compiling a program with
"<tt>-O3 -g</tt>" gives you full debug information that is always available
and accurate for reading (e.g., you get accurate stack traces despite tail
call elimination and inlining), but you might lose the ability to modify the
program and call functions where were optimized out of the program, or
inlined away completely.</p>
<p><a href="TestingGuide.html#quicktestsuite">LLVM test suite</a> provides a
framework to test optimizer's handling of debugging information. It can be
run like this:</p>
<div class="doc_code">
<pre>
% cd llvm/projects/test-suite/MultiSource/Benchmarks # or some other level
% make TEST=dbgopt
</pre>
</div>
<p>This will test impact of debugging information on optimization passes. If
debugging information influences optimization passes then it will be reported
as a failure. See <a href="TestingGuide.html">TestingGuide</a> for more
information on LLVM test infrastructure and how to run various tests.</p>
</div>
</div>
<!-- *********************************************************************** -->
<h2>
<a name="format">Debugging information format</a>
</h2>
<!-- *********************************************************************** -->
<div>
<p>LLVM debugging information has been carefully designed to make it possible
for the optimizer to optimize the program and debugging information without
necessarily having to know anything about debugging information. In
particular, the use of metadata avoids duplicated debugging information from
the beginning, and the global dead code elimination pass automatically
deletes debugging information for a function if it decides to delete the
function. </p>
<p>To do this, most of the debugging information (descriptors for types,
variables, functions, source files, etc) is inserted by the language
front-end in the form of LLVM metadata. </p>
<p>Debug information is designed to be agnostic about the target debugger and
debugging information representation (e.g. DWARF/Stabs/etc). It uses a
generic pass to decode the information that represents variables, types,
functions, namespaces, etc: this allows for arbitrary source-language
semantics and type-systems to be used, as long as there is a module
written for the target debugger to interpret the information. </p>
<p>To provide basic functionality, the LLVM debugger does have to make some
assumptions about the source-level language being debugged, though it keeps
these to a minimum. The only common features that the LLVM debugger assumes
exist are <a href="#format_files">source files</a>,
and <a href="#format_global_variables">program objects</a>. These abstract
objects are used by a debugger to form stack traces, show information about
local variables, etc.</p>
<p>This section of the documentation first describes the representation aspects
common to any source-language. The <a href="#ccxx_frontend">next section</a>
describes the data layout conventions used by the C and C++ front-ends.</p>
<!-- ======================================================================= -->
<h3>
<a name="debug_info_descriptors">Debug information descriptors</a>
</h3>
<div>
<p>In consideration of the complexity and volume of debug information, LLVM
provides a specification for well formed debug descriptors. </p>
<p>Consumers of LLVM debug information expect the descriptors for program
objects to start in a canonical format, but the descriptors can include
additional information appended at the end that is source-language
specific. All LLVM debugging information is versioned, allowing backwards
compatibility in the case that the core structures need to change in some
way. Also, all debugging information objects start with a tag to indicate
what type of object it is. The source-language is allowed to define its own
objects, by using unreserved tag numbers. We recommend using with tags in
the range 0x1000 through 0x2000 (there is a defined enum DW_TAG_user_base =
0x1000.)</p>
<p>The fields of debug descriptors used internally by LLVM
are restricted to only the simple data types <tt>i32</tt>, <tt>i1</tt>,
<tt>float</tt>, <tt>double</tt>, <tt>mdstring</tt> and <tt>mdnode</tt>. </p>
<div class="doc_code">
<pre>
!1 = metadata !{
i32, ;; A tag
...
}
</pre>
</div>
<p><a name="LLVMDebugVersion">The first field of a descriptor is always an
<tt>i32</tt> containing a tag value identifying the content of the
descriptor. The remaining fields are specific to the descriptor. The values
of tags are loosely bound to the tag values of DWARF information entries.
However, that does not restrict the use of the information supplied to DWARF
targets. To facilitate versioning of debug information, the tag is augmented
with the current debug version (LLVMDebugVersion = 8 << 16 or
0x80000 or 524288.)</a></p>
<p>The details of the various descriptors follow.</p>
<!-- ======================================================================= -->
<h4>
<a name="format_compile_units">Compile unit descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!0 = metadata !{
i32, ;; Tag = 17 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_compile_unit)
i32, ;; Unused field.
i32, ;; DWARF language identifier (ex. DW_LANG_C89)
metadata, ;; Source file name
metadata, ;; Source file directory (includes trailing slash)
metadata ;; Producer (ex. "4.0.1 LLVM (LLVM research group)")
i1, ;; True if this is a main compile unit.
i1, ;; True if this is optimized.
metadata, ;; Flags
i32 ;; Runtime version
metadata ;; List of enums types
metadata ;; List of retained types
metadata ;; List of subprograms
metadata ;; List of global variables
}
</pre>
</div>
<p>These descriptors contain a source language ID for the file (we use the DWARF
3.0 ID numbers, such as <tt>DW_LANG_C89</tt>, <tt>DW_LANG_C_plus_plus</tt>,
<tt>DW_LANG_Cobol74</tt>, etc), three strings describing the filename,
working directory of the compiler, and an identifier string for the compiler
that produced it.</p>
<p>Compile unit descriptors provide the root context for objects declared in a
specific compilation unit. File descriptors are defined using this context.
These descriptors are collected by a named metadata
<tt>!llvm.dbg.cu</tt>. Compile unit descriptor keeps track of subprograms,
global variables and type information.
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_files">File descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!0 = metadata !{
i32, ;; Tag = 41 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_file_type)
metadata, ;; Source file name
metadata, ;; Source file directory (includes trailing slash)
metadata ;; Unused
}
</pre>
</div>
<p>These descriptors contain information for a file. Global variables and top
level functions would be defined using this context.k File descriptors also
provide context for source line correspondence. </p>
<p>Each input file is encoded as a separate file descriptor in LLVM debugging
information output. </p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_global_variables">Global variable descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!1 = metadata !{
i32, ;; Tag = 52 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_variable)
i32, ;; Unused field.
metadata, ;; Reference to context descriptor
metadata, ;; Name
metadata, ;; Display name (fully qualified C++ name)
metadata, ;; MIPS linkage name (for C++)
metadata, ;; Reference to file where defined
i32, ;; Line number where defined
metadata, ;; Reference to type descriptor
i1, ;; True if the global is local to compile unit (static)
i1, ;; True if the global is defined in the compile unit (not extern)
{}* ;; Reference to the global variable
}
</pre>
</div>
<p>These descriptors provide debug information about globals variables. The
provide details such as name, type and where the variable is defined. All
global variables are collected by named metadata <tt>!llvm.dbg.gv</tt>.</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_subprograms">Subprogram descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32, ;; Tag = 46 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_subprogram)
i32, ;; Unused field.
metadata, ;; Reference to context descriptor
metadata, ;; Name
metadata, ;; Display name (fully qualified C++ name)
metadata, ;; MIPS linkage name (for C++)
metadata, ;; Reference to file where defined
i32, ;; Line number where defined
metadata, ;; Reference to type descriptor
i1, ;; True if the global is local to compile unit (static)
i1, ;; True if the global is defined in the compile unit (not extern)
i32, ;; Virtuality, e.g. dwarf::DW_VIRTUALITY__virtual
i32, ;; Index into a virtual function
metadata, ;; indicates which base type contains the vtable pointer for the
;; derived class
i1, ;; isArtificial
i1, ;; isOptimized
Function *,;; Pointer to LLVM function
metadata, ;; Lists function template parameters
metadata ;; Function declaration descriptor
metadata ;; List of function variables
}
</pre>
</div>
<p>These descriptors provide debug information about functions, methods and
subprograms. They provide details such as name, return types and the source
location where the subprogram is defined.
All subprogram descriptors are collected by a named metadata
<tt>!llvm.dbg.sp</tt>.
</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_blocks">Block descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!3 = metadata !{
i32, ;; Tag = 11 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a> (DW_TAG_lexical_block)
metadata,;; Reference to context descriptor
i32, ;; Line number
i32, ;; Column number
metadata,;; Reference to source file
i32 ;; Unique ID to identify blocks from a template function
}
</pre>
</div>
<p>This descriptor provides debug information about nested blocks within a
subprogram. The line number and column numbers are used to dinstinguish
two lexical blocks at same depth. </p>
<div class="doc_code">
<pre>
!3 = metadata !{
i32, ;; Tag = 11 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a> (DW_TAG_lexical_block)
metadata ;; Reference to the scope we're annotating with a file change
metadata,;; Reference to the file the scope is enclosed in.
}
</pre>
</div>
<p>This descriptor provides a wrapper around a lexical scope to handle file
changes in the middle of a lexical block.</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_basic_type">Basic type descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!4 = metadata !{
i32, ;; Tag = 36 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_base_type)
metadata, ;; Reference to context
metadata, ;; Name (may be "" for anonymous types)
metadata, ;; Reference to file where defined (may be NULL)
i32, ;; Line number where defined (may be 0)
i64, ;; Size in bits
i64, ;; Alignment in bits
i64, ;; Offset in bits
i32, ;; Flags
i32 ;; DWARF type encoding
}
</pre>
</div>
<p>These descriptors define primitive types used in the code. Example int, bool
and float. The context provides the scope of the type, which is usually the
top level. Since basic types are not usually user defined the context
and line number can be left as NULL and 0. The size, alignment and offset
are expressed in bits and can be 64 bit values. The alignment is used to
round the offset when embedded in a
<a href="#format_composite_type">composite type</a> (example to keep float
doubles on 64 bit boundaries.) The offset is the bit offset if embedded in
a <a href="#format_composite_type">composite type</a>.</p>
<p>The type encoding provides the details of the type. The values are typically
one of the following:</p>
<div class="doc_code">
<pre>
DW_ATE_address = 1
DW_ATE_boolean = 2
DW_ATE_float = 4
DW_ATE_signed = 5
DW_ATE_signed_char = 6
DW_ATE_unsigned = 7
DW_ATE_unsigned_char = 8
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_derived_type">Derived type descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!5 = metadata !{
i32, ;; Tag (see below)
metadata, ;; Reference to context
metadata, ;; Name (may be "" for anonymous types)
metadata, ;; Reference to file where defined (may be NULL)
i32, ;; Line number where defined (may be 0)
i64, ;; Size in bits
i64, ;; Alignment in bits
i64, ;; Offset in bits
metadata, ;; Reference to type derived from
metadata, ;; (optional) Name of the Objective C property assoicated with
;; Objective-C an ivar
metadata, ;; (optional) Name of the Objective C property getter selector.
metadata, ;; (optional) Name of the Objective C property setter selector.
i32 ;; (optional) Objective C property attributes.
}
</pre>
</div>
<p>These descriptors are used to define types derived from other types. The
value of the tag varies depending on the meaning. The following are possible
tag values:</p>
<div class="doc_code">
<pre>
DW_TAG_formal_parameter = 5
DW_TAG_member = 13
DW_TAG_pointer_type = 15
DW_TAG_reference_type = 16
DW_TAG_typedef = 22
DW_TAG_const_type = 38
DW_TAG_volatile_type = 53
DW_TAG_restrict_type = 55
</pre>
</div>
<p><tt>DW_TAG_member</tt> is used to define a member of
a <a href="#format_composite_type">composite type</a>
or <a href="#format_subprograms">subprogram</a>. The type of the member is
the <a href="#format_derived_type">derived
type</a>. <tt>DW_TAG_formal_parameter</tt> is used to define a member which
is a formal argument of a subprogram.</p>
<p><tt>DW_TAG_typedef</tt> is used to provide a name for the derived type.</p>
<p><tt>DW_TAG_pointer_type</tt>,<tt>DW_TAG_reference_type</tt>,
<tt>DW_TAG_const_type</tt>, <tt>DW_TAG_volatile_type</tt>
and <tt>DW_TAG_restrict_type</tt> are used to qualify
the <a href="#format_derived_type">derived type</a>. </p>
<p><a href="#format_derived_type">Derived type</a> location can be determined
from the context and line number. The size, alignment and offset are
expressed in bits and can be 64 bit values. The alignment is used to round
the offset when embedded in a <a href="#format_composite_type">composite
type</a> (example to keep float doubles on 64 bit boundaries.) The offset is
the bit offset if embedded in a <a href="#format_composite_type">composite
type</a>.</p>
<p>Note that the <tt>void *</tt> type is expressed as a type derived from NULL.
</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_composite_type">Composite type descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!6 = metadata !{
i32, ;; Tag (see below)
metadata, ;; Reference to context
metadata, ;; Name (may be "" for anonymous types)
metadata, ;; Reference to file where defined (may be NULL)
i32, ;; Line number where defined (may be 0)
i64, ;; Size in bits
i64, ;; Alignment in bits
i64, ;; Offset in bits
i32, ;; Flags
metadata, ;; Reference to type derived from
metadata, ;; Reference to array of member descriptors
i32 ;; Runtime languages
}
</pre>
</div>
<p>These descriptors are used to define types that are composed of 0 or more
elements. The value of the tag varies depending on the meaning. The following
are possible tag values:</p>
<div class="doc_code">
<pre>
DW_TAG_array_type = 1
DW_TAG_enumeration_type = 4
DW_TAG_structure_type = 19
DW_TAG_union_type = 23
DW_TAG_vector_type = 259
DW_TAG_subroutine_type = 21
DW_TAG_inheritance = 28
</pre>
</div>
<p>The vector flag indicates that an array type is a native packed vector.</p>
<p>The members of array types (tag = <tt>DW_TAG_array_type</tt>) or vector types
(tag = <tt>DW_TAG_vector_type</tt>) are <a href="#format_subrange">subrange
descriptors</a>, each representing the range of subscripts at that level of
indexing.</p>
<p>The members of enumeration types (tag = <tt>DW_TAG_enumeration_type</tt>) are
<a href="#format_enumeration">enumerator descriptors</a>, each representing
the definition of enumeration value for the set. All enumeration type
descriptors are collected by named metadata <tt>!llvm.dbg.enum</tt>.</p>
<p>The members of structure (tag = <tt>DW_TAG_structure_type</tt>) or union (tag
= <tt>DW_TAG_union_type</tt>) types are any one of
the <a href="#format_basic_type">basic</a>,
<a href="#format_derived_type">derived</a>
or <a href="#format_composite_type">composite</a> type descriptors, each
representing a field member of the structure or union.</p>
<p>For C++ classes (tag = <tt>DW_TAG_structure_type</tt>), member descriptors
provide information about base classes, static members and member
functions. If a member is a <a href="#format_derived_type">derived type
descriptor</a> and has a tag of <tt>DW_TAG_inheritance</tt>, then the type
represents a base class. If the member of is
a <a href="#format_global_variables">global variable descriptor</a> then it
represents a static member. And, if the member is
a <a href="#format_subprograms">subprogram descriptor</a> then it represents
a member function. For static members and member
functions, <tt>getName()</tt> returns the members link or the C++ mangled
name. <tt>getDisplayName()</tt> the simplied version of the name.</p>
<p>The first member of subroutine (tag = <tt>DW_TAG_subroutine_type</tt>) type
elements is the return type for the subroutine. The remaining elements are
the formal arguments to the subroutine.</p>
<p><a href="#format_composite_type">Composite type</a> location can be
determined from the context and line number. The size, alignment and
offset are expressed in bits and can be 64 bit values. The alignment is used
to round the offset when embedded in
a <a href="#format_composite_type">composite type</a> (as an example, to keep
float doubles on 64 bit boundaries.) The offset is the bit offset if embedded
in a <a href="#format_composite_type">composite type</a>.</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_subrange">Subrange descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!42 = metadata !{
i32, ;; Tag = 33 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a> (DW_TAG_subrange_type)
i64, ;; Low value
i64 ;; High value
}
</pre>
</div>
<p>These descriptors are used to define ranges of array subscripts for an array
<a href="#format_composite_type">composite type</a>. The low value defines
the lower bounds typically zero for C/C++. The high value is the upper
bounds. Values are 64 bit. High - low + 1 is the size of the array. If low
> high the array bounds are not included in generated debugging information.
</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_enumeration">Enumerator descriptors</a>
</h4>
<div>
<div class="doc_code">
<pre>
!6 = metadata !{
i32, ;; Tag = 40 + <a href="#LLVMDebugVersion">LLVMDebugVersion</a>
;; (DW_TAG_enumerator)
metadata, ;; Name
i64 ;; Value
}
</pre>
</div>
<p>These descriptors are used to define members of an
enumeration <a href="#format_composite_type">composite type</a>, it
associates the name to the value.</p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_variables">Local variables</a>
</h4>
<div>
<div class="doc_code">
<pre>
!7 = metadata !{
i32, ;; Tag (see below)
metadata, ;; Context
metadata, ;; Name
metadata, ;; Reference to file where defined
i32, ;; 24 bit - Line number where defined
;; 8 bit - Argument number. 1 indicates 1st argument.
metadata, ;; Type descriptor
i32, ;; flags
metadata ;; (optional) Reference to inline location
}
</pre>
</div>
<p>These descriptors are used to define variables local to a sub program. The
value of the tag depends on the usage of the variable:</p>
<div class="doc_code">
<pre>
DW_TAG_auto_variable = 256
DW_TAG_arg_variable = 257
DW_TAG_return_variable = 258
</pre>
</div>
<p>An auto variable is any variable declared in the body of the function. An
argument variable is any variable that appears as a formal argument to the
function. A return variable is used to track the result of a function and
has no source correspondent.</p>
<p>The context is either the subprogram or block where the variable is defined.
Name the source variable name. Context and line indicate where the
variable was defined. Type descriptor defines the declared type of the
variable.</p>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="format_common_intrinsics">Debugger intrinsic functions</a>
</h3>
<div>
<p>LLVM uses several intrinsic functions (name prefixed with "llvm.dbg") to
provide debug information at various points in generated code.</p>
<!-- ======================================================================= -->
<h4>
<a name="format_common_declare">llvm.dbg.declare</a>
</h4>
<div>
<pre>
void %<a href="#format_common_declare">llvm.dbg.declare</a>(metadata, metadata)
</pre>
<p>This intrinsic provides information about a local element (ex. variable.) The
first argument is metadata holding alloca for the variable. The
second argument is metadata containing description of the variable. </p>
</div>
<!-- ======================================================================= -->
<h4>
<a name="format_common_value">llvm.dbg.value</a>
</h4>
<div>
<pre>
void %<a href="#format_common_value">llvm.dbg.value</a>(metadata, i64, metadata)
</pre>
<p>This intrinsic provides information when a user source variable is set to a
new value. The first argument is the new value (wrapped as metadata). The
second argument is the offset in the user source variable where the new value
is written. The third argument is metadata containing description of the
user source variable. </p>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="format_common_lifetime">Object lifetimes and scoping</a>
</h3>
<div>
<p>In many languages, the local variables in functions can have their lifetimes
or scopes limited to a subset of a function. In the C family of languages,
for example, variables are only live (readable and writable) within the
source block that they are defined in. In functional languages, values are
only readable after they have been defined. Though this is a very obvious
concept, it is non-trivial to model in LLVM, because it has no notion of
scoping in this sense, and does not want to be tied to a language's scoping
rules.</p>
<p>In order to handle this, the LLVM debug format uses the metadata attached to
llvm instructions to encode line number and scoping information. Consider
the following C fragment, for example:</p>
<div class="doc_code">
<pre>
1. void foo() {
2. int X = 21;
3. int Y = 22;
4. {
5. int Z = 23;
6. Z = X;
7. }
8. X = Y;
9. }
</pre>
</div>
<p>Compiled to LLVM, this function would be represented like this:</p>
<div class="doc_code">
<pre>
define void @foo() nounwind ssp {
entry:
%X = alloca i32, align 4 ; <i32*> [#uses=4]
%Y = alloca i32, align 4 ; <i32*> [#uses=4]
%Z = alloca i32, align 4 ; <i32*> [#uses=3]
%0 = bitcast i32* %X to {}* ; <{}*> [#uses=1]
call void @llvm.dbg.declare(metadata !{i32 * %X}, metadata !0), !dbg !7
store i32 21, i32* %X, !dbg !8
%1 = bitcast i32* %Y to {}* ; <{}*> [#uses=1]
call void @llvm.dbg.declare(metadata !{i32 * %Y}, metadata !9), !dbg !10
store i32 22, i32* %Y, !dbg !11
%2 = bitcast i32* %Z to {}* ; <{}*> [#uses=1]
call void @llvm.dbg.declare(metadata !{i32 * %Z}, metadata !12), !dbg !14
store i32 23, i32* %Z, !dbg !15
%tmp = load i32* %X, !dbg !16 ; <i32> [#uses=1]
%tmp1 = load i32* %Y, !dbg !16 ; <i32> [#uses=1]
%add = add nsw i32 %tmp, %tmp1, !dbg !16 ; <i32> [#uses=1]
store i32 %add, i32* %Z, !dbg !16
%tmp2 = load i32* %Y, !dbg !17 ; <i32> [#uses=1]
store i32 %tmp2, i32* %X, !dbg !17
ret void, !dbg !18
}
declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
!0 = metadata !{i32 459008, metadata !1, metadata !"X",
metadata !3, i32 2, metadata !6}; [ DW_TAG_auto_variable ]
!1 = metadata !{i32 458763, metadata !2}; [DW_TAG_lexical_block ]
!2 = metadata !{i32 458798, i32 0, metadata !3, metadata !"foo", metadata !"foo",
metadata !"foo", metadata !3, i32 1, metadata !4,
i1 false, i1 true}; [DW_TAG_subprogram ]
!3 = metadata !{i32 458769, i32 0, i32 12, metadata !"foo.c",
metadata !"/private/tmp", metadata !"clang 1.1", i1 true,
i1 false, metadata !"", i32 0}; [DW_TAG_compile_unit ]
!4 = metadata !{i32 458773, metadata !3, metadata !"", null, i32 0, i64 0, i64 0,
i64 0, i32 0, null, metadata !5, i32 0}; [DW_TAG_subroutine_type ]
!5 = metadata !{null}
!6 = metadata !{i32 458788, metadata !3, metadata !"int", metadata !3, i32 0,
i64 32, i64 32, i64 0, i32 0, i32 5}; [DW_TAG_base_type ]
!7 = metadata !{i32 2, i32 7, metadata !1, null}
!8 = metadata !{i32 2, i32 3, metadata !1, null}
!9 = metadata !{i32 459008, metadata !1, metadata !"Y", metadata !3, i32 3,
metadata !6}; [ DW_TAG_auto_variable ]
!10 = metadata !{i32 3, i32 7, metadata !1, null}
!11 = metadata !{i32 3, i32 3, metadata !1, null}
!12 = metadata !{i32 459008, metadata !13, metadata !"Z", metadata !3, i32 5,
metadata !6}; [ DW_TAG_auto_variable ]
!13 = metadata !{i32 458763, metadata !1}; [DW_TAG_lexical_block ]
!14 = metadata !{i32 5, i32 9, metadata !13, null}
!15 = metadata !{i32 5, i32 5, metadata !13, null}
!16 = metadata !{i32 6, i32 5, metadata !13, null}
!17 = metadata !{i32 8, i32 3, metadata !1, null}
!18 = metadata !{i32 9, i32 1, metadata !2, null}
</pre>
</div>
<p>This example illustrates a few important details about LLVM debugging
information. In particular, it shows how the <tt>llvm.dbg.declare</tt>
intrinsic and location information, which are attached to an instruction,
are applied together to allow a debugger to analyze the relationship between
statements, variable definitions, and the code used to implement the
function.</p>
<div class="doc_code">
<pre>
call void @llvm.dbg.declare(metadata, metadata !0), !dbg !7
</pre>
</div>
<p>The first intrinsic
<tt>%<a href="#format_common_declare">llvm.dbg.declare</a></tt>
encodes debugging information for the variable <tt>X</tt>. The metadata
<tt>!dbg !7</tt> attached to the intrinsic provides scope information for the
variable <tt>X</tt>.</p>
<div class="doc_code">
<pre>
!7 = metadata !{i32 2, i32 7, metadata !1, null}
!1 = metadata !{i32 458763, metadata !2}; [DW_TAG_lexical_block ]
!2 = metadata !{i32 458798, i32 0, metadata !3, metadata !"foo",
metadata !"foo", metadata !"foo", metadata !3, i32 1,
metadata !4, i1 false, i1 true}; [DW_TAG_subprogram ]
</pre>
</div>
<p>Here <tt>!7</tt> is metadata providing location information. It has four
fields: line number, column number, scope, and original scope. The original
scope represents inline location if this instruction is inlined inside a
caller, and is null otherwise. In this example, scope is encoded by
<tt>!1</tt>. <tt>!1</tt> represents a lexical block inside the scope
<tt>!2</tt>, where <tt>!2</tt> is a
<a href="#format_subprograms">subprogram descriptor</a>. This way the
location information attached to the intrinsics indicates that the
variable <tt>X</tt> is declared at line number 2 at a function level scope in
function <tt>foo</tt>.</p>
<p>Now lets take another example.</p>
<div class="doc_code">
<pre>
call void @llvm.dbg.declare(metadata, metadata !12), !dbg !14
</pre>
</div>
<p>The second intrinsic
<tt>%<a href="#format_common_declare">llvm.dbg.declare</a></tt>
encodes debugging information for variable <tt>Z</tt>. The metadata
<tt>!dbg !14</tt> attached to the intrinsic provides scope information for
the variable <tt>Z</tt>.</p>
<div class="doc_code">
<pre>
!13 = metadata !{i32 458763, metadata !1}; [DW_TAG_lexical_block ]
!14 = metadata !{i32 5, i32 9, metadata !13, null}
</pre>
</div>
<p>Here <tt>!14</tt> indicates that <tt>Z</tt> is declared at line number 5 and
column number 9 inside of lexical scope <tt>!13</tt>. The lexical scope
itself resides inside of lexical scope <tt>!1</tt> described above.</p>
<p>The scope information attached with each instruction provides a
straightforward way to find instructions covered by a scope.</p>
</div>
</div>
<!-- *********************************************************************** -->
<h2>
<a name="ccxx_frontend">C/C++ front-end specific debug information</a>
</h2>
<!-- *********************************************************************** -->
<div>
<p>The C and C++ front-ends represent information about the program in a format
that is effectively identical
to <a href="http://www.eagercon.com/dwarf/dwarf3std.htm">DWARF 3.0</a> in
terms of information content. This allows code generators to trivially
support native debuggers by generating standard dwarf information, and
contains enough information for non-dwarf targets to translate it as
needed.</p>
<p>This section describes the forms used to represent C and C++ programs. Other
languages could pattern themselves after this (which itself is tuned to
representing programs in the same way that DWARF 3 does), or they could
choose to provide completely different forms if they don't fit into the DWARF
model. As support for debugging information gets added to the various LLVM
source-language front-ends, the information used should be documented
here.</p>
<p>The following sections provide examples of various C/C++ constructs and the
debug information that would best describe those constructs.</p>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_compile_units">C/C++ source file information</a>
</h3>
<div>
<p>Given the source files <tt>MySource.cpp</tt> and <tt>MyHeader.h</tt> located
in the directory <tt>/Users/mine/sources</tt>, the following code:</p>
<div class="doc_code">
<pre>
#include "MyHeader.h"
int main(int argc, char *argv[]) {
return 0;
}
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
...
;;
;; Define the compile unit for the main source file "/Users/mine/sources/MySource.cpp".
;;
!2 = metadata !{
i32 524305, ;; Tag
i32 0, ;; Unused
i32 4, ;; Language Id
metadata !"MySource.cpp",
metadata !"/Users/mine/sources",
metadata !"4.2.1 (Based on Apple Inc. build 5649) (LLVM build 00)",
i1 true, ;; Main Compile Unit
i1 false, ;; Optimized compile unit
metadata !"", ;; Compiler flags
i32 0} ;; Runtime version
;;
;; Define the file for the file "/Users/mine/sources/MySource.cpp".
;;
!1 = metadata !{
i32 524329, ;; Tag
metadata !"MySource.cpp",
metadata !"/Users/mine/sources",
metadata !2 ;; Compile unit
}
;;
;; Define the file for the file "/Users/mine/sources/Myheader.h"
;;
!3 = metadata !{
i32 524329, ;; Tag
metadata !"Myheader.h"
metadata !"/Users/mine/sources",
metadata !2 ;; Compile unit
}
...
</pre>
</div>
<p>llvm::Instruction provides easy access to metadata attached with an
instruction. One can extract line number information encoded in LLVM IR
using <tt>Instruction::getMetadata()</tt> and
<tt>DILocation::getLineNumber()</tt>.
<pre>
if (MDNode *N = I->getMetadata("dbg")) { // Here I is an LLVM instruction
DILocation Loc(N); // DILocation is in DebugInfo.h
unsigned Line = Loc.getLineNumber();
StringRef File = Loc.getFilename();
StringRef Dir = Loc.getDirectory();
}
</pre>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_global_variable">C/C++ global variable information</a>
</h3>
<div>
<p>Given an integer global variable declared as follows:</p>
<div class="doc_code">
<pre>
int MyGlobal = 100;
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
;;
;; Define the global itself.
;;
%MyGlobal = global int 100
...
;;
;; List of debug info of globals
;;
!llvm.dbg.gv = !{!0}
;;
;; Define the global variable descriptor. Note the reference to the global
;; variable anchor and the global variable itself.
;;
!0 = metadata !{
i32 524340, ;; Tag
i32 0, ;; Unused
metadata !1, ;; Context
metadata !"MyGlobal", ;; Name
metadata !"MyGlobal", ;; Display Name
metadata !"MyGlobal", ;; Linkage Name
metadata !3, ;; Compile Unit
i32 1, ;; Line Number
metadata !4, ;; Type
i1 false, ;; Is a local variable
i1 true, ;; Is this a definition
i32* @MyGlobal ;; The global variable
}
;;
;; Define the basic type of 32 bit signed integer. Note that since int is an
;; intrinsic type the source file is NULL and line 0.
;;
!4 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"int", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in Bits
i64 32, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 5 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_subprogram">C/C++ function information</a>
</h3>
<div>
<p>Given a function declared as follows:</p>
<div class="doc_code">
<pre>
int main(int argc, char *argv[]) {
return 0;
}
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
;;
;; Define the anchor for subprograms. Note that the second field of the
;; anchor is 46, which is the same as the tag for subprograms
;; (46 = DW_TAG_subprogram.)
;;
!6 = metadata !{
i32 524334, ;; Tag
i32 0, ;; Unused
metadata !1, ;; Context
metadata !"main", ;; Name
metadata !"main", ;; Display name
metadata !"main", ;; Linkage name
metadata !1, ;; File
i32 1, ;; Line number
metadata !4, ;; Type
i1 false, ;; Is local
i1 true, ;; Is definition
i32 0, ;; Virtuality attribute, e.g. pure virtual function
i32 0, ;; Index into virtual table for C++ methods
i32 0, ;; Type that holds virtual table.
i32 0, ;; Flags
i1 false, ;; True if this function is optimized
Function *, ;; Pointer to llvm::Function
null ;; Function template parameters
}
;;
;; Define the subprogram itself.
;;
define i32 @main(i32 %argc, i8** %argv) {
...
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_basic_types">C/C++ basic types</a>
</h3>
<div>
<p>The following are the basic type descriptors for C/C++ core types:</p>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_type_bool">bool</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"bool", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 8, ;; Size in Bits
i64 8, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 2 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_char">char</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"char", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 8, ;; Size in Bits
i64 8, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 6 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_unsigned_char">unsigned char</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"unsigned char",
metadata !1, ;; File
i32 0, ;; Line number
i64 8, ;; Size in Bits
i64 8, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 8 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_short">short</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"short int",
metadata !1, ;; File
i32 0, ;; Line number
i64 16, ;; Size in Bits
i64 16, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 5 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_unsigned_short">unsigned short</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"short unsigned int",
metadata !1, ;; File
i32 0, ;; Line number
i64 16, ;; Size in Bits
i64 16, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 7 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_int">int</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"int", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in Bits
i64 32, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 5 ;; Encoding
}
</pre></div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_unsigned_int">unsigned int</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"unsigned int",
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in Bits
i64 32, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 7 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_long_long">long long</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"long long int",
metadata !1, ;; File
i32 0, ;; Line number
i64 64, ;; Size in Bits
i64 64, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 5 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_unsigned_long_long">unsigned long long</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"long long unsigned int",
metadata !1, ;; File
i32 0, ;; Line number
i64 64, ;; Size in Bits
i64 64, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 7 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_float">float</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"float",
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in Bits
i64 32, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 4 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h4>
<a name="ccxx_basic_double">double</a>
</h4>
<div>
<div class="doc_code">
<pre>
!2 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"double",;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 64, ;; Size in Bits
i64 64, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 4 ;; Encoding
}
</pre>
</div>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_derived_types">C/C++ derived types</a>
</h3>
<div>
<p>Given the following as an example of C/C++ derived type:</p>
<div class="doc_code">
<pre>
typedef const int *IntPtr;
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
;;
;; Define the typedef "IntPtr".
;;
!2 = metadata !{
i32 524310, ;; Tag
metadata !1, ;; Context
metadata !"IntPtr", ;; Name
metadata !3, ;; File
i32 0, ;; Line number
i64 0, ;; Size in bits
i64 0, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
metadata !4 ;; Derived From type
}
;;
;; Define the pointer type.
;;
!4 = metadata !{
i32 524303, ;; Tag
metadata !1, ;; Context
metadata !"", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 64, ;; Size in bits
i64 64, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
metadata !5 ;; Derived From type
}
;;
;; Define the const type.
;;
!5 = metadata !{
i32 524326, ;; Tag
metadata !1, ;; Context
metadata !"", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
metadata !6 ;; Derived From type
}
;;
;; Define the int type.
;;
!6 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"int", ;; Name
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
5 ;; Encoding
}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_composite_types">C/C++ struct/union types</a>
</h3>
<div>
<p>Given the following as an example of C/C++ struct type:</p>
<div class="doc_code">
<pre>
struct Color {
unsigned Red;
unsigned Green;
unsigned Blue;
};
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
;;
;; Define basic type for unsigned int.
;;
!5 = metadata !{
i32 524324, ;; Tag
metadata !1, ;; Context
metadata !"unsigned int",
metadata !1, ;; File
i32 0, ;; Line number
i64 32, ;; Size in Bits
i64 32, ;; Align in Bits
i64 0, ;; Offset in Bits
i32 0, ;; Flags
i32 7 ;; Encoding
}
;;
;; Define composite type for struct Color.
;;
!2 = metadata !{
i32 524307, ;; Tag
metadata !1, ;; Context
metadata !"Color", ;; Name
metadata !1, ;; Compile unit
i32 1, ;; Line number
i64 96, ;; Size in bits
i64 32, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
null, ;; Derived From
metadata !3, ;; Elements
i32 0 ;; Runtime Language
}
;;
;; Define the Red field.
;;
!4 = metadata !{
i32 524301, ;; Tag
metadata !1, ;; Context
metadata !"Red", ;; Name
metadata !1, ;; File
i32 2, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
metadata !5 ;; Derived From type
}
;;
;; Define the Green field.
;;
!6 = metadata !{
i32 524301, ;; Tag
metadata !1, ;; Context
metadata !"Green", ;; Name
metadata !1, ;; File
i32 3, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 32, ;; Offset in bits
i32 0, ;; Flags
metadata !5 ;; Derived From type
}
;;
;; Define the Blue field.
;;
!7 = metadata !{
i32 524301, ;; Tag
metadata !1, ;; Context
metadata !"Blue", ;; Name
metadata !1, ;; File
i32 4, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 64, ;; Offset in bits
i32 0, ;; Flags
metadata !5 ;; Derived From type
}
;;
;; Define the array of fields used by the composite type Color.
;;
!3 = metadata !{metadata !4, metadata !6, metadata !7}
</pre>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="ccxx_enumeration_types">C/C++ enumeration types</a>
</h3>
<div>
<p>Given the following as an example of C/C++ enumeration type:</p>
<div class="doc_code">
<pre>
enum Trees {
Spruce = 100,
Oak = 200,
Maple = 300
};
</pre>
</div>
<p>a C/C++ front-end would generate the following descriptors:</p>
<div class="doc_code">
<pre>
;;
;; Define composite type for enum Trees
;;
!2 = metadata !{
i32 524292, ;; Tag
metadata !1, ;; Context
metadata !"Trees", ;; Name
metadata !1, ;; File
i32 1, ;; Line number
i64 32, ;; Size in bits
i64 32, ;; Align in bits
i64 0, ;; Offset in bits
i32 0, ;; Flags
null, ;; Derived From type
metadata !3, ;; Elements
i32 0 ;; Runtime language
}
;;
;; Define the array of enumerators used by composite type Trees.
;;
!3 = metadata !{metadata !4, metadata !5, metadata !6}
;;
;; Define Spruce enumerator.
;;
!4 = metadata !{i32 524328, metadata !"Spruce", i64 100}
;;
;; Define Oak enumerator.
;;
!5 = metadata !{i32 524328, metadata !"Oak", i64 200}
;;
;; Define Maple enumerator.
;;
!6 = metadata !{i32 524328, metadata !"Maple", i64 300}
</pre>
</div>
</div>
</div>
<!-- *********************************************************************** -->
<hr>
<address>
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img
src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
<a href="http://validator.w3.org/check/referer"><img
src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
<a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
<a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br>
Last modified: $Date: 2011-10-11 15:59:11 -0700 (Tue, 11 Oct 2011) $
</address>
</body>
</html>
|