diff options
author | Daniel Paoliello <danpao@microsoft.com> | 2023-05-03 17:22:52 -0700 |
---|---|---|
committer | Eli Friedman <efriedma@quicinc.com> | 2023-05-03 18:20:16 -0700 |
commit | e48826e016e2f427f3b7b1274166aa9aa0ea7f4f (patch) | |
tree | 2d94cb8fcb0c9ccd6e9ea9ae5143f7eeba625f2a /llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | |
parent | 1c2b8129e99478a9b0222fc0aaf44a4a47e7ecd6 (diff) | |
download | llvm-e48826e016e2f427f3b7b1274166aa9aa0ea7f4f.zip llvm-e48826e016e2f427f3b7b1274166aa9aa0ea7f4f.tar.gz llvm-e48826e016e2f427f3b7b1274166aa9aa0ea7f4f.tar.bz2 |
Emit the correct flags for the PROC CodeView Debug Symbol
The S_LPROC32_ID and S_GPROC32_ID CodeView Debug Symbols have a flags
field which LLVM has had the values for (in the ProcSymFlags enum) but
has never actually set.
These flags are used by Microsoft-internal tooling that leverages debug
information to do binary analysis.
Modified LLVM to set the correct flags:
- ProcSymFlags::HasOptimizedDebugInfo - always set, as this indicates that
debug info is present for optimized builds (if debug info is not emitted
for optimized builds, then LLVM won't emit a debug symbol at all).
- ProcSymFlags::IsNoReturn and ProcSymFlags::IsNoInline - set if the
function has the NoReturn or NoInline attributes respectively.
- ProcSymFlags::HasFP - set if the function requires a frame pointer (per
TargetFrameLowering::hasFP).
Differential Revision: https://reviews.llvm.org/D148761
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 3494ae0..8a1218a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -1160,7 +1160,14 @@ void CodeViewDebug::emitDebugInfoForFunction(const Function *GV, OS.AddComment("Function section index"); OS.emitCOFFSectionIndex(Fn); OS.AddComment("Flags"); - OS.emitInt8(0); + ProcSymFlags ProcFlags = ProcSymFlags::HasOptimizedDebugInfo; + if (FI.HasFramePointer) + ProcFlags |= ProcSymFlags::HasFP; + if (GV->hasFnAttribute(Attribute::NoReturn)) + ProcFlags |= ProcSymFlags::IsNoReturn; + if (GV->hasFnAttribute(Attribute::NoInline)) + ProcFlags |= ProcSymFlags::IsNoInline; + OS.emitInt8(static_cast<uint8_t>(ProcFlags)); // Emit the function display name as a null-terminated string. OS.AddComment("Function name"); // Truncate the name so we won't overflow the record length field. @@ -1478,6 +1485,7 @@ void CodeViewDebug::beginFunctionImpl(const MachineFunction *MF) { CurFn->EncodedLocalFramePtrReg = EncodedFramePtrReg::StackPtr; CurFn->EncodedParamFramePtrReg = EncodedFramePtrReg::StackPtr; } else { + CurFn->HasFramePointer = true; // If there is an FP, parameters are always relative to it. CurFn->EncodedParamFramePtrReg = EncodedFramePtrReg::FramePtr; if (CurFn->HasStackRealignment) { |