LLVM后端怎么输出栈展开和调试信息

梦杰酱_1649

梦杰酱_1649

2026-10-03

136人浏览

原创

llvm后端不直接输出栈展开或调试信息,而是生成供运行时和调试器使用的元数据:需在machineinstr/mcinst中注入lsda描述符(依赖abi及ehstreamer)和dbg_instr_ref(依赖debug-instr-number与getdebugloc),并确保emitprologue/epilogue、cfi指令、invoke支持、寄存器分配时的debug值替换等环节正确实现。

llvm后端怎么输出栈展开和调试信息

LLVM 后端本身不直接“输出”栈展开或调试信息,而是生成供运行时(如 libcxxabi)和调试器(如 gdb、lldb)使用的元数据和指令标记。关键在于:你得让后端在生成 MachineInstr 和 MCInst 时,正确注入两类东西——LSDA 描述符(用于栈展开)和 DBG_INSTR_REF / debug-instr-number(用于变量位置追踪)。

怎么让 LLVM 后端生成 LSDA 和 .eh_frame 段

栈展开依赖目标平台的异常处理 ABI(如 DWARF EH 或 ARM EHABI),LLVM 通过 TargetLowering::getExceptionPointerRegister()、getExceptionSelectorRegister() 等钩子控制行为。实际输出由 AsmPrinter pass 完成:

  • 确保你的后端在 TargetFrameLowering 中正确实现 emitPrologue() 和 emitEpilogue(),并在其中调用 MCCFIInstruction 系列 API(如 addDefCfaOffset、addOffset)来生成 CFI 指令
  • 启用 -exceptions 或 -unwind-tables 编译选项(Clang 默认不开),否则 SelectionDAGBuilder 会跳过 landingpad 相关节点,AsmPrinter 也不会 emit .eh_frame
  • LSDA 内容由 EHStreamer pass 构建,它读取 MachineFunction::getLandingPads() 和每个 invoke 的 landingpad 指令;如果你的后端没支持 invoke 指令选择(比如漏了 ISD::INVOKE 的 LowerInvoke 实现),LSDA 就是空的
  • RISC-V 等无原生异常寄存器的目标,需在 TargetLowering 中返回 0 表示不支持 exception-pointer,否则 EHStreamer 可能 crash

为什么加了 -g 还看不到变量值:DBG_INSTR_REF 没生效

-g 只是开关,真正决定调试信息质量的是后端是否在每条 relevant MachineInstr 上写入 debug-instr-number,并让 DBG_VALUE 指令引用它。常见断点:

HueBit AI
HueBit AI

一款AI图像与设计工具,主要用于一站式AI艺术创作工具,适合需要提升相关任务效率的用户。

下载
  • MachineInstr::setDebugInstrNumber() 必须在指令调度前(即 MachineScheduler 之前)被调用;如果寄存器分配器(RegAlloc)做了 coalescing 或 splitting,但没调用 MachineFunction::substituteDebugValuesForInst(),DBG_INSTR_REF 就会指向已删除的指令
  • 自定义指令(如 RISC-V builtin)若没在 SelectionDAG 阶段打上 SDNode::setDebugLoc(),后续所有 MachineInstr 都不会带 debug-instr-number
  • LiveDebugVariables pass 已被弃用;新流程靠 DBG_INSTR_REF + MachineInstr::getDebugLoc() 联动,但前提是 IR 层的 dbg.value 指令没被 DCE 掉——检查是否误开了 -O2 且没加 -grecord-gcc-switches

调试时 gdb 显示 “optimized out”,但代码没开优化

这往往不是编译器问题,而是后端在寄存器分配阶段破坏了指令引用链。典型表现是 DBG_VALUE %0, $x, !123 对应的 %0 是一个 virtual register,而该 register 在 MachineInstr 中被 split 成多个物理寄存器,但 substituteDebugValuesForInst() 没被触发:

  • 确认你的 RegisterInfo 实现中,eliminateFrameIndex() 是否保留了 MachineInstr::getDebugLoc();某些后端在改写 frame index 时直接 clone 指令却丢掉了 debug loc
  • 检查 TargetPassConfig::addPreEmitPass() 是否注册了 DebugVariableManager(RISC-V 后端默认没开,需手动加)
  • 用 llc -debug-only=debug-variables 观察日志里有没有 Failed to find def for debug value —— 有就说明某条 DBG_VALUE 引用的 MachineInstr 被删了,且没做 substitution

最易被忽略的一点:LSDA 和调试信息都依赖于 MachineFunction 的 getMMI().getLandingPads() 和 getDebugValueMap() 在 code emission 前非空。如果某个 pass(比如你写的 custom instruction selector)提前清空了这些容器,后面所有输出都会静默失效,且无 warning。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2243

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5950

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5266

10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5027

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2248

6

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

60

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程