diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-08 17:34:50 +0000 |
commit | 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch) | |
tree | 62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | |
parent | cf037972ea8863e2bab7461d77345367d2c1e054 (diff) | |
parent | 7fa27ce4a07f19b07799a767fc29416f3b625afb (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 0a67c4b6beb6..8161de57b58e 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -16,7 +16,6 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/TinyPtrVector.h" -#include "llvm/ADT/Triple.h" #include "llvm/ADT/Twine.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/BinaryFormat/Dwarf.h" @@ -65,6 +64,7 @@ #include "llvm/Support/ScopedPrinter.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/TargetParser/Triple.h" #include <algorithm> #include <cassert> #include <cctype> @@ -488,10 +488,10 @@ void CodeViewDebug::recordLocalVariable(LocalVariable &&Var, // This variable was inlined. Associate it with the InlineSite. const DISubprogram *Inlinee = Var.DIVar->getScope()->getSubprogram(); InlineSite &Site = getInlineSite(InlinedAt, Inlinee); - Site.InlinedLocals.emplace_back(Var); + Site.InlinedLocals.emplace_back(std::move(Var)); } else { // This variable goes into the corresponding lexical scope. - ScopeVariables[LS].emplace_back(Var); + ScopeVariables[LS].emplace_back(std::move(Var)); } } @@ -569,7 +569,6 @@ static SourceLanguage MapDWLangToCVLang(unsigned DWLang) { case dwarf::DW_LANG_C89: case dwarf::DW_LANG_C99: case dwarf::DW_LANG_C11: - case dwarf::DW_LANG_ObjC: return SourceLanguage::C; case dwarf::DW_LANG_C_plus_plus: case dwarf::DW_LANG_C_plus_plus_03: @@ -595,6 +594,10 @@ static SourceLanguage MapDWLangToCVLang(unsigned DWLang) { return SourceLanguage::Swift; case dwarf::DW_LANG_Rust: return SourceLanguage::Rust; + case dwarf::DW_LANG_ObjC: + return SourceLanguage::ObjC; + case dwarf::DW_LANG_ObjC_plus_plus: + return SourceLanguage::ObjCpp; default: // There's no CodeView representation for this language, and CV doesn't // have an "unknown" option for the language field, so we'll use MASM, @@ -788,7 +791,6 @@ void CodeViewDebug::emitObjName() { // Don't emit the filename if we're writing to stdout or to /dev/null. PathRef = {}; } else { - llvm::sys::path::remove_dots(PathStore, /*remove_dot_dot=*/true); PathRef = PathStore; } @@ -1158,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. @@ -1262,7 +1271,8 @@ void CodeViewDebug::collectVariableInfoFromMFTable( const TargetFrameLowering *TFI = TSI.getFrameLowering(); const TargetRegisterInfo *TRI = TSI.getRegisterInfo(); - for (const MachineFunction::VariableDbgInfo &VI : MF.getVariableDbgInfo()) { + for (const MachineFunction::VariableDbgInfo &VI : + MF.getInStackSlotVariableDbgInfo()) { if (!VI.Var) continue; assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) && @@ -1290,7 +1300,8 @@ void CodeViewDebug::collectVariableInfoFromMFTable( // Get the frame register used and the offset. Register FrameReg; - StackOffset FrameOffset = TFI->getFrameIndexReference(*Asm->MF, VI.Slot, FrameReg); + StackOffset FrameOffset = + TFI->getFrameIndexReference(*Asm->MF, VI.getStackSlot(), FrameReg); uint16_t CVReg = TRI->getCodeViewRegNum(FrameReg); assert(!FrameOffset.getScalable() && @@ -1476,6 +1487,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) { @@ -1717,12 +1729,13 @@ TypeIndex CodeViewDebug::lowerTypeArray(const DICompositeType *Ty) { // Otherwise, if it has an upperboud, use (upperbound - lowerbound + 1), // where lowerbound is from the LowerBound field of the Subrange, // or the language default lowerbound if that field is unspecified. - if (auto *CI = Subrange->getCount().dyn_cast<ConstantInt *>()) + if (auto *CI = dyn_cast_if_present<ConstantInt *>(Subrange->getCount())) Count = CI->getSExtValue(); - else if (auto *UI = Subrange->getUpperBound().dyn_cast<ConstantInt *>()) { + else if (auto *UI = dyn_cast_if_present<ConstantInt *>( + Subrange->getUpperBound())) { // Fortran uses 1 as the default lowerbound; other languages use 0. int64_t Lowerbound = (moduleIsInFortran()) ? 1 : 0; - auto *LI = Subrange->getLowerBound().dyn_cast<ConstantInt *>(); + auto *LI = dyn_cast_if_present<ConstantInt *>(Subrange->getLowerBound()); Lowerbound = (LI) ? LI->getSExtValue() : Lowerbound; Count = UI->getSExtValue() - Lowerbound + 1; } @@ -1793,12 +1806,14 @@ TypeIndex CodeViewDebug::lowerTypeBasic(const DIBasicType *Ty) { } break; case dwarf::DW_ATE_complex_float: + // The CodeView size for a complex represents the size of + // an individual component. switch (ByteSize) { - case 2: STK = SimpleTypeKind::Complex16; break; - case 4: STK = SimpleTypeKind::Complex32; break; - case 8: STK = SimpleTypeKind::Complex64; break; - case 10: STK = SimpleTypeKind::Complex80; break; - case 16: STK = SimpleTypeKind::Complex128; break; + case 4: STK = SimpleTypeKind::Complex16; break; + case 8: STK = SimpleTypeKind::Complex32; break; + case 16: STK = SimpleTypeKind::Complex64; break; + case 20: STK = SimpleTypeKind::Complex80; break; + case 32: STK = SimpleTypeKind::Complex128; break; } break; case dwarf::DW_ATE_float: @@ -3279,7 +3294,7 @@ void CodeViewDebug::emitDebugInfoForGlobals() { // Second, emit each global that is in a comdat into its own .debug$S // section along with its own symbol substream. for (const CVGlobalVariable &CVGV : ComdatVariables) { - const GlobalVariable *GV = CVGV.GVInfo.get<const GlobalVariable *>(); + const GlobalVariable *GV = cast<const GlobalVariable *>(CVGV.GVInfo); MCSymbol *GVSym = Asm->getSymbol(GV); OS.AddComment("Symbol subsection for " + Twine(GlobalValue::dropLLVMManglingEscape(GV->getName()))); @@ -3388,7 +3403,7 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { : getFullyQualifiedName(Scope, DIGV->getName()); if (const GlobalVariable *GV = - CVGV.GVInfo.dyn_cast<const GlobalVariable *>()) { + dyn_cast_if_present<const GlobalVariable *>(CVGV.GVInfo)) { // DataSym record, see SymbolRecord.h for more info. Thread local data // happens to have the same format as global data. MCSymbol *GVSym = Asm->getSymbol(GV); @@ -3403,7 +3418,7 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { OS.AddComment("DataOffset"); uint64_t Offset = 0; - if (CVGlobalVariableOffsets.find(DIGV) != CVGlobalVariableOffsets.end()) + if (CVGlobalVariableOffsets.contains(DIGV)) // Use the offset seen while collecting info on globals. Offset = CVGlobalVariableOffsets[DIGV]; OS.emitCOFFSecRel32(GVSym, Offset); @@ -3415,7 +3430,7 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) { emitNullTerminatedSymbolName(OS, QualifiedName, LengthOfDataRecord); endSymbolRecord(DataEnd); } else { - const DIExpression *DIE = CVGV.GVInfo.get<const DIExpression *>(); + const DIExpression *DIE = cast<const DIExpression *>(CVGV.GVInfo); assert(DIE->isConstant() && "Global constant variables must contain a constant expression."); |