mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:37:06 +00:00

CodeView doesn't have the ability to represent variables in other ways than as in registers or memory values, but LLVM very often transforms simple values into constants, consider this program: int f () { int i = 123; return i; } LLVM will transform `i` into a constant value and just leave behind a llvm.dbg.value, this can't be represented as a S_LOCAL record in CodeView. But we can represent it as a S_CONSTANT record. This patch checks if the location of a debug value is null, then we will insert a S_CONSTANT record instead of a S_LOCAL value with the flag "OptimizedAway". In lld we then output the S_CONSTANT in the right scope, before they where always inserted in the global stream, now we check the scope before inserting it. This has shown to improve debugging for our developers internally. Fixes to llvm/llvm-project#55958 Reviewed By: aganea Differential Revision: https://reviews.llvm.org/D138995
21 lines
781 B
Plaintext
21 lines
781 B
Plaintext
# REQUIRES: x86
|
|
# RUN: llvm-mc -filetype=obj %S/Inputs/pdb-local-constants.s -o %t.obj -triple x86_64-windows-msvc
|
|
# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe -pdb:%t.pdb -debug
|
|
# RUN: llvm-pdbutil dump -globals -symbols %t.pdb | FileCheck %s
|
|
#
|
|
# Check that LLD puts the S_CONSTANT records in the right scope
|
|
#
|
|
# Compiled from this C code, using
|
|
# clang t.cpp -g -gcodeview -S
|
|
#
|
|
# const int g_const = 321;
|
|
# int main() { int i = 123; return i + g_const; }
|
|
#
|
|
|
|
CHECK: Global Symbols
|
|
CHECK: 40 | S_CONSTANT [size = 20] `g_const`
|
|
CHECK-NEXT: type = 0x1002 (const int), value = 321
|
|
|
|
CHECK: Symbols
|
|
CHECK: 220 | S_CONSTANT [size = 12] `i`
|
|
CHECK-NEXT type = 0x0074 (int), value = 123 |