[DebugInfo][DwarfDebug] Move emission of globals from beginModule() to endModule() (5/7) (#184219) RFC https://discourse.llvm.org/t/rfc-dwarfdebug-fix-and-improve-handling-imported-entities-types-and-static-local-in-subprogram-and-lexical-block-scopes/68544 This patch moves the emission of global variables from `DwarfDebug::beginModule()` to `DwarfDebug::endModule()`. It has the following effects: 1. The order of debug entities in the resulting DWARF changes. 2. Currently, if a DISubprogram requires emission of both concrete out-of-line and inlined subprogram DIEs, and such a subprogram contains a static local variable, the DIE for the variable is emitted into the concrete out-of-line subprogram DIE. As a result, the variable is not available in debugger when breaking at the inlined function instance. It happens because static locals are emitted in `DwarfDebug::beginModule()`, but abstract DIEs for functions that are not completely inlined away are created only later during `DwarfDebug::endFunctionImpl()` calls. With this patch, DIEs for static local variables of subprograms that have both inlined and the concrete out-of-line instances are placed into abstract subprogram DIEs. They become visible in debugger when breaking at concrete out-of-line and inlined function instances. `llvm/test/DebugInfo/Generic/inlined-static-var.ll` illustrates that. 3. It will allow to simplify abstract subprogram DIEs creation by reverting https://github.com/llvm/llvm-project/pull/159104 later. This is needed to simplify DWARF emission in a context of proper support of function-local static variables which comes in the next patch (https://reviews.llvm.org/D144008), making all function-local entities handled in `DwarfDebug::endModuleImpl()`. Authored-by: Kristina Bessonova <kbessonova@accesssoftek.com> Co-authored-by: David Blaikie <dblaikie@gmail.com> Co-authored-by: Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com>
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.