llvm-project/lld/test/COFF/pdb-local-constants.test
Tobias Hieta 2298a44ccd
[CodeView] Add support for local S_CONSTANT records
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
2022-12-06 10:34:01 +01:00

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