Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

EDG Module Map

This page is the definitive reference table mapping all 52 .c modules and 13 .h header modules of EDG 6.6 to their binary addresses in the cudafe++ CUDA 13.0 build. Each module is identified by the trailing .c/.h filename of the assertion path-string its functions load. Every column is derived from the .rodata string cross-reference database and verified against the 20 sweep reports (P1.01 through P1.20).

For narrative discussion of these modules and their roles in the compilation pipeline, see the Function Map and EDG Overview pages.

Module Identifiers

Every assertion path-string shares a common prefix ending in EDG_6.6 and terminates in a .c/.h filename. Only that trailing filename is meaningful to this analysis; it is used as the stable identifier for the module a function belongs to.

Coverage Summary

MetricCount
.c modules with mapped functions52
.h modules with mapped functions13
Total modules65
Functions mapped via .c strings2,129
Functions mapped via .h strings only80
Total mapped functions2,209
Unmapped functions in EDG region (0x403300--0x7E0000)~2,914
C++ runtime / demangler (0x7E0000--0x829722)~1,085
PLT stubs + init (0x402A18--0x403300)~283
Total functions in binary~6,501
Mapping coverage34.0%

The 34% mapping rate reflects the fact that only functions containing EDG internal_error assertions reference __FILE__ strings. Functions below the assertion threshold, display-only code compiled without assertions, inlined leaf functions, and the statically-linked C++ runtime are all invisible to this technique.

Column Definitions

ColumnMeaning
#Row number, ordered by main body start address
ModuleModule identifier (trailing .c/.h filename of the assertion path-string)
OriginEDG = standard Edison Design Group code; NVIDIA = NVIDIA-authored
Total FuncsUnique functions referencing this file's __FILE__ string (stubs + main)
StubsAssert wrapper functions in 0x403300--0x408B40
Main FuncsFunctions in the main body region (after 0x409350)
Main Body StartLowest xref address outside the stub region
Main Body EndHighest xref address outside the stub region
Code SizeMain Body End - Main Body Start in bytes; approximate (includes interleaved .h inlines and alignment padding)

Module Table — 52 .c Modules

Sorted by main body start address. This ordering reflects the binary layout, which is near-alphabetical with two exceptions noted below.

#ModuleOriginTotal FuncsStubsMain FuncsMain Body StartMain Body EndCode Size
1attribute.cEDG17771700x4093500x418F8064,560
2class_decl.cEDG27392640x4192800x447930190,160
3cmd_line.cEDG441430x44B2500x45963058,336
4const_ints.cEDG4130x461C200x4659A015,744
5cp_gen_be.cEDG226252010x466F900x489000139,376
6debug.cEDG2020x48A1B00x48A1B0<1 KB
7decl_inits.cEDG19641920x48B3F00x4A154090,448
8decl_spec.cEDG883850x4A1BF00x4B37F072,704
9declarator.cEDG640640x4B39700x4C00A050,480
10decls.cEDG20752020x4C09100x4E8C40164,656
11disambig.cEDG5140x4E9E700x4EC69010,272
12error.cEDG511500x4EDCD00x4F8F8045,744
13expr.cEDG538105280x4F98700x5565E0380,528
14exprutil.cEDG299132860x5587200x583540175,648
15extasm.cEDG7070x584CA00x5858502,992
16fe_init.cEDG6150x585B100x5863A02,192
17fe_wrapup.cEDG2020x588D400x588F90592
18float_pt.cEDG790790x5895500x59415044,032
19folding.cEDG13991300x594B300x5A4FD066,464
20func_def.cEDG561550x5A51B00x5AAB8022,992
21host_envir.cEDG192170x5AD5400x5B1E7018,736
22il.cEDG358163420x5B28F00x5DFAD0184,800
23il_alloc.cEDG381370x5E06000x5E830031,488
24il_to_str.cEDG831820x5F7FD00x6039E047,632
25il_walk.cEDG271260x603FE00x620190115,120
26interpret.cEDG21652110x620CE00x65DE10250,160
27layout.cEDG212190x65EA500x665A6028,688
28lexical.cEDG14051350x6667200x689130141,328
29literals.cEDG210210x68ACC00x68F2B017,904
30lookup.cEDG712690x68FAB00x69BE8050,128
31lower_name.cEDG179111680x69C9800x6AB28059,648
32macro.cEDG431420x6AB6E00x6B5C1042,288
33mem_manage.cEDG9270x6B6DD00x6BA23013,408
34nv_transforms.cNVIDIA1010x6BE3000x6BE300~22 KB1
35overload.cEDG28432810x6BE4A00x6EF7A0201,472
36pch.cEDG233200x6F27900x6F5DA013,840
37pragma.cEDG280280x6F61B00x6F83208,560
38preproc.cEDG100100x6F9B000x6FC94011,840
39scope_stk.cEDG18661800x6FE1600x7106B075,600
40src_seq.cEDG571560x710F100x71872030,736
41statements.cEDG831820x7193000x726A5055,120
42symbol_ref.cEDG422400x726F200x72CEA024,448
43symbol_tbl.cEDG17581670x72D9500x74B8D0122,688
44sys_predef.cEDG351340x74C6900x75147019,936
45target.cEDG110110x7525F00x752DF02,048
46templates.cEDG455124430x7530C00x794D30285,808
47trans_copy.cEDG2020x796BA00x796BA0<1 KB
48trans_corresp.cEDG886820x796E600x7A342050,112
49trans_unit.cEDG100100x7A3BB00x7A46902,784
50types.cEDG885830x7A49400x7C02A0112,480
51modules.cEDG223190x7C0C600x7C25606,400
52floating.cEDG509410x7D0EB00x7D59B019,200
TOTALS5,3382005,1380x4093500x7D59B0~3.57 MB

Module Table — 13 .h Header Modules

Header modules appear in assertion strings when an inline function or macro defined in the header triggers an internal_error call. The function itself is compiled within the .c module's translation unit, but __FILE__ resolves to the header's filename. These functions are scattered across the binary, interleaved with the .c module that #include-d them.

#Header ModuleTotal FuncsStubsMain FuncsMin AddressMax AddressPrimary Host
1decls.h1010x4E08F00x4E08F0decls.c
2float_type.h630630x7D1C900x7DEB90floating.c
3il.h5230x52ABC00x6011F0expr.c, il.c, il_to_str.c
4lexical.h1010x68F2B00x68F2B0lexical.c / literals.c boundary
5mem_manage.h4040x4EDCD00x4EDCD0error.c
6modules.h5050x7C11000x7C2560modules.c
7nv_transforms.h3030x4322800x719D20class_decl.c, cp_gen_be.c, src_seq.c
8overload.h1010x6C9E400x6C9E40overload.c
9scope_stk.h4040x503D900x574DD0expr.c, exprutil.c
10symbol_tbl.h2110x7377D00x7377D0symbol_tbl.c
11types.h174130x4692600x7B05E0Many .c files (scattered type queries)
12util.h124101140x430E100x7C2B10All major .c files
13walk_entry.h510510x6041700x618660il_walk.c
TOTALS28117264

The stub column sums to 217 across the two tables (200 from .c modules + 17 from .h modules). The 198 figure quoted in the narrative counts distinct stub functions referencing any module string — each stub references exactly one module, but 19 stub functions are the target of multiple cross-references (the same stub is reused at multiple assertion call sites that all encode the same location), inflating column sums above the unique-stub count.

Header Distribution Patterns

The 13 headers fall into three distinct patterns:

Localized headers — functions cluster in a single .c module's address range:

  • float_type.h (63 funcs in 52 KB at 0x7D1C90--0x7DEB90, all within floating.c)
  • walk_entry.h (51 funcs in 90 KB at 0x604170--0x618660, all within il_walk.c)
  • modules.h (5 funcs in 5 KB at 0x7C1100--0x7C2560, all within modules.c)
  • decls.h, lexical.h, overload.h, symbol_tbl.h (1–2 funcs each, single site)
  • mem_manage.h (4 funcs, single site in error.c)

Moderately scattered headers — functions appear in 2–3 .c modules:

  • il.h (5 funcs across expr.c, il.c, il_to_str.c)
  • scope_stk.h (4 funcs across expr.c, exprutil.c)
  • nv_transforms.h (3 funcs across class_decl.c, cp_gen_be.c, src_seq.c)

Pervasive headers — functions inlined into most .c modules:

  • util.h (124 xrefs spanning 0x430E10--0x7C2B10, nearly the entire EDG region)
  • types.h (17 funcs spanning 0x469260--0x7B05E0, scattered type queries)

Assert Stub Region

The region 0x403300--0x408B40 contains 235 small __noreturn functions. Each encodes a single assertion site: the assertion path-string, line number, and enclosing function name. When the assertion condition fails, the stub calls sub_4F2930 (EDG's internal_error handler) and does not return. Every stub is 29 bytes.

Of the 235 stubs, 198 carry a resolvable module string (181 to .c modules, 17 to .h modules); the remaining 37 are unattributed — their __FILE__ argument is either folded into a shared string or supplied by the caller, and they do not appear as targets in the per-module cross-reference table below.

Stub Distribution by Module

ModuleStub CountModuleStub Count
cp_gen_be.c25macro.c1
il.c16mem_manage.c2
exprutil.c13modules.c3
templates.c12overload.c3
lower_name.c11pch.c3
expr.c10preproc.c0
class_decl.c9scope_stk.c6
folding.c9src_seq.c1
floating.c9statements.c1
attribute.c7symbol_ref.c2
symbol_tbl.c8symbol_tbl.h1
trans_corresp.c6sys_predef.c1
lexical.c5target.c0
decls.c5trans_copy.c0
types.c5trans_unit.c0
decl_inits.c4types.h4
interpret.c3util.h10
decl_spec.c3il.h2
host_envir.c2debug.c0
layout.c2extasm.c0
lookup.c2fe_wrapup.c0
cmd_line.c1float_pt.c0
const_ints.c1declarator.c0
disambig.c1pragma.c0
error.c1nv_transforms.c0
fe_init.c1literals.c0
func_def.c1
il_alloc.c1
il_to_str.c1
il_walk.c1

After the stubs, addresses 0x408B40--0x409350 contain 15 C++ static constructor functions (ctor_001 through ctor_015) that initialize global tables at program startup. These have no module attribution.

Gap Analysis — Unmapped Regions

The following address ranges within the EDG .text region contain functions that could not be mapped to any module via __FILE__ strings. Each gap represents functions that either lack assertions entirely, use non-EDG assertion macros, or are compiler-generated (vtable thunks, exception handlers, template instantiation artifacts).

#Gap RangeSizeBetweenProbable Content
10x408B40--0x4093502 KBstubs / attribute.cStatic constructors (ctor_001--ctor_015)
20x447930--0x44B25013 KBclass_decl.c / cmd_line.cBoundary helpers, small inlines
30x459630--0x461C2034 KBcmd_line.c / const_ints.cUnmapped option handlers, flag tables
40x4659A0--0x466F906 KBconst_ints.c / cp_gen_be.cConstant integer helpers
50x489000--0x48A1B05 KBcp_gen_be.c / debug.cBackend emission tail
60x48A1B0--0x48B3F05 KBdebug.c / decl_inits.cDebug infrastructure
70x5E8300--0x5F7FD087 KBil_alloc.c / il_to_str.cIL display routines (no assertions)
80x620190--0x620CE03 KBil_walk.c / interpret.cWalk epilogue
90x65DE10--0x65EA503 KBinterpret.c / layout.cInterpreter tail
100x665A60--0x6667203 KBlayout.c / lexical.cLayout/lexer boundary
110x689130--0x68ACC07 KBlexical.c / literals.cToken conversion helpers
120x6AB280--0x6AB6E01 KBlower_name.c / macro.cMangling helpers
130x6BA230--0x6BAE703 KBmem_manage.c / nv_transforms.cMemory infrastructure
140x6EF7A0--0x6F279012 KBoverload.c / pch.cOverload resolution tail
150x6FC940--0x6FE1606 KBpreproc.c / scope_stk.cPreprocessor tail functions
160x751470--0x7525F07 KBsys_predef.c / target.cPredefined macro infrastructure
170x7A4690--0x7A49401 KBtrans_unit.c / types.cTU helpers
180x7C2560--0x7D0EB059 KBmodules.c / floating.cType-name encoding, module helpers
190x7D59B0--0x7DEB9037 KBfloating.c tailfloat_type.h template instantiations
200x7DFFF0--0x82A000304 KBpost-EDGC++ runtime, demangler, soft-float, EH
Total unmapped~582 KB

The largest unmapped gap within EDG code proper is the IL display region at 0x5E8300--0x5F7FD0 (87 KB). These functions were compiled from il_to_str.c but contain no assertions because the display/dump subsystem was built without assertion macros — it is purely diagnostic code that formats IL trees to stdout.

Alphabetical Layout Observation

Modules are laid out in the binary in near-alphabetical order by name, a consequence of the build system compiling object files in directory-listing order and the linker processing them sequentially. The sequence is strictly alphabetical from attribute.c through types.c (rows 1–50).

Two modules break this pattern:

ModuleExpected PositionActual PositionOffset
modules.cBetween mem_manage.c and nv_transforms.c (#33--#34)After types.c (#51, at 0x7C0C60)+47 rows late
floating.cBetween float_pt.c and folding.c (#18--#19)After modules.c (#52, at 0x7D0EB0)+34 rows late

Both modules appear after the main alphabetical sequence, placed at the very end of the EDG region. The most likely explanation is that modules.c and floating.c are compiled as separate translation units — perhaps as a secondary build target — and are appended to the link line after the alphabetically-sorted main objects. The modules.c module implements C++20 module support (mostly stubs in the CUDA build), and floating.c implements arbitrary-precision IEEE 754 arithmetic — both are semi-independent subsystems that could plausibly be compiled separately.

Note that floating.c is followed immediately by its private header float_type.h (63 template instantiations at 0x7D1C90--0x7DEB90), confirming they share a compilation unit.

Binary Region Map

0x402A18 +--------------------------+
         | PLT stubs / init (283)   |  3 KB
0x403300 +--------------------------+
         | Assert stubs (198)       |  22 KB
0x408B40 +--------------------------+
         | Constructors (15)        |  2 KB
0x409350 +--------------------------+
         | attribute.c              |  65 KB
0x419280 | class_decl.c             | 190 KB
         | cmd_line.c               |  58 KB
         | const_ints.c             |  16 KB
         | cp_gen_be.c              | 139 KB
         | debug.c                  |  <1 KB
         | decl_inits.c             |  90 KB
         | decl_spec.c              |  73 KB
         | declarator.c             |  50 KB
         | decls.c                  | 165 KB
         | disambig.c               |  10 KB
         | error.c                  |  46 KB
         | expr.c                   | 381 KB
         | exprutil.c               | 176 KB
         | extasm.c                 |   3 KB
         | fe_init.c                |   2 KB
         | fe_wrapup.c              |  <1 KB
         | float_pt.c               |  44 KB
         | folding.c                |  66 KB
         | func_def.c               |  23 KB
         | host_envir.c             |  19 KB
         | il.c                     | 185 KB
         | il_alloc.c               |  31 KB
         | [il display gap]         |  87 KB  (unmapped)
         | il_to_str.c              |  48 KB
         | il_walk.c                | 115 KB
         | interpret.c              | 250 KB
         | layout.c                 |  29 KB
         | lexical.c                | 141 KB
         | literals.c               |  18 KB
         | lookup.c                 |  50 KB
         | lower_name.c             |  60 KB
         | macro.c                  |  42 KB
         | mem_manage.c             |  13 KB
         | nv_transforms.c          |  22 KB
         | overload.c               | 201 KB
         | pch.c                    |  14 KB
         | pragma.c                 |   9 KB
         | preproc.c                |  12 KB
         | scope_stk.c              |  76 KB
         | src_seq.c                |  31 KB
         | statements.c             |  55 KB
         | symbol_ref.c             |  24 KB
         | symbol_tbl.c             | 123 KB
         | sys_predef.c             |  20 KB
         | target.c                 |   2 KB
         | templates.c              | 286 KB
         | trans_copy.c             |  <1 KB
         | trans_corresp.c          |  50 KB
         | trans_unit.c             |   3 KB
         | types.c                  | 112 KB
         |  --- alphabetical break ---
         | modules.c                |   6 KB
         |  --- gap (59 KB) ---
0x7D0EB0 | floating.c               |  19 KB
         | float_type.h inlines     |  52 KB
0x7DFFF0 +--------------------------+
         | C++ runtime / demangler  | 304 KB
0x82A000 +--------------------------+

Reproduction

The reproduction below treats any assertion path-string — a .rodata string whose trailing path component is a .c/.h filename and that is cross-referenced from an assert stub — as a module identifier. The trailing filename is the module key.

To regenerate the module list from the strings database:

jq '[.[] | select(.value | test("\\.[ch]$")) |
  {file: (.value | split("/") | last),
   xrefs: (.xrefs | length)}
] | group_by(.file) |
  map({file: .[0].file,
       total_xrefs: (map(.xrefs) | add)}) |
  sort_by(.file)' cudafe++_strings.json

To extract address ranges per module:

import json
from collections import defaultdict

with open('cudafe++_strings.json') as f:
    data = json.load(f)

modules = defaultdict(list)
for entry in data:
    val = entry.get('value', '')
    # Module strings end in a .c/.h filename (the trailing path component)
    if not (val.endswith('.c') or val.endswith('.h')):
        continue
    fname = val.split('/')[-1]
    for xref in entry.get('xrefs', []):
        modules[fname].append(int(xref['from'], 16))

for fname in sorted(modules):
    addrs = sorted(modules[fname])
    print(f"{fname:25s}  {hex(addrs[0]):>12s} - {hex(addrs[-1]):>12s}"
          f"  ({len(addrs)} xrefs)")

  1. nv_transforms.c has only 1 function with an EDG-style __FILE__ reference, but sweep analysis confirms ~40 functions in the 0x6BAE70--0x6BE4A0 region (~22 KB). Most use NVIDIA's own assertion macros instead of EDG's internal_error path.