Index: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -2064,28 +2064,53 @@ // LocalSym record, see SymbolRecord.h for more info. MCSymbol *LocalBegin = MMI->getContext().createTempSymbol(), *LocalEnd = MMI->getContext().createTempSymbol(); + TypeIndex TI = getCompleteTypeIndex(Var.DIVar->getType()); OS.AddComment("Record length"); OS.emitAbsoluteSymbolDiff(LocalEnd, LocalBegin, 2); OS.EmitLabel(LocalBegin); + if (Var.DefRanges.size() == 1) { + auto &DefRange = Var.DefRanges[0]; + if (DefRange.InMemory) { + if (DefRange.CVRegister == uint16_t(codeview::RegisterId::EBP)) { + OS.AddComment("Record kind: S_BPREL32"); + OS.EmitIntValue(unsigned(SymbolKind::S_BPREL32), 2); + } else { + OS.AddComment("Record kind: S_REGREL32"); + OS.EmitIntValue(unsigned(SymbolKind::S_REGREL32), 2); + } + OS.EmitIntValue(DefRange.DataOffset, 4); + OS.AddComment("TypeIndex"); + OS.EmitIntValue(TI.getIndex(), 4); + if (DefRange.CVRegister != uint16_t(codeview::RegisterId::EBP)) + OS.EmitIntValue(DefRange.CVRegister, 2); + } else { + OS.AddComment("Record kind: S_REGISTER"); + OS.EmitIntValue(unsigned(SymbolKind::S_REGISTER), 2); + OS.AddComment("TypeIndex"); + OS.EmitIntValue(TI.getIndex(), 4); + OS.EmitIntValue(DefRange.CVRegister, 2); + } + } else { + OS.AddComment("Record kind: S_LOCAL"); + OS.EmitIntValue(unsigned(SymbolKind::S_LOCAL), 2); + LocalSymFlags Flags = LocalSymFlags::None; + if (Var.DIVar->isParameter()) + Flags |= LocalSymFlags::IsParameter; + if (Var.DefRanges.empty()) + Flags |= LocalSymFlags::IsOptimizedOut; + OS.AddComment("TypeIndex"); + OS.EmitIntValue(TI.getIndex(), 4); + OS.AddComment("Flags"); + OS.EmitIntValue(static_cast(Flags), 2); + } - OS.AddComment("Record kind: S_LOCAL"); - OS.EmitIntValue(unsigned(SymbolKind::S_LOCAL), 2); - - LocalSymFlags Flags = LocalSymFlags::None; - if (Var.DIVar->isParameter()) - Flags |= LocalSymFlags::IsParameter; - if (Var.DefRanges.empty()) - Flags |= LocalSymFlags::IsOptimizedOut; - - OS.AddComment("TypeIndex"); - TypeIndex TI = getCompleteTypeIndex(Var.DIVar->getType()); - OS.EmitIntValue(TI.getIndex(), 4); - OS.AddComment("Flags"); - OS.EmitIntValue(static_cast(Flags), 2); // Truncate the name so we won't overflow the record length field. emitNullTerminatedSymbolName(OS, Var.DIVar->getName()); OS.EmitLabel(LocalEnd); + if (Var.DefRanges.size() <= 1) + return; + // Calculate the on disk prefix of the appropriate def range record. The // records and on disk formats are described in SymbolRecords.h. BytePrefix // should be big enough to hold all forms without memory allocation.