[PATCH] D146591: [dataflow] add HTML logger: browse code/cfg/analysis timeline/state

Martin Storsjö via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 20 00:29:06 PDT 2023


mstorsjo added a comment.

FYI, I'm seeing occasional spurious build breakage from this change.

The issue is that even if we've got `add_dependencies(clangAnalysisFlowSensitive clangAnalysisFlowSensitiveResources)`, it looks like `clangAnalysisFlowSensitiveResources` only is considered a dependency to the whole `clangAnalysisFlowSensitive` library target, but the individual `HTMLLogger.cpp.o` object file doesn't have a dependency on the generated `HTMLLogger.inc` file. So when building, it may start building `HTMLLogger.cpp.o` before `HTMLLogger.inc` has been generated.

To reproduce it:

  $ cd llvm-project/llvm
  $ mkdir build
  $ cd build
  $ cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang"
  $ ninja tools/clang/lib/Analysis/FlowSensitive/CMakeFiles/obj.clangAnalysisFlowSensitive.dir/HTMLLogger.cpp.o
  ../tools/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp:72:10: fatal error: HTMLLogger.inc: No such file or directory
     72 | #include "HTMLLogger.inc"
        |          ^~~~~~~~~~~~~~~~

If you've built this successfully once, then ninja also has picked up the dependency between `HTMLLogger.cpp.o` and `HTMLLogger.inc`, but it's possible to reproduce this in a clean build dir with the commands above.

Looking at the generated `build.ninja`, we've got this:

  build cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive: phony || tools/clang/clang-tablegen-targets
  
  build cmake_object_order_depends_target_clangAnalysisFlowSensitive: phony || cmake_object_order_depends_target_LLVMAggressiveInstCombine cmake_object_order_depends_target_LLVMAnalysis cmake_object_order_depends_target_LLVMAsmParser cmake_object_order_depends_target_LLVMBinaryFormat cmake_object_order_depends_target_LLVMBitReader cmake_object_order_depends_target_LLVMBitstreamReader cmake_object_order_depends_target_LLVMCore cmake_object_order_depends_target_LLVMDebugInfoCodeView cmake_object_order_depends_target_LLVMDebugInfoDWARF cmake_object_order_depends_target_LLVMDebugInfoMSF cmake_object_order_depends_target_LLVMDebugInfoPDB cmake_object_order_depends_target_LLVMDemangle cmake_object_order_depends_target_LLVMFrontendOpenMP cmake_object_order_depends_target_LLVMIRReader cmake_object_order_depends_target_LLVMInstCombine cmake_object_order_depends_target_LLVMMC cmake_object_order_depends_target_LLVMMCParser cmake_object_order_depends_target_LLVMObject cmake_object_order_depends_target_LLVMProfileData cmake_object_order_depends_target_LLVMRemarks cmake_object_order_depends_target_LLVMScalarOpts cmake_object_order_depends_target_LLVMSupport cmake_object_order_depends_target_LLVMSymbolize cmake_object_order_depends_target_LLVMTargetParser cmake_object_order_depends_target_LLVMTextAPI cmake_object_order_depends_target_LLVMTransformUtils cmake_object_order_depends_target_clangAST cmake_object_order_depends_target_clangASTMatchers cmake_object_order_depends_target_clangAnalysis cmake_object_order_depends_target_clangBasic cmake_object_order_depends_target_clangLex cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive tools/clang/clang-tablegen-targets tools/clang/lib/Analysis/FlowSensitive/clangAnalysisFlowSensitiveResources
  
  build tools/clang/lib/Analysis/FlowSensitive/CMakeFiles/obj.clangAnalysisFlowSensitive.dir/HTMLLogger.cpp.o: CXX_COMPILER__obj.2eclangAnalysisFlowSensitive_Release ../tools/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp || cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive

`HTMLLogger.cpp.o` depends on `cmake_object_order_depends_target_obj.clangAnalysisFlowSensitive`, but that one doesn't depend on `clangAnalysisFlowSensitiveResources`. Only `cmake_object_order_depends_target_clangAnalysisFlowSensitive` (note the missing `obj.` in the middle) depends on it.

Looking at the similarly handled `HTMLForestResources.inc` in `clang-pseudo`, that one does work correctly. That one is set up with `add_clang_tool`, where there's no intermediate object library between the target itself and the object files as for `add_clang_library`.

Not sure what the right CMake way to handle it is - should the dependency be added for the intermediate object library? (Looking in the cmake files, it doesn't seem like we always generate object libraries.) Or should we add an explicit dependency for the `HTMLLogger.cpp` source file?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D146591/new/

https://reviews.llvm.org/D146591



More information about the cfe-commits mailing list