[llvm] r311977 - Revert "[codeview] support more DW_OPs for more complete debug info"
Bob Haarman via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 28 21:08:31 PDT 2017
Author: inglorion
Date: Mon Aug 28 21:08:31 2017
New Revision: 311977
URL: http://llvm.org/viewvc/llvm-project?rev=311977&view=rev
Log:
Revert "[codeview] support more DW_OPs for more complete debug info"
This reverts commit e160912f53f047bc97e572add179e08e33f4df48.
Removed:
llvm/trunk/test/CodeGen/MIR/X86/diexpr-win32.mir
Modified:
llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
llvm/trunk/test/DebugInfo/COFF/pieces.ll
llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Mon Aug 28 21:08:31 2017
@@ -949,103 +949,13 @@ void CodeViewDebug::collectVariableInfoF
}
}
-void CodeViewDebug::calculateRanges(
- LocalVariable &Var, const DbgValueHistoryMap::InstrRanges &Ranges) {
- const TargetRegisterInfo *TRI = Asm->MF->getSubtarget().getRegisterInfo();
-
- // calculate the definition ranges.
- for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
- const InsnRange &Range = *I;
- const MachineInstr *DVInst = Range.first;
- assert(DVInst->isDebugValue() && "Invalid History entry");
- // FIXME: Find a way to represent constant variables, since they are
- // relatively common.
- DbgVariableLocation Location;
- bool Supported =
- DbgVariableLocation::extractFromMachineInstruction(Location, *DVInst);
-
- // Because we cannot express DW_OP_deref in CodeView directly,
- // we use a trick: we encode the type as a reference to the
- // real type.
- if (Var.Deref) {
- // When we're encoding the type as a reference to the original type,
- // we need to remove a level of indirection from incoming locations.
- // E.g. [RSP+8] with DW_OP_deref becomes [RSP+8],
- // and [RCX+0] without DW_OP_deref becomes RCX.
- if (!Location.Deref) {
- if (Location.InMemory)
- Location.InMemory = false;
- else
- Supported = false;
- }
- } else if (Location.Deref) {
- // We've encountered a Deref range when we had not applied the
- // reference encoding. Start over using reference encoding.
- Var.Deref = true;
- Var.DefRanges.clear();
- calculateRanges(Var, Ranges);
- return;
- }
-
- // If we don't know how to handle this range, skip past it.
- if (!Supported || (Location.Offset && !Location.InMemory))
- continue;
-
- // Handle the two cases we can handle: indirect in memory and in register.
- {
- LocalVarDefRange DR;
- DR.CVRegister = TRI->getCodeViewRegNum(Location.Register);
- DR.InMemory = Location.InMemory;
- DR.DataOffset = Location.Offset;
- if (Location.FragmentInfo) {
- DR.IsSubfield = true;
- DR.StructOffset = Location.FragmentInfo->OffsetInBits / 8;
- } else {
- DR.IsSubfield = false;
- DR.StructOffset = 0;
- }
-
- if (Var.DefRanges.empty() ||
- Var.DefRanges.back().isDifferentLocation(DR)) {
- Var.DefRanges.emplace_back(std::move(DR));
- }
- }
-
- // Compute the label range.
- const MCSymbol *Begin = getLabelBeforeInsn(Range.first);
- const MCSymbol *End = getLabelAfterInsn(Range.second);
- if (!End) {
- // This range is valid until the next overlapping bitpiece. In the
- // common case, ranges will not be bitpieces, so they will overlap.
- auto J = std::next(I);
- const DIExpression *DIExpr = DVInst->getDebugExpression();
- while (J != E &&
- !fragmentsOverlap(DIExpr, J->first->getDebugExpression()))
- ++J;
- if (J != E)
- End = getLabelBeforeInsn(J->first);
- else
- End = Asm->getFunctionEnd();
- }
-
- // If the last range end is our begin, just extend the last range.
- // Otherwise make a new range.
- SmallVectorImpl<std::pair<const MCSymbol *, const MCSymbol *>> &R =
- Var.DefRanges.back().Ranges;
- if (!R.empty() && R.back().second == Begin)
- R.back().second = End;
- else
- R.emplace_back(Begin, End);
-
- // FIXME: Do more range combining.
- }
-}
-
void CodeViewDebug::collectVariableInfo(const DISubprogram *SP) {
DenseSet<InlinedVariable> Processed;
// Grab the variable info that was squirreled away in the MMI side-table.
collectVariableInfoFromMFTable(Processed);
+ const TargetRegisterInfo *TRI = Asm->MF->getSubtarget().getRegisterInfo();
+
for (const auto &I : DbgValues) {
InlinedVariable IV = I.first;
if (Processed.count(IV))
@@ -1068,7 +978,89 @@ void CodeViewDebug::collectVariableInfo(
LocalVariable Var;
Var.DIVar = DIVar;
- calculateRanges(Var, Ranges);
+ // Calculate the definition ranges.
+ for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
+ const InsnRange &Range = *I;
+ const MachineInstr *DVInst = Range.first;
+ assert(DVInst->isDebugValue() && "Invalid History entry");
+ const DIExpression *DIExpr = DVInst->getDebugExpression();
+ bool InMemory = DVInst->getOperand(1).isImm();
+ bool IsSubfield = false;
+ unsigned StructOffset = 0;
+ // Recognize a +Offset expression.
+ int Offset = 0;
+ DIExpressionCursor Ops(DIExpr);
+ auto Op = Ops.peek();
+ if (Op && Op->getOp() == dwarf::DW_OP_plus_uconst) {
+ Offset = Op->getArg(0);
+ Ops.take();
+ }
+
+ // Handle fragments.
+ auto Fragment = Ops.getFragmentInfo();
+ if (Fragment) {
+ IsSubfield = true;
+ StructOffset = Fragment->OffsetInBits / 8;
+ }
+ // Ignore unrecognized exprs.
+ if (Ops.peek() && Ops.peek()->getOp() != dwarf::DW_OP_LLVM_fragment)
+ continue;
+ if (!InMemory && Offset)
+ continue;
+
+ // Bail if operand 0 is not a valid register. This means the variable is a
+ // simple constant, or is described by a complex expression.
+ // FIXME: Find a way to represent constant variables, since they are
+ // relatively common.
+ unsigned Reg =
+ DVInst->getOperand(0).isReg() ? DVInst->getOperand(0).getReg() : 0;
+ if (Reg == 0)
+ continue;
+
+ // Handle the two cases we can handle: indirect in memory and in register.
+ unsigned CVReg = TRI->getCodeViewRegNum(Reg);
+ {
+ LocalVarDefRange DR;
+ DR.CVRegister = CVReg;
+ DR.InMemory = InMemory;
+ DR.DataOffset = Offset;
+ DR.IsSubfield = IsSubfield;
+ DR.StructOffset = StructOffset;
+
+ if (Var.DefRanges.empty() ||
+ Var.DefRanges.back().isDifferentLocation(DR)) {
+ Var.DefRanges.emplace_back(std::move(DR));
+ }
+ }
+
+ // Compute the label range.
+ const MCSymbol *Begin = getLabelBeforeInsn(Range.first);
+ const MCSymbol *End = getLabelAfterInsn(Range.second);
+ if (!End) {
+ // This range is valid until the next overlapping bitpiece. In the
+ // common case, ranges will not be bitpieces, so they will overlap.
+ auto J = std::next(I);
+ while (J != E &&
+ !fragmentsOverlap(DIExpr, J->first->getDebugExpression()))
+ ++J;
+ if (J != E)
+ End = getLabelBeforeInsn(J->first);
+ else
+ End = Asm->getFunctionEnd();
+ }
+
+ // If the last range end is our begin, just extend the last range.
+ // Otherwise make a new range.
+ SmallVectorImpl<std::pair<const MCSymbol *, const MCSymbol *>> &Ranges =
+ Var.DefRanges.back().Ranges;
+ if (!Ranges.empty() && Ranges.back().second == Begin)
+ Ranges.back().second = End;
+ else
+ Ranges.emplace_back(Begin, End);
+
+ // FIXME: Do more range combining.
+ }
+
recordLocalVariable(std::move(Var), InlinedAt);
}
}
@@ -1995,16 +1987,6 @@ TypeIndex CodeViewDebug::getTypeIndex(DI
return recordTypeIndexForDINode(Ty, TI, ClassTy);
}
-TypeIndex CodeViewDebug::getTypeIndexForReferenceTo(DITypeRef TypeRef) {
- DIType *Ty = TypeRef.resolve();
- PointerRecord PR(getTypeIndex(Ty),
- getPointerSizeInBytes() == 8 ? PointerKind::Near64
- : PointerKind::Near32,
- PointerMode::LValueReference, PointerOptions::None,
- Ty->getSizeInBits() / 8);
- return TypeTable.writeKnownType(PR);
-}
-
TypeIndex CodeViewDebug::getCompleteTypeIndex(DITypeRef TypeRef) {
const DIType *Ty = TypeRef.resolve();
@@ -2112,8 +2094,7 @@ void CodeViewDebug::emitLocalVariable(co
Flags |= LocalSymFlags::IsOptimizedOut;
OS.AddComment("TypeIndex");
- TypeIndex TI = Var.Deref ? getTypeIndexForReferenceTo(Var.DIVar->getType())
- : getCompleteTypeIndex(Var.DIVar->getType());
+ TypeIndex TI = getCompleteTypeIndex(Var.DIVar->getType());
OS.EmitIntValue(TI.getIndex(), 4);
OS.AddComment("Flags");
OS.EmitIntValue(static_cast<uint16_t>(Flags), 2);
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h Mon Aug 28 21:08:31 2017
@@ -94,7 +94,6 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
struct LocalVariable {
const DILocalVariable *DIVar = nullptr;
SmallVector<LocalVarDefRange, 1> DefRanges;
- bool Deref = false;
};
struct InlineSite {
@@ -148,9 +147,6 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
codeview::TypeIndex getFuncIdForSubprogram(const DISubprogram *SP);
- void calculateRanges(LocalVariable &Var,
- const DbgValueHistoryMap::InstrRanges &Ranges);
-
static void collectInlineSiteChildren(SmallVectorImpl<unsigned> &Children,
const FunctionInfo &FI,
const InlineSite &Site);
@@ -263,8 +259,6 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
codeview::TypeIndex getTypeIndex(DITypeRef TypeRef,
DITypeRef ClassTyRef = DITypeRef());
- codeview::TypeIndex getTypeIndexForReferenceTo(DITypeRef TypeRef);
-
codeview::TypeIndex getMemberFunctionType(const DISubprogram *SP,
const DICompositeType *Class);
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp Mon Aug 28 21:08:31 2017
@@ -23,57 +23,6 @@
using namespace llvm;
-bool DbgVariableLocation::extractFromMachineInstruction(
- DbgVariableLocation &Location, const MachineInstr &Instruction) {
- if (!Instruction.isDebugValue())
- return false;
- if (!Instruction.getOperand(0).isReg())
- return false;
- Location.Register = Instruction.getOperand(0).getReg();
- Location.InMemory = Instruction.getOperand(1).isImm();
- Location.Deref = false;
- Location.FragmentInfo.reset();
- // We only handle expressions generated by DIExpression::appendOffset,
- // which doesn't require a full stack machine.
- int64_t Offset = 0;
- const DIExpression *DIExpr = Instruction.getDebugExpression();
- auto Op = DIExpr->expr_op_begin();
- while (Op != DIExpr->expr_op_end()) {
- switch (Op->getOp()) {
- case dwarf::DW_OP_constu: {
- int Value = Op->getArg(0);
- ++Op;
- if (Op != DIExpr->expr_op_end()) {
- switch (Op->getOp()) {
- case dwarf::DW_OP_minus:
- Offset -= Value;
- break;
- case dwarf::DW_OP_plus:
- Offset += Value;
- default:
- continue;
- }
- }
- } break;
- case dwarf::DW_OP_plus_uconst:
- Offset += Op->getArg(0);
- break;
- case dwarf::DW_OP_LLVM_fragment:
- Location.FragmentInfo = {Op->getArg(1), Op->getArg(0)};
- break;
- case dwarf::DW_OP_deref:
- Location.Deref = true;
- break;
- default:
- return false;
- }
- ++Op;
- }
-
- Location.Offset = Offset;
- return true;
-}
-
DebugHandlerBase::DebugHandlerBase(AsmPrinter *A) : Asm(A), MMI(Asm->MMI) {}
// Each LexicalScope has first instruction and last instruction to mark
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h Mon Aug 28 21:08:31 2017
@@ -17,44 +17,14 @@
#include "AsmPrinterHandler.h"
#include "DbgValueHistoryCalculator.h"
-#include "llvm/ADT/Optional.h"
#include "llvm/CodeGen/LexicalScopes.h"
#include "llvm/CodeGen/MachineInstr.h"
-#include "llvm/IR/DebugInfoMetadata.h"
namespace llvm {
class AsmPrinter;
-class MachineInstr;
class MachineModuleInfo;
-/// Represents the location at which a variable is stored.
-struct DbgVariableLocation {
- /// Offset relative to base register.
- int64_t Offset;
-
- /// Base register.
- unsigned Register;
-
- /// If false, Register is the location. If true,
- /// Register+Offset point at the location.
- unsigned InMemory : 1;
-
- /// If false, the location holds the variable's value.
- /// If true, the location holds the variable's address.
- unsigned Deref : 1;
-
- /// Present if the location is part of a larger variable.
- llvm::Optional<llvm::DIExpression::FragmentInfo> FragmentInfo;
-
- /// Extract a VariableLocation from a MachineInstr. The struct passed in as
- /// Location is populated. The MachineInstr must be a debug value
- /// instruction.
- /// @return true if successful and false if not.
- static bool extractFromMachineInstruction(DbgVariableLocation &Location,
- const MachineInstr &Instruction);
-};
-
/// Base class for debug information backends. Common functionality related to
/// tracking which variables and scopes are alive at a given PC live here.
class DebugHandlerBase : public AsmPrinterHandler {
Removed: llvm/trunk/test/CodeGen/MIR/X86/diexpr-win32.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/diexpr-win32.mir?rev=311976&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/MIR/X86/diexpr-win32.mir (original)
+++ llvm/trunk/test/CodeGen/MIR/X86/diexpr-win32.mir (removed)
@@ -1,253 +0,0 @@
-# RUN: llc -filetype=obj -O0 %s -o - | llvm-readobj -codeview | FileCheck %s
-#
-# (DW_OP_plus_uconst 12)
-# CHECK: LocalSym {
-# CHECK-NEXT: Kind: S_LOCAL (0x113E)
-# CHECK-NEXT: Type: string* (0x
-# CHECK-NEXT: Flags [ (0x0)
-# CHECK-NEXT: ]
-# CHECK-NEXT: VarName: Str
-# CHECK-NEXT: }
-# CHECK-NEXT: DefRangeRegisterRelSym {
-# CHECK-NEXT: Kind: S_DEFRANGE_REGISTER_REL (0x1145)
-# CHECK-NEXT: BaseRegister:
-# CHECK-NEXT: HasSpilledUDTMember: No
-# CHECK-NEXT: OffsetInParent: 0
-# CHECK-NEXT: BasePointerOffset: 12
-# CHECK-NEXT: LocalVariableAddrRange {
-# CHECK-NEXT: OffsetStart:
-# CHECK-NEXT: ISectStart:
-# CHECK-NEXT: Range:
-# CHECK-NEXT: }
-# CHECK-NEXT: }
-# (DW_OP_plus_uconst, 8, DW_OP_deref)
-# CHECK: LocalSym {
-# CHECK-NEXT: Kind: S_LOCAL (0x113E)
-# CHECK-NEXT: Type: string& (0x
-# CHECK-NEXT: Flags [ (0x0)
-# CHECK-NEXT: ]
-# CHECK-NEXT: VarName: Result
-# CHECK-NEXT: }
-# CHECK-NEXT: DefRangeRegisterRelSym {
-# CHECK-NEXT: Kind: S_DEFRANGE_REGISTER_REL (0x1145)
-# CHECK-NEXT: BaseRegister:
-# CHECK-NEXT: HasSpilledUDTMember: No
-# CHECK-NEXT: OffsetInParent: 0
-# CHECK-NEXT: BasePointerOffset: 8
-# CHECK-NEXT: LocalVariableAddrRange {
-# CHECK-NEXT: OffsetStart:
-# CHECK-NEXT: ISectStart:
-# CHECK-NEXT: Range:
-# CHECK-NEXT: }
-# CHECK-NEXT: }
-# (DW_OP_constu, 4, DW_OP_minus)
-# CHECK: LocalSym {
-# CHECK-NEXT: Kind: S_LOCAL (0x113E)
-# CHECK-NEXT: Type: long (0x12)
-# CHECK-NEXT: Flags [ (0x0)
-# CHECK-NEXT: ]
-# CHECK-NEXT: VarName: Bytes
-# CHECK-NEXT: }
-# CHECK-NEXT: DefRangeRegisterRelSym {
-# CHECK-NEXT: Kind: S_DEFRANGE_REGISTER_REL (0x1145)
-# CHECK-NEXT: BaseRegister:
-# CHECK-NEXT: HasSpilledUDTMember: No
-# CHECK-NEXT: OffsetInParent: 0
-# CHECK-NEXT: BasePointerOffset: -4
-# CHECK-NEXT: LocalVariableAddrRange {
-# CHECK-NEXT: OffsetStart:
-# CHECK-NEXT: ISectStart:
-# CHECK-NEXT: Range:
-# CHECK-NEXT: }
-# CHECK-NEXT: }
---- |
- ; ModuleID = '<stdin>'
- source_filename = "<stdin>"
- target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
- target triple = "i386-pc-windows-msvc19.0.24215"
-
- %struct.string = type { i32, i32, i8* }
-
- define void @fun(%struct.string* noalias sret %agg.result, %struct.string* noalias %str) !dbg !12 {
- entry:
- call void @llvm.dbg.value(metadata %struct.string* %agg.result, metadata !23, metadata !24), !dbg !25
- call void @llvm.dbg.value(metadata %struct.string* %str, metadata !26, metadata !28), !dbg !25
- %call = call dereferenceable(12) %struct.string* @getString(), !dbg !29
- %0 = bitcast %struct.string* %agg.result to i8*, !dbg !29
- %1 = bitcast %struct.string* %call to i8*, !dbg !29
- call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* %1, i32 12, i32 4, i1 false), !dbg !29
- ret void, !dbg !30
- }
-
- define i32 @len(%struct.string* %s, i32 %acc) !dbg !31 {
- entry:
- %0 = bitcast %struct.string* %s to i32*
- %bytes = load i32, i32* %0, !dbg !34
- call void @llvm.dbg.declare(metadata i32 %bytes, metadata !35, metadata !28), !dbg !34
- %1 = add i32 %bytes, %acc, !dbg !36
- ret i32 %1, !dbg !36
- }
-
- ; Function Attrs: nounwind readnone speculatable
- declare void @llvm.dbg.declare(metadata, metadata, metadata) #0
-
- ; Function Attrs: nounwind readnone speculatable
- declare void @llvm.dbg.value(metadata, metadata, metadata) #0
-
- declare dereferenceable(12) %struct.string* @getString()
-
- ; Function Attrs: argmemonly nounwind
- declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1) #1
-
- ; Function Attrs: nounwind
- declare void @llvm.stackprotector(i8*, i8**) #2
-
- attributes #0 = { nounwind readnone speculatable }
- attributes #1 = { argmemonly nounwind }
- attributes #2 = { nounwind }
-
- !llvm.dbg.cu = !{!0}
- !llvm.linker.options = !{!3, !4}
- !llvm.module.flags = !{!5, !6, !7, !8}
- !llvm.ident = !{!9}
-
- !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 6.0.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
- !1 = !DIFile(filename: "diexpr.ll", directory: "C:\5Csrc", checksumkind: CSK_MD5, checksum: "c547c362c610fa79e7abaddc76e1efe7")
- !2 = !{}
- !3 = !{!"/DEFAULTLIB:libcmt.lib"}
- !4 = !{!"/DEFAULTLIB:oldnames.lib"}
- !5 = !{i32 1, !"NumRegisterParameters", i32 0}
- !6 = !{i32 2, !"CodeView", i32 1}
- !7 = !{i32 2, !"Debug Info Version", i32 3}
- !8 = !{i32 1, !"wchar_size", i32 2}
- !9 = !{!"clang version 6.0.0 "}
- !10 = !DIExpression(DW_OP_plus_uconst, 12)
- !11 = !DIExpression(DW_OP_plus_uconst, 8, DW_OP_deref)
- !12 = distinct !DISubprogram(name: "fun", linkageName: "fun", scope: !1, file: !1, line: 9, type: !13, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
- !13 = !DISubroutineType(types: !14)
- !14 = !{!15}
- !15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "string", file: !1, line: 1, size: 96, elements: !16, identifier: ".?AUstring@@")
- !16 = !{!17, !19, !20}
- !17 = !DIDerivedType(tag: DW_TAG_member, name: "length", scope: !15, file: !1, line: 2, baseType: !18, size: 32)
- !18 = !DIBasicType(name: "long int", size: 32, encoding: DW_ATE_signed)
- !19 = !DIDerivedType(tag: DW_TAG_member, name: "size", scope: !15, file: !1, line: 3, baseType: !18, size: 32, offset: 32)
- !20 = !DIDerivedType(tag: DW_TAG_member, name: "data", scope: !15, file: !1, line: 4, baseType: !21, size: 32, offset: 64)
- !21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !22, size: 32)
- !22 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
- !23 = !DILocalVariable(name: "Result", scope: !12, file: !1, line: 10, type: !15)
- !24 = !DIExpression(DW_OP_deref)
- !25 = !DILocation(line: 10, scope: !12)
- !26 = !DILocalVariable(name: "Str", scope: !12, file: !1, line: 10, type: !27)
- !27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !15, size: 32)
- !28 = !DIExpression(DW_OP_constu, 4, DW_OP_minus)
- !29 = !DILocation(line: 11, scope: !12)
- !30 = !DILocation(line: 12, scope: !12)
- !31 = distinct !DISubprogram(name: "len", linkageName: "len", scope: !1, file: !1, line: 14, type: !32, isLocal: false, isDefinition: true, scopeLine: 14, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
- !32 = !DISubroutineType(types: !33)
- !33 = !{!18}
- !34 = !DILocation(line: 15, scope: !31)
- !35 = !DILocalVariable(name: "Bytes", scope: !31, file: !1, line: 15, type: !18)
- !36 = !DILocation(line: 16, scope: !31)
-
-...
----
-name: fun
-alignment: 4
-exposesReturnsTwice: false
-legalized: false
-regBankSelected: false
-selected: false
-tracksRegLiveness: true
-registers:
-liveins:
-frameInfo:
- isFrameAddressTaken: false
- isReturnAddressTaken: false
- hasStackMap: false
- hasPatchPoint: false
- stackSize: 4
- offsetAdjustment: 0
- maxAlignment: 4
- adjustsStack: true
- hasCalls: true
- stackProtector: ''
- maxCallFrameSize: 0
- hasOpaqueSPAdjustment: false
- hasVAStart: false
- hasMustTailInVarArgFunc: false
- savePoint: ''
- restorePoint: ''
-fixedStack:
- - { id: 0, type: spill-slot, offset: -8, size: 4, alignment: 4, stack-id: 0,
- callee-saved-register: '%esi' }
- - { id: 1, type: default, offset: 4, size: 4, alignment: 4, stack-id: 0,
- isImmutable: true, isAliased: false, callee-saved-register: '' }
- - { id: 2, type: default, offset: 0, size: 4, alignment: 4, stack-id: 0,
- isImmutable: true, isAliased: false, callee-saved-register: '' }
-stack:
-constants:
-body: |
- bb.0.entry:
- liveins: %esi
-
- frame-setup PUSH32r killed %esi, implicit-def %esp, implicit %esp
- CFI_INSTRUCTION def_cfa_offset 8
- CFI_INSTRUCTION offset %esi, -8
- %esi = MOV32rm %esp, 1, _, 8, _ :: (load 4 from %fixed-stack.2)
- DBG_VALUE %esp, 0, !26, !10, debug-location !25
- DBG_VALUE %esp, 0, !23, !11, debug-location !25
- CALLpcrel32 @getString, csr_32, implicit %esp, implicit-def %esp, implicit-def %eax, debug-location !29
- %ecx = MOV32rm %eax, 1, _, 0, _, debug-location !29 :: (dereferenceable load 4 from %ir.1)
- %edx = MOV32rm %eax, 1, _, 4, _, debug-location !29 :: (dereferenceable load 4 from %ir.1 + 4)
- MOV32mr %esi, 1, _, 0, _, killed %ecx, debug-location !29 :: (store 4 into %ir.0)
- MOV32mr %esi, 1, _, 4, _, killed %edx, debug-location !29 :: (store 4 into %ir.0 + 4)
- %eax = MOV32rm killed %eax, 1, _, 8, _, debug-location !29 :: (dereferenceable load 4 from %ir.1 + 8)
- MOV32mr %esi, 1, _, 8, _, killed %eax, debug-location !29 :: (store 4 into %ir.0 + 8)
- %eax = COPY killed %esi, debug-location !30
- %esi = POP32r implicit-def %esp, implicit %esp, debug-location !30
- RET 0, %eax, debug-location !30
-
-...
----
-name: len
-alignment: 4
-exposesReturnsTwice: false
-legalized: false
-regBankSelected: false
-selected: false
-tracksRegLiveness: true
-registers:
-liveins:
-frameInfo:
- isFrameAddressTaken: false
- isReturnAddressTaken: false
- hasStackMap: false
- hasPatchPoint: false
- stackSize: 0
- offsetAdjustment: 0
- maxAlignment: 4
- adjustsStack: false
- hasCalls: false
- stackProtector: ''
- maxCallFrameSize: 0
- hasOpaqueSPAdjustment: false
- hasVAStart: false
- hasMustTailInVarArgFunc: false
- savePoint: ''
- restorePoint: ''
-fixedStack:
- - { id: 0, type: default, offset: 4, size: 4, alignment: 4, stack-id: 0,
- isImmutable: true, isAliased: false, callee-saved-register: '' }
- - { id: 1, type: default, offset: 0, size: 4, alignment: 4, stack-id: 0,
- isImmutable: true, isAliased: false, callee-saved-register: '' }
-stack:
-constants:
-body: |
- bb.0.entry:
- %eax = MOV32rm %esp, 1, _, 4, _ :: (load 4 from %fixed-stack.1)
- %eax = MOV32rm killed %eax, 1, _, 0, _, debug-location !34 :: (load 4 from %ir.0)
- DBG_VALUE debug-use %eax, 0, !35, !28, debug-location !34
- %eax = ADD32rm killed %eax, %esp, 1, _, 8, _, implicit-def dead %eflags, debug-location !36 :: (load 4 from %fixed-stack.0)
- RET 0, %eax, debug-location !36
-
-...
Modified: llvm/trunk/test/DebugInfo/COFF/pieces.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/pieces.ll?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/pieces.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/pieces.ll Mon Aug 28 21:08:31 2017
@@ -179,7 +179,8 @@
; ASM: .asciz "nested" # Function name
; ASM: .short 4414 # Record kind: S_LOCAL
; ASM: .asciz "o"
-; ASM: .cv_def_range .Lfunc_begin3 .Lfunc_end3, "E\021J\001\000\000\000\000\000\000"
+; FIXME: We should have a .cv_def_range for 'o', but we don't yet.
+; ASM-NOT: .cv_def_range
; ASM: .short 4414 # Record kind: S_LOCAL
; ASM: .asciz "p"
; ASM: .cv_def_range [[p_start]] .Lfunc_end3, "C\021\021\000\000\000\004\000\000\000"
@@ -189,17 +190,8 @@
; OBJ: DisplayName: nested
; OBJ: }
; OBJ: LocalSym {
-; OBJ: Type: Nested&
; OBJ: VarName: o
; OBJ: }
-; OBJ: DefRangeRegisterRelSym {
-; OBJ: BaseRegister: 330
-; OBJ: HasSpilledUDTMember: No
-; OBJ: OffsetInParent: 0
-; OBJ: BasePointerOffset: 0
-; OBJ: LocalVariableAddrRange {
-; OBJ: }
-; OBJ: }
; OBJ: LocalSym {
; OBJ: VarName: p
; OBJ: }
Modified: llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll?rev=311977&r1=311976&r2=311977&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/types-array-advanced.ll Mon Aug 28 21:08:31 2017
@@ -50,40 +50,28 @@
; CHECK: SizeOf: 4
; CHECK: Name:
; CHECK: }
-; CHECK: Pointer (0x1004) {
-; CHECK: TypeLeafKind: LF_POINTER (0x1002)
-; CHECK: PointeeType: 0x1003
-; CHECK: PointerAttributes: 0x2A
-; CHECK: PtrType: Near32 (0xA)
-; CHECK: PtrMode: LValueReference (0x1)
-; CHECK: IsFlat: 0
-; CHECK: IsConst: 0
-; CHECK: IsVolatile: 0
-; CHECK: IsUnaligned: 0
-; CHECK: SizeOf: 0
-; CHECK: }
-; CHECK: Array (0x1005) {
+; CHECK: Array (0x1004) {
; CHECK: TypeLeafKind: LF_ARRAY (0x1503)
; CHECK: ElementType: char (0x70)
; CHECK: IndexType: unsigned long (0x22)
; CHECK: SizeOf: 7
; CHECK: Name:
; CHECK: }
-; CHECK: Array (0x1006) {
+; CHECK: Array (0x1005) {
; CHECK: TypeLeafKind: LF_ARRAY (0x1503)
-; CHECK: ElementType: 0x1005
+; CHECK: ElementType: 0x1004
; CHECK: IndexType: unsigned long (0x22)
; CHECK: SizeOf: 35
; CHECK: Name:
; CHECK: }
-; CHECK: Array (0x1007) {
+; CHECK: Array (0x1006) {
; CHECK: TypeLeafKind: LF_ARRAY (0x1503)
-; CHECK: ElementType: 0x1006
+; CHECK: ElementType: 0x1005
; CHECK: IndexType: unsigned long (0x22)
; CHECK: SizeOf: 70
; CHECK: Name:
; CHECK: }
-; CHECK: Struct (0x1008) {
+; CHECK: Struct (0x1007) {
; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
; CHECK: MemberCount: 0
; CHECK: Properties [ (0x280)
@@ -97,16 +85,16 @@
; CHECK: Name: incomplete_struct
; CHECK: LinkageName: .?AUincomplete_struct@@
; CHECK: }
-; CHECK: Array (0x1009) {
+; CHECK: Array (0x1008) {
; CHECK: TypeLeafKind: LF_ARRAY (0x1503)
-; CHECK: ElementType: incomplete_struct (0x1008)
+; CHECK: ElementType: incomplete_struct (0x1007)
; CHECK: IndexType: unsigned long (0x22)
; CHECK: SizeOf: 12
; CHECK: Name:
; CHECK: }
-; CHECK: Pointer (0x100A) {
+; CHECK: Pointer (0x1009) {
; CHECK: TypeLeafKind: LF_POINTER (0x1002)
-; CHECK: PointeeType: 0x1009
+; CHECK: PointeeType: 0x1008
; CHECK: PointerAttributes: 0x800A
; CHECK: PtrType: Near32 (0xA)
; CHECK: PtrMode: Pointer (0x0)
@@ -116,41 +104,8 @@
; CHECK: IsUnaligned: 0
; CHECK: SizeOf: 4
; CHECK: }
-; CHECK: FieldList (0x100B) {
-; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203)
-; CHECK: DataMember {
-; CHECK: TypeLeafKind: LF_MEMBER (0x150D)
-; CHECK: AccessSpecifier: Public (0x3)
-; CHECK: Type: int (0x74)
-; CHECK: FieldOffset: 0x0
-; CHECK: Name: s1
-; CHECK: }
-; CHECK: }
-; CHECK: Struct (0x100C) {
-; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
-; CHECK: MemberCount: 1
-; CHECK: Properties [ (0x200)
-; CHECK: HasUniqueName (0x200)
-; CHECK: ]
-; CHECK: FieldList: <field list> (0x100B)
-; CHECK: DerivedFrom: 0x0
-; CHECK: VShape: 0x0
-; CHECK: SizeOf: 4
-; CHECK: Name: incomplete_struct
-; CHECK: LinkageName: .?AUincomplete_struct@@
-; CHECK: }
-; CHECK: StringId (0x100D) {
-; CHECK: TypeLeafKind: LF_STRING_ID (0x1605)
-; CHECK: Id: 0x0
-; CHECK: StringData: \t.cpp
-; CHECK: }
-; CHECK: UdtSourceLine (0x100E) {
-; CHECK: TypeLeafKind: LF_UDT_SRC_LINE (0x1606)
-; CHECK: UDT: incomplete_struct (0x100C)
-; CHECK: SourceFile: \t.cpp (0x100D)
-; CHECK: LineNumber: 4
-; CHECK: }
-; CHECK: Modifier (0x100F) {
+;
+; CHECK: Modifier (0x100E) {
; CHECK: TypeLeafKind: LF_MODIFIER (0x1001)
; CHECK: ModifiedType: int (0x74)
; CHECK: Modifiers [ (0x3)
@@ -158,12 +113,12 @@
; CHECK: Volatile (0x2)
; CHECK: ]
; CHECK: }
-; CHECK: Array (0x1010) {
+; CHECK: Array (0x100F) {
; CHECK: TypeLeafKind: LF_ARRAY (0x1503)
-; CHECK: ElementType: const volatile int (0x100F)
+; CHECK: ElementType: const volatile int (0x100E)
; CHECK: IndexType: unsigned long (0x22)
; CHECK: SizeOf: 16
-; CHECK: Name:
+; CHECK: Name:
; CHECK: }
; CHECK: ]
More information about the llvm-commits
mailing list