From c278f4575f812566b11ae3736b864551de378136 Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Mon, 29 Oct 2018 23:51:20 -0400 Subject: [PATCH] [lldb] Remove work-around for missing '-gdb-set breakpoint pending' For more recent versions fo LLDB (8.0.0-r345563) this work-around is not required. This is a follow-up to bug 539641. See also https://reviews.llvm.org/D52953 Change-Id: If5f951a33fab8781a594175571d0ad5131e9ef15 Signed-off-by: Marc-Andre Laperle --- .../dsf/lldb/core/internal/LLDBTrait.java | 10 ++++-- .../core/internal/launching/LLDBLaunch.java | 4 +++ .../internal/service/LLDBServiceFactory.java | 2 +- .../service/commands/LLDBCommandFactory.java | 35 +++++++++++++++---- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/LLDBTrait.java b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/LLDBTrait.java index 1ad707e452e..0c69a0b49b8 100644 --- a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/LLDBTrait.java +++ b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/LLDBTrait.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Ericsson. + * Copyright (c) 2017 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -34,7 +34,13 @@ public enum LLDBTrait { * Inserting a breakpoint with full path would not work. * TODO: Remove for versions < 4.0.0 eventually */ - BROKEN_BREAKPOINT_INSERT_FULL_PATH_LLVM_BUG_28709; + BROKEN_BREAKPOINT_INSERT_FULL_PATH_LLVM_BUG_28709, + /** + * Trait for LLDBs that do not have "-gdb-set breakpoint pending" + * implemented. It was added in LLDB 8.0 as of r345563. + * See https://reviews.llvm.org/D52953 + */ + MISSING_GDB_SET_BREAKPOINT_PENDING; /** * Returns whether or not the given session has this trait. diff --git a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/launching/LLDBLaunch.java b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/launching/LLDBLaunch.java index 0c3baa1fdb3..475f6b8d898 100644 --- a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/launching/LLDBLaunch.java +++ b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/launching/LLDBLaunch.java @@ -232,6 +232,10 @@ public class LLDBLaunch extends GdbLaunch { if (fLldbVersion != null && fLldbVersion.compareTo(new IntegerTuple(4, 0, 0)) < 0 || fLldbRevision != null && fLldbRevision.compareTo(new IntegerTuple(370, 0, 37)) < 0) { fTraits.add(LLDBTrait.BROKEN_BREAKPOINT_INSERT_FULL_PATH_LLVM_BUG_28709); } + + if (fLldbVersion != null && fLldbVersion.compareTo(new IntegerTuple(8, 0, 0)) < 0 || fLldbRevision != null) { + fTraits.add(LLDBTrait.MISSING_GDB_SET_BREAKPOINT_PENDING); + } } } diff --git a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/LLDBServiceFactory.java b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/LLDBServiceFactory.java index fe085d83390..7e31c2baf93 100644 --- a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/LLDBServiceFactory.java +++ b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/LLDBServiceFactory.java @@ -36,7 +36,7 @@ public class LLDBServiceFactory extends GdbDebugServicesFactory { @Override protected ICommandControl createCommandControl(DsfSession session, ILaunchConfiguration config) { - return new LLDBControl(session, config, new LLDBCommandFactory()); + return new LLDBControl(session, config, new LLDBCommandFactory(session)); } @Override diff --git a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/commands/LLDBCommandFactory.java b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/commands/LLDBCommandFactory.java index c8f214cf53e..d850000c86e 100644 --- a/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/commands/LLDBCommandFactory.java +++ b/llvm/org.eclipse.cdt.llvm.dsf.lldb.core/src/org/eclipse/cdt/llvm/dsf/lldb/core/internal/service/commands/LLDBCommandFactory.java @@ -15,6 +15,8 @@ import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert; import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; +import org.eclipse.cdt.dsf.service.DsfSession; +import org.eclipse.cdt.llvm.dsf.lldb.core.internal.LLDBTrait; /** * A command factory specific to LLDB for cases where some commands need any @@ -22,6 +24,17 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; */ public class LLDBCommandFactory extends CommandFactory { + private DsfSession fSession; + + /** + * Construct a command factory specific to LLDB. + * + * @param session the debugging session + */ + public LLDBCommandFactory(DsfSession session) { + fSession = session; + } + /** * lldb-mi (as of 8.0.0-r341271) doesn't implement "-gdb-set args" but it does * implement "-exec-arguments". So we just substitute here. @@ -41,15 +54,17 @@ public class LLDBCommandFactory extends CommandFactory { } /** - * lldb-mi (as of 8.0.0-r343825) doesn't implement "-gdb-set breakpoint pending" - * so instead we always use "-break-insert -f" to always use pending breakpoints. - * Once the -gdb-set is implemented in lldb-mi, we can remove this. - * See also https://reviews.llvm.org/D52953 + * lldb-mi implements "-gdb-set breakpoint pending" starting with 8.0.0-r345563. + * For earlier version we use "-break-insert -f" to always use pending + * breakpoints. See also https://reviews.llvm.org/D52953 */ @Override public ICommand createMIBreakInsert(IBreakpointsTargetDMContext ctx, boolean isTemporary, boolean isHardware, String condition, int ignoreCount, String line, String tid) { - return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, line, tid, true); + if (LLDBTrait.MISSING_GDB_SET_BREAKPOINT_PENDING.isTraitOf(fSession)) { + return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, line, tid, true); + } + return super.createMIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, line, tid); } /** @@ -59,7 +74,10 @@ public class LLDBCommandFactory extends CommandFactory { public ICommand createMIBreakInsert(IBreakpointsTargetDMContext ctx, boolean isTemporary, boolean isHardware, String condition, int ignoreCount, String location, String tid, boolean disabled, boolean isTracepoint) { - return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, location, tid, disabled, isTracepoint, true); + if (LLDBTrait.MISSING_GDB_SET_BREAKPOINT_PENDING.isTraitOf(fSession)) { + return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, location, tid, disabled, isTracepoint, true); + } + return super.createMIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, location, tid, disabled, isTracepoint); } /** @@ -67,6 +85,9 @@ public class LLDBCommandFactory extends CommandFactory { */ @Override public ICommand createMIBreakInsert(IBreakpointsTargetDMContext ctx, String func) { - return new MIBreakInsert(ctx, func, true); + if (LLDBTrait.MISSING_GDB_SET_BREAKPOINT_PENDING.isTraitOf(fSession)) { + return new MIBreakInsert(ctx, func, true); + } + return super.createMIBreakInsert(ctx, func); } }