P1482R0
Modules Feedback

Published Proposal,

This version:
http://wg21.link/P1482R0
Authors:
(Apple)
(Apple)
(Apple)
Audience:
EWG, SG15
Project:
ISO/IEC JTC1/SC22/WG21 14882: Programming Language — C++
Source:
github.com/jfbastien/papers/blob/master/source/P1482R0.bs

As the C++ committee closes in on C++20, several concerns have emerged regarding the state of C++ Modules and whether they should be promoted from a TS to the C++20 draft. Legitimate questions are being asked, and while it’s unclear what the future has in store for C++20, we consider the current merging proposal in [P1103R1] to have achieved a nice tradeoff between the different perspectives on how a modular system for C++ should work.

That doesn’t mean that the current proposal solves all problems in the C++ universe or shouldn’t be improved any further; there’s immense room for development and a set of open questions. For good (or bad) we lay out some of the hot topics, as seen in post-San Diego and pre-Kona mailings, and our current take on some of these issues:

This paper isn’t advocating for or against modules being merged into the C++20 draft. It’s a mere overview of publicly available facts we think are relevant to the current discussion.

1. C++ Modules are the C++ Savior

They’re not. It would be great if Modules could solve all problems in the C++ universe, but that’s unrealistic. It’s probably a good opportunity to make the world a better place (e.g. moving away from macros), but you can’t get the benefits of componentization without introducing well-defined dependencies.

We consider that C++ Modules must solve componentization and provide build time speedups. However, packaging or a binary distribution system sound out of scope. At the same time, C++ Modules shouldn’t prevent any of those ideas from flourishing independently. We think that the current model meets both requirements, as explained in more detail in this paper.

The addition of layers and abstractions won’t ever be free. We ask the reader to keep that in mind while balancing the tradeoffs.

2. Module preamble, configuration, and dependency scanning

The module preamble consists of a set of module import declarations (module imports and header imports) and is terminated by the first non import decl. Module imports never import macros, while macros from header imports are visible directly after the closing ';'. The macros that are imported from headers can influence subsequent import logic. Includes can appear within the preamble as long as they only expand into import decls.

In C++17, dependency scanning requires a correct preprocessor. The current state of modules is no different. It is no slower to determine the dependencies of a modular C++ file than a normal C++ file today, and current proposals aimed at restricting the preamble wouldn’t make a scanner any faster.

After scanning the preamble, there may be an #include later in the file, but since this is uncommon a scanner can do a quick scan for #white-spaceinclude and fall back to preprocessing the entire file if required.

2.1. Module configuration

An important topic is whether to ship module artifacts, but it’s not clear whether that’s actually feasible because of how modules are configured at build time.

For example, implementations allow configuration macros via -D, which is useful for specifying dynamic library import/export (within in a build) or platform-specific constants (when a library needs special handling for each platform). Each variation in configuration macros needs a different module build artifact.

Another potential issue in shipping module artifacts consistently handling command-line flags controlling diagnostics. Suppose you build module A with -Wno-error. Next, someone tries to invoke the compiler with -Werror while re-using module A. What should happen here? Should the compiler accept that? Should the user give up because their workflow isn’t supported? This can get tricky for delayed diagnostics in template instantiations, where the declaration is in the module and the instantiation is in a user of the module.

A mechanism like the artifact hashing in Clang Modules is an example of how to solve this problem. When building a module with Clang Modules, the hash for the artifact location consists of: command line macros, language options, and a set of similar compiler flags. Changes in any of those by a subsequent compiler invocation typically triggers a new module build.

None of the above prevents fine-grained memoization. Indeed, the current Clang approach can evolve to consider configurations at a finer granularity. Our experience so far makes it unclear whether this use case is worth addressing.

2.2. Dependency scanning can be fast

The LLVM project is investing in a prototype which provides dependency scanning for headers with 4–10× speed up over -Eonly preprocessing. There’s a clear path to compute C++ Modules dependencies using this approach. We are therefore confident that tooling can be done fast and reliably.

If you think about Clang Modules as a legacy header only C++ modules, the approach should be straightforward to relate. This is how it works:

This can be further optimized by additional levels of caching. Since system modules (such as system headers) do not change frequently, it might be feasible to pre-populate metadata with dependency info, or even module artifacts, for a chosen set of common configurations.

2.3. Mapping modules

Another topic related to dependency scanning and build times is how the mapping between module names and files should happen. As stated in [P1427R0], [P0778R0], and other discussions, this deserves more investigation. However, it doesn’t need to block C++ Modules. There are interesting side effects of treating this as an implementation detail:

2.4. Modules and Package Management

We consider source code to be the C++ shipping format. Modules aren’t the right place to solve longstanding vendor compatibility problems. Neither are Modules the right vehicle for distribution of C++ packages.

This derives from the consistency problems mentioned in the modules configuration section above. It’s unrealistic to consider that one could ship a module and at the same time make it consumable by a different users with distinct restrictions and setups.

We believe modules should be built (not shipped or distributed) as part of a build, and potentially shared in the same environment for other compiler invocations that end up using non-conflicting setups.

However, the nice thing about not specifying any of this at the standards level is that vendors are free to explore with both models, or even come up with a mixed mode, where modules could be shipped for a specific audience. It would then be on that vendor to figure out how to support that binary format over time, and how to keep their implementation fast while making interoperability easy. That said, we don’t think that speculations about how Modules impact packaging should block the progress of C++ Modules.

3. Deploying Modules: does it scale?

Let’s take LLVM as an example of how a modular code base might behave. LLVM is currently modularized with Clang Modules. These are similar to a version of C++ Modules where each module only provides a module interface unit, as in GCC’s BMIs. Since the BMIs don’t depend on module implementation units, this is a fair approximation of a C++ Modules dependency subgraph. Here is the Clang Modules build graph for LLVM:

llvm deps Darwin1LQCVL2F9L06G Darwin1LQCVL2F9L06G std_config1LQCVL2F9L06G std_config1LQCVL2F9L06G Darwin1LQCVL2F9L06G->std_config1LQCVL2F9L06G _Builtin_stddef_max_align_t1LQCVL2F9L06G _Builtin_stddef_max_align_t1LQCVL2F9L06G Darwin1LQCVL2F9L06G->_Builtin_stddef_max_align_t1LQCVL2F9L06G LLVM_C1LQCVL2F9L06G LLVM_C1LQCVL2F9L06G LLVM_C1LQCVL2F9L06G->Darwin1LQCVL2F9L06G LLVM_Config_Config1LQCVL2F9L06G LLVM_Config_Config1LQCVL2F9L06G LLVM_C1LQCVL2F9L06G->LLVM_Config_Config1LQCVL2F9L06G std1LQCVL2F9L06G std1LQCVL2F9L06G LLVM_C1LQCVL2F9L06G->std1LQCVL2F9L06G std1LQCVL2F9L06G->Darwin1LQCVL2F9L06G std1LQCVL2F9L06G->std_config1LQCVL2F9L06G std1LQCVL2F9L06G->_Builtin_stddef_max_align_t1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->Darwin1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->std_config1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->LLVM_C1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->LLVM_Config_Config1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->std1LQCVL2F9L06G LLVM_Config_ABI_Breaking1LQCVL2F9L06G LLVM_Config_ABI_Breaking1LQCVL2F9L06G LLVM_Utils1LQCVL2F9L06G->LLVM_Config_ABI_Breaking1LQCVL2F9L06G Darwin2G3VFZ0WJ5ZW8 Darwin2G3VFZ0WJ5ZW8 std_config2G3VFZ0WJ5ZW8 std_config2G3VFZ0WJ5ZW8 Darwin2G3VFZ0WJ5ZW8->std_config2G3VFZ0WJ5ZW8 _Builtin_stddef_max_align_t2G3VFZ0WJ5ZW8 _Builtin_stddef_max_align_t2G3VFZ0WJ5ZW8 Darwin2G3VFZ0WJ5ZW8->_Builtin_stddef_max_align_t2G3VFZ0WJ5ZW8 std2G3VFZ0WJ5ZW8 std2G3VFZ0WJ5ZW8 std2G3VFZ0WJ5ZW8->Darwin2G3VFZ0WJ5ZW8 std2G3VFZ0WJ5ZW8->std_config2G3VFZ0WJ5ZW8 std2G3VFZ0WJ5ZW8->_Builtin_stddef_max_align_t2G3VFZ0WJ5ZW8 Darwin2JUI1XD6IHH6D Darwin2JUI1XD6IHH6D std_config2JUI1XD6IHH6D std_config2JUI1XD6IHH6D Darwin2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D _Builtin_stddef_max_align_t2JUI1XD6IHH6D _Builtin_stddef_max_align_t2JUI1XD6IHH6D Darwin2JUI1XD6IHH6D->_Builtin_stddef_max_align_t2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_Config_Config2JUI1XD6IHH6D LLVM_Config_Config2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D std2JUI1XD6IHH6D std2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D LLVM_Analysis2JUI1XD6IHH6D->LLVM_ProfileData2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Pass2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_C2JUI1XD6IHH6D LLVM_C2JUI1XD6IHH6D LLVM_IR2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_intrinsic_gen2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_Config_ABI_Breaking2JUI1XD6IHH6D LLVM_Config_ABI_Breaking2JUI1XD6IHH6D LLVM_Utils2JUI1XD6IHH6D->LLVM_Config_ABI_Breaking2JUI1XD6IHH6D std2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D std2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D std2JUI1XD6IHH6D->_Builtin_stddef_max_align_t2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_ProfileData2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_Analysis2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_Backend_Target2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_MC2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_Backend2JUI1XD6IHH6D->LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_BinaryFormat2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_MC2JUI1XD6IHH6D LLVM_Backend_Target2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_MC2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_MC_TableGen2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_C2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_C2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_C2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D LLVM_DebugInfo2JUI1XD6IHH6D->LLVM_Object2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_BinaryFormat2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_MC2JUI1XD6IHH6D LLVM_Object2JUI1XD6IHH6D->LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_Config_Config2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_Backend_Target2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_MC_TableGen2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_DebugInfo2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_Object2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D LLVM_ExecutionEngine2JUI1XD6IHH6D->LLVM_Transforms2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_Analysis2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_Pass2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_IR2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_intrinsic_gen2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Transforms2JUI1XD6IHH6D->LLVM_ProfileData2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D->Darwin2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D->std_config2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D->LLVM_Utils2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D->std2JUI1XD6IHH6D LLVM_Support_TargetRegistry2JUI1XD6IHH6D->LLVM_C2JUI1XD6IHH6D Darwin32QV03SNE4L16 Darwin32QV03SNE4L16 std_config32QV03SNE4L16 std_config32QV03SNE4L16 Darwin32QV03SNE4L16->std_config32QV03SNE4L16 _Builtin_stddef_max_align_t32QV03SNE4L16 _Builtin_stddef_max_align_t32QV03SNE4L16 Darwin32QV03SNE4L16->_Builtin_stddef_max_align_t32QV03SNE4L16 std32QV03SNE4L16 std32QV03SNE4L16 std32QV03SNE4L16->Darwin32QV03SNE4L16 std32QV03SNE4L16->std_config32QV03SNE4L16 std32QV03SNE4L16->_Builtin_stddef_max_align_t32QV03SNE4L16 Darwin3ERGIVFQTTTGW Darwin3ERGIVFQTTTGW std_config3ERGIVFQTTTGW std_config3ERGIVFQTTTGW Darwin3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW _Builtin_stddef_max_align_t3ERGIVFQTTTGW _Builtin_stddef_max_align_t3ERGIVFQTTTGW Darwin3ERGIVFQTTTGW->_Builtin_stddef_max_align_t3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_Pass3ERGIVFQTTTGW LLVM_Config_Config3ERGIVFQTTTGW LLVM_Config_Config3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_Config_Config3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_IR3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_intrinsic_gen3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW std3ERGIVFQTTTGW std3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW LLVM_Analysis3ERGIVFQTTTGW->LLVM_ProfileData3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_Pass3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->LLVM_Pass3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->LLVM_BinaryFormat3ERGIVFQTTTGW LLVM_C3ERGIVFQTTTGW LLVM_C3ERGIVFQTTTGW LLVM_IR3ERGIVFQTTTGW->LLVM_C3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->LLVM_Pass3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->LLVM_Config_Config3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->LLVM_IR3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_intrinsic_gen3ERGIVFQTTTGW->LLVM_C3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->LLVM_Config_Config3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->LLVM_C3ERGIVFQTTTGW LLVM_Config_ABI_Breaking3ERGIVFQTTTGW LLVM_Config_ABI_Breaking3ERGIVFQTTTGW LLVM_Utils3ERGIVFQTTTGW->LLVM_Config_ABI_Breaking3ERGIVFQTTTGW std3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW std3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW std3ERGIVFQTTTGW->_Builtin_stddef_max_align_t3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->LLVM_IR3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->LLVM_intrinsic_gen3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_ProfileData3ERGIVFQTTTGW->LLVM_C3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_BinaryFormat3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_C3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_C3ERGIVFQTTTGW->LLVM_Config_Config3ERGIVFQTTTGW LLVM_C3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->Darwin3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->std_config3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_Analysis3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_Pass3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_IR3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_intrinsic_gen3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_Utils3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->std3ERGIVFQTTTGW LLVM_Transforms3ERGIVFQTTTGW->LLVM_ProfileData3ERGIVFQTTTGW DarwinC37OZW46X6BW DarwinC37OZW46X6BW std_configC37OZW46X6BW std_configC37OZW46X6BW DarwinC37OZW46X6BW->std_configC37OZW46X6BW _Builtin_stddef_max_align_tC37OZW46X6BW _Builtin_stddef_max_align_tC37OZW46X6BW DarwinC37OZW46X6BW->_Builtin_stddef_max_align_tC37OZW46X6BW stdC37OZW46X6BW stdC37OZW46X6BW stdC37OZW46X6BW->DarwinC37OZW46X6BW stdC37OZW46X6BW->std_configC37OZW46X6BW stdC37OZW46X6BW->_Builtin_stddef_max_align_tC37OZW46X6BW CoreFoundationE8CC9O9F9A3Z CoreFoundationE8CC9O9F9A3Z std_configE8CC9O9F9A3Z std_configE8CC9O9F9A3Z CoreFoundationE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z DispatchE8CC9O9F9A3Z DispatchE8CC9O9F9A3Z CoreFoundationE8CC9O9F9A3Z->DispatchE8CC9O9F9A3Z DarwinE8CC9O9F9A3Z DarwinE8CC9O9F9A3Z CoreFoundationE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z stdE8CC9O9F9A3Z stdE8CC9O9F9A3Z CoreFoundationE8CC9O9F9A3Z->stdE8CC9O9F9A3Z DispatchE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z DispatchE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z os_objectE8CC9O9F9A3Z os_objectE8CC9O9F9A3Z DispatchE8CC9O9F9A3Z->os_objectE8CC9O9F9A3Z DarwinE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z _Builtin_stddef_max_align_tE8CC9O9F9A3Z _Builtin_stddef_max_align_tE8CC9O9F9A3Z DarwinE8CC9O9F9A3Z->_Builtin_stddef_max_align_tE8CC9O9F9A3Z stdE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z stdE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z stdE8CC9O9F9A3Z->_Builtin_stddef_max_align_tE8CC9O9F9A3Z os_objectE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z LLVM_AnalysisE8CC9O9F9A3Z->LLVM_ProfileDataE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_PassE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_CE8CC9O9F9A3Z LLVM_CE8CC9O9F9A3Z LLVM_IRE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_intrinsic_genE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_Config_ABI_BreakingE8CC9O9F9A3Z LLVM_Config_ABI_BreakingE8CC9O9F9A3Z LLVM_UtilsE8CC9O9F9A3Z->LLVM_Config_ABI_BreakingE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_ProfileDataE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_AsmParserE8CC9O9F9A3Z LLVM_AsmParserE8CC9O9F9A3Z LLVM_AsmParserE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_AsmParserE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_AsmParserE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_AnalysisE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_Backend_TargetE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_MCE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_BackendE8CC9O9F9A3Z->LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_BinaryFormatE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_MCE8CC9O9F9A3Z LLVM_Backend_TargetE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_MCE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_MC_TableGenE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_CE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_CE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_CE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_BitcodeE8CC9O9F9A3Z->LLVM_MCE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z LLVM_DebugInfoE8CC9O9F9A3Z->LLVM_ObjectE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_MCE8CC9O9F9A3Z LLVM_ObjectE8CC9O9F9A3Z->LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->LLVM_DebugInfoE8CC9O9F9A3Z LLVM_DebugInfo_DWARFE8CC9O9F9A3Z->LLVM_ObjectE8CC9O9F9A3Z LLVM_DebugInfo_MSFE8CC9O9F9A3Z LLVM_DebugInfo_MSFE8CC9O9F9A3Z LLVM_DebugInfo_MSFE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_DebugInfo_MSFE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->LLVM_BinaryFormatE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->LLVM_DebugInfoE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->LLVM_DebugInfo_CodeViewE8CC9O9F9A3Z LLVM_DebugInfo_PDBE8CC9O9F9A3Z->LLVM_DebugInfo_MSFE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_Config_ConfigE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_Backend_TargetE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_MC_TableGenE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_DebugInfoE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_ObjectE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z LLVM_ExecutionEngineE8CC9O9F9A3Z->LLVM_TransformsE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_AnalysisE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_PassE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_TransformsE8CC9O9F9A3Z->LLVM_ProfileDataE8CC9O9F9A3Z LLVM_IRReaderE8CC9O9F9A3Z LLVM_IRReaderE8CC9O9F9A3Z LLVM_IRReaderE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_IRReaderE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_IRE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_intrinsic_genE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_Backend_TargetE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_ObjectE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->LLVM_TransformsE8CC9O9F9A3Z XPCE8CC9O9F9A3Z XPCE8CC9O9F9A3Z LLVM_LTOE8CC9O9F9A3Z->XPCE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->DispatchE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->stdE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->os_objectE8CC9O9F9A3Z launchE8CC9O9F9A3Z launchE8CC9O9F9A3Z XPCE8CC9O9F9A3Z->launchE8CC9O9F9A3Z LLVM_LineEditorE8CC9O9F9A3Z LLVM_LineEditorE8CC9O9F9A3Z LLVM_LineEditorE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_LineEditorE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_OptionE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_Support_TargetRegistryE8CC9O9F9A3Z->LLVM_CE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z->stdE8CC9O9F9A3Z LLVM_TableGenE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z LLVM_WindowsManifestE8CC9O9F9A3Z LLVM_WindowsManifestE8CC9O9F9A3Z LLVM_WindowsManifestE8CC9O9F9A3Z->LLVM_UtilsE8CC9O9F9A3Z MachOE8CC9O9F9A3Z MachOE8CC9O9F9A3Z MachOE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z MachOE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z MachOE8CC9O9F9A3Z->stdE8CC9O9F9A3Z launchE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z launchE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z libxml2E8CC9O9F9A3Z libxml2E8CC9O9F9A3Z libxml2E8CC9O9F9A3Z->std_configE8CC9O9F9A3Z libxml2E8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z zlibE8CC9O9F9A3Z zlibE8CC9O9F9A3Z zlibE8CC9O9F9A3Z->std_configE8CC9O9F9A3Z zlibE8CC9O9F9A3Z->DarwinE8CC9O9F9A3Z DarwinOWOOEIWRWCYO DarwinOWOOEIWRWCYO std_configOWOOEIWRWCYO std_configOWOOEIWRWCYO DarwinOWOOEIWRWCYO->std_configOWOOEIWRWCYO _Builtin_stddef_max_align_tOWOOEIWRWCYO _Builtin_stddef_max_align_tOWOOEIWRWCYO DarwinOWOOEIWRWCYO->_Builtin_stddef_max_align_tOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_Config_ConfigOWOOEIWRWCYO LLVM_Config_ConfigOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO LLVM_IROWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO stdOWOOEIWRWCYO stdOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO LLVM_AnalysisOWOOEIWRWCYO->LLVM_ProfileDataOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_PassOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_COWOOEIWRWCYO LLVM_COWOOEIWRWCYO LLVM_IROWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_intrinsic_genOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_Config_ABI_BreakingOWOOEIWRWCYO LLVM_Config_ABI_BreakingOWOOEIWRWCYO LLVM_UtilsOWOOEIWRWCYO->LLVM_Config_ABI_BreakingOWOOEIWRWCYO stdOWOOEIWRWCYO->DarwinOWOOEIWRWCYO stdOWOOEIWRWCYO->std_configOWOOEIWRWCYO stdOWOOEIWRWCYO->_Builtin_stddef_max_align_tOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_ProfileDataOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_AsmParserOWOOEIWRWCYO LLVM_AsmParserOWOOEIWRWCYO LLVM_AsmParserOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_AsmParserOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_AsmParserOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_AnalysisOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_Backend_TargetOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_MCOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO LLVM_BackendOWOOEIWRWCYO->LLVM_MC_TableGenOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_BinaryFormatOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_MCOWOOEIWRWCYO LLVM_Backend_TargetOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->LLVM_MC_TableGenOWOOEIWRWCYO LLVM_MCOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_MC_TableGenOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_COWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_COWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_COWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_BitcodeOWOOEIWRWCYO->LLVM_MCOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO LLVM_DebugInfoOWOOEIWRWCYO->LLVM_ObjectOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_MCOWOOEIWRWCYO LLVM_ObjectOWOOEIWRWCYO->LLVM_MC_TableGenOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_DebugInfo_CodeViewOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->LLVM_DebugInfoOWOOEIWRWCYO LLVM_DebugInfo_DWARFOWOOEIWRWCYO->LLVM_ObjectOWOOEIWRWCYO LLVM_DebugInfo_MSFOWOOEIWRWCYO LLVM_DebugInfo_MSFOWOOEIWRWCYO LLVM_DebugInfo_MSFOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_DebugInfo_MSFOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->LLVM_BinaryFormatOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->LLVM_DebugInfoOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->LLVM_DebugInfo_CodeViewOWOOEIWRWCYO LLVM_DebugInfo_PDBOWOOEIWRWCYO->LLVM_DebugInfo_MSFOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_Config_ConfigOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_Backend_TargetOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_MC_TableGenOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_DebugInfoOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_ObjectOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO LLVM_ExecutionEngineOWOOEIWRWCYO->LLVM_TransformsOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_AnalysisOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_PassOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_IROWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_intrinsic_genOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_TransformsOWOOEIWRWCYO->LLVM_ProfileDataOWOOEIWRWCYO LLVM_IRReaderOWOOEIWRWCYO LLVM_IRReaderOWOOEIWRWCYO LLVM_IRReaderOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_IRReaderOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_LineEditorOWOOEIWRWCYO LLVM_LineEditorOWOOEIWRWCYO LLVM_LineEditorOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_LineEditorOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_OptionOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO->DarwinOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO->std_configOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO->LLVM_UtilsOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO->stdOWOOEIWRWCYO LLVM_Support_TargetRegistryOWOOEIWRWCYO->LLVM_COWOOEIWRWCYO DarwinTE2C3XR0BJU4 DarwinTE2C3XR0BJU4 std_configTE2C3XR0BJU4 std_configTE2C3XR0BJU4 DarwinTE2C3XR0BJU4->std_configTE2C3XR0BJU4 _Builtin_stddef_max_align_tTE2C3XR0BJU4 _Builtin_stddef_max_align_tTE2C3XR0BJU4 DarwinTE2C3XR0BJU4->_Builtin_stddef_max_align_tTE2C3XR0BJU4 stdTE2C3XR0BJU4 stdTE2C3XR0BJU4 stdTE2C3XR0BJU4->DarwinTE2C3XR0BJU4 stdTE2C3XR0BJU4->std_configTE2C3XR0BJU4 stdTE2C3XR0BJU4->_Builtin_stddef_max_align_tTE2C3XR0BJU4
Orc IRCompileLayer.cpp Orc IRCompileLayer.cpp ExecutionEngine ExecutionEngine Transforms Transforms Analysis Analysis ProfileData ProfileData intrinsic_gen intrinsic_gen IR IR BinaryFormat BinaryFormat Utils Utils C C std std Darwin Darwin _Builtin_stddef_max_align_t _Builtin_stddef_max_align_t

Most of the speed benefit from using these modules come from re-using the artifacts for these 5 configurations across 2440 C++ TUs. In a clean build of LLVM using Clang Modules, we see about a 30% speedup (10m10s vs 13m44s) using ninja -j6. A more complete survey including different configurations should cover more accurate performance results, but this illustrates one data point commonly found at a developer’s desk.

It’s possible to build a strawperson example which performs poorly, but this is an example of a real C++ project that benefits from the reuse of some form of module artifacts.

This example uses Clang’s implicit modules in which each compiler invocation lazily builds the modules it depends on, and often time multiple compiler invocations are building the same module. Building modules lazily doesn’t solve the problem of the added build dependencies. You still have to build the same number of modules before you can proceed with the translation unit, only now multiple TUs are doing duplicate work instead of sharing it. There’s also no real parallelism exposed because the preamble must be the first thing and no real parsing work will be done until the dependencies have been compiled.

4. Standard Library

Yet another contentious topic is Standard Library modularization. [P1427R0] expresses a desire that the Standard Library be modularized along with the standardization of modules. [P1453R0] brings interesting points, such as the rare opportunity for reorganization and the limited time for C++20. Our current understanding is that standard library modularization shouldn’t be a requirement for the standardization of modules.

In the clang Modules world, there’s modularization support for libc++. Supporting this modularization was not straightforward given the potential non-modular nature of headers and the underlying includes from other system headers. We end up with a module map that has a lot of workarounds and does not fully respect layering. Although C++ Modules are different from clang Modules, some of the problems here are the same: to do it right, a rethink of organization and layering is a must. We don’t trust that any rush to get this in will be beneficial at this point. The same might not be true for other implementations of the standard library, but there’s a chance other vendors might also be abusing header inclusion and preprocessor tricks.

The types of issues we describe for the standard library are the types of issues regular developer code will encounter when modularizing their code base.

References

Informative References

[P0778R0]
Nathan Sidwell. Module Names. 10 October 2017. URL: https://wg21.link/p0778r0
[P1103R1]
Richard Smith. Merging Modules. 8 October 2018. URL: https://wg21.link/p1103r1
[P1427R0]
Peter Bindels, Ben Craig, Steve Downey, Rene Rivera, Tom Honermann, Corentin Jabot, Stephen Kelly. Concerns about module toolability. 20 November 2018. URL: https://wg21.link/p1427r0
[P1453R0]
Bryce Adelstein Lelbach. Modularizing the Standard Library is a Reorganization Opportunity. 21 January 2019. URL: https://wg21.link/p1453r0