[llvm] r293228 - GlobalISel: support debug intrinsics.
Evgenii Stepanov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 27 12:54:44 PST 2017
Hi,
looks like this change is causing memory leaks in llvm tests:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/700/steps/check-llvm%20asan/logs/stdio
On Thu, Jan 26, 2017 at 3:39 PM, Tim Northover via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: tnorthover
> Date: Thu Jan 26 17:39:14 2017
> New Revision: 293228
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293228&view=rev
> Log:
> GlobalISel: support debug intrinsics.
>
> The translation scheme is mostly cribbed from FastISel, and it's not entirely
> convincing semantically. But it does seem to work in the common cases and allow
> variables to be printed so it can't be all wrong.
>
> Added:
> llvm/trunk/test/CodeGen/AArch64/GlobalISel/debug-insts.ll
> Modified:
> llvm/trunk/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
> llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
> llvm/trunk/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
> llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
>
> Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h?rev=293228&r1=293227&r2=293228&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h Thu Jan 26 17:39:14 2017
> @@ -108,6 +108,9 @@ public:
> /// Set the debug location to \p DL for all the next build instructions.
> void setDebugLoc(const DebugLoc &DL) { this->DL = DL; }
>
> + /// Get the current instruction's debug location.
> + DebugLoc getDebugLoc() { return DL; }
> +
> /// Build and insert <empty> = \p Opcode <empty>.
> /// The insertion point is the one set by the last call of either
> /// setBasicBlock or setMI.
> @@ -127,6 +130,29 @@ public:
> /// Insert an existing instruction at the insertion point.
> MachineInstrBuilder insertInstr(MachineInstrBuilder MIB);
>
> + /// Build and insert a DBG_VALUE instruction expressing the fact that the
> + /// associated \p Variable lives in \p Reg (suitably modified by \p Expr).
> + MachineInstrBuilder buildDirectDbgValue(unsigned Reg, const MDNode *Variable,
> + const MDNode *Expr);
> +
> + /// Build and insert a DBG_VALUE instruction expressing the fact that the
> + /// associated \p Variable lives in memory at \p Reg + \p Offset (suitably
> + /// modified by \p Expr).
> + MachineInstrBuilder buildIndirectDbgValue(unsigned Reg, unsigned Offset,
> + const MDNode *Variable,
> + const MDNode *Expr);
> + /// Build and insert a DBG_VALUE instruction expressing the fact that the
> + /// associated \p Variable lives in the stack slot specified by \p FI
> + /// (suitably modified by \p Expr).
> + MachineInstrBuilder buildFIDbgValue(int FI, const MDNode *Variable,
> + const MDNode *Expr);
> +
> + /// Build and insert a DBG_VALUE instructions specifying that \p Variable is
> + /// given by \p C (suitably modified by \p Expr).
> + MachineInstrBuilder buildConstDbgValue(const Constant &C, unsigned Offset,
> + const MDNode *Variable,
> + const MDNode *Expr);
> +
> /// Build and insert \p Res<def> = G_FRAME_INDEX \p Idx
> ///
> /// G_FRAME_INDEX materializes the address of an alloca value or other
>
> Modified: llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp?rev=293228&r1=293227&r2=293228&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp (original)
> +++ llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp Thu Jan 26 17:39:14 2017
> @@ -22,6 +22,7 @@
> #include "llvm/CodeGen/MachineRegisterInfo.h"
> #include "llvm/CodeGen/TargetPassConfig.h"
> #include "llvm/IR/Constant.h"
> +#include "llvm/IR/DebugInfo.h"
> #include "llvm/IR/Function.h"
> #include "llvm/IR/GetElementPtrTypeIterator.h"
> #include "llvm/IR/IntrinsicInst.h"
> @@ -522,12 +523,60 @@ bool IRTranslator::translateKnownIntrins
> switch (ID) {
> default:
> break;
> - case Intrinsic::dbg_declare:
> - case Intrinsic::dbg_value:
> - // FIXME: these obviously need to be supported properly.
> - if (!TPC->isGlobalISelAbortEnabled())
> - MF->getProperties().set(MachineFunctionProperties::Property::FailedISel);
> + case Intrinsic::dbg_declare: {
> + const DbgDeclareInst &DI = cast<DbgDeclareInst>(CI);
> + assert(DI.getVariable() && "Missing variable");
> +
> + const Value *Address = DI.getAddress();
> + if (!Address || isa<UndefValue>(Address)) {
> + DEBUG(dbgs() << "Dropping debug info for " << DI << "\n");
> + return true;
> + }
> +
> + unsigned Reg = getOrCreateVReg(*Address);
> + auto RegDef = MRI->def_instr_begin(Reg);
> + assert(DI.getVariable()->isValidLocationForIntrinsic(
> + MIRBuilder.getDebugLoc()) &&
> + "Expected inlined-at fields to agree");
> +
> + if (RegDef != MRI->def_instr_end() &&
> + RegDef->getOpcode() == TargetOpcode::G_FRAME_INDEX) {
> + MIRBuilder.buildFIDbgValue(RegDef->getOperand(1).getIndex(),
> + DI.getVariable(), DI.getExpression());
> + } else
> + MIRBuilder.buildDirectDbgValue(Reg, DI.getVariable(), DI.getExpression());
> return true;
> + }
> + case Intrinsic::dbg_value: {
> + // This form of DBG_VALUE is target-independent.
> + const DbgValueInst &DI = cast<DbgValueInst>(CI);
> + const Value *V = DI.getValue();
> + assert(DI.getVariable()->isValidLocationForIntrinsic(
> + MIRBuilder.getDebugLoc()) &&
> + "Expected inlined-at fields to agree");
> + if (!V) {
> + // Currently the optimizer can produce this; insert an undef to
> + // help debugging. Probably the optimizer should not do this.
> + MIRBuilder.buildIndirectDbgValue(0, DI.getOffset(), DI.getVariable(),
> + DI.getExpression());
> + } else if (const auto *CI = dyn_cast<Constant>(V)) {
> + MIRBuilder.buildConstDbgValue(*CI, DI.getOffset(), DI.getVariable(),
> + DI.getExpression());
> + } else {
> + unsigned Reg = getOrCreateVReg(*V);
> + // FIXME: This does not handle register-indirect values at offset 0. The
> + // direct/indirect thing shouldn't really be handled by something as
> + // implicit as reg+noreg vs reg+imm in the first palce, but it seems
> + // pretty baked in right now.
> + if (DI.getOffset() != 0)
> + MIRBuilder.buildIndirectDbgValue(Reg, DI.getOffset(), DI.getVariable(),
> + DI.getExpression());
> + else
> + MIRBuilder.buildDirectDbgValue(Reg, DI.getVariable(),
> + DI.getExpression());
> + }
> + return true;
> + }
> case Intrinsic::uadd_with_overflow:
> return translateOverflowIntrinsic(CI, TargetOpcode::G_UADDE, MIRBuilder);
> case Intrinsic::sadd_with_overflow:
>
> Modified: llvm/trunk/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp?rev=293228&r1=293227&r2=293228&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp (original)
> +++ llvm/trunk/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp Thu Jan 26 17:39:14 2017
> @@ -15,6 +15,7 @@
> #include "llvm/CodeGen/MachineInstr.h"
> #include "llvm/CodeGen/MachineInstrBuilder.h"
> #include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/IR/DebugInfo.h"
> #include "llvm/Target/TargetInstrInfo.h"
> #include "llvm/Target/TargetOpcodes.h"
> #include "llvm/Target/TargetSubtargetInfo.h"
> @@ -82,6 +83,66 @@ MachineInstrBuilder MachineIRBuilder::in
> return MIB;
> }
>
> +MachineInstrBuilder MachineIRBuilder::buildDirectDbgValue(
> + unsigned Reg, const MDNode *Variable, const MDNode *Expr) {
> + assert(isa<DILocalVariable>(Variable) && "not a variable");
> + assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
> + assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
> + "Expected inlined-at fields to agree");
> + return buildInstr(TargetOpcode::DBG_VALUE)
> + .addReg(Reg, RegState::Debug)
> + .addReg(0, RegState::Debug)
> + .addMetadata(Variable)
> + .addMetadata(Expr);
> +}
> +
> +MachineInstrBuilder MachineIRBuilder::buildIndirectDbgValue(
> + unsigned Reg, unsigned Offset, const MDNode *Variable, const MDNode *Expr) {
> + assert(isa<DILocalVariable>(Variable) && "not a variable");
> + assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
> + assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
> + "Expected inlined-at fields to agree");
> + return buildInstr(TargetOpcode::DBG_VALUE)
> + .addReg(Reg, RegState::Debug)
> + .addImm(Offset)
> + .addMetadata(Variable)
> + .addMetadata(Expr);
> +}
> +
> +MachineInstrBuilder MachineIRBuilder::buildFIDbgValue(int FI,
> + const MDNode *Variable,
> + const MDNode *Expr) {
> + assert(isa<DILocalVariable>(Variable) && "not a variable");
> + assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
> + assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
> + "Expected inlined-at fields to agree");
> + return buildInstr(TargetOpcode::DBG_VALUE)
> + .addFrameIndex(FI)
> + .addImm(0)
> + .addMetadata(Variable)
> + .addMetadata(Expr);
> +}
> +
> +MachineInstrBuilder MachineIRBuilder::buildConstDbgValue(const Constant &C,
> + unsigned Offset,
> + const MDNode *Variable,
> + const MDNode *Expr) {
> + assert(isa<DILocalVariable>(Variable) && "not a variable");
> + assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
> + assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) &&
> + "Expected inlined-at fields to agree");
> + auto MIB = buildInstr(TargetOpcode::DBG_VALUE);
> + if (auto *CI = dyn_cast<ConstantInt>(&C)) {
> + if (CI->getBitWidth() > 64)
> + MIB.addCImm(CI);
> + else
> + MIB.addImm(CI->getZExtValue());
> + } else
> + MIB.addFPImm(&cast<ConstantFP>(C));
> +
> + return MIB.addImm(Offset).addMetadata(Variable).addMetadata(Expr);
> +}
> +
> MachineInstrBuilder MachineIRBuilder::buildFrameIndex(unsigned Res, int Idx) {
> assert(MRI->getType(Res).isPointer() && "invalid operand type");
> return buildInstr(TargetOpcode::G_FRAME_INDEX)
>
> Modified: llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll?rev=293228&r1=293227&r2=293228&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll Thu Jan 26 17:39:14 2017
> @@ -82,36 +82,3 @@ define void @legal_default(i64 %in) {
> insertvalue [2 x i64] undef, i64 %in, 0
> ret void
> }
> -
> -; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for debug_insts
> -; FALLBACK-WITH-REPORT-LABEL: debug_insts:
> -define void @debug_insts(i32 %in) #0 !dbg !7 {
> -entry:
> - %in.addr = alloca i32, align 4
> - store i32 %in, i32* %in.addr, align 4
> - call void @llvm.dbg.declare(metadata i32* %in.addr, metadata !11, metadata !12), !dbg !13
> - ret void, !dbg !14
> -}
> -
> -; Function Attrs: nounwind readnone
> -declare void @llvm.dbg.declare(metadata, metadata, metadata)
> -
> -!llvm.dbg.cu = !{!0}
> -!llvm.module.flags = !{!3, !4, !5}
> -!llvm.ident = !{!6}
> -
> -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
> -!1 = !DIFile(filename: "tmp.c", directory: "/Users/tim/llvm/build")
> -!2 = !{}
> -!3 = !{i32 2, !"Dwarf Version", i32 4}
> -!4 = !{i32 2, !"Debug Info Version", i32 3}
> -!5 = !{i32 1, !"PIC Level", i32 2}
> -!6 = !{!"clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)"}
> -!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
> -!8 = !DISubroutineType(types: !9)
> -!9 = !{null, !10}
> -!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> -!11 = !DILocalVariable(name: "in", arg: 1, scope: !7, file: !1, line: 1, type: !10)
> -!12 = !DIExpression()
> -!13 = !DILocation(line: 1, column: 14, scope: !7)
> -!14 = !DILocation(line: 2, column: 1, scope: !7)
>
> Added: llvm/trunk/test/CodeGen/AArch64/GlobalISel/debug-insts.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/debug-insts.ll?rev=293228&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/debug-insts.ll (added)
> +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/debug-insts.ll Thu Jan 26 17:39:14 2017
> @@ -0,0 +1,51 @@
> +; RUN: llc -global-isel -mtriple=aarch64 %s -stop-after=irtranslator -o - | FileCheck %s
> +
> +
> +; CHECK-LABEL: name: debug_declare
> +; CHECK: DBG_VALUE %stack.0.in.addr, 0, !11, !12, debug-location !13
> +; CHECK: DBG_VALUE debug-use %0(s32), debug-use _, !11, !12, debug-location !13
> +define void @debug_declare(i32 %in) #0 !dbg !7 {
> +entry:
> + %in.addr = alloca i32, align 4
> + store i32 %in, i32* %in.addr, align 4
> + call void @llvm.dbg.declare(metadata i32* %in.addr, metadata !11, metadata !12), !dbg !13
> + call void @llvm.dbg.declare(metadata i32 %in, metadata !11, metadata !12), !dbg !13
> + ret void, !dbg !14
> +}
> +
> +; CHECK-LABEL: name: debug_value
> +; CHECK: [[IN:%[0-9]+]](s32) = COPY %w0
> +; CHECK: DBG_VALUE debug-use [[IN]](s32), debug-use _, !11, !12, debug-location !13
> +; CHECK: DBG_VALUE debug-use %1(p0), debug-use _, !11, !15, debug-location !13
> +define void @debug_value(i32 %in) #0 !dbg !7 {
> + %addr = alloca i32
> + call void @llvm.dbg.value(metadata i32 %in, i64 0, metadata !11, metadata !12), !dbg !13
> + store i32 %in, i32* %addr
> + call void @llvm.dbg.value(metadata i32* %addr, i64 0, metadata !11, metadata !15), !dbg !13
> + ret void
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata, metadata)
> +declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!3, !4, !5}
> +!llvm.ident = !{!6}
> +
> +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
> +!1 = !DIFile(filename: "tmp.c", directory: "/Users/tim/llvm/build")
> +!2 = !{}
> +!3 = !{i32 2, !"Dwarf Version", i32 4}
> +!4 = !{i32 2, !"Debug Info Version", i32 3}
> +!5 = !{i32 1, !"PIC Level", i32 2}
> +!6 = !{!"clang version 4.0.0 (trunk 289075) (llvm/trunk 289080)"}
> +!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
> +!8 = !DISubroutineType(types: !9)
> +!9 = !{null, !10}
> +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +!11 = !DILocalVariable(name: "in", arg: 1, scope: !7, file: !1, line: 1, type: !10)
> +!12 = !DIExpression()
> +!13 = !DILocation(line: 1, column: 14, scope: !7)
> +!14 = !DILocation(line: 2, column: 1, scope: !7)
> +!15 = !DIExpression(DW_OP_deref)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list