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:
C++ Modules are the C++ Savior
Module preamble, configuration and dependency scanning
Deploying modules & scalability
Standard Library
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-space include
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:
Each header file has its source code minimized, by trimming down anything that is not #define
, #include
, #import
, @import
, see the code for a detailed explanation.
An #include
triggers a lookup to find out if a header is part of a module. If it is, every header that maps to the same module is bundled and serialized into a . pcm
(precompiled module). The mapping is done using external files called module maps . Each #include
of a header in a previously serialized bundle with the same configuration is essentially free.
While traversing the mapping above, installed listeners register necessary dependencies.
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:
Modern compilers will have significant freedom to explore solutions for out of process services, in-memory (or virtual) filesystems, and distributed builds; i.e., models other than a traditional filesystem.
Existing module systems will have more flexibility in transitioning to a C++ modules world.
Compiler extensions that enable bridging to other languages—such as Objective-C and WebAssembly—also have more flexibility.
Darwinism at its finest: let the best solution become de facto practice, which the Committee can explore in a separate Standing Document.
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
2440 . cpp
files which import modules. None of those are part of a module themselves, since there’s no similar concept of a module implementation unit .
173 module files (. pcm
) including all different configurations for a given module. For instance, LLVM_Utils
shows up 5 times, covering 5 different configurations.
14330 import edges modeling the total import relationships between . cpp
to . pcm
, and . pcm
to . pcm
.
The longest import path has 12 hops, illustrated below.
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 (10 m10s
vs 13 m44s
) 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.