/** * */ package de.innot.avreclipse.debug.core.service; import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommand; 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.commands.MIDataDisassemble; import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIDataDisassembleInfo; /** * Patched command factory to work around a long standing bug in gdb * (https://sourceware.org/bugzilla/show_bug.cgi?format=multiple&id=13519). * * @author mnl */ public class PatchedCommandFactory extends CommandFactory { @Override public ICommand<MIDataDisassembleInfo> createMIDataDisassemble(IDisassemblyDMContext ctx, String start, String end, boolean mode) { start = "(void (*)())" + start; end = "(void (*)())" + end; return new MIDataDisassemble(ctx, start, end, mode); } @Override public ICommand<MIDataDisassembleInfo> createMIDataDisassemble(IDisassemblyDMContext ctx, String start, String end, int mode) { start = "(void (*)())" + start; end = "(void (*)())" + end; return new MIDataDisassemble(ctx, start, end, mode); } @Override public ICommand<MIBreakInsertInfo> createMIBreakInsert(IBreakpointsTargetDMContext ctx, boolean isTemporary, boolean isHardware, String condition, int ignoreCount, String location, int tid, boolean disabled, boolean isTracepoint) { if (location.startsWith("*")) { location = location.substring(0, 1) + "(void (*)())" + location.substring(1); } return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, location, tid, disabled, isTracepoint, true); } }