llvm-project/clang/lib/CodeGen/CMakeLists.txt
Evan Wilde c3fe727181
Add missing deps edge: CodeGenAction.cpp.o -> GenVT.inc (#109306)
CodeGenAction.cpp.o depends on generating GenVT.inc before trying to
compile it through the following header chain:

```
GenVT.inc
MachineValueType.h
LowLevelType.h
MachineMemOperand.h
MachineInstr.h
MachineBasicBlock.h
MachineFunctionPass.h
MachineOptimizationRemarkEmitter.h
CodeGenAction.cpp
```

There is a dependency edge through LLVMCodeGenTypes, but that edge is
applied to the clangCodeGen link step, not the compile step of the files
that make up clangCodeGen. Usually the compile and link are close enough
in the build that GenVT.inc is scheduled early enough that it exists by
the time we're compiling CodeGenAction.cpp.o, but on machines with high
core counts, it seems to be more prevalent that the scheduling works out
just right to expose the missing edge. I've only been able to reproduce
this on machines with at least 64 cores (but even then it was not
reliable).

Additionally, llvm-tblgen depends on GenVT.inc, so to see the missing
dependency edge, one must be using a pre-built tablegen binary.

Adding the missing dependency edge to ensure that GenVT.inc is generated
before trying to compile CodeGenAction.cpp.o.

Found by inspecting the dependency graph generated from Ninja with:

```sh
cmake -G 'Ninja' \
  ...
  -DLLVM_TABLEGEN=<path to native tblegen> \
  -DCLANG_TABLEGEN=<path to native clang tblgen> \
  -DLLVM_ENABLE_PROJECTS=clang \
  ...

ninja -t graph \
  tools/clang/lib/CodeGen/CMakeFiles/obj.clangCodeGen.dir/CodeGenAction.cpp.o | dot -Tpdf > CodeGenAction.pdf
```
2024-09-19 14:14:18 -07:00

162 lines
3.3 KiB
CMake

set(LLVM_LINK_COMPONENTS
AggressiveInstCombine
Analysis
BitReader
BitWriter
CodeGenTypes
Core
Coroutines
Coverage
Demangle
Extensions
FrontendDriver
FrontendHLSL
FrontendOpenMP
FrontendOffloading
HIPStdPar
IPO
IRPrinter
IRReader
InstCombine
Instrumentation
LTO
Linker
MC
ObjCARCOpts
Object
Passes
ProfileData
ScalarOpts
Support
Target
TargetParser
TransformUtils
)
# Workaround for MSVC ARM64 performance regression:
# https://developercommunity.visualstudio.com/t/Compiling-a-specific-code-for-ARM64-with/10444970
# Since /O1 and /O2 represent a set of optimizations,
# our goal is to disable the /Og flag while retaining the other optimizations from the /O1|/O2 set
if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES Clang
AND MSVC_VERSION VERSION_GREATER_EQUAL 1932
AND MSVC_VERSION VERSION_LESS 1939
AND CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64")
string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
string(REGEX MATCHALL "/[Oo][12]" opt_flags "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}")
if (opt_flags)
if(opt_flags MATCHES "1$")
set(opt_flags "/Od;/Os;/Oy;/Ob2;/GF;/Gy")
elseif (opt_flags MATCHES "2$")
set(opt_flags "/Od;/Oi;/Ot;/Oy;/Ob2;/GF;/Gy")
endif()
set_source_files_properties(CGBuiltin.cpp PROPERTIES COMPILE_OPTIONS "${opt_flags}")
endif()
endif()
add_clang_library(clangCodeGen
ABIInfo.cpp
ABIInfoImpl.cpp
BackendUtil.cpp
CGAtomic.cpp
CGBlocks.cpp
CGBuiltin.cpp
CGCUDANV.cpp
CGCUDARuntime.cpp
CGCXX.cpp
CGCXXABI.cpp
CGCall.cpp
CGClass.cpp
CGCleanup.cpp
CGCoroutine.cpp
CGDebugInfo.cpp
CGDecl.cpp
CGDeclCXX.cpp
CGException.cpp
CGExpr.cpp
CGExprAgg.cpp
CGExprCXX.cpp
CGExprComplex.cpp
CGExprConstant.cpp
CGExprScalar.cpp
CGGPUBuiltin.cpp
CGHLSLRuntime.cpp
CGLoopInfo.cpp
CGNonTrivialStruct.cpp
CGObjC.cpp
CGObjCGNU.cpp
CGObjCMac.cpp
CGObjCRuntime.cpp
CGOpenCLRuntime.cpp
CGOpenMPRuntime.cpp
CGOpenMPRuntimeGPU.cpp
CGPointerAuth.cpp
CGRecordLayoutBuilder.cpp
CGStmt.cpp
CGStmtOpenMP.cpp
CGVTT.cpp
CGVTables.cpp
CodeGenABITypes.cpp
CodeGenAction.cpp
CodeGenFunction.cpp
CodeGenModule.cpp
CodeGenPGO.cpp
CodeGenTBAA.cpp
CodeGenTypes.cpp
ConstantInitBuilder.cpp
CoverageMappingGen.cpp
ItaniumCXXABI.cpp
LinkInModulesPass.cpp
MacroPPCallbacks.cpp
MicrosoftCXXABI.cpp
ModuleBuilder.cpp
ObjectFilePCHContainerWriter.cpp
PatternInit.cpp
SanitizerMetadata.cpp
SwiftCallingConv.cpp
TargetInfo.cpp
Targets/AArch64.cpp
Targets/AMDGPU.cpp
Targets/ARC.cpp
Targets/ARM.cpp
Targets/AVR.cpp
Targets/BPF.cpp
Targets/CSKY.cpp
Targets/DirectX.cpp
Targets/Hexagon.cpp
Targets/Lanai.cpp
Targets/LoongArch.cpp
Targets/M68k.cpp
Targets/MSP430.cpp
Targets/Mips.cpp
Targets/NVPTX.cpp
Targets/PNaCl.cpp
Targets/PPC.cpp
Targets/RISCV.cpp
Targets/SPIR.cpp
Targets/Sparc.cpp
Targets/SystemZ.cpp
Targets/TCE.cpp
Targets/VE.cpp
Targets/WebAssembly.cpp
Targets/X86.cpp
Targets/XCore.cpp
VarBypassDetector.cpp
DEPENDS
vt_gen
intrinsics_gen
ClangDriverOptions
# These generated headers are included transitively.
ARMTargetParserTableGen
AArch64TargetParserTableGen
LINK_LIBS
clangAST
clangAnalysis
clangBasic
clangFrontend
clangLex
clangSerialization
)