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

Scope Entry

The scope entry is the 784-byte record that forms the elements of the scope stack, the central data structure in cudafe++ for tracking nested lexical scopes during C++ parsing and semantic analysis. The scope stack is a flat array at qword_126C5E8, indexed by dword_126C5E4 (current depth). Every time the parser enters a new scope -- file, block, function body, class definition, template declaration, namespace -- a new 784-byte entry is pushed onto this stack. When the scope closes, the entry is popped and all associated cleanup runs: symbol table housekeeping, using-directive deactivation, name collision discriminator assignment, template parameter restoration, and memory region disposal.

This page documents the scope stack entry layout, the scope kind enum, the key flag bytes, the CUDA-specific additions (device/host scope context), the template instantiation depth counters, and the major push/pop functions.

Key Facts

PropertyValue
Entry size784 bytes (constant, verified by "Stack entry size: %d\n" in debug statistics)
Stack base pointerqword_126C5E8 (global, array of 784-byte entries)
Current depth indexdword_126C5E4 (global, 0-based index of topmost entry)
Function scope indexdword_126C5D8 (-1 if not inside a function scope)
Class scope indexdword_126C5C8 (-1 if not inside a class scope)
File scope indexdword_126C5DC
EDG source filescope_stk.c (address range 0x6FE160-0x7106B0, ~160 functions)
Push functionsub_700560 (push_scope_full, 1476 lines, 13 parameters)
Pop functionsub_7076A0 (pop_scope, 1142 lines)
Index arithmetic784 * index for byte offset; reverse via multiply by 0x7D6343EB1A1F58D1 and shift right (division by 784 = 16 * 49)

Scope Stack Global Variables

GlobalTypeMeaning
qword_126C5E8void*Base pointer to the scope stack array
dword_126C5E4int32Current scope stack top index (0-based)
dword_126C5D8int32Current function scope index (-1 if none)
dword_126C5DCint32File scope index / secondary depth marker
dword_126C5ACint32Saved depth for template instantiation
qword_126C5D0void*Current routine descriptor pointer
dword_126C5B8int32is_member_of_template flag
dword_126C5C8int32Class scope index (-1 if none)
dword_126C5C4int32Nested class / lambda scope index (-1 if none)
dword_126C5E0int32Scope hash / identifier
dword_126C5B4int32Namespace scope index
dword_126C5BCint32Class scope depth counter
qword_126C598void*Pack expansion context pointer

Full Offset Map

The table documents every field observed in the 784-byte scope stack entry. These are scope stack entry fields, not IL scope node fields (the IL scope is a separate 288-byte structure pointed to from offset +192).

OffsetSizeFieldEvidence
+04scope_numberUnique identifier for this scope instance; checked in pop_scope assertions
+41scope_kindScope kind enum byte (see table below)
+51scope_flags_1General flags
+62scope_flags_2Bit 0 = void return flag; bit 1 = device scope context (NVIDIA addition); bit 2 = inline namespace; in some contexts bit 1 = is_extern, bit 5 = inline_namespace
+71access_flagsBit 0 = in class context; bit 1 = has using-directives; bit 4 = lambda body
+81scope_flags_4Template/class/reactivation bits; bit 5 (0x20) = is_template_scope
+91scope_flags_5Bit 0 = needs cleanup / scope pop control -- when set, triggers sub_67B4E0() cleanup of template instantiation artifacts before popping
+101scope_flags_6Bit 0 = in_template_context
+111sign bitin_template_dependent_context
+121scope_flags_7Bit 0 = in_template_arg_scan; bit 2 = suppress_diagnostics; bit 4 = has_concepts / void_return_warned
+131scope_flags_8Bit 4 = warned_no_return
+141flags3Bit 2 = in_device_code (NVIDIA-specific, marks whether code in this scope is device code)
+248symbol_chain_or_hash_ptrPointer to the name symbol chain or hash table for name lookup
+328hash_table_ptrHash table pointer (when scope uses hashing for lookup)
+32-+144112Inline tail infoWhen +24 is 0, this region contains inline tail pointers for entity lists: +40 = variables tail, +48 = types tail, +56 = routines next, +88 = asm tail, +112 = namespaces tail, +144 = templates tail
+1928il_scope_ptrPointer to the associated 288-byte IL scope node (the persistent representation that survives scope pop)
+2008local_static_init_listList of local static variable initializers
+2088vla_dimensions_list / scope_depthVLA dimension tracking (C mode); scope depth integer
+2168class_type_ptr / tu_ptrFor class scopes: pointer to the class type symbol. For template instantiation scopes: pointer to the translation unit descriptor
+2248routine_descriptorPointer to the current routine descriptor (set for function scopes)
+2328namespace_entityFor namespace scopes: pointer to the namespace entity
+2404region_numberMemory region number (-1 = invalid sentinel, set by alloc_scope)
+2564parent_scope_indexIndex of the enclosing scope in the stack (reported at both +240 and +256 in different sweeps -- likely +240 = region, +256 = parent)
+2728name_hiding_listLinked list of names hidden by declarations in this scope
+2968local_vars_tailTail pointer for the local variables list
+3688source_beginSource position at scope entry
+3768associated_entity / parent_template_infoAssociated entity pointer / template information pointer
+3848template_argument_listTemplate argument list for instantiation scopes
+4084try_block_index / enclosing_class_scope_indexTry block index (-1 = none); in class contexts, index to enclosing class scope
+4168module_infoModule information pointer (C++20 modules support)
+4244line_numberLine number at scope open (for diagnostics)
+4968root_object_lifetimeRoot of the object lifetime tree for this scope
+5128freed_lifetime_listList of freed object lifetimes awaiting reuse
+5604enclosing_scope_indexParent scope index for pop validation
+5764template_instantiation_depth_counterNested instantiation depth counter -- incremented on recursive template instantiation push, decremented on pop; when > 0, pop just decrements without actually popping the scope stack
+5804orig_depthOriginal scope stack depth at time of template instantiation push; validated during pop
+5844saved_scope_depthSaved scope depth; restored via dword_126C5AC on template instantiation pop
+6088class_def_info_ptrClass definition information pointer
+6248template_info_ptrTemplate information record pointer
+6328template_parameter_list / class_info_ptrTemplate parameter list pointer
+7048lambda_counterLambda expression counter within this scope (int64)
+7204fixup_counterDeferred fixup counter
+7288has_been_completedCompletion flag (int64 used as bool)
+7368deferred_fixup_list_headHead of deferred fixup linked list
+7448deferred_fixup_list_tailTail of deferred fixup linked list

Scope Stack Kind Enum

The scope stack kind byte at +4 uses a different, larger enum than the IL scope kind (sck_*) at IL scope node +28. The scope stack enum includes additional entries for reactivation states, template instantiation context, and module scopes. The mapping is derived from scope_kind_to_string (sub_7000E0, 77 lines) which contains display string literals for each enum value, and from display_scope (sub_5F2140) in il_to_str.c.

Scope Stack Kind Values

ValueNameDisplay StringNotes
0ssk_source_file"source file"Top-level file scope. Maps to IL sck_file (0).
1ssk_func_prototype"function prototype"Function prototype scope (parameter names). Maps to IL sck_func_prototype (1).
2ssk_block"block"Block scope (compound statement). Maps to IL sck_block (2).
3ssk_alloc_namespace"alloc_namespace"Namespace scope (first opening). Maps to IL sck_namespace (3).
4ssk_namespace_extension"namespace extension"Namespace extension (reopened namespace N { ... }).
5ssk_namespace_reactivation"namespace reactivation"Namespace scope reactivated for out-of-line definition.
6ssk_class_struct_union"class/struct/union"Class/struct/union scope. Maps to IL sck_class_struct_union (6).
7ssk_class_reactivation"class reactivation"Class scope reactivated for out-of-line member definition (e.g., void MyClass::foo() { ... }).
8ssk_template_declaration"template declaration"Template declaration scope (template<...>). Maps to IL sck_template_declaration (8).
9ssk_template_instantiation"template instantiation"Template instantiation scope (pushed by push_template_instantiation_scope).
10ssk_instantiation_context"instantiation context"Instantiation context scope (tracks the chain of instantiation sites for diagnostics).
11ssk_module_decl_import"module decl import"C++20 module declaration/import scope.
12ssk_module_isolation"module isolation"C++20 module isolation scope (module purview boundary).
13ssk_pragma"pragma"Pragma scope (for pragma-delimited regions).
14ssk_function_access"function access"Function access scope.
15ssk_condition"condition"Condition scope (if/while/for condition variable). Maps to IL sck_condition (15).
16ssk_enum"enum"Scoped enum scope (C++11 enum class). Maps to IL sck_enum (16).
17ssk_function"function"Function body scope (has routine pointer, parameters, ctor init list). Maps to IL sck_function (17).

Relationship to IL Scope Kinds

The IL scope node (288 bytes, allocated by alloc_scope at sub_5E7D80) uses a smaller sck_* enum at its +28 field. The scope stack entry at +192 points to the IL scope that persists after the stack entry is popped. Not all scope stack kinds produce an IL scope -- reactivation kinds (5, 7) and context kinds (9, 10) reuse existing IL scopes.

IL sck_*ValueCorresponding stack kind(s)
sck_file00
sck_func_prototype11
sck_block22
sck_namespace33, 4, 5
sck_class_struct_union66, 7
sck_template_declaration88
sck_condition1515
sck_enum1616
sck_function1717

CUDA-Specific Fields

NVIDIA added two device/host scope tracking bits to the scope entry, grafted onto the EDG base structure.

Byte +6, Bit 1: Device Scope Context

scope_entry+6, bit 1 (0x02):

  When set: code in this scope is compiled for the device execution space.
  When clear: code in this scope is compiled for the host.

This bit is tested by CUDA-specific code paths to determine whether the current compilation context targets device or host. It affects:

  • Whether __device__-only functions suppress certain diagnostics (e.g., missing return value warning at check_void_return_okay, sub_719D20)
  • Whether device-specific type validation applies
  • Severity overrides via byte_126ED55 (default diagnostic severity for device mode)

The bit is set when entering __device__ or __global__ function scopes and cleared when entering __host__ scopes. This allows mixed host/device compilation to track which context is active at any nesting depth.

Byte +14, Bit 2: In Device Code

scope_entry+14, bit 2 (0x04):

  Secondary device-code marker. Set when the parser is inside a device
  function body. Used in conjunction with dword_106C2C0 (CUDA device
  compilation mode flag).

Template Instantiation Depth Counters

Three fields at offsets +576, +580, and +584 form the template instantiation depth tracking system. These fields enable the scope stack to handle nested template instantiations without fully pushing/popping scope entries at every nesting level.

Mechanism

When push_template_instantiation_scope (sub_709DE0) sets up a template instantiation, it writes the current scope stack depth into +580 (orig_depth) and the saved global depth into +584 (saved_scope_depth). The +576 counter starts at 0.

If the same template scope is re-entered for a nested instantiation (e.g., recursive template), +576 is incremented rather than pushing a full new scope entry. On pop, pop_template_instantiation_scope (sub_708EE0) checks +576:

if (scope_entry[576] > 0) {
    scope_entry[576]--;     // just decrement, don't pop
    return;
}
// Full pop: restore scope stack to orig_depth
pop_scopes_to(scope_entry[580]);
restore(dword_126C5AC, scope_entry[584]);

This optimization avoids deep scope stack growth during deeply recursive template instantiations (e.g., std::tuple<T1, T2, ..., TN> with large N).

Validation

pop_template_instantiation_scope_with_check (sub_708E90) validates that +576 matches the expected depth before calling the actual pop. The assertion is at scope_stk.c line 5593. A mismatch triggers an internal error.

Push Scope: push_scope_full (sub_700560)

The core scope push function (1476 lines, 13 parameters, located at 0x700560). Called directly or via thin wrappers for each scope kind.

Parameters

The 13-parameter signature handles all scope kinds through a single entry point:

  1. Scope kind
  2. Associated entity pointer (class type, namespace entity, routine descriptor, etc.)
  3. Region number
  4. Additional flags 5-13. Kind-specific parameters (template info, reactivation data, etc.)

Key Operations

  1. Stack growth: Increments dword_126C5E4. If the stack exceeds its allocation, it is reallocated (the base pointer qword_126C5E8 may change).

  2. Entry initialization: Zeros the 784-byte entry, then sets:

    • +0 = scope number (from a global counter)
    • +4 = scope kind
    • +240 = region number
    • +192 = IL scope pointer (newly allocated via alloc_scope or reused from a reactivated entity)
    • +560 = parent scope index
  3. Kind-specific setup:

    • File (0): Sets dword_126C5DC, initializes file-level state.
    • Block (2): Links to enclosing function scope.
    • Namespace (3, 4, 5): Sets +232 to namespace entity. For extensions (4), reuses existing IL scope. For reactivation (5), calls add_active_using_directives_for_scope.
    • Class (6, 7): Sets +216 to class type pointer, dword_126C5C8 to current index. For reactivation (7), walks the class hierarchy to restore template context.
    • Template declaration (8): Sets template-related bits in +8.
    • Function (17): Sets dword_126C5D8, qword_126C5D0, +224.
  4. Parent scope linkage: Calls set_parent_scope_on_push to establish the scope tree.

  5. Memory region: Calls get_enclosing_memory_region to determine the memory arena for allocations within this scope.

Push Wrappers

WrapperAddressParametersTarget Kind
push_scope (thin)sub_7047907Various
push_scope_with_using_dirssub_7047C029Namespace + using
push_template_scopesub_7048707Template declaration (8)
push_block_reactivation_scopesub_7048A032Block reactivation
push_namespace_scope_fullsub_7024D040Namespace (3)
push_function_scopesub_704BB013Function (17)
push_class_scopesub_704C1017Class (6)
push_scope_for_compound_statementsub_70C8A064Block (2)
push_scope_for_conditionsub_70C95086Condition (15)
push_scope_for_init_statementsub_70CAE049Block (2), C++17 init

Pop Scope: pop_scope (sub_7076A0)

The core scope pop function (1142 lines, at 0x7076A0). Complement to push_scope_full. Performs all scope cleanup in a specific order.

Cleanup Sequence

  1. Debug trace: If dword_126EFC8 is set, prints "pop_scope: number = %ld, depth = %d".

  2. Scope wrapup: Calls wrapup_scope (sub_706710, 381 lines) which:

    • Iterates all symbols in the scope
    • Runs end_of_scope_symbol_check (sub_705440, 781 lines) for consistency validation
    • Emits needed definitions
    • Reports unreferenced entities
  3. Using-directive deactivation: Clears active using-directives for this scope via sub_6FEC10 (debug: clear using-directive).

  4. Template parameter restoration: If leaving a template scope, calls restore_default_template_params (sub_6FEEE0) to undo template parameter symbol bindings.

  5. Name collision discriminators: Assigns ABI discriminator values to entities with the same name in this scope via assign_discriminators_to_entities_list (sub_7036E0).

  6. C99 inline definitions: Checks check_c99_inline_definition (sub_703AD0) for C99-mode inline function rules.

  7. Module/pragma state: Adjusts STDC pragma state (byte_126E558/559/55A) and module context if applicable.

  8. Stack decrement: Decrements dword_126C5E4. Restores previous scope's global state (function scope index, class scope index, etc.).

  9. Memory region disposal: Frees the memory arena associated with this scope if the scope kind has one.

Pop Variants

FunctionAddressLinesPurpose
pop_scope (core)sub_7076A01142Full scope pop with all cleanup
pop_scope_fullsub_70C440100Wrapper calling core + name hiding cleanup
pop_scope (validation)sub_70C62062Pop with object lifetime validation: asserts "pop_scope: curr_object_lifetime is not that of", "pop_scope: unexpected curr_object_lifetime"

Template Instantiation Scope

The template instantiation scope push and pop are separate from the generic scope push/pop. They handle the complex process of binding template parameters to arguments, setting up the correct translation unit context, and managing pack expansions.

Push: push_template_instantiation_scope (sub_709DE0)

The largest function in the scope_stk.c range at 1281 lines. Takes 8 parameters: template pointer, association info, and various flags.

Key operations:

  1. Translation unit check: Calls sub_7418D0 to verify that the template being instantiated belongs to the same translation unit, or that cross-TU instantiation is explicitly allowed (flag & 0x1000). Failure triggers the assert "push_template_instantiation_scope: wrong translation unit".

  2. Template parameter binding: Iterates the template parameter list and the instantiation argument list in parallel, creating bindings. For each template parameter:

    • Type parameters: binds to the supplied type argument
    • Non-type parameters: binds to the supplied expression/value
    • Template template parameters: binds to the supplied template
  3. Pack expansion: For variadic templates, handles parameter pack expansion. Creates pack instantiation descriptors via create_pack_instantiation_descr (sub_70CF50, 772 lines).

  4. Scope entry setup: Writes +576 = 0, +580 = current depth, +584 = dword_126C5AC. Sets +216 to the translation unit pointer.

  5. State save/restore: Saves dword_126C5B8 (is_member_of_template), dword_126C5D8 (function scope), qword_126C5D0 (routine descriptor).

  6. Reactivation flags: Flag bits & 0x84000 control class template reactivation behavior. When set, the function enters class reactivation mode via sub_70BB60.

Pop: pop_template_instantiation_scope (sub_708EE0)

66 lines. Reverse of the push.

  1. Reads +576 (depth counter). If > 0, decrements and returns early (nested instantiation shortcut).
  2. If bit 0 of +9 is set (needs_cleanup), calls sub_67B4E0() to clean up template instantiation artifacts.
  3. Pops scope entries back to orig_depth (+580) via sub_7076A0.
  4. Restores dword_126C5AC from +584.
  5. Calls sub_6FED20 (debug trace: set using-directive).
FunctionAddressLinesRole
pop_template_instantiation_scope_wrappersub_708E707Thin wrapper passing through to sub_708EE0
pop_template_instantiation_scope_with_checksub_708E9014Validates +576 depth counter before calling sub_708EE0
pop_template_instantiation_scope_variantsub_70911071Alternative pop with extra +8 flag processing, returns int64
pop_instantiation_scope_for_rescansub_70900054Pop for template argument rescan case
push_instantiation_scope_for_rescansub_70B900123Push for template parameter rescanning
push_instantiation_scope_for_templ_param_rescansub_70B7C052Push for template parameter rescan
push_instantiation_scope_for_classsub_70BB60131Push for class template instantiation
push_class_and_template_reactivation_scope_fullsub_7098B0261Combined class + template reactivation

Using-Directive Activation

When entering a namespace scope that has active using namespace directives, those directives must be reactivated so that names from the nominated namespace are visible. The scope stack manages this through two functions:

add_active_using_directives_for_scope (sub_6FFCC0)

246 lines. Called during scope push when entering a namespace or block that may have inherited using-directives. Walks the using-directive list for the scope and calls add_active_using_directive_to_scope for each one.

Debug trace format: "adding using-dir at depth %d for namespace %s applies at %d".

Using-Directive Debug Traces

FunctionAddressLinesTrace
Debug: set using-directivesub_6FED2074"setting using-dir at depth %d for namespace %s applies at %d"
Debug: clear using-directivesub_6FEC1034"clearing using-dir at depth %d for namespace %s applies at %d"
Debug: using-dir set/clearsub_704490106"using_dir", "setting", "clearing"

Name Collision Discriminators

When multiple local entities share the same name (e.g., two struct S in different blocks within the same function), the Itanium ABI requires a discriminator suffix in the mangled name. The scope stack manages this through:

FunctionAddressLinesRole
get_name_collision_list + initialize_local_name_collision_tablesub_6FE76064Manages the name collision table at qword_12C6FE0
compute_local_name_collision_discriminator + distinct_lambda_signaturessub_702FB0293Computes ABI discriminator values for local entities; includes lambda signature discrimination logic
cancel_name_collision_discriminatorsub_7034C0118Cancels a previously assigned discriminator (7 assertion sites)
assign_discriminators_to_entities_listsub_7036E046Assigns ABI discriminators to a list of entities at scope exit
set_parent_entity_for_closure_typessub_70379091Sets parent entity for lambda closure types (needed for correct mangling, 5 assertion sites)
set_parent_routine_for_closure_types_in_default_argssub_70392043Sets parent routine for lambdas in default argument contexts

Class and Template Reactivation

When defining an out-of-line member function (void MyClass::foo() { ... }), the parser must reactivate the class scope so that class member names are visible. For class templates, this also requires reactivating the template instantiation scope.

reactivate_class_context (sub_7029D0 / sub_70BE50)

Two implementations exist:

  • sub_7029D0 (196 lines, in p1.16): Reactivates a class scope for out-of-line definition. Asserts "reactivate_class_context: class type has NULL assoc_info".
  • sub_70BE50 (130 lines, in p1.17): Additional variant that handles nesting, template flags, and scope_entry +8 bit manipulation.

push_class_and_template_reactivation_scope_full (sub_7098B0)

261 lines. Handles the combined case of class template reactivation. Reads symbol flags at offsets +80, +81, +161, +162. Processes "specified template decl info" at +64 of assoc_info. Detects member templates via bit 0x10 at +81. When dword_106BC58 is set, enters class reactivation mode with sub_70BB60.

reactivate_local_context (sub_702670 / sub_70C0F0)

  • sub_702670 (120 lines): Reactivates a previously saved local scope context. Calls push_scope_full.
  • sub_70C0F0 (50 lines): Asserts "reactivate_local_context".

Pack Expansion Support

The scope stack provides infrastructure for variadic template parameter pack expansion during instantiation.

FunctionAddressLinesRole
create_pack_instantiation_descrsub_70CF50772Creates pack instantiation descriptors; handles sizeof..., fold expressions
create_pack_instantiation_descr_helpersub_70DD60212Helper for pack descriptor creation
cleanup_pack_instantiation_statesub_70E13037Cleans up pack expansion state
end_potential_pack_expansion_contextsub_70E1D0392Processes end of pack expansion; checks C++17 via dword_126EF68 > 199900; uses qword_126C598 (pack expansion context)
find_template_arg_for_pack + get_enclosing_template_params_and_argssub_6FE9B0140Traverses scope stack to find template arguments for parameter packs

Scope Stack Query Functions

FunctionAddressLinesRole
get_innermost_template_dependent_contextsub_6FE16072Traverses scope stack to find innermost template-dependent scope
get_outermost_template_dependent_contextsub_6FFA6054Complement to innermost variant
get_curr_template_params_and_args (part 1)sub_70E7F0321Retrieves current template parameters and arguments from scope stack
get_curr_template_params_and_args (full)sub_70F5401002Full implementation with default argument handling and pack expansion
is_in_template_contextsub_70EE1016No-arg predicate, returns bool
is_in_template_instantiation_scopesub_70EDA0276-arg predicate, returns bool
current_class_symbol_if_class_templatesub_70413084Returns class symbol if inside a class template definition
is_in_deprecated_contextsub_70F44043Checks scope_entry[83] bit 4 and walks scope stack
get_scope_depthsub_70C60017Returns current scope stack depth value
get_template_scope_info_for_entitysub_7106B074Last function in scope_stk.c range

Debug and Statistics

Scope Statistics Dump (sub_702DC0)

95 lines. Prints scope stack statistics when debug tracing is enabled. Output format:

Scope stack statistics
Stack entry size: 784
Max. stack depth: <N>

Followed by per-scope-kind counts using all scope kind display names.

Scope Entry Dump (sub_700260 / sub_7002D0)

  • sub_700260 (17 lines): Prints " scope %d" with scope kind name via scope_kind_to_string. Detects bad depth with "***BAD SCOPE DEPTH***".
  • sub_7002D0 (111 lines): Detailed dump using format "%s%3ld %3d " with associated type/symbol information.

End-of-Scope Processing

wrapup_scope (sub_706710)

381 lines. Major scope cleanup function called from pop_scope. Processes all symbols in the scope, emits needed definitions, runs end_of_scope_symbol_check. Debug traces: "wrapup_scope", "Wrapping up ", " scope".

end_of_scope_symbol_check (sub_705440)

781 lines, 6 assertion sites. The largest validation function. Checks:

  • Symbol-to-IL-entry parent-class consistency ("end_of_scope_symbol_check: sym/il-entry parent-class mismatch")
  • Parameter-to-routine association ("end_of_scope_symbol_check: parameter with no assoc routine")
  • Hash table statistics ("hash_stats", "Hash statistics for: ")

set_needed_flags_at_end_of_file_scope (sub_707040)

188 lines. Determines which entities need to be emitted at the end of the translation unit. Validates scope kind ("set_needed_flags_at_end_of_file_scope: bad scope kind"). Debug brackets: "Start of set_needed_flags_at_end_of_file_scope\n" / "End of set_needed_flags_at_end_of_file_scope\n".

finish_function_body_processing (sub_6FE2A0)

142 lines. Post-processes function bodies after the scope closes. Determines whether the function needs to be emitted ("routine_needed_even_if_unreferenced", "Not calling mark_as_needed for", "storage class is %s\n").

Cross-References