【问题标题】:How to compile some modules in LLVM with debug mode, others with release mode?如何在调试模式下编译 LLVM 中的一些模块,在发布模式下编译其他模块?
【发布时间】:2017-08-10 10:48:23
【问题描述】:

完全调试编译需要太多内存。我的机器只有4GB内存。我想使用调试编译器调试一个模块,其他模块使用发布编译。

一般来说,我使用以下命令在调试模式或发布模式下构建 LLVM:

cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Release" 

cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Debug" 

构建类型的选择会影响整个构建过程。完整的调试版本不方便调试,因为它需要大约 13GB 内存。我只想调试一小部分代码。

示例:我想制作llvm/lib/IR 模块调试版本。如何修改llvm\lib\IR中的CMakeLists.txt

【问题讨论】:

  • 怀疑这在没有太多黑客攻击的情况下是可能的。
  • 如果不破解 LLVM 的 CMakeLists 文件,这可能是不可能的。但如果你准备好破解它们,这绝对是可能的。
  • 我不明白为什么这个问题被搁置了。似乎选民完全脱离了上下文,因为这个问题绝对清楚有效。
  • @freyone,你的问题对我来说很清楚,但我可以看到它如何混淆那些投票支持这个问题被关闭为“过于宽泛”的人。请填写更多详细信息,例如您正在从源代码构建 LLVM 并希望调试其特定模块等。

标签: llvm


【解决方案1】:

LLVM 与 CMake 一起使用,因此要在特定模块上启用调试模式,您需要在特定文件上启用 -g 标志或在整个构建目标上启用它。您很可能需要:

COMPILE_FLAGSCOMPILE_DEFITIONS 目标属性(参见Difference between COMPILE_FLAGS and COMPILE_OPTIONS)或COMPILE_FLAGS 源文件属性。

我已经在一个项目上快速尝试过,包括文件级别和目标级别,并且可以确认它是可行的。

假设您有一个文件MySourceFile.cpp 和一个构建目标MyTarget。下面我添加-hack-target-hack-file 以更好地了解结果。

set(my_source_files
  MySourceFile.cpp
)

add_library(MyTarget SHARED ${my_source_files} ...)

在目标级别上添加 -g 标志:

get_target_property(my_target_compile_flags MyTarget COMPILE_FLAGS)
if (NOT my_target_compile_flags)
  set(my_target_compile_flags "")
endif()
set_target_properties(MyTarget
                      PROPERTIES COMPILE_OPTIONS  
                      "${my_target_compile_options} -g -hack-target")

在源文件级别添加 -g 标志:

get_source_file_property(my_source_file_compile_flags
                         MySource.cpp
                         COMPILE_FLAGS)

if (NOT my_source_file_compile_flags)
  set(my_source_file_compile_flags "")
endif()
set_source_files_properties(MySource.cpp
                            PROPERTIES
                            COMPILE_FLAGS
                            "${my_source_file_compile_flags} -g -hack-file")

从以上几行可以创建 CMake 辅助函数,以便您更轻松地在需要的东西上启用 -g 标志。


我可以谈谈这在 Ninja 和 Xcode 上的工作原理:

忍者

$ grep -ri "hack-" BuildNinja

BuildNinja//build.ninja:  FLAGS = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -fPIC    -g -hack-target -std=c++11  -g -hack-file

Xcode

在目标级别的 Xcode -g 中转到“生成调试符号”属性:

这是标志的样子:

目标一:

文件一:

【讨论】:

  • 根据您的建议。我在我的模块中修改了 Cmakelists.txt。之后,如何cmake?还是“cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Release" ”需要加“-g”吗?
  • 不,您只需在 CMakeLists 中添加 -g,就像我展示的那样。无需在其他任何地方传递。
  • 是的,您必须再次运行cmake ... 命令。随意使用 CMake 的 message 命令来调试您的 CMakeLists 文件。示例:message(STATUS "This is debug string you will see when you run cmake")。另见stackoverflow.com/a/5403778/598057
  • 您的意思是获取 COMPILE_OPTIONS 的_target_property 而不是 COMPILE_FLAGS?
  • 我想我在回答时发布了工作代码。你可能知道它们是同一个东西:stackoverflow.com/questions/24302073/…,对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多