Sync with recent changes at Nokia, include patches
from daniel.thomas@broadcom.com.
diff --git a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMElfExecutableSymbolicsReader.java b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMElfExecutableSymbolicsReader.java
index 93d4010..70afd7a 100644
--- a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMElfExecutableSymbolicsReader.java
+++ b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMElfExecutableSymbolicsReader.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 Nokia and others.
+ * Copyright (c) 2010, 2011 Nokia 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
@@ -7,51 +7,41 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * refactoring of properties & readSymbols to super, added newSymbol()
+ * Broadcom - addition of properties
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.arm;
import java.io.IOException;
-import java.util.Collections;
-import java.util.Set;
-import java.util.TreeSet;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf;
import org.eclipse.cdt.debug.edc.internal.symbols.files.ElfExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
import org.eclipse.core.runtime.IPath;
/**
- * This class handles reading ELF files for the purposes of detecting symbolics.
+ * This class handles reading ARM ELF files for the purposes of detecting symbolics.
*/
public class ARMElfExecutableSymbolicsReader extends ElfExecutableSymbolicsReader {
- protected boolean isLE;
+ /**
+ * the only thing special about this reader is that it creates
+ * ARMSymbol objects rather than plain Symbol objects
+ * @param binaryFile
+ * @param elf
+ * @throws IOException
+ */
public ARMElfExecutableSymbolicsReader(IPath binaryFile, Elf elf) throws IOException {
super(binaryFile, elf);
}
- protected void readSymbols(Elf elfFile) throws IOException {
- // load the symbol table
- elfFile.loadSymbols();
- Set<IAddress> symbolAddressSet = new TreeSet<IAddress>();
-
- for (Elf.Symbol symbol : elfFile.getSymtabSymbols()) {
- String name = symbol.toString();
- // Multiple symbol entries for the same address are generated.
- // Do not add duplicate symbols with 0 size to the list since it confuses
- // debugger
- if (name.length() > 0) {
- if (symbol.st_size != 0 || !symbolAddressSet.contains(symbol.st_value)) {
- // need to get rid of labels with size 0
- if (symbol.st_size != 0 || !name.startsWith("|")) {
- symbols.add(new ARMSymbol(symbol.toString(), symbol.st_value, symbol.st_size));
- symbolAddressSet.add(symbol.st_value);
- }
- }
- }
- }
-
- // now sort it by address for faster lookups
- Collections.sort(symbols);
+ /** creates a new ARMSymbol instead of a plain new Symbol
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.ElfExecutableSymbolicsReader#newSymbol(org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf.Symbol, org.eclipse.cdt.core.IAddress)
+ */
+ @Override
+ protected ISymbol newSymbol(Elf.Symbol symbol, IAddress linkAddress) {
+ return new ARMSymbol(symbol.toString(), linkAddress, symbol.st_size,
+ initSymbolProperties(symbol));
}
}
diff --git a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMSymbol.java b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMSymbol.java
index f0b6268..89823db 100644
--- a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMSymbol.java
+++ b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/ARMSymbol.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,37 +7,32 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - implmentation of ctor with properties
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.arm;
+import java.util.HashMap;
+import java.util.Map;
+
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.edc.arm.IARMSymbol;
+import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
import org.eclipse.cdt.utils.Addr32;
-public class ARMSymbol implements IARMSymbol {
+public class ARMSymbol extends Symbol implements IARMSymbol {
- protected String name;
- protected IAddress address;
- protected long size;
protected boolean isThumb;
public ARMSymbol(String name, IAddress address, long size) {
- this.name = name;
- this.size = size;
+ this(name, address, size, new HashMap<String, Object>(0));
+ }
+
+ public ARMSymbol(String name, IAddress address, long size,
+ Map<String, Object> props) {
+ // will keep thumb-mode in isThumb; need to clear thumb bit in addr
+ super(name, new Addr32(address.getValue().clearBit(0).longValue()),
+ size, props);
isThumb = address.getValue().testBit(0);
- this.address = new Addr32(address.getValue().clearBit(0).longValue());
- }
-
- public String getName() {
- return name;
- }
-
- public IAddress getAddress() {
- return address;
- }
-
- public long getSize() {
- return size;
}
public int compareTo(Object o) {
@@ -48,16 +43,16 @@
}
return 0;
}
-
+
public boolean isThumbAddress() {
return isThumb;
}
@Override
public String toString() {
- return "name=" + name + //$NON-NLS-1$
- ", address=0x" + Long.toHexString(address.getValue().longValue()) + //$NON-NLS-1$
- ", size=" + size + ", thumb=" + isThumb; //$NON-NLS-1$
+ return "name=" + name //$NON-NLS-1$
+ + ", address=" + address.toHexAddressString() //$NON-NLS-1$
+ + ", size=" + size + ", thumb=" + isThumb; //$NON-NLS-1$
}
}
diff --git a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/TargetEnvironmentARM.java b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/TargetEnvironmentARM.java
index 967065c..7e187e9 100644
--- a/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/TargetEnvironmentARM.java
+++ b/org.eclipse.cdt.debug.edc.arm/src/org/eclipse/cdt/debug/edc/internal/arm/TargetEnvironmentARM.java
@@ -38,6 +38,7 @@
import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
import org.eclipse.cdt.debug.edc.symbols.ISymbol;
import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
@@ -344,4 +345,17 @@
// this looks the optimal after some trials.
return 64;
}
+
+ @Override
+ public void shutdown(RequestMonitor rm) {
+ // clear the cache as it holds an open file handle. the garbage collector
+ // would do this for us but just do it here to ensure it happens
+ // right away
+ for (ARMElf elf : readerToArmElfMap.values()) {
+ elf.dispose();
+ }
+ readerToArmElfMap.clear();
+
+ super.shutdown(rm);
+ }
}
diff --git a/org.eclipse.cdt.debug.edc.tcf.extension/META-INF/MANIFEST.MF b/org.eclipse.cdt.debug.edc.tcf.extension/META-INF/MANIFEST.MF
index 53aaf4c..ae5643f 100644
--- a/org.eclipse.cdt.debug.edc.tcf.extension/META-INF/MANIFEST.MF
+++ b/org.eclipse.cdt.debug.edc.tcf.extension/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: EDC Extension to TCF Core
Bundle-SymbolicName: org.eclipse.cdt.debug.edc.tcf.extension
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 3.0.0.qualifier
Bundle-Vendor: Eclipse CDT
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Export-Package: org.eclipse.cdt.debug.edc.tcf.extension,
diff --git a/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/AbstractTCFService.java b/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/AbstractTCFService.java
new file mode 100644
index 0000000..9b219ba
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/AbstractTCFService.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation June, 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tcf.extension.services;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IChannel.ICommandServer;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.eclipse.tm.tcf.protocol.JSON;
+
+/**
+ * A base TCF service that facilitates service creation in a TCF agent written
+ * in Java.
+ *
+ * @since 3.0
+ */
+abstract public class AbstractTCFService implements IService {
+
+ private final IChannel fChannel;
+
+ /**
+ * CommandServer framework.<Br>
+ * A concrete TCF service must implement a concrete command server based on
+ * this. The concrete command server class must be public and should
+ * implement methods in such format:
+ *
+ * <pre>
+ * public void methodName(IToken token, String cmdName, Object[] args)
+ * </pre>
+ *
+ * where the "methodName" must be name of a command of the TCF service. See
+ * {Service}Proxy class (e.g. {@link LoggingProxy}) for exact command names.
+ * And the method should not throw more than IOException.
+ */
+ abstract protected class AbstractCommandServer implements IChannel.ICommandServer {
+
+ public void command(IToken token, String name, byte[] data) {
+ try {
+ command(token, name, JSON.parseSequence(data));
+ } catch (Throwable x) {
+ System.out.println("Exception occured in agent. Closing channel.");
+ x.printStackTrace();
+ fChannel.terminate(x);
+ }
+ }
+
+ private void command(IToken token, String name, Object[] args) throws Exception {
+ String methodName = name;
+
+ Method handler = null;
+ try {
+ handler = this.getClass().getMethod(methodName, new Class[] { IToken.class, String.class, Object[].class });
+ } catch (SecurityException e) {
+ // should not happen
+ return;
+ } catch (NoSuchMethodException e) {
+ // Command not supported yet.
+ fChannel.rejectCommand(token);
+ return;
+ }
+
+ try {
+ handler.invoke(this, new Object[] { token, name, args });
+ } catch (IllegalArgumentException e) {
+ throw e;
+ } catch (IllegalAccessException e) {
+ throw e;
+ } catch (InvocationTargetException e) {
+ throw (Exception)e.getCause();
+ }
+ }
+ }
+
+ public AbstractTCFService(IChannel channel) {
+ this.fChannel = channel;
+ channel.addCommandServer(this, getCommandServer());
+ }
+
+ public IChannel getChannel() {
+ return fChannel;
+ }
+
+
+ abstract protected ICommandServer getCommandServer();
+}
diff --git a/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/SettingsProxy.java b/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/SettingsProxy.java
index 0247b74..53d1f1a 100644
--- a/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/SettingsProxy.java
+++ b/org.eclipse.cdt.debug.edc.tcf.extension/src/org/eclipse/cdt/debug/edc/tcf/extension/services/SettingsProxy.java
@@ -25,30 +25,6 @@
private final IChannel channel;
- /**
- * Register/configure the service on the Eclipse client side. This should be
- * called only once. And it is usually called when the TCF framework starts
- * (see where it's called for more).
- */
- static public void registerProxyForClient() {
-
- Protocol.addServiceProvider(new IServiceProvider() {
- /*
- * Tell the framework that for remote service named
- * "ICalculator.NAME", we offer the proxy for it.
- */
- public IService getServiceProxy(IChannel channel, String serviceName) {
- if (serviceName.equals(ISettings.NAME))
- return new SettingsProxy(channel);
- return null;
- }
-
- public IService[] getLocalService(IChannel channel) {
- return null;
- }
- });
- }
-
public SettingsProxy(IChannel channel) {
this.channel = channel;
diff --git a/org.eclipse.cdt.debug.edc.tests/META-INF/MANIFEST.MF b/org.eclipse.cdt.debug.edc.tests/META-INF/MANIFEST.MF
index d241a2a..c1924ea 100644
--- a/org.eclipse.cdt.debug.edc.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.cdt.debug.edc.tests/META-INF/MANIFEST.MF
@@ -1,32 +1,34 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EDC Tests
-Bundle-SymbolicName: org.eclipse.cdt.debug.edc.tests;singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.cdt.debug.edc.tests.EDCTestPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.cdt.debug.edc.examples.javaagent;bundle-version="1.0.0",
- org.eclipse.cdt.debug.edc.tcf.extension;bundle-version="1.0.0",
- org.eclipse.cdt.debug.edc;bundle-version="1.0.0",
- org.eclipse.cdt.debug.core;bundle-version="6.0.0",
- org.eclipse.cdt.dsf;bundle-version="2.0.0",
- org.eclipse.cdt.core;bundle-version="5.1.0",
- org.eclipse.debug.core;bundle-version="3.5.0",
- org.eclipse.debug.ui;bundle-version="3.5.0",
- org.eclipse.platform;bundle-version="3.3.200",
- org.eclipse.ui.ide;bundle-version="3.5.0",
- org.junit4,
- org.eclipse.cdt.debug.edc.x86;bundle-version="1.0.0",
- org.eclipse.cdt.debug.edc.arm;bundle-version="1.0.0",
- org.eclipse.cdt.debug.edc.ui;bundle-version="1.0.0",
- org.eclipse.cdt.dsf.ui;bundle-version="2.1.0",
- org.eclipse.cdt.ui;bundle-version="5.2.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.cdt.debug.edc.tests
-Import-Package: org.eclipse.tm.tcf.core;version="0.2.0",
- org.eclipse.tm.tcf.protocol;version="0.2.0",
- org.eclipse.tm.tcf.services;version="0.2.0",
- org.eclipse.tm.tcf.util;version="0.2.0"
-Bundle-Vendor: Eclipse CDT
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: EDC Tests
+Bundle-SymbolicName: org.eclipse.cdt.debug.edc.tests;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.cdt.debug.edc.tests.EDCTestPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.cdt.debug.edc.examples.javaagent;bundle-version="1.0.0",
+ org.eclipse.cdt.debug.edc.tcf.extension;bundle-version="1.0.0",
+ org.eclipse.cdt.debug.edc;bundle-version="1.0.0",
+ org.eclipse.cdt.debug.core;bundle-version="6.0.0",
+ org.eclipse.cdt.dsf;bundle-version="2.0.0",
+ org.eclipse.cdt.core;bundle-version="5.1.0",
+ org.eclipse.debug.core;bundle-version="3.5.0",
+ org.eclipse.debug.ui;bundle-version="3.5.0",
+ org.eclipse.platform;bundle-version="3.3.200",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.junit4,
+ org.eclipse.cdt.debug.edc.x86;bundle-version="1.0.0",
+ org.eclipse.cdt.debug.edc.arm;bundle-version="1.0.0",
+ org.eclipse.cdt.debug.edc.ui;bundle-version="1.0.0",
+ org.eclipse.cdt.dsf.ui;bundle-version="2.1.0",
+ org.eclipse.cdt.ui;bundle-version="5.2.0",
+ org.eclipse.cdt.debug.ui;bundle-version="7.0.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.cdt.debug.edc.tests,
+ org.eclipse.cdt.debug.edc.tests.tcfagent
+Import-Package: org.eclipse.tm.tcf.core;version="0.2.0",
+ org.eclipse.tm.tcf.protocol;version="0.2.0",
+ org.eclipse.tm.tcf.services;version="0.2.0",
+ org.eclipse.tm.tcf.util;version="0.2.0"
+Bundle-Vendor: Eclipse CDT
diff --git a/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe
new file mode 100644
index 0000000..56a6051
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe.sym b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe.sym
new file mode 100644
index 0000000..e440e5c
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.exe.sym
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.sym b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.sym
new file mode 100644
index 0000000..d8263ee
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/resources/SymbolFiles/bogus.sym
@@ -0,0 +1 @@
+2
\ No newline at end of file
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseExpressionTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseExpressionTest.java
index 5499e35..b54f547 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseExpressionTest.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseExpressionTest.java
@@ -96,9 +96,7 @@
/**
* Check that an expression evaluates without an error.
- * @param k9View
* @param expr
- * @param type the type to check (either IType or String), or <code>null</code>
* @throws Exception
*/
@@ -116,9 +114,9 @@
* differences in compilers wrt. class/struct and template argument formatting).
* If the type is IType, compare the types with #equals first, and if not matching, then
* because we know we have gaps in #equals/#hashCode support, check the #getTypeName() of the type.
+ * @param type the type to check (either IType or String), or <code>null</code>
* @param result
* @param expr
- * @param type the type to check (either IType or String), or <code>null</code>
* @throws Exception
*/
protected void checkExpr(Object type, String result, String expr)
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseLaunchTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseLaunchTest.java
index 8fcc2f6..f1aa789 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseLaunchTest.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BaseLaunchTest.java
@@ -10,19 +10,46 @@
*******************************************************************************/
package org.eclipse.cdt.debug.edc.debugger.tests;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import junit.framework.Assert;
+
+import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICBreakpointType;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
import org.eclipse.cdt.debug.edc.tests.AbstractLaunchTest;
import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl2;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
+import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.IBreakpoint;
/**
* Test based on live debug session for an x86 application on local host.
@@ -34,6 +61,60 @@
private static final String EDC_LAUNCH_DELEGATE_LINUX = "org.eclipse.cdt.debug.edc.linux.x86.launchDelegate";
private static final String EDC_LAUNCH_DELEGATE_WINDOWS = "org.eclipse.cdt.debug.edc.windows.localLaunchDelegate";
+ protected EDCLaunch launch;
+ protected DsfSession session;
+ protected ExecutionDMC threadDMC;
+ protected IFrameDMContext frame;
+
+ protected IStack getStackService() {
+ return null;
+ }
+
+ protected void assertControlIsAt(String fileName,
+ String functionName, int lineNo) throws Exception {
+ assertFrameMatches(frame, fileName, functionName, lineNo);
+ }
+
+ protected void assertFrameMatches(final IFrameDMContext frame2, String fileName,
+ String functionName, int lineNo) throws Exception {
+ final IStack stackService = getStackService();
+ assertNotNull(stackService);
+ Query<IFrameDMData> query = new Query<IFrameDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IFrameDMData> drm) {
+ stackService.getFrameData(frame2, drm);
+ }
+ };
+ session.getExecutor().execute(query);
+
+ IFrameDMData fdata = null;
+ fdata = query.get(5, TimeUnit.SECONDS);
+
+ if (fdata == null)
+ fail("Error getting stack frame data.");
+
+ assertNotNull(fdata);
+ assertNotNull(fdata.getFile());
+ assertTrue(
+ "Expected source file is [" + fileName + "] but got [" + fdata.getFile() + "].",
+ fdata.getFile().contains(fileName));
+ assertEquals(functionName, fdata.getFunction());
+ assertEquals(lineNo, fdata.getLine());
+ }
+
+ protected void basicLaunch() throws Exception {
+ TestUtils.showDebugPerspective();
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = waitForSession(launch);
+ assertNotNull(session);
+ IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
+ assertNotNull(executionDMC);
+ threadDMC = TestUtils.waitForSuspendedThread(session);
+ Assert.assertNotNull(threadDMC);
+ frame = TestUtils.waitForStackFrame(session, threadDMC);
+ }
+
protected EDCLaunch createLaunch() throws Exception {
ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationWorkingCopy configuration = lm.getLaunchConfigurationType(CDT_LOCAL_LAUNCH_TYPE)
@@ -63,7 +144,20 @@
*/
protected void configureLaunchConfiguration(
ILaunchConfigurationWorkingCopy configuration) {
- // default do nothing.
+ if (getStopAtMain()) {
+ // Make sure it stop at main
+ configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, true);
+ configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, "main");
+ }
+ }
+
+ /**
+ * Get full path of executable file in {plugin}/resources/SymbolFiles folder.
+ *
+ * @return a full path
+ */
+ protected boolean getStopAtMain() {
+ return false;
}
/**
@@ -108,4 +202,206 @@
return ret;
}
+ /**
+ * set a User breakpoint
+ * - for use when the breakpoint needs to persist or act like a normal breakpoint
+ * @param Breakpoints breakpoint service
+ * @param String srcFile
+ * @param int lineNo
+ * @throws Exception
+ */
+ protected void removeUserBreakpoint(final Breakpoints breakpointsService,
+ final IBreakpointDMContext userBPContext) throws Exception {
+ Query<Object> query = new Query<Object>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Object> rm) {
+ breakpointsService.removeBreakpoint(userBPContext,
+ new RequestMonitor(session.getExecutor(), rm) {
+ @Override
+ protected void handleCompleted() {
+ rm.done();
+ }});
+ }};
+
+ session.getExecutor().execute(query);
+
+ query.get(5, TimeUnit.SECONDS);
+ }
+
+ /**
+ * set a temporary breakpoint
+ * - for use when the breakpoint is no longer necessary after the next suspend
+ * @param Breakpoints breakpoint service
+ * @param String srcFile
+ * @param int lineNo
+ * @throws Exception
+ */
+ protected void setTempBreakpoint(final Breakpoints bpService,
+ final String srcFile, final int lineNo) throws Exception {
+ Query<IBreakpointDMContext> query = new Query<IBreakpoints.IBreakpointDMContext>() {
+
+ @Override
+ protected void execute(
+ final DataRequestMonitor<IBreakpoints.IBreakpointDMContext> drm) {
+
+ Modules modulesService = getDsfServicesTracker(session).getService(Modules.class);
+
+ modulesService.getLineAddress(threadDMC, srcFile, lineNo,
+ new DataRequestMonitor<List<IAddress>>(session.getExecutor(), drm) {
+ @Override
+ protected void handleSuccess() {
+ List<IAddress> addrs = getData();
+
+ // IBreakpointsTargetDMContext bt_dmc = DMContexts.getAncestorOfType(executionDMC, IBreakpointsTargetDMContext.class);
+ bpService.setTempBreakpoint(threadDMC, addrs.get(0),
+ new RequestMonitor(session.getExecutor(), drm));
+ }});
+
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ query.get(5, TimeUnit.SECONDS);
+ }
+
+ /**
+ * set a User breakpoint
+ * - for use when the breakpoint needs to persist or act like a normal breakpoint
+ * @param Breakpoints breakpoint service
+ * @param String srcFile
+ * @param int lineNo
+ * @throws Exception
+ */
+ protected IBreakpointDMContext setUserBreakpoint(final Breakpoints breakpointsService,
+ final String srcFile, final int lineNo) throws Exception {
+ final String coreId = DebugPlugin.getUniqueIdentifier();
+ final HashMap<String, Object> bkptAttributes = new HashMap<String, Object>();
+ bkptAttributes.put(IBreakpoint.ID, coreId);
+ bkptAttributes.put(IBreakpoint.ENABLED, true);
+ bkptAttributes.put(Breakpoints.BREAKPOINT_TYPE, Breakpoints.BREAKPOINT);
+ bkptAttributes.put(Breakpoints.BREAKPOINT_SUBTYPE, Breakpoints.LINE_BREAKPOINT);
+ bkptAttributes.put("lineNumber", lineNo);
+ bkptAttributes.put(ICBreakpoint.SOURCE_HANDLE, srcFile);
+ bkptAttributes.put(ICBreakpoint.IGNORE_COUNT, 0);
+ bkptAttributes.put(ICBreakpoint.INSTALL_COUNT, 1);
+ bkptAttributes.put(ICBreakpoint.CONDITION, "");
+ bkptAttributes.put(ICBreakpointType.TYPE, ICBreakpointType.REGULAR);
+
+ Query<IBreakpointDMContext> query = new Query<IBreakpointDMContext>() {
+
+ @Override
+ protected void execute(final DataRequestMonitor<IBreakpointDMContext> drm) {
+ Modules modulesService = getDsfServicesTracker(session).getService(Modules.class);
+ modulesService.getLineAddress(threadDMC, srcFile, lineNo,
+ new DataRequestMonitor<List<IAddress>>(session.getExecutor(), drm) {
+
+ @Override
+ protected void handleSuccess() {
+ List<IAddress> addrs = getData();
+ bkptAttributes.put(Breakpoints.RUNTIME_ADDRESS, addrs.get(0).toString(0x10));
+
+ IBreakpointsTargetDMContext bdmc
+ = DMContexts.getAncestorOfType(threadDMC, IBreakpointsTargetDMContext.class);
+ breakpointsService.insertBreakpoint(bdmc, bkptAttributes,
+ new DataRequestMonitor<IBreakpointDMContext>(session.getExecutor(), drm) {
+ @Override
+ protected void handleSuccess() {
+ drm.setData(getData());
+ drm.done();
+ }});
+ }});
+ }};
+
+ session.getExecutor().execute(query);
+
+ IBreakpointDMContext userBreakpoint = query.get(5, TimeUnit.SECONDS);
+ assertTrue(query.isDone());
+ assertNotNull(userBreakpoint);
+ return userBreakpoint;
+ }
+
+ /**
+ * Wait for a suspend and update suspended thread and frame.
+ * @param waitForSuspend time to wait for suspend event to be broadcasted.
+ *
+ * @throws Exception
+ */
+ protected void updateSuspendedFrame(int waitForSuspend) throws Exception {
+ assertNotNull(threadDMC);
+ // Wait some time for the suspend event to get broadcasted.
+ Thread.sleep(waitForSuspend);
+
+ frame = TestUtils.waitForStackFrame(session, threadDMC, 0);
+ }
+
+ /**
+ * find the address for a given line
+ *
+ * @param source
+ * @param line
+ * @throws Exception
+ */
+ protected IAddress waitGetLineAddress(final String source, final int line) throws Exception {
+
+ Query<IAddress> query = new Query<IAddress>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IAddress> drm) {
+ Modules modulesService = getDsfServicesTracker(session).getService(Modules.class);
+ modulesService.getLineAddress(threadDMC, source, line,
+ new DataRequestMonitor<List<IAddress>>(session.getExecutor(), drm) {
+ @Override
+ protected void handleSuccess() {
+ List<IAddress> addrs = getData();
+ drm.setData(addrs.get(0));
+ drm.done();
+ }});
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ IAddress addr = query.get(5, TimeUnit.SECONDS);
+ if (addr == null)
+ fail("Error calling getLineAddress() ");
+ return addr;
+ }
+
+ /**
+ * Perform run to line and wait till it's done. Underlying members "thread" and "frame"
+ * will be updated.
+ *
+ * @param fileName
+ * @param lineNo
+ * @throws Exception
+ */
+ protected void waitRunToLine(final IRunControl2 runControlService,
+ final String fileName, final int lineNo) throws Exception {
+ waitRunToLine(runControlService, fileName, lineNo, 400);
+ }
+
+ protected void waitRunToLine(final IRunControl2 runControlService,
+ final String fileName, final int lineNo, int waitForSuspend) throws Exception {
+ Query<IStatus> query = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ runControlService.runToLine(threadDMC, fileName, lineNo, false, new RequestMonitor(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getStatus());
+ drm.done();
+ }});
+
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ IStatus status = query.get(15, TimeUnit.SECONDS);
+
+ if (status == null || ! status.isOK())
+ fail("Error in run-to-line: " + (status == null ? "Exception happened." : status.getMessage()));
+
+ updateSuspendedFrame(waitForSuspend);
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointActionsTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointActionsTest.java
new file mode 100644
index 0000000..80e8e8c
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointActionsTest.java
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.core.breakpointactions.BreakpointActionManager;
+import org.eclipse.cdt.debug.core.breakpointactions.IBreakpointAction;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.breakpointactions.SkipAction;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.Stack;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.ui.breakpointactions.LogAction;
+import org.eclipse.cdt.debug.ui.breakpointactions.ResumeAction;
+import org.eclipse.cdt.debug.ui.breakpointactions.SoundAction;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
+import org.eclipse.cdt.dsf.debug.service.IRunControl2;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.core.runtime.IStatus;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ TODO this really only tests run-control scenarios for breakpoint
+ actions. SkipAction & ResumeAction can be considered fully tested.
+
+ however, LogAction & SoundAction are only tested in terms of
+ coverage and not crashing. nothing checks the log to see if the
+ log was appropriately written, or if an expression was appropriatly
+ evaluated, and there's no automatic check for the Sound being played.
+ */
+public class BreakpointActionsTest {
+
+ private static final String BlackFlagWascana_cpp = "BlackFlagWascana.cpp"; //$NON-NLS-1$
+ private static final String dbg_simple_types_cpp = "dbg_simple_types.cpp"; //$NON-NLS-1$
+
+ private static final String BlackFlagWascana_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\BlackFlagWascana.cpp"; //$NON-NLS-1$
+ private static final String dbg_breakpoints_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_breakpoints.cpp"; //$NON-NLS-1$
+ private static final String dbg_derived_types_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$
+ private static final String dbg_memory_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_memory.cpp"; //$NON-NLS-1$
+ private static final String dbg_rtti_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_rtti.cpp"; //$NON-NLS-1$
+ private static final String dbg_simple_types_cpp_path
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_simple_types.cpp"; //$NON-NLS-1$
+
+ /**
+ * these mementos are subject to change
+ */
+ private static final String bpActionMemento
+ = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
+ private static final String log8Data
+ = bpActionMemento + "<logData evalExpr=\"true\" message=\"3+5\"/>";
+ private static final String logHereData
+ = bpActionMemento + "<logData evalExpr=\"false\" message=\"here\"/>";
+ private static final String pause6Data
+ = bpActionMemento + "<resumeData pauseTime=\"6\"/>";
+ private static final String skip2Data
+ = bpActionMemento + "<skipData statements=\"2\"/>";
+ private static final String soundData
+ = bpActionMemento + "<soundData file=\"C:\\WINDOWS\\Media\\tada.wav\"/>";
+
+ static enum BPAction {
+ Log8(LogAction.class, "log8", log8Data),
+ LogHere(LogAction.class, "logHere", logHereData),
+ pause6(ResumeAction.class, "pause6", pause6Data),
+ Skip2(SkipAction.class, "skip2", skip2Data),
+ SoundTada(SoundAction.class, "soundTada", soundData);
+
+ final Class<? extends IBreakpointAction> c;
+ final String name;
+ final String memento;
+
+ BPAction(Class<? extends IBreakpointAction> c, String name, String memento) {
+ this.c = c;
+ this.name = name;
+ this.memento = memento;
+ }
+
+ Class<? extends IBreakpointAction> getActionClass() {
+ return c;
+ }
+
+ String getName() {
+ return name;
+ }
+
+ String getMemento() {
+ return memento;
+ }
+ }
+
+ static enum BPData {
+ main16(BlackFlagWascana_cpp_path, 16, BPAction.Skip2.getName()),
+ main18(BlackFlagWascana_cpp_path, 18, BPAction.Log8.getName()),
+ main19(BlackFlagWascana_cpp_path, 19, BPAction.Skip2.getName()),
+ main23(BlackFlagWascana_cpp_path, 23, BPAction.pause6.getName()),
+ main24(BlackFlagWascana_cpp_path, 24, BPAction.LogHere.getName()),
+ main25(BlackFlagWascana_cpp_path, 25, BPAction.LogHere.getName()+","+BPAction.SoundTada.getName()),
+ dbg_breakpoints(dbg_breakpoints_cpp_path, 56, null),
+ dbg_dervied_types(dbg_derived_types_cpp_path, 285, null),
+ dbg_memory(dbg_memory_cpp_path, 9, null),
+ dbg_rtti(dbg_rtti_cpp_path, 47, null),
+ dbg_simple_types(dbg_simple_types_cpp_path, 60, null)
+
+ ;
+
+ final String file;
+ final int line;
+ final String actionPropString;
+
+ BPData(String file, int line, String actionPropString) {
+ this.file = file;
+ this.line = line;
+ this.actionPropString = actionPropString;
+ }
+
+ String getFile() {
+ return file;
+ }
+
+ int getLine() {
+ return line;
+ }
+
+ boolean hasActions() {
+ return actionPropString != null;
+ }
+
+ String getActions() {
+ return actionPropString;
+ }
+ }
+
+ static BreakpointActionManager bpActionMgr() {
+ return CDebugCorePlugin.getDefault().getBreakpointActionManager();
+ }
+
+ private static Breakpoints breakpointsService;
+ private static ArrayList<IBreakpoints.IBreakpointDMContext> bkpts;
+
+ private static BaseLaunchTest simpleLaunch;
+
+ private static IRunControl2 runControl;
+ private static IStack stackService;
+
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+
+ simpleLaunch = new BaseLaunchTest() {
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ // used because the locations of certain line numbers are known,
+ // not because there's no hardcoded break
+ return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected IStack getStackService() {
+ return stackService;
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ simpleLaunch.basicLaunch();
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(
+ EDCDebugger.getBundleContext(), simpleLaunch.session.getId());
+ Assert.assertNotNull(edcTracker);
+ breakpointsService = edcTracker.getService(Breakpoints.class);
+ Assert.assertNotNull(breakpointsService);
+ runControl = edcTracker.getService(RunControl.class);
+ Assert.assertNotNull(runControl);
+ stackService = edcTracker.getService(Stack.class);
+ Assert.assertNotNull(stackService);
+
+ for (BPAction actionData : BPAction.values()) {
+ IBreakpointAction action
+ = actionData.getActionClass().getConstructor((Class[])null).newInstance((Object[])null);
+ action.setName(actionData.getName());
+ action.initializeFromMemento(actionData.getMemento());
+ bpActionMgr().addAction(action);
+ }
+
+ BPData[] allData = BPData.values();
+ bkpts = new ArrayList<IBreakpoints.IBreakpointDMContext>(allData.length);
+
+ TestUtils.waitForUIUpdate(1000);
+ }
+
+ private static IBreakpoints.IBreakpointDMContext setBreakpointWithAction(BPData bpData)
+ throws Exception, InterruptedException, ExecutionException,
+ TimeoutException {
+ String file = bpData.getFile();
+ int line = bpData.getLine();
+ final IBreakpoints.IBreakpointDMContext bp
+ = simpleLaunch.setUserBreakpoint(breakpointsService, file, line);
+ Assert.assertNotNull(bkpts);
+ if (bpData.hasActions()) {
+ final Map<String, Object> delta = new HashMap<String,Object>();
+ delta.put(BreakpointActionManager.BREAKPOINT_ACTION_ATTRIBUTE, bpData.getActions());
+ Query<IStatus> query = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ breakpointsService.updateBreakpoint(bp, delta, drm);
+ }
+ };
+
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ }
+ return bp;
+ }
+
+ @AfterClass
+ public static void shutdown() {
+ for (final IBreakpoints.IBreakpointDMContext bpc : bkpts) {
+ try {
+ simpleLaunch.removeUserBreakpoint(breakpointsService, bpc);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ for (BPAction bpAction : BPAction.values()) {
+ IBreakpointAction action
+ = bpActionMgr().findBreakpointAction(bpAction.getName());
+ bpActionMgr().deleteAction(action);
+ }
+ TestUtils.shutdownDebugSession(simpleLaunch.launch, simpleLaunch.session);
+ bkpts = null;
+ breakpointsService = null;
+
+ simpleLaunch = null;
+ }
+
+ // for all tests, the target in waitRunToLine() has been semi-arbitrarily
+ // chosen as 26, because it's after the last test breakpoint
+ private void runToNextExpectedBreakpoint(int waitTime) throws Exception {
+ simpleLaunch.waitRunToLine(runControl, BlackFlagWascana_cpp_path, 26, 500);
+ TestUtils.waitForUIUpdate(waitTime);
+ }
+ // default 1/2 second wait
+ private void runToNextExpectedBreakpoint() throws Exception {
+ runToNextExpectedBreakpoint(500);
+ }
+
+ @Test
+ public void testBreakpointActionSkipActionEndingAtBreakpoint() throws Exception {
+
+ // bkpt16 has a skip2 skip action attached
+ // and thus skips over nested bkpts in dbg_breakpoints()
+ // & dbg_derived_types(). should end at bkpt at line 18 in main
+ // bkpt18 has a log action attached, which should execute
+ bkpts.add(setBreakpointWithAction(BPData.main16));
+ bkpts.add(setBreakpointWithAction(BPData.main18));
+ bkpts.add(setBreakpointWithAction(BPData.dbg_breakpoints));
+ bkpts.add(setBreakpointWithAction(BPData.dbg_dervied_types));
+
+ runToNextExpectedBreakpoint();
+
+ simpleLaunch.assertControlIsAt(BlackFlagWascana_cpp, "main", BPData.main18.getLine());
+ }
+
+ @Test
+ public void testBreakpointActionsSkipActionNoEndingAtBreakpoint() throws Exception {
+
+ // bkpt19 has a skip2 skip action attached,
+ // skips over nested breakpoints in dbg_memory() & dbg_rtti()
+ // should end in nested bkpt in dbg_simple_types()
+ bkpts.add(setBreakpointWithAction(BPData.main19));
+ bkpts.add(setBreakpointWithAction(BPData.dbg_memory));
+ bkpts.add(setBreakpointWithAction(BPData.dbg_rtti));
+ bkpts.add(setBreakpointWithAction(BPData.dbg_simple_types));
+
+ // was encountering occasional timing based errors when running this test.
+ // wait a little longer because the stack changes for this test where it
+ // is not changing for the other tests in this JUnit
+ runToNextExpectedBreakpoint(/* waitTime */ 1000);
+
+ simpleLaunch.assertControlIsAt(dbg_simple_types_cpp, "dbg_simple_types", BPData.dbg_simple_types.getLine());
+ }
+
+ @Test
+ public void testBreakpointActionsResumeActionPause6() throws Exception {
+ // bkpt23 has a pause6 resume action attached.
+ // so a check after 3 seconds should show we're still here
+ // and a check 6 seconds after that should show we're at the next bkpt
+ // should end at bkpt24
+ bkpts.add(setBreakpointWithAction(BPData.main23));
+ bkpts.add(setBreakpointWithAction(BPData.main24));
+
+ runToNextExpectedBreakpoint();
+
+ // we should be at our breakpoint right after it's hit
+ simpleLaunch.assertControlIsAt(BlackFlagWascana_cpp, "main", BPData.main23.getLine());
+
+ simpleLaunch.updateSuspendedFrame(3000); // half the length of the pause
+
+ // should still be at the same line (i.e. still pausing)
+ simpleLaunch.assertControlIsAt(BlackFlagWascana_cpp, "main", BPData.main23.getLine());
+
+ simpleLaunch.updateSuspendedFrame(4000); // the other half of the pause plus a little cushion
+
+ // should be done with the pause, and resumed to the next line
+ simpleLaunch.assertControlIsAt(BlackFlagWascana_cpp, "main", BPData.main24.getLine());
+ }
+
+ @Test
+ public void testBreakpointActionsSoundAction() throws Exception {
+
+ // bkpt25 has two actions attached
+ // ... uh, unsure how to really test if both were processed
+ bkpts.add(setBreakpointWithAction(BPData.main25));
+
+ runToNextExpectedBreakpoint();
+
+ Thread.sleep(100); // wait for sound to be played
+
+ simpleLaunch.assertControlIsAt(BlackFlagWascana_cpp, "main", BPData.main25.getLine());
+
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointsServiceTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointsServiceTest.java
new file mode 100644
index 0000000..109eb3e
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/BreakpointsServiceTest.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
+import org.eclipse.cdt.debug.edc.tests.TestReflectionHelper;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.model.ISourceLocator;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test that we can recover expressions from stack frames other than the TOS
+ */
+public class BreakpointsServiceTest {
+
+ private static final String dbg_derived_types_cpp
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$
+
+ private static Breakpoints breakpointsService;
+ private static IBreakpoints.IBreakpointDMContext testUserBreakpoint;
+ private static IBreakpoints.IBreakpointsTargetDMContext breakDMC;
+ private static BaseLaunchTest simpleLaunch;
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+
+ simpleLaunch = new BaseLaunchTest() {
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ // used because the locations of certain line numbers are known,
+ // not because there's no hardcoded break
+ return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ simpleLaunch.basicLaunch();
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(
+ EDCDebugger.getBundleContext(), simpleLaunch.session.getId());
+ Assert.assertNotNull(edcTracker);
+ breakpointsService = edcTracker.getService(Breakpoints.class);
+ Assert.assertNotNull(breakpointsService);
+
+ breakDMC = DMContexts.getAncestorOfType(simpleLaunch.threadDMC, IBreakpoints.IBreakpointsTargetDMContext.class);
+
+ testUserBreakpoint = simpleLaunch.setUserBreakpoint(breakpointsService, dbg_derived_types_cpp, 57);
+ Assert.assertNotNull(testUserBreakpoint);
+ }
+
+ @AfterClass
+ public static void shutdown() {
+ TestUtils.shutdownDebugSession(simpleLaunch.launch, simpleLaunch.session);
+ breakDMC = null;
+ breakpointsService = null;
+ testUserBreakpoint = null;
+ simpleLaunch = null;
+ }
+
+ @Test
+ public void testBreakpointDMContextToString() {
+ Assert.assertTrue(testUserBreakpoint.toString().startsWith("BreakpointDMContext [id="));
+ }
+
+ @Test
+ public void testGetBreakpointDMData() throws Exception {
+ Query<IBreakpoints.IBreakpointDMData> query = new Query<IBreakpoints.IBreakpointDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IBreakpoints.IBreakpointDMData> drm) {
+ breakpointsService.getBreakpointDMData(testUserBreakpoint, drm);
+ }
+ };
+
+ simpleLaunch.session.getExecutor().execute(query);
+
+ IBreakpoints.IBreakpointDMData dmData = query.get(3, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(dmData instanceof Breakpoints.BreakpointDMData);
+ Breakpoints.BreakpointDMData breakData = (Breakpoints.BreakpointDMData)dmData;
+
+ IAddress testUserBreakpointAddress = simpleLaunch.waitGetLineAddress(dbg_derived_types_cpp, 57);
+ Assert.assertTrue(dmData.equals(breakpointsService.findBreakpoint(testUserBreakpointAddress)));
+ Assert.assertEquals(testUserBreakpointAddress, breakData.getAddresses()[0]);
+ Assert.assertEquals(Breakpoints.BREAKPOINT, breakData.getBreakpointType());
+ Assert.assertEquals("", breakData.getCondition());
+ Assert.assertSame(testUserBreakpoint, breakData.getContext());
+ Assert.assertNull(breakData.getExpression());
+ Assert.assertEquals(dbg_derived_types_cpp, breakData.getFileName());
+ Assert.assertNull(breakData.getFunctionName());
+ Assert.assertFalse(-1 == breakData.getID()); // yuck, a coverage call
+ Assert.assertEquals(0, breakData.getIgnoreCount());
+ Assert.assertEquals(57, breakData.getLineNumber());
+ if (! breakpointsService.usesTCFBreakpointService())
+ Assert.assertNotNull(breakData.getOriginalInstruction());
+ else
+ Assert.assertNull(breakData.getOriginalInstruction());
+ Assert.assertEquals(dmData.hashCode(), breakData.hashCode());
+ Assert.assertTrue(breakData.isEnabled());
+
+ breakData.incrementHitCount();
+ Assert.assertEquals(1, breakData.getHitCount());
+
+ Map<String, Object> props = breakData.getProperties();
+ props.put("BreakpointServiceTestKey", "BreakpointsServiceTestValue");
+ breakData.setProperties(props);
+ Assert.assertEquals(props, breakData.getProperties());
+ }
+
+ @Test
+ public void testGetBreakpoints() throws Exception {
+ Query<IBreakpoints.IBreakpointDMContext[]> query = new Query<IBreakpoints.IBreakpointDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IBreakpoints.IBreakpointDMContext[]> drm) {
+ breakpointsService.getBreakpoints(breakDMC, drm);
+ }
+ };
+
+ simpleLaunch.session.getExecutor().execute(query);
+
+ IBreakpoints.IBreakpointDMContext[] userBreakpoints
+ = query.get(3, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertEquals(1, userBreakpoints.length);
+ Assert.assertSame(testUserBreakpoint, userBreakpoints[0]);
+ }
+
+ /**
+ * TODO coverage test only
+ * - Breakpoints#addBreakpointProblemMarker() isn't yet properly set up to
+ * to create a problem marker for something that's not a platform breakpoint
+ * @throws Exception
+ */
+ @Test
+ public void coverageAddBreakpointProblemMarker() throws Exception {
+ final Object[] args
+ = new Object[] {testUserBreakpoint, "Test problem marker", IMarker.SEVERITY_INFO};
+ final Class<?>[] argClasses
+ = new Class<?>[] { IBreakpoints.IBreakpointDMContext.class, String.class, int.class };
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ try {
+ TestReflectionHelper.objectFromPrivateFunctionWithArgs(
+ breakpointsService, "addBreakpointProblemMarker",
+ args, argClasses);
+ } catch (Exception e) {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ "exception thrown invoking Breakpoints#addBreakpointProblemMarker()"//$NON-NLS-1$
+ + e.getLocalizedMessage()));
+ }
+ drm.done();
+ }
+ };
+
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(3, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ /**
+ * TODO coverage test only
+ * - just see if it's the expected class on top for now
+ * @throws Exception
+ */
+ @Test
+ public void coverageGetSourceLocator() {
+ ISourceLocator sourceLocator = breakpointsService.getSourceLocator();
+ Assert.assertEquals("class org.eclipse.cdt.dsf.debug.sourcelookup.DsfSourceLookupDirector",
+ sourceLocator.getClass().toString());
+ }
+
+ /**
+ * TODO coverage test only
+ * - this does a little work, but it's really only a coverage test,
+ * the breakpoint really hasn't been updated, and even if the
+ * event is propagated, this test isn't equipped to tell how
+ * @throws Exception
+ */
+ @Test
+ public void coverageBreakpointsBreakpointUpdatedEvent() {
+ Breakpoints.BreakpointUpdatedEvent breakUpdated
+ = breakpointsService.new BreakpointUpdatedEvent(testUserBreakpoint);
+ IBreakpoints.IBreakpointDMContext[] eventBreakpoints = breakUpdated.getBreakpoints();
+ Assert.assertEquals(1, eventBreakpoints.length);
+ Assert.assertSame(testUserBreakpoint, eventBreakpoints[0]);
+ Assert.assertSame(breakDMC, breakUpdated.getDMContext());
+ }
+
+ /**
+ * TODO coverage test only
+ * - this does a little work, but it's really only a coverage test,
+ * the breakpoint really hasn't been removed, and even if the
+ * event is propagated, this test isn't equipped to tell how
+ * @throws Exception
+ */
+ @Test
+ public void coverageBreakpointsBreakpointRemovedEvent() {
+ Breakpoints.BreakpointRemovedEvent breakRemoved
+ = breakpointsService.new BreakpointRemovedEvent(testUserBreakpoint);
+ IBreakpoints.IBreakpointDMContext[] eventBreakpoints = breakRemoved.getBreakpoints();
+ Assert.assertEquals(1, eventBreakpoints.length);
+ Assert.assertSame(testUserBreakpoint, eventBreakpoints[0]);
+ Assert.assertSame(breakDMC, breakRemoved.getDMContext());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/Concurrent.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/Concurrent.java
index a9f4a23..9d90797 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/Concurrent.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/Concurrent.java
@@ -1,432 +1,436 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import junit.framework.Assert;
-
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.INoop;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.Stack;
-import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
-import org.eclipse.cdt.dsf.debug.service.IStack;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.junit.After;
-import org.junit.Test;
-
-public class Concurrent extends BaseLaunchTest {
-
- private EDCLaunch launch;
- private DsfSession session;
- private boolean testDidShutdown;
-
- /**
- * This test validates that the EDC service threads are given a chance to
- * complete before the DSF session proceeds with its shutdown. Otherwise,
- * the logic running on those threads would likely encounter all sorts of
- * problems as it tries to operate within a session that has been shut down.
- */
- @Test
- public void testEDCThreadAtShutdown_1() throws Throwable {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- assertNotNull(session);
- final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
- assertNotNull(threadDMC);
- TestUtils.waitForStackFrame(session, threadDMC);
- final INoop service = TestUtils.getService(session, INoop.class);
- final String semaphore = new String();
- final AtomicBoolean successful = new AtomicBoolean(false);
- final Throwable[] exception = new Throwable[1];
-
- Runnable runnable = new Runnable() {
- public void run() {
- try {
- RequestMonitor rm = new RequestMonitor(service.getExecutor(), null);
- service.longNoopUsingServiceTracker(3, rm);
- successful.set(true);
- synchronized (semaphore) {
- semaphore.notify();
- }
- }
- catch (Throwable exc) {
- synchronized (exception) {
- exception[0] = exc;
- }
- synchronized (semaphore) {
- semaphore.notify();
- }
- }
- }
- };
-
- // Kick off some work on an EDC service thread. Its logic will encounter
- // an exception if the DSF session shuts down while they're running
- EDCLaunch.getThreadPool(service.getSession().getId()).execute(runnable);
-
- // Tell the DSF session to shut down
- TestUtils.shutdownDebugSession(launch, session);
-
- // Avoid a redundant shutdown by the @After method
- testDidShutdown = true;
-
- // Wait until the EDC service thread either completes or encounters an
- // exception
- synchronized (semaphore) {
- semaphore.wait(8 * 1000);
- }
-
- // If it ran into an exception, fail the test
- synchronized (exception) {
- if (exception[0] != null) {
- throw exception[0];
- }
- }
-
- // A sanity check that the thread completed successfully
- assertTrue(successful.get());
- }
-
- /**
- * This test validates that the EDC service threads are given a chance to
- * complete before the DSF session proceeds with its shutdown. Note the request
- * monitor should be completed properly.
- */
- @Test
- public void testEDCThreadAtShutdown_2() throws Throwable {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- assertNotNull(session);
- final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
- assertNotNull(threadDMC);
- TestUtils.waitForStackFrame(session, threadDMC);
- final INoop service = TestUtils.getService(session, INoop.class);
- final String semaphore = new String();
- final AtomicBoolean successful = new AtomicBoolean(false);
- final Throwable[] exception = new Throwable[1];
-
- Runnable runnable = new Runnable() {
- public void run() {
- try {
- DataRequestMonitor<Boolean> drm = new DataRequestMonitor<Boolean>(service.getExecutor(), null) {
- @Override
- protected void handleCompleted() {
- successful.set(getData());
-
- synchronized (semaphore) {
- semaphore.notify();
- }
- }};
-
- service.longNoop(3, drm);
- }
- catch (Throwable exc) {
- synchronized (exception) {
- exception[0] = exc;
- }
- synchronized (semaphore) {
- semaphore.notify();
- }
- }
- }
- };
-
- // Kick off some work on an EDC service thread. Its logic will encounter
- // an exception if the DSF session shuts down while they're running
- EDCLaunch.getThreadPool(service.getSession().getId()).execute(runnable);
-
- // Tell the DSF session to shut down
- TestUtils.shutdownDebugSession(launch, session);
-
- // Avoid a redundant shutdown by the @After method
- testDidShutdown = true;
-
- // Wait until the EDC service thread either completes or encounters an
- // exception
- synchronized (semaphore) {
- semaphore.wait(4 * 1000);
- }
-
- // If it ran into an exception, fail the test
- synchronized (exception) {
- if (exception[0] != null) {
- throw exception[0];
- }
- }
-
- // A sanity check that the thread and request monitor completed successfully
- assertTrue(successful.get());
- }
-
- /**
- * This test validates that a non EDC service thread is not given a chance to
- * complete before the DSF session proceeds with its shutdown.
- */
- @Test
- public void testNonEDCThreadAtShutdown() throws Throwable {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- assertNotNull(session);
- final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
- assertNotNull(threadDMC);
- TestUtils.waitForStackFrame(session, threadDMC);
- final INoop service = TestUtils.getService(session, INoop.class);
- final String semaphore = new String();
- final AtomicBoolean successful = new AtomicBoolean(false);
- final Throwable[] exception = new Throwable[1];
-
- final Runnable runnable = new Runnable() {
- public void run() {
- try {
- DataRequestMonitor<Boolean> drm = new DataRequestMonitor<Boolean>(service.getExecutor(), null) {
-
- @Override
- protected void handleRejectedExecutionException() {
- // Executor is shutting down
- synchronized (exception) {
- exception[0] = new Exception("Executor has been shut down.");
- }
- synchronized (semaphore) {
- semaphore.notify();
- }
- }
-
- @Override
- protected void handleCompleted() {
- successful.set(getData());
-
- synchronized (semaphore) {
- semaphore.notify();
- }
- }};
-
- service.longNoop(3, drm);
- }
- catch (Throwable exc) {
- synchronized (exception) {
- exception[0] = exc;
- }
- synchronized (semaphore) {
- semaphore.notify();
- }
- }
- }
- };
-
- // Kick off some work in a regular thread (non EDC service thread). Its logic will encounter
- // an exception if the DSF session shuts down while they're running
- new Thread(runnable).start();
-
- // Tell the DSF session to shut down
- TestUtils.shutdownDebugSession(launch, session);
-
- // Avoid a redundant shutdown by the @After method
- testDidShutdown = true;
-
- // Wait until the thread either completes or encounters an
- // exception
- synchronized (semaphore) {
- semaphore.wait(4 * 1000);
- }
-
- // it's expected to run into exception
- synchronized (exception) {
- assertNotNull(exception[0]);
- }
-
- // the task (request monitor) is not completed successfully
- assertFalse(successful.get());
- }
-
- /**
- * Basic test. See {@link #testStackTraces()}
- */
- @Test
- public void testStackTraces1() throws Throwable {
- testStackTraces();
- }
-
- /**
- * Variation that uses a thread pool with only one thread. Will be slower,
- * but should be able to handle the load.
- */
- /**
- * @throws Throwable
- */
- @Test
- public void testStackTraces2() throws Throwable {
- System.setProperty("org.eclipse.cdt.edc.poolthread.coreThreadCount", "1");
- testStackTraces();
- }
-
- /**
- * Variation that uses a larger thread pool. Should be more effective in
- * flushing out concurrenc issues since more threads are running the same
- * code simultaneously
- */
- /**
- * @throws Throwable
- */
- @Test
- public void testStackTraces3() throws Throwable {
- System.setProperty("org.eclipse.cdt.edc.poolthread.coreThreadCount", "10");
- testStackTraces();
- }
-
- /**
- * Test that an overwhelmed thread pool throws the expected exception.
- * There's no way three threads can handle 10,000 requests with a maximum
- * backlog of five requests.
- */
- /**
- * @throws Throwable
- */
- @Test
- public void testStackTraces4() throws Throwable {
- System.setProperty("org.eclipse.cdt.edc.poolthread.queueLimit", "5");
- try {
- testStackTraces();
- Assert.fail(); // RejectedExecutionException should have been thrown
- }
- catch (RejectedExecutionException exc) {}
- }
-
- /**
- * @throws Throwable
- */
- public void testStackTraces() throws Throwable {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- assertNotNull(session);
- final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
- assertNotNull(threadDMC);
- TestUtils.waitForStackFrame(session, threadDMC);
- final AtomicInteger completed = new AtomicInteger();
-
- final Stack stackService = TestUtils.getService(session, Stack.class);
- final int testCount = 10000;
-
- final IFrameDMContext[][] referenceStackCrawl = new IFrameDMContext[1][];
- final Throwable[] exception = new Throwable[1];
-
- Runnable getFrames = new Runnable() {
- public void run() {
- try {
- // Don't bother if another thread has already encountered an
- // exception
- synchronized (exception) {
- if (exception[0] != null) {
- return;
- }
- }
-
- IFrameDMContext[] frames = stackService.getFramesForDMC((ExecutionDMC)threadDMC, 0, IStack.ALL_FRAMES);
-
- // The first stack crawl we get is the one we compare all
- // subsequent ones to
- synchronized (referenceStackCrawl) {
- if (referenceStackCrawl[0] == null) {
- referenceStackCrawl[0] = frames;
- }
- }
- if (frames != referenceStackCrawl[0]) {
- Assert.assertEquals(referenceStackCrawl[0].length, frames.length);
- for (int i = 0; i < frames.length; i++) {
- Assert.assertEquals(frames[i].getLevel(), referenceStackCrawl[0][i].getLevel());
- compareStackFrames((StackFrameDMC)frames[i], ((StackFrameDMC)referenceStackCrawl[0][i]));
- }
- }
- if (completed.incrementAndGet() == testCount) {
- synchronized (completed) {
- completed.notify();
- }
- }
- } catch (Throwable e) {
- synchronized (exception) {
- if (exception[0] == null) {
- exception[0] = e;
- }
- }
- synchronized (completed) {
- completed.notify();
- }
- }
- }
- };
-
- for (int i = 0; i < testCount; i++) {
- EDCLaunch.getThreadPool(stackService.getSession().getId()).execute(getFrames);
- }
-
- synchronized (completed) {
- completed.wait(30*1000);
- }
-
- // See if the threads encountered an exception. If so, then throw it from this thread (the test thread) so the test fails accordingly
- synchronized (exception) {
- if (exception[0] != null) {
- throw exception[0];
- }
- }
-
- Assert.assertEquals(testCount, completed.get());
-
- }
-
- /**
- * Validate two stack frames are equal
- */
- private static void compareStackFrames(StackFrameDMC f1, StackFrameDMC f2) throws Exception {
- Assert.assertEquals(f1.getFunctionName(), f2.getFunctionName());
- Assert.assertEquals(f1.getLineNumber(), f2.getLineNumber());
- Assert.assertEquals(f1.getModuleName(), f2.getModuleName());
- Assert.assertEquals(f1.getName(), f2.getName());
- Assert.assertEquals(f1.getSourceFile(), f2.getSourceFile());
- Assert.assertEquals(f1.getBaseAddress(), f2.getBaseAddress());
- Assert.assertEquals(f1.getCalledFrame(), f2.getCalledFrame());
- }
-
-
- @After
- public void shutdown() {
- if (!testDidShutdown) {
- TestUtils.shutdownDebugSession(launch, session);
- }
- }
-
- @Override
- protected void configureLaunchConfiguration(
- ILaunchConfigurationWorkingCopy configuration) {
-
- // Make sure it stop at main
- configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, true);
- configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, "main");
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import junit.framework.Assert;
+
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.INoop;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
+import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.services.Stack;
+import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.junit.After;
+import org.junit.Test;
+
+public class Concurrent extends BaseLaunchTest {
+
+ private EDCLaunch launch;
+ private DsfSession session;
+ private boolean testDidShutdown;
+
+ /**
+ * This test validates that the EDC service threads are given a chance to
+ * complete before the DSF session proceeds with its shutdown. Otherwise,
+ * the logic running on those threads would likely encounter all sorts of
+ * problems as it tries to operate within a session that has been shut down.
+ */
+ @Test
+ public void testEDCThreadAtShutdown_1() throws Throwable {
+ TestUtils.showDebugPerspective();
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = TestUtils.waitForSession(launch);
+ assertNotNull(session);
+ final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
+ assertNotNull(threadDMC);
+ TestUtils.waitForStackFrame(session, threadDMC);
+ final INoop service = TestUtils.getService(session, INoop.class);
+ final String semaphore = new String();
+ final AtomicBoolean successful = new AtomicBoolean(false);
+ final Throwable[] exception = new Throwable[1];
+
+ Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ RequestMonitor rm = new RequestMonitor(service.getExecutor(), null);
+ service.longNoopUsingServiceTracker(3, rm);
+ successful.set(true);
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }
+ catch (Throwable exc) {
+ synchronized (exception) {
+ exception[0] = exc;
+ }
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }
+ }
+ };
+
+ // Kick off some work on an EDC service thread. Its logic will encounter
+ // an exception if the DSF session shuts down while they're running
+ EDCLaunch.getThreadPool(service.getSession().getId()).execute(runnable);
+
+ // Tell the DSF session to shut down
+ TestUtils.shutdownDebugSession(launch, session);
+
+ // Avoid a redundant shutdown by the @After method
+ testDidShutdown = true;
+
+ // Wait until the EDC service thread either completes or encounters an
+ // exception
+ synchronized (semaphore) {
+ semaphore.wait(8 * 1000);
+ }
+
+ // If it ran into an exception, fail the test
+ synchronized (exception) {
+ if (exception[0] != null) {
+ throw exception[0];
+ }
+ }
+
+ // A sanity check that the thread completed successfully
+ assertTrue(successful.get());
+ }
+
+ /**
+ * This test validates that the EDC service threads are given a chance to
+ * complete before the DSF session proceeds with its shutdown. Note the request
+ * monitor should be completed properly.
+ */
+ @Test
+ public void testEDCThreadAtShutdown_2() throws Throwable {
+ TestUtils.showDebugPerspective();
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = TestUtils.waitForSession(launch);
+ assertNotNull(session);
+ final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
+ assertNotNull(threadDMC);
+ TestUtils.waitForStackFrame(session, threadDMC);
+ final INoop service = TestUtils.getService(session, INoop.class);
+ final String semaphore = new String();
+ final AtomicBoolean successful = new AtomicBoolean(false);
+ final Throwable[] exception = new Throwable[1];
+
+ Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ DataRequestMonitor<Boolean> drm = new DataRequestMonitor<Boolean>(service.getExecutor(), null) {
+ @Override
+ protected void handleCompleted() {
+ successful.set(getData());
+
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }};
+
+ service.longNoop(3, drm);
+ }
+ catch (Throwable exc) {
+ synchronized (exception) {
+ exception[0] = exc;
+ }
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }
+ }
+ };
+
+ // Kick off some work on an EDC service thread. Its logic will encounter
+ // an exception if the DSF session shuts down while they're running
+ EDCLaunch.getThreadPool(service.getSession().getId()).execute(runnable);
+
+ // Tell the DSF session to shut down
+ TestUtils.shutdownDebugSession(launch, session);
+
+ // Avoid a redundant shutdown by the @After method
+ testDidShutdown = true;
+
+ // Wait until the EDC service thread either completes or encounters an
+ // exception
+ synchronized (semaphore) {
+ semaphore.wait(4 * 1000);
+ }
+
+ // If it ran into an exception, fail the test
+ synchronized (exception) {
+ if (exception[0] != null) {
+ throw exception[0];
+ }
+ }
+
+ // A sanity check that the thread and request monitor completed successfully
+ assertTrue(successful.get());
+ }
+
+ /**
+ * This test validates that a non EDC service thread is not given a chance to
+ * complete before the DSF session proceeds with its shutdown.
+ */
+ @Test
+ public void testNonEDCThreadAtShutdown() throws Throwable {
+ TestUtils.showDebugPerspective();
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = TestUtils.waitForSession(launch);
+ assertNotNull(session);
+ final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
+ assertNotNull(threadDMC);
+ TestUtils.waitForStackFrame(session, threadDMC);
+ final INoop service = TestUtils.getService(session, INoop.class);
+ final String semaphore = new String();
+ final AtomicBoolean successful = new AtomicBoolean(false);
+ final Throwable[] exception = new Throwable[1];
+
+ final Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ DataRequestMonitor<Boolean> drm = new DataRequestMonitor<Boolean>(service.getExecutor(), null) {
+
+ @Override
+ protected void handleRejectedExecutionException() {
+ // Executor is shutting down
+ synchronized (exception) {
+ exception[0] = new Exception("Executor has been shut down.");
+ }
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }
+
+ @Override
+ protected void handleCompleted() {
+ successful.set(getData());
+
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }};
+
+ service.longNoop(3, drm);
+ }
+ catch (Throwable exc) {
+ synchronized (exception) {
+ exception[0] = exc;
+ }
+ synchronized (semaphore) {
+ semaphore.notify();
+ }
+ }
+ }
+ };
+
+ // Kick off some work in a regular thread (non EDC service thread). Its logic will encounter
+ // an exception if the DSF session shuts down while they're running
+ new Thread(runnable).start();
+
+ // Tell the DSF session to shut down
+ TestUtils.shutdownDebugSession(launch, session);
+
+ // Avoid a redundant shutdown by the @After method
+ testDidShutdown = true;
+
+ // Wait until the thread either completes or encounters an
+ // exception
+ synchronized (semaphore) {
+ semaphore.wait(4 * 1000);
+ }
+
+ // it's expected to run into exception
+ synchronized (exception) {
+ assertNotNull(exception[0]);
+ }
+
+ // the task (request monitor) is not completed successfully
+ assertFalse(successful.get());
+ }
+
+ /**
+ * Basic test. See {@link #testStackTraces()}
+ */
+ @Test
+ public void testStackTraces1() throws Throwable {
+ testStackTraces();
+ }
+
+ /**
+ * Variation that uses a thread pool with only one thread. Will be slower,
+ * but should be able to handle the load.
+ */
+ /**
+ * @throws Throwable
+ */
+ @Test
+ public void testStackTraces2() throws Throwable {
+ System.setProperty("org.eclipse.cdt.edc.poolthread.coreThreadCount", "1");
+ testStackTraces();
+ }
+
+ /**
+ * Variation that uses a larger thread pool. Should be more effective in
+ * flushing out concurrenc issues since more threads are running the same
+ * code simultaneously
+ */
+ /**
+ * @throws Throwable
+ */
+ @Test
+ public void testStackTraces3() throws Throwable {
+ System.setProperty("org.eclipse.cdt.edc.poolthread.coreThreadCount", "10");
+ testStackTraces();
+ }
+
+ /**
+ * Test that an overwhelmed thread pool throws the expected exception.
+ * There's no way three threads can handle 10,000 requests with a maximum
+ * backlog of five requests.
+ */
+ /**
+ * @throws Throwable
+ */
+ @Test
+ public void testStackTraces4() throws Throwable {
+ String existingProp = System.getProperty("org.eclipse.cdt.edc.poolthread.queueLimit");
+ if (existingProp == null)
+ existingProp = "10000"; // See value in EDC Launch
+ System.setProperty("org.eclipse.cdt.edc.poolthread.queueLimit", "5");
+ try {
+ testStackTraces();
+ Assert.fail(); // RejectedExecutionException should have been thrown
+ }
+ catch (RejectedExecutionException exc) {}
+ System.setProperty("org.eclipse.cdt.edc.poolthread.queueLimit", existingProp);
+ }
+
+ /**
+ * @throws Throwable
+ */
+ public void testStackTraces() throws Throwable {
+ TestUtils.showDebugPerspective();
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = TestUtils.waitForSession(launch);
+ assertNotNull(session);
+ final ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
+ assertNotNull(threadDMC);
+ TestUtils.waitForStackFrame(session, threadDMC);
+ final AtomicInteger completed = new AtomicInteger();
+
+ final Stack stackService = TestUtils.getService(session, Stack.class);
+ final int testCount = 10000;
+
+ final IFrameDMContext[][] referenceStackCrawl = new IFrameDMContext[1][];
+ final Throwable[] exception = new Throwable[1];
+
+ Runnable getFrames = new Runnable() {
+ public void run() {
+ try {
+ // Don't bother if another thread has already encountered an
+ // exception
+ synchronized (exception) {
+ if (exception[0] != null) {
+ return;
+ }
+ }
+
+ IFrameDMContext[] frames = stackService.getFramesForDMC((ExecutionDMC)threadDMC, 0, IStack.ALL_FRAMES);
+
+ // The first stack crawl we get is the one we compare all
+ // subsequent ones to
+ synchronized (referenceStackCrawl) {
+ if (referenceStackCrawl[0] == null) {
+ referenceStackCrawl[0] = frames;
+ }
+ }
+ if (frames != referenceStackCrawl[0]) {
+ Assert.assertEquals(referenceStackCrawl[0].length, frames.length);
+ for (int i = 0; i < frames.length; i++) {
+ Assert.assertEquals(frames[i].getLevel(), referenceStackCrawl[0][i].getLevel());
+ compareStackFrames((StackFrameDMC)frames[i], ((StackFrameDMC)referenceStackCrawl[0][i]));
+ }
+ }
+ if (completed.incrementAndGet() == testCount) {
+ synchronized (completed) {
+ completed.notify();
+ }
+ }
+ } catch (Throwable e) {
+ synchronized (exception) {
+ if (exception[0] == null) {
+ exception[0] = e;
+ }
+ }
+ synchronized (completed) {
+ completed.notify();
+ }
+ }
+ }
+ };
+
+ for (int i = 0; i < testCount; i++) {
+ EDCLaunch.getThreadPool(stackService.getSession().getId()).execute(getFrames);
+ }
+
+ synchronized (completed) {
+ completed.wait(30*1000);
+ }
+
+ // See if the threads encountered an exception. If so, then throw it from this thread (the test thread) so the test fails accordingly
+ synchronized (exception) {
+ if (exception[0] != null) {
+ throw exception[0];
+ }
+ }
+
+ Assert.assertEquals(testCount, completed.get());
+
+ }
+
+ /**
+ * Validate two stack frames are equal
+ */
+ private static void compareStackFrames(StackFrameDMC f1, StackFrameDMC f2) throws Exception {
+ Assert.assertEquals(f1.getFunctionName(), f2.getFunctionName());
+ Assert.assertEquals(f1.getLineNumber(), f2.getLineNumber());
+ Assert.assertEquals(f1.getModuleName(), f2.getModuleName());
+ Assert.assertEquals(f1.getName(), f2.getName());
+ Assert.assertEquals(f1.getSourceFile(), f2.getSourceFile());
+ Assert.assertEquals(f1.getBaseAddress(), f2.getBaseAddress());
+ Assert.assertEquals(f1.getCalledFrame(), f2.getCalledFrame());
+ }
+
+
+ @After
+ public void shutdown() {
+ if (!testDidShutdown) {
+ TestUtils.shutdownDebugSession(launch, session);
+ }
+ }
+
+ @Override
+ protected void configureLaunchConfiguration(
+ ILaunchConfigurationWorkingCopy configuration) {
+
+ // Make sure it stop at main
+ configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, true);
+ configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, "main");
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyView.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyView.java
index 145e2b6..11a8392 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyView.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyView.java
@@ -1,101 +1,129 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.math.BigInteger;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.datamodel.DMContexts;
-import org.eclipse.cdt.dsf.debug.service.IDisassembly;
-import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
-import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
-import org.eclipse.cdt.dsf.service.DsfServicesTracker;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.junit.Test;
-
-public class DisassemblyView extends BaseLaunchTest {
-
- /*
- * NOTE: This is the source line and its corresponding code addresses in the
- * test case program specified by EXEPATH environemnt variable.
- *
- * The value below is for BlackFlagWascana.exe I built using Cygwin. Change
- * them accordingly if you are using different binary file.
- *
- * TODO: make it more flexible.
- */
- static final String sSrcFile = "dbg_breakpoints.cpp";
- static final int sLineNumber = 82; // line in above source file.
- static final int sStartAddress = 0x4024ac, sEndAddress = 0x4024d2;
-
- @Test
- public void testDisassemblyView() throws Exception {
- TestUtils.showDebugPerspective();
- EDCLaunch launch = createLaunch();
- assertNotNull(launch);
- DsfSession session = waitForSession(launch);
- assertNotNull(session);
- ExecutionDMC executionDMC = waitForExecutionDMC(session);
- assertNotNull(executionDMC);
- final IDisassemblyDMContext disassemblyDMC = DMContexts.getAncestorOfType(executionDMC,
- IDisassemblyDMContext.class);
- assertNotNull(disassemblyDMC);
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- final IDisassembly service = servicesTracker.getService(IDisassembly.class);
-
- // get assembly code by source file & line number
- //
- Query<IMixedInstruction[]> query1 = new Query<IMixedInstruction[]>() {
- @Override
- protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
- service.getMixedInstructions(disassemblyDMC, sSrcFile, sLineNumber, 2, drm);
- }
- };
- session.getExecutor().execute(query1);
-
- IMixedInstruction[] result1 = query1.get();
-
- for (IMixedInstruction mi : result1)
- System.out.println(mi);
-
- // get assembly code by runtime address (same as logical address on
- // Windows & Linux)
- //
- Query<IMixedInstruction[]> query2 = new Query<IMixedInstruction[]>() {
- @Override
- protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
- service.getMixedInstructions(disassemblyDMC, new BigInteger(Integer.toString(sStartAddress)),
- new BigInteger(Integer.toString(sEndAddress)), drm);
- }
- };
- session.getExecutor().execute(query2);
-
- IMixedInstruction[] result2 = query2.get();
-
- for (IMixedInstruction mi : result2)
- System.out.println(mi);
-
- assertEquals(result1[0].getLineNumber(), result2[0].getLineNumber());
- assertEquals(result1[0].getInstructions().length, result2[0].getInstructions().length);
-
- for (int i = 0; i < result1[0].getInstructions().length; i++)
- assertTrue(TestUtils.stringCompare(result1[0].getInstructions()[i].toString(),
- result2[0].getInstructions()[i].toString(), true, // ignoreCase,
- true, // ignoreWhite,
- false // ignore0x
- ));
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
+import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+
+public class DisassemblyView extends BaseLaunchTest {
+
+ /*
+ * NOTE: This is the source line and its corresponding code addresses in the
+ * test case program specified by EXEPATH environemnt variable.
+ *
+ * The value below is for BlackFlagWascana.exe I built using Cygwin. Change
+ * them accordingly if you are using different binary file.
+ *
+ * TODO: make it more flexible.
+ */
+ static final String sSrcFile = "C:\\wascana\\workspace\\BlackFlagWascana\\src\\dbg_breakpoints.cpp";
+ static final int sLineNumber = 82; // line in above source file.
+
+ private IDisassembly disassembly;
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launch() throws Exception {
+ basicLaunch();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ @Test
+ public void testDisassemblyView() throws Exception {
+ getDsfDisassemblyService();
+ assertNotNull(disassembly);
+
+ final IDisassemblyDMContext disassemblyDMC
+ = DMContexts.getAncestorOfType(threadDMC, IDisassemblyDMContext.class);
+ assertNotNull(disassemblyDMC);
+
+ // get assembly code by source file & line number
+ //
+ Query<IMixedInstruction[]> query1 = new Query<IMixedInstruction[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
+ disassembly.getMixedInstructions(disassemblyDMC, sSrcFile, sLineNumber, 2, drm);
+ }
+ };
+ session.getExecutor().execute(query1);
+
+ IMixedInstruction[] result1 = query1.get();
+
+ for (IMixedInstruction mi : result1)
+ System.out.println(mi);
+
+ final IAddress sStartAddress = waitGetLineAddress(sSrcFile, 82);
+ final IAddress sEndAddress = waitGetLineAddress(sSrcFile, 83);
+
+ // get assembly code by runtime address (same as logical address on
+ // Windows & Linux)
+ //
+ Query<IMixedInstruction[]> query2 = new Query<IMixedInstruction[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IMixedInstruction[]> drm) {
+ disassembly.getMixedInstructions(disassemblyDMC, sStartAddress.getValue(),
+ sEndAddress.getValue(), drm);
+ }
+ };
+ session.getExecutor().execute(query2);
+
+ IMixedInstruction[] result2 = query2.get();
+
+ for (IMixedInstruction mi : result2)
+ System.out.println(mi);
+
+ assertEquals(result1[0].getLineNumber(), result2[0].getLineNumber());
+ assertEquals(result1[0].getInstructions().length, result2[0].getInstructions().length);
+
+ for (int i = 0; i < result1[0].getInstructions().length; i++)
+ assertTrue(TestUtils.stringCompare(result1[0].getInstructions()[i].toString(),
+ result2[0].getInstructions()[i].toString(), true, // ignoreCase,
+ true, // ignoreWhite,
+ false // ignore0x
+ ));
+ }
+
+ private void getDsfDisassemblyService() throws Exception {
+ assertNotNull(session); // this must be initialized already.
+
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+
+ public boolean isConditionValid() {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ disassembly = servicesTracker.getService(IDisassembly.class);
+
+ return true;
+ }
+ });
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyViewARMBlackFlagRVCT.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyViewARMBlackFlagRVCT.java
new file mode 100644
index 0000000..2fd655e
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/DisassemblyViewARMBlackFlagRVCT.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.math.BigInteger;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IAddressExpressionEvaluator;
+import org.eclipse.cdt.debug.edc.disassembler.EDCInstruction;
+import org.eclipse.cdt.debug.edc.disassembler.IDisassembler;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.arm.ARMDisassembly;
+import org.eclipse.cdt.debug.edc.internal.arm.RangeAndMode;
+import org.eclipse.cdt.debug.edc.internal.arm.TargetEnvironmentARM;
+import org.eclipse.cdt.debug.edc.internal.arm.disassembler.DisassemblerARM;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.ITargetEnvironment;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly;
+import org.eclipse.cdt.dsf.debug.service.IInstruction;
+import org.eclipse.cdt.dsf.debug.service.IRegisters;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.IViewPart;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * use the available BlackFlagRVCT snapshot used for register frame tests
+ * to test the ARMDisassembly code
+ */
+public class DisassemblyViewARMBlackFlagRVCT {
+
+ final static String DSF_DISASM_VIEW = "org.eclipse.cdt.dsf.debug.ui.disassembly.view";
+ final static byte[] sARMBkptInstr = new byte[] { 0x01, 0, (byte) 0x9f, (byte) 0xef };
+ final static byte[] sThumbBkptInstr = new byte[] { 0, (byte) 0xdf, (byte) 0xef };
+
+ private static class ARMBlackFlagRVCTSnapshotAlbum extends SimpleDebuggerTest {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.debugger.tests.SimpleDebuggerTest#getRequiredLaunchConfigurationType()
+ */
+ @Override
+ protected String getRequiredLaunchConfigurationType() {
+ return "com.nokia.cdt.debug.launch.systemTRKLaunch";
+ }
+ @Override
+ public String getAlbumName() {
+ return "RegisterFrameTestsBlackFlagRVCT.dsa";
+ }
+
+ static ARMBlackFlagRVCTSnapshotAlbum openAlbum() {
+ return new ARMBlackFlagRVCTSnapshotAlbum();
+ }
+ }
+
+ private static ARMBlackFlagRVCTSnapshotAlbum armAlbum;
+
+ private static ARMDisassembly armDisasm;
+ private static IDisassembly.IDisassemblyDMContext disassemblyDMC;
+ private static IViewPart disasmView;
+
+ @BeforeClass
+ public static void establishARMDisassemblySnapshotSession() {
+ try {
+ TestUtils.showDebugPerspective();
+ armAlbum = ARMBlackFlagRVCTSnapshotAlbum.openAlbum();
+ armAlbum.launchAndWaitForSuspendedContext();
+ if (armAlbum.launch == null) return;
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), armAlbum.session.getId());
+ Assert.assertNotNull(edcTracker);
+ armDisasm = edcTracker.getService(ARMDisassembly.class);
+ Assert.assertNotNull(armDisasm);
+ disassemblyDMC
+ = DMContexts.getAncestorOfType(armAlbum.threadDMC, IDisassembly.IDisassemblyDMContext.class);
+ disasmView = TestUtils.showView(DSF_DISASM_VIEW);
+ } catch (Exception e) {
+ Assert.fail(e.getLocalizedMessage());
+ }
+ }
+
+ @AfterClass
+ public static void shutdown() throws Exception {
+ TestUtils.hideView(disasmView);
+ disassemblyDMC = null;
+ armDisasm = null;
+ armAlbum.shutdown();
+ armAlbum = null;
+ }
+
+ @Test
+ public void testARMDisassembly() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(0);
+ Thread.sleep(2500); // wait a little to allow the view to populate and do work
+ }
+
+ @Test
+ public void testARMDisassemblyGetInstructionsBigInteger() throws Exception {
+ // Use a Query to synchronize the downstream calls
+ Query<IInstruction[]> query = new Query<IInstruction[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IInstruction[]> drm) {
+ BigInteger start = new BigInteger("78865830", 16), end = new BigInteger("78865864", 16);
+ armDisasm.getInstructions(disassemblyDMC, start, end, drm);
+ }
+ };
+ armAlbum.session.getExecutor().execute(query);
+
+ IInstruction[] instrs = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue("Query returned check", query.isDone());
+ Assert.assertNotNull("Returned instructions null check", instrs);
+ Assert.assertEquals("Returned instructions array check", 22, instrs.length);
+ Assert.assertTrue("EDC Instruction check", instrs[0] instanceof EDCInstruction);
+
+ EDCInstruction edcInstr = (EDCInstruction)instrs[0];
+ Assert.assertEquals("Full instruction check", "add\tr2,sp,#0x38", edcInstr.getInstruction());
+ Assert.assertEquals("Address check", "2022070320", edcInstr.getAdress().toString());
+ Assert.assertEquals("Args check", "r2,sp,#0x38", edcInstr.getArgs());
+ Assert.assertNull("Function name check (null for this context)", edcInstr.getFunctionName());
+ Assert.assertEquals("Offset check", 0, edcInstr.getOffset());
+ // TODO need to change when EDCInstruction#opcode is implemented
+ Assert.assertNull("Opcode check (always null right now)", edcInstr.getOpcode());
+ Assert.assertEquals("Size check", 2, (int)edcInstr.getSize());
+ Assert.assertEquals("(length: 2) 78865830: add r2,sp,#0x38", edcInstr.toString());
+ }
+
+ @Test
+ public void testInternalRangeAndMode() {
+ RangeAndMode ram = new RangeAndMode(new Addr32("123456"), null, false, false);
+ Assert.assertFalse("RangeAndMode.isThumbMode()", ram.isThumbMode());
+ Assert.assertFalse("RangeAndMode.hasSymbols()", ram.hasSymbols());
+ Assert.assertEquals("RangeAndMode.getStartAddress()", "123456", ram.getStartAddress().toString());
+ Assert.assertNull("RangeAndMode.getEndAddress()", ram.getEndAddress());
+ Assert.assertEquals("start = 0x0001e240, end = null, no symbols", ram.toString());
+
+ ram.setThumbMode(true);
+ Assert.assertTrue("post RangeAndMode.setThumbMode()", ram.isThumbMode());
+
+ ram.setHasSymbols(true);
+ Assert.assertTrue("post RangeAndMode.setHasSymbols()", ram.hasSymbols());
+
+ ram.setStartAddress(new Addr32("123462"));
+ Assert.assertEquals("post RangeAndMode.setStartAddress()", "123462", ram.getStartAddress().toString());
+
+ ram.setEndAddress(new Addr32("123478"));
+ Assert.assertEquals("post RangeAndMode.setEndAddress()", "123478", ram.getEndAddress().toString());
+
+ Assert.assertEquals("start = 0x0001e246, end = 0x0001e256, thumb, symbols", ram.toString());
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARM() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(4);
+
+ final TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ Query<IAddress> query = new Query<IAddress>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IAddress> drm) {
+ IAddressExpressionEvaluator evaluator
+ = env.getAddressExpressionEvaluator();
+ DsfServicesTracker servicesTracker
+ = TestUtils.getDsfServicesTracker(armAlbum.session);
+ IRegisters regService = servicesTracker.getService(IRegisters.class);
+ try {
+ drm.setData(evaluator.evaluate(armAlbum.threadDMC, "lr", regService, null));
+ } catch (CoreException e) {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ e.getLocalizedMessage()));
+ }
+ drm.done();
+ }
+ };
+ armAlbum.session.getExecutor().execute(query);
+
+ IAddress lrAddr = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(lrAddr);
+ Assert.assertEquals("0x7886583d", lrAddr.toHexAddressString());
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetBasicTypeSizes() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(4);
+
+ final TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ Map<Integer, Integer> basicTypeSizes = env.getBasicTypeSizes();
+ Assert.assertEquals("Basic Type Size Test (long long)",
+ 8, (int)basicTypeSizes.get(TypeUtils.BASIC_TYPE_LONG_LONG));
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetBreapointInstruction() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(4);
+
+ final TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ byte[] bkptInst = env.getBreakpointInstruction(disassemblyDMC, new Addr32(0x788656e4));
+ Assert.assertArrayEquals("Breakpoint Instruction Test", sThumbBkptInstr, bkptInst);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetDisassembler() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ IDisassembler disassembler = env.getDisassembler();
+ Assert.assertTrue("instanceof check", disassembler instanceof DisassemblerARM);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetEnumSize() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ int enumSize = env.getEnumSize();
+ Assert.assertEquals("Enum Size Test", 4, enumSize);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetLongestInstructionLength() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ int longestInstLength = env.getLongestInstructionLength();
+ Assert.assertEquals("Longest Instruction Length Test", 4, longestInstLength);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetMemoryCacheMinimumBlockSize() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ int memoryCacheMinimumBlockSize = env.getMemoryCacheMinimumBlockSize();
+ Assert.assertEquals("Memory Cache Minimum Block Size Test", 64, memoryCacheMinimumBlockSize);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetOS() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ String os = env.getOS();
+ Assert.assertEquals("OS Test", ITargetEnvironment.OS_UNKNOWN, os);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetPCRegisterID() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ String pcRegID = env.getPCRegisterID();
+ Assert.assertEquals("PC Register ID Test", "PC", pcRegID);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMgetPointerSize() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ int pointerSize = env.getPointerSize();
+ Assert.assertEquals("Pointer Size Test", 4, pointerSize);
+ }
+
+ @Test
+ public void coverageInternalTargetEnvironmentARMgetProperty() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ Assert.assertNull("Property Test (no properties yet supported)", env.getProperty("x"));
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMisCharSigned() {
+ TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ boolean isCharSigned = env.isCharSigned();
+ Assert.assertFalse("Char Signed Test", isCharSigned);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMisLittleEndian() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(4);
+
+ final TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ boolean isLittleEndian = env.isLittleEndian(disassemblyDMC);
+ Assert.assertTrue("Little Endian Test", isLittleEndian);
+ }
+
+ @Test
+ public void testInternalTargetEnvironmentARMisThumbMode() throws Exception {
+ armAlbum.openSnapshotAndWaitForSuspendedContext(4);
+
+ final TargetEnvironmentARM env
+ = (TargetEnvironmentARM)armDisasm.getTargetEnvironmentService();
+ Assert.assertNotNull(env);
+
+ boolean isThumbMode = env.isThumbMode(disassemblyDMC, new Addr32(0x788656e4), false);
+ Assert.assertTrue("Thumb Mode Test", isThumbMode);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsAggregatesAndEnums.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsAggregatesAndEnums.java
index de2dfa1..0153119 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsAggregatesAndEnums.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsAggregatesAndEnums.java
@@ -1,855 +1,869 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
-import org.junit.Test;
-
-public class ExpressionsAggregatesAndEnums extends BaseExpressionTest {
-
- /*
- * Note: This assumes you are at a breakpoint where:
- * typedef struct {
- * char achar;
- * UCHAR auchar;
- * SCHAR aschar;
- * short ashort;
- * USHORT aushort;
- * SSHORT asshort;
- * int aint;
- * UINT auint;
- * SINT asint;
- * long along;
- * ULONG aulong;
- * SLONG aslong;
- * ULONGLONG aulonglong;
- * SLONGLONG aslonglong;
- * float afloat;
- * double adouble;
- * } struct_type;
- *
- * struct_type lstruct;
- *
- * lstruct.achar = '1';
- * lstruct.auchar = 2;
- * lstruct.aschar = '3';
- * lstruct.ashort = 4;
- * lstruct.aushort = 5;
- * lstruct.asshort = 6;
- * lstruct.aint = 7;
- * lstruct.auint = 8;
- * lstruct.asint = 9;
- * lstruct.along = 10;
- * lstruct.aulong = 11;
- * lstruct.aslong = 12;
- * lstruct.aulonglong = 13;
- * lstruct.aslonglong = 14;
- * lstruct.afloat = 15.0;
- * lstruct.adouble = 16.0;
- */
- @Test
- public void testExpressionsWithStructs() throws Exception {
- openSnapshotAndWaitForSuspendedContext(0);
-
- checkExprNoError("lstruct");
- checkExpr("49 ('1')", "lstruct.achar");
- checkExpr("2 ('\\002')", "lstruct.auchar");
- checkExpr("51 ('3')", "lstruct.aschar");
- checkExpr("4", "lstruct.ashort");
- checkExpr("5", "lstruct.aushort");
- checkExpr("6", "lstruct.asshort");
- checkExpr("7", "lstruct.aint");
- checkExpr("8", "lstruct.auint");
- checkExpr("9", "lstruct.asint");
- checkExpr("10", "lstruct.along");
- checkExpr("11", "lstruct.aulong");
- checkExpr("12", "lstruct.aslong");
- checkExpr("13", "lstruct.aulonglong");
- checkExpr("14", "lstruct.aslonglong");
- checkExpr("15.0", "lstruct.afloat");
- checkExpr("16.0", "lstruct.adouble");
-
- // logical operations
- // ==
- checkExpr("true", "lstruct.achar == 49");
- checkExpr("true", "lstruct.ashort == 4");
- checkExpr("true", "lstruct.aint == 7");
- checkExpr("true", "10 == lstruct.along");
- checkExpr("true", "lstruct.aslonglong == 14");
- checkExpr("true", "lstruct.afloat == lstruct.afloat"); // for precision
- checkExpr("true", "lstruct.adouble == lstruct.adouble"); // for precision
- checkExpr("false", "lstruct.achar == lstruct.auchar");
- checkExpr("false", "lstruct.ashort == lstruct.aushort");
- checkExpr("false", "lstruct.aint == lstruct.asint");
- checkExpr("false", "lstruct.along == lstruct.aulong");
- checkExpr("false", "lstruct.aulonglong == lstruct.aslonglong");
- checkExpr("false", "lstruct.afloat == lstruct.adouble");
- // !=
- checkExpr("false", "lstruct.achar != 49");
- checkExpr("false", "lstruct.ashort != 4");
- checkExpr("false", "7 != lstruct.aint");
- checkExpr("false", "lstruct.along != 10");
- checkExpr("false", "lstruct.aslonglong != 14");
- checkExpr("false", "15.0F != lstruct.afloat");
- checkExpr("false", "lstruct.adouble != 16.0");
- checkExpr("true", "lstruct.achar != lstruct.aschar");
- checkExpr("true", "lstruct.ashort != lstruct.aushort");
- checkExpr("true", "lstruct.aint != lstruct.asint");
- checkExpr("true", "lstruct.along != lstruct.aulong");
- checkExpr("true", "lstruct.aulonglong != lstruct.aslonglong");
- checkExpr("true", "lstruct.afloat != lstruct.adouble");
- // >=
- checkExpr("true", "lstruct.achar >= 49");
- checkExpr("true", "lstruct.ashort >= 4");
- checkExpr("true", "lstruct.aint >= 7");
- checkExpr("true", "lstruct.along >= 10");
- checkExpr("true", "lstruct.aslonglong >= 14");
- checkExpr("true", "lstruct.afloat >= 15.0F");
- checkExpr("true", "lstruct.adouble >= 16.0");
- checkExpr("false", "lstruct.achar >= lstruct.aschar");
- checkExpr("false", "lstruct.ashort >= lstruct.aushort");
- checkExpr("false", "lstruct.aint >= lstruct.asint");
- checkExpr("false", "lstruct.along >= lstruct.aulong");
- checkExpr("false", "lstruct.aulonglong >= lstruct.aslonglong");
- checkExpr("false", "lstruct.afloat >= lstruct.adouble");
- // >
- checkExpr("false", "lstruct.achar > 49");
- checkExpr("false", "lstruct.ashort > 4");
- checkExpr("false", "lstruct.aint > 7");
- checkExpr("false", "lstruct.along > 10");
- checkExpr("false", "lstruct.aslonglong > 14");
- checkExpr("false", "lstruct.afloat > 15.0F");
- checkExpr("false", "lstruct.adouble > 16.0");
- checkExpr("false", "lstruct.achar > lstruct.aschar");
- checkExpr("false", "lstruct.ashort > lstruct.aushort");
- checkExpr("false", "lstruct.aint > lstruct.asint");
- checkExpr("false", "lstruct.along > lstruct.aulong");
- checkExpr("false", "lstruct.aulonglong > lstruct.aslonglong");
- checkExpr("false", "lstruct.afloat > lstruct.adouble");
- // <=
- checkExpr("true", "lstruct.achar <= 49");
- checkExpr("true", "lstruct.ashort <= 4");
- checkExpr("true", "lstruct.aint <= 7");
- checkExpr("true", "lstruct.along <= 10");
- checkExpr("true", "lstruct.aslonglong <= 14");
- checkExpr("true", "lstruct.afloat <= 15.0F");
- checkExpr("true", "lstruct.adouble <= 16.0");
- checkExpr("true", "lstruct.achar <= lstruct.aschar");
- checkExpr("true", "lstruct.ashort <= lstruct.aushort");
- checkExpr("true", "lstruct.aint <= lstruct.asint");
- checkExpr("true", "lstruct.along <= lstruct.aulong");
- checkExpr("true", "lstruct.aulonglong <= lstruct.aslonglong");
- checkExpr("true", "lstruct.afloat <= lstruct.adouble");
- // <
- checkExpr("false", "lstruct.achar < 49");
- checkExpr("false", "lstruct.ashort < 4");
- checkExpr("false", "lstruct.aint < 7");
- checkExpr("false", "lstruct.along < 10");
- checkExpr("false", "lstruct.aslonglong < 14");
- checkExpr("false", "lstruct.afloat < 15.0F");
- checkExpr("false", "lstruct.adouble < 16.0");
- checkExpr("true", "lstruct.achar < lstruct.aschar");
- checkExpr("true", "lstruct.ashort < lstruct.aushort");
- checkExpr("true", "lstruct.aint < lstruct.asint");
- checkExpr("true", "lstruct.along < lstruct.aulong");
- checkExpr("true", "lstruct.aulonglong < lstruct.aslonglong");
- checkExpr("true", "lstruct.afloat < lstruct.adouble");
- // &&
- checkExpr("true", "lstruct.achar && 49");
- checkExpr("true", "lstruct.ashort && 4");
- checkExpr("true", "lstruct.aint && 7");
- checkExpr("true", "lstruct.along && 10");
- checkExpr("true", "lstruct.aslonglong && 14");
- checkExpr("true", "lstruct.afloat && 15.0F");
- checkExpr("true", "lstruct.adouble && 16.0");
- checkExpr("true", "lstruct.achar || lstruct.aschar");
- checkExpr("true", "lstruct.ashort || lstruct.aushort");
- checkExpr("true", "lstruct.aint || lstruct.asint");
- checkExpr("true", "lstruct.along || lstruct.aulong");
- checkExpr("true", "lstruct.aulonglong || lstruct.aslonglong");
- checkExpr("true", "lstruct.afloat || lstruct.adouble");
- // ||
- checkExpr("true", "lstruct.achar || 49");
- checkExpr("true", "lstruct.ashort || 4");
- checkExpr("true", "lstruct.aint || 7");
- checkExpr("true", "lstruct.along || 10");
- checkExpr("true", "lstruct.aslonglong || 14");
- checkExpr("true", "lstruct.afloat || 15.0F");
- checkExpr("true", "lstruct.adouble || 16.0");
- checkExpr("true", "lstruct.achar || lstruct.aschar");
- checkExpr("true", "lstruct.ashort || lstruct.aushort");
- checkExpr("true", "lstruct.aint || lstruct.asint");
- checkExpr("true", "lstruct.along || lstruct.aulong");
- checkExpr("true", "lstruct.aulonglong || lstruct.aslonglong");
- checkExpr("true", "lstruct.afloat || lstruct.adouble");
-
- // arithmetic operations
- // &
- checkExpr("49", "lstruct.achar & 49");
- checkExpr("4", "lstruct.ashort & 4");
- checkExpr("7", "lstruct.aint & 7");
- checkExpr("10", "lstruct.along & 10");
- checkExpr("14", "lstruct.aslonglong & 14");
- checkExpr("0.0", "lstruct.afloat & 15.0F");
- checkExpr("0.0", "lstruct.adouble & 16.0");
- // |
- checkExpr("49", "lstruct.achar | 0");
- checkExpr("4", "lstruct.ashort | 0");
- checkExpr("7", "lstruct.aint | 0");
- checkExpr("10", "lstruct.along | 0");
- checkExpr("14", "lstruct.aslonglong | 0");
- checkExpr("0.0", "lstruct.afloat | 0.0F");
- checkExpr("0.0", "lstruct.adouble | 0.0");
- // ^
- checkExpr("49", "lstruct.achar ^ 0");
- checkExpr("4", "lstruct.ashort ^ 0");
- checkExpr("7", "lstruct.aint ^ 0");
- checkExpr("10", "lstruct.along ^ 0");
- checkExpr("14", "lstruct.aslonglong ^ 0");
- checkExpr("0.0", "lstruct.afloat ^ 0.0F");
- checkExpr("0.0", "lstruct.adouble ^ 0.0");
- // +
- checkExpr("50", "lstruct.achar + 1");
- checkExpr("5", "lstruct.ashort + 1");
- checkExpr("8", "lstruct.aint + 1");
- checkExpr("11", "lstruct.along + 1");
- checkExpr("15", "lstruct.aslonglong + 1");
- checkExpr("16.0", "lstruct.afloat + 1.0F");
- checkExpr("17.0", "lstruct.adouble + 1.0");
- // -
- checkExpr("48", "lstruct.achar - 1");
- checkExpr("3", "lstruct.ashort - 1");
- checkExpr("6", "lstruct.aint - 1");
- checkExpr("9", "lstruct.along - 1");
- checkExpr("13", "lstruct.aslonglong - 1");
- checkExpr("14.0", "lstruct.afloat - 1.0F");
- checkExpr("15.0", "lstruct.adouble - 1.0");
- // *
- checkExpr("98", "lstruct.achar * 2");
- checkExpr("8", "lstruct.ashort * 2");
- checkExpr("14", "lstruct.aint * 2");
- checkExpr("20", "lstruct.along * 2");
- checkExpr("28", "lstruct.aslonglong * 2");
- checkExpr("30.0", "lstruct.afloat * 2.0F");
- checkExpr("32.0", "lstruct.adouble * 2.0");
- // /
- checkExpr("24", "lstruct.achar / 2");
- checkExpr("2", "lstruct.ashort / 2");
- checkExpr("3", "lstruct.aint / 2");
- checkExpr("5", "lstruct.along / 2");
- checkExpr("7", "lstruct.aslonglong / 2");
- checkExpr("7.5", "lstruct.afloat / 2.0F");
- checkExpr("8.0", "lstruct.adouble / 2.0");
- // %
- checkExpr("1", "lstruct.achar % 2");
- checkExpr("0", "lstruct.ashort % 2");
- checkExpr("1", "lstruct.aint % 2");
- checkExpr("0", "lstruct.along % 2");
- checkExpr("0", "lstruct.aslonglong % 2");
- checkExpr("1.0", "lstruct.afloat % 2.0F");
- checkExpr("0.0", "lstruct.adouble % 2.0");
- // <<
- checkExpr("98", "lstruct.achar << 1");
- checkExpr("8", "lstruct.ashort << 1");
- checkExpr("14", "lstruct.aint << 1");
- checkExpr("20", "lstruct.along << 1");
- checkExpr("28", "lstruct.aslonglong << 1");
- checkExpr("0.0", "lstruct.afloat << 1");
- checkExpr("0.0", "lstruct.adouble << 1");
- // >>
- checkExpr("24", "lstruct.achar >> 1");
- checkExpr("2", "lstruct.ashort >> 1");
- checkExpr("3", "lstruct.aint >> 1");
- checkExpr("5", "lstruct.along >> 1");
- checkExpr("7", "lstruct.aslonglong >> 1");
- checkExpr("0.0", "lstruct.afloat >> 1");
- checkExpr("0.0", "lstruct.adouble >> 1");
-
- // unary operations
- // +
- checkExpr(intType, "49", "+lstruct.achar");
- checkExpr(intType, "4", "+lstruct.ashort");
- checkExpr(intType, "7", "+lstruct.aint");
- checkExpr(longType, "10", "+lstruct.along");
- checkExpr("14", "+lstruct.aslonglong");
- checkExpr(floatType, "15.0", "+lstruct.afloat");
- checkExpr(doubleType, "16.0", "+lstruct.adouble");
- // -
- checkExpr(intType, "-49", "-lstruct.achar");
- checkExpr("-4", "-lstruct.ashort");
- checkExpr("-7", "-lstruct.aint");
- checkExpr("-10", "-lstruct.along");
- checkExpr("-14", "-lstruct.aslonglong");
- checkExpr("-15.0", "-lstruct.afloat");
- checkExpr("-16.0", "-lstruct.adouble");
- // !
- checkExpr("false", "!lstruct.achar");
- checkExpr("false", "!lstruct.ashort");
- checkExpr("false", "!lstruct.aint");
- checkExpr("false", "!lstruct.along");
- checkExpr("false", "!lstruct.aslonglong");
- checkExpr("false", "!lstruct.afloat");
- checkExpr("false", "!lstruct.adouble");
- // ~
- checkExpr("-5", "~lstruct.ashort");
- checkExpr("-8", "~lstruct.aint");
- checkExpr("-11", "~lstruct.along");
- checkExpr("-15", "~lstruct.aslonglong");
- checkExpr("0.0", "~lstruct.afloat");
- checkExpr("0.0", "~lstruct.adouble");
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * int larray[40];
- *
- * larray[0] = 40;
- * larray[1] = 39;
- * larray[2] = 38;
- * ....
- * larray[37] = 3;
- * larray[38] = 2;
- * larray[39] = 1;
- */
- @Test
- public void testExpressionsWithArrays() throws Exception {
- openSnapshotAndWaitForSuspendedContext(1);
-
- checkExprNoError("larray");
- checkExprNoError("&larray");
-
- checkExpr("0", "larray[0]");
- checkExpr("1", "larray[1]");
- checkExpr("2", "larray[2]");
- checkExpr("37", "larray[37]");
- checkExpr("38", "larray[38]");
- checkExpr("39", "larray[39]");
-
- // logical operations
- // ==
- checkExpr("true", "larray[0] == 0");
- checkExpr("false", "larray[0] == 1");
- checkExpr("true", "39 == larray[39]");
- checkExpr("false", "larray[39] == 40");
- checkExpr("false", "larray[0] == larray[39]");
- // !=
- checkExpr("true", "larray[0] != 1");
- checkExpr("false", "larray[0] != 0");
- checkExpr("true", "40 != larray[39]");
- checkExpr("false", "larray[39] != 39");
- checkExpr("true", "larray[0] != larray[39]");
- // >=
- checkExpr("true", "larray[0] >= 0");
- checkExpr("false", "larray[0] >= 41");
- checkExpr("true", "larray[39] >= 1");
- checkExpr("false", "38 >= larray[39]");
- checkExpr("false", "larray[0] >= larray[39]");
- // >
- checkExpr("true", "larray[0] > -1");
- checkExpr("false", "larray[0] > 40");
- checkExpr("true", "larray[39] > 0");
- checkExpr("false", "38 > larray[39]");
- checkExpr("false", "larray[0] > larray[39]");
- // <=
- checkExpr("true", "larray[0] <= 40");
- checkExpr("false", "larray[0] <= -1");
- checkExpr("true", "38 <= larray[39]");
- checkExpr("false", "larray[39] <= 0");
- checkExpr("true", "larray[0] <= larray[39]");
- // <
- checkExpr("true", "larray[0] < 41");
- checkExpr("false", "larray[0] < -1");
- checkExpr("true", "larray[39] < 40");
- checkExpr("false", "larray[39] < 1");
- checkExpr("true", "larray[0] < larray[39]");
- // &&
- checkExpr("false", "larray[0] && 40");
- checkExpr("true", "1 && larray[39]");
- checkExpr("false", "larray[0] && larray[39]");
- // ||
- checkExpr("true", "larray[0] || 40");
- checkExpr("true", "larray[39] || 1");
- checkExpr("true", "larray[0] || larray[39]");
-
- // arithmetic operations
- // &
- checkExpr("1", "larray[39] & 1");
- checkExpr("0", "larray[0] & larray[39]");
- // |
- checkExpr("0", "larray[0] | 0");
- checkExpr("39", "0 | larray[39]");
- checkExpr("39", "larray[1] | larray[38]");
- // ^
- checkExpr("0", "larray[0] ^ 0");
- checkExpr("39", "larray[39] ^ 0");
- checkExpr("38", "larray[1] ^ larray[39]");
- // +
- checkExpr("1", "larray[0] + 1");
- checkExpr("40", "1 + larray[39]");
- checkExpr("39", "larray[0] + larray[39]");
- // -
- checkExpr("-1", "larray[0] - 1");
- checkExpr("38", "larray[39] - 1");
- checkExpr("-39", "larray[0] - larray[39]");
- // *
- checkExpr("2", "larray[1] * 2");
- checkExpr("78", "2 * larray[39]");
- checkExpr("39", "larray[1] * larray[39]");
- // /
- checkExpr("0", "larray[0] / 2");
- checkExpr("19", "larray[39] / 2");
- checkExpr("39", "larray[39] / larray[1]");
- // %
- checkExpr("0", "larray[0] % 2");
- checkExpr("1", "larray[39] % 2");
- checkExpr("1", "larray[1] % larray[39]");
- // <<
- checkExpr("0", "larray[0] << 1");
- checkExpr("78", "larray[39] << 1");
- checkExpr("16", "larray[2] << larray[3]");
- // >>
- checkExpr("0", "larray[0] >> 1");
- checkExpr("19", "larray[39] >> 1");
- checkExpr("4", "larray[39] >> larray[3]");
-
- // unary operations
- // +
- checkExpr("0", "+larray[0]");
- checkExpr("39", "+larray[39]");
- // -
- checkExpr("0", "-larray[0]");
- checkExpr("-39", "-larray[39]");
- // !
- checkExpr("true", "!larray[0]");
- checkExpr("false", "!larray[39]");
- // ~
- checkExpr("-2", "~larray[1]");
- checkExpr("-40", "~larray[39]");
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * typedef union {
- * volatile int x;
- * volatile long y;
- * } union_type;
- *
- * union_type lunion;
- *
- * lunion.x = 2;
- * lunion.y = 2;
- */
- @Test
- public void testExpressionsWithUnions() throws Exception {
- openSnapshotAndWaitForSuspendedContext(2);
-
- checkExprNoError("lunion");
- checkExprNoError("&lunion");
- checkExpr("2", "lunion.x");
- checkExpr("2", "lunion.y");
-
- // logical operations
- // ==
- checkExpr("true", "lunion.x == 2");
- checkExpr("false", "lunion.x == 1");
- checkExpr("true", "lunion.y == 2");
- checkExpr("false", "lunion.y == 1");
- checkExpr("true", "lunion.x == lunion.y");
- // !=
- checkExpr("false", "lunion.x != 2");
- checkExpr("true", "lunion.x != 1");
- checkExpr("false", "lunion.y != 2");
- checkExpr("true", "lunion.y != 1");
- checkExpr("false", "lunion.x != lunion.y");
- // >=
- checkExpr("true", "lunion.x >= 2");
- checkExpr("false", "lunion.x >= 3");
- checkExpr("true", "lunion.y >= 2");
- checkExpr("true", "2 >= lunion.y");
- checkExpr("false", "lunion.y >= 3");
- checkExpr("true", "lunion.x >= lunion.y");
- // >
- checkExpr("false", "lunion.x > 2");
- checkExpr("true", "lunion.x > 1");
- checkExpr("false", "lunion.y > 2");
- checkExpr("true", "lunion.y > 1");
- checkExpr("false", "lunion.x > lunion.y");
- // <=
- checkExpr("true", "lunion.x <= 2");
- checkExpr("false", "lunion.x <= 1");
- checkExpr("true", "lunion.y <= 2");
- checkExpr("false", "lunion.y <= 1");
- checkExpr("true", "lunion.x <= lunion.y");
- // <
- checkExpr("false", "lunion.x < 2");
- checkExpr("true", "lunion.x < 3");
- checkExpr("false", "lunion.y < 2");
- checkExpr("true", "lunion.y < 3");
- checkExpr("false", "lunion.x < lunion.y");
- // &&
- checkExpr("true", "lunion.x && 2");
- checkExpr("true", "1 && lunion.x");
- checkExpr("false", "lunion.x && 0");
- checkExpr("false", "0 && lunion.x");
- checkExpr("true", "lunion.y && 2");
- checkExpr("true", "1 && lunion.y");
- checkExpr("true", "lunion.x && lunion.y");
- // ||
- checkExpr("true", "lunion.x || 2");
- checkExpr("true", "lunion.x || 1");
- checkExpr("true", "lunion.y || 2");
- checkExpr("true", "lunion.y || 1");
- checkExpr("true", "lunion.x || lunion.y");
-
- // arithmetic operations
- // &
- checkExpr("2", "lunion.x & 2");
- checkExpr("0", "lunion.x & 1");
- checkExpr("2", "lunion.y & 2");
- checkExpr("0", "lunion.y & 1");
- checkExpr("2", "lunion.x & lunion.y");
- // |
- checkExpr("2", "lunion.x | 2");
- checkExpr("3", "lunion.x | 1");
- checkExpr("2", "lunion.y | 2");
- checkExpr("3", "lunion.y | 1");
- checkExpr("2", "lunion.x | lunion.y");
- // ^
- checkExpr("0", "lunion.x ^ 2");
- checkExpr("3", "lunion.x ^ 1");
- checkExpr("0", "lunion.y ^ 2");
- checkExpr("3", "lunion.y ^ 1");
- checkExpr("0", "lunion.x ^ lunion.y");
- // +
- checkExpr("4", "lunion.x + 2");
- checkExpr("3", "lunion.x + 1");
- checkExpr("4", "lunion.y + 2");
- checkExpr("3", "lunion.y + 1");
- checkExpr("4", "lunion.x + lunion.y");
- // -
- checkExpr("0", "lunion.x - 2");
- checkExpr("1", "lunion.x - 1");
- checkExpr("0", "lunion.y - 2");
- checkExpr("1", "lunion.y - 1");
- checkExpr("0", "lunion.x - lunion.y");
- // *
- checkExpr("4", "lunion.x * 2");
- checkExpr("2", "lunion.x * 1");
- checkExpr("4", "lunion.y * 2");
- checkExpr("2", "lunion.y * 1");
- checkExpr("4", "lunion.x * lunion.y");
- // /
- checkExpr("1", "lunion.x / 2");
- checkExpr("2", "lunion.x / 1");
- checkExpr("1", "lunion.y / 2");
- checkExpr("2", "lunion.y / 1");
- checkExpr("1", "lunion.x / lunion.y");
- // %
- checkExpr("0", "lunion.x % 2");
- checkExpr("0", "lunion.x % 1");
- checkExpr("0", "lunion.y % 2");
- checkExpr("0", "lunion.y % 1");
- checkExpr("0", "lunion.x % lunion.y");
- // <<
- checkExpr("8", "lunion.x << 2");
- checkExpr("4", "lunion.x << 1");
- checkExpr("8", "lunion.y << 2");
- checkExpr("4", "lunion.y << 1");
- checkExpr("8", "lunion.x << lunion.y");
- // >>
- checkExpr("0", "lunion.x >> 2");
- checkExpr("1", "lunion.x >> 1");
- checkExpr("0", "lunion.y >> 2");
- checkExpr("1", "lunion.y >> 1");
- checkExpr("0", "lunion.x >> lunion.y");
-
- // unary operations
- // +
- checkExpr("2", "+lunion.x");
- checkExpr("2", "+lunion.y");
- // -
- checkExpr("-2", "-lunion.x");
- checkExpr("-2", "-lunion.y");
- // !
- checkExpr("false", "!lunion.x");
- checkExpr("false", "!lunion.y");
- checkExpr("true", "!!lunion.y");
- // ~
- checkExpr("-3", "~lunion.x");
- checkExpr("-3", "~lunion.y");
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * typedef struct {
- * volatile unsigned x:1;
- * volatile unsigned y:2;
- * volatile unsigned z:3;
- * volatile unsigned w:16;
- * } bitfield_type;
- *
- * bitfield_type lbitfield;
- *
- * lbitfield.x = 1;
- * lbitfield.y = 2;
- * lbitfield.z = 3;
- * lbitfield.w = 26;
- */
- @Test
- public void testExpressionsWithBitfields() throws Exception {
- openSnapshotAndWaitForSuspendedContext(3);
-
- checkExprNoError("lbitfield");
- checkExpr("1", "lbitfield.x");
- checkExpr("2", "lbitfield.y");
- checkExpr("3", "lbitfield.z");
- checkExpr("26", "lbitfield.w");
-
- // logical operations
- // ==
- checkExpr("true", "lbitfield.x == 1");
- checkExpr("false", "lbitfield.x == 0");
- checkExpr("true", "lbitfield.y == 2");
- checkExpr("false", "lbitfield.y == 0");
- checkExpr("false", "lbitfield.x == lbitfield.y");
- // !=
- checkExpr("true", "lbitfield.x != 0");
- checkExpr("false", "lbitfield.x != 1");
- checkExpr("true", "lbitfield.y != 0");
- checkExpr("false", "lbitfield.y != 2");
- checkExpr("true", "lbitfield.x != lbitfield.y");
- // >=
- checkExpr("true", "lbitfield.x >= 1");
- checkExpr("false", "lbitfield.x >= 2");
- checkExpr("true", "lbitfield.y >= 2");
- checkExpr("false", "lbitfield.y >= 3");
- checkExpr("false", "lbitfield.x >= lbitfield.y");
- // >
- checkExpr("true", "lbitfield.x > 0");
- checkExpr("false", "lbitfield.x > 1");
- checkExpr("true", "lbitfield.y > 1");
- checkExpr("false", "lbitfield.y > 2");
- checkExpr("false", "lbitfield.x > lbitfield.y");
- // <=
- checkExpr("true", "lbitfield.x <= 1");
- checkExpr("false", "lbitfield.x <= 0");
- checkExpr("true", "lbitfield.y <= 2");
- checkExpr("false", "lbitfield.y <= 1");
- checkExpr("true", "lbitfield.x <= lbitfield.y");
- // <
- checkExpr("true", "lbitfield.x < 2");
- checkExpr("false", "lbitfield.x < 1");
- checkExpr("true", "lbitfield.y < 3");
- checkExpr("false", "lbitfield.y < 2");
- checkExpr("true", "lbitfield.x < lbitfield.y");
- // &&
- checkExpr("true", "lbitfield.x && 2");
- checkExpr("true", "lbitfield.x && 1");
- checkExpr("true", "lbitfield.y && 3");
- checkExpr("true", "lbitfield.y && 2");
- checkExpr("true", "lbitfield.x && lbitfield.y");
- // ||
- checkExpr("true", "lbitfield.x || 2");
- checkExpr("true", "lbitfield.x || 1");
- checkExpr("true", "lbitfield.y || 3");
- checkExpr("true", "lbitfield.y || 2");
- checkExpr("true", "lbitfield.x || lbitfield.y");
-
- // arithmetic operations
- // &
- checkExpr("0", "lbitfield.x & 0");
- checkExpr("1", "lbitfield.x & 1");
- checkExpr("0", "lbitfield.y & 0");
- checkExpr("2", "lbitfield.y & 2");
- checkExpr("0", "lbitfield.x & lbitfield.y");
- // |
- checkExpr("1", "lbitfield.x | 0");
- checkExpr("1", "lbitfield.x | 1");
- checkExpr("2", "lbitfield.y | 0");
- checkExpr("2", "lbitfield.y | 2");
- checkExpr("3", "lbitfield.x | lbitfield.y");
- // ^
- checkExpr("1", "lbitfield.x ^ 0");
- checkExpr("0", "lbitfield.x ^ 1");
- checkExpr("2", "lbitfield.y ^ 0");
- checkExpr("0", "lbitfield.y ^ 2");
- checkExpr("3", "lbitfield.x ^ lbitfield.y");
- // +
- checkExpr("0", "lbitfield.x + (-1)");
- checkExpr("2", "lbitfield.x + 1");
- checkExpr("1", "lbitfield.y + (-1)");
- checkExpr("3", "lbitfield.y + 1");
- checkExpr("3", "lbitfield.x + lbitfield.y");
- // -
- checkExpr("2", "lbitfield.x - (-1)");
- checkExpr("0", "lbitfield.x - 1");
- checkExpr("3", "lbitfield.y - (-1)");
- checkExpr("1", "lbitfield.y - 1");
- checkExpr("-1", "lbitfield.x - lbitfield.y");
- // *
- checkExpr("0", "lbitfield.x * 0");
- checkExpr("1", "lbitfield.x * 1");
- checkExpr("0", "lbitfield.y * 0");
- checkExpr("4", "lbitfield.y * 2");
- checkExpr("2", "lbitfield.x * lbitfield.y");
- // /
- checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.x / 0");
- checkExpr("1", "lbitfield.x / 1");
- checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.y / 0");
- checkExpr("1", "lbitfield.y / 2");
- checkExpr("0", "lbitfield.x / lbitfield.y");
- // %
- checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.x % 0");
- checkExpr("0", "lbitfield.x % 1");
- checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.y % 0");
- checkExpr("0", "lbitfield.y % 2");
- checkExpr("1", "lbitfield.x % lbitfield.y");
- // <<
- checkExpr("1", "lbitfield.x << 0");
- checkExpr("2", "lbitfield.x << 1");
- checkExpr("2", "lbitfield.y << 0");
- checkExpr("4", "lbitfield.y << 1");
- checkExpr("4", "lbitfield.x << lbitfield.y");
- // >>
- checkExpr("1", "lbitfield.x >> 0");
- checkExpr("0", "lbitfield.x >> 1");
- checkExpr("2", "lbitfield.y >> 0");
- checkExpr("1", "lbitfield.y >> 1");
- checkExpr("0", "lbitfield.x >> lbitfield.y");
-
- // unary operations
- // +
- checkExpr("1", "+lbitfield.x");
- checkExpr("2", "+lbitfield.y");
- checkExpr("3", "+lbitfield.z");
- checkExpr("26", "+lbitfield.w");
- // -
- checkExpr("-1", "-lbitfield.x");
- checkExpr("-2", "-lbitfield.y");
- checkExpr("-3", "-lbitfield.z");
- checkExpr("-26", "-lbitfield.w");
- // !
- checkExpr("false", "!lbitfield.x");
- checkExpr("false", "!lbitfield.y");
- checkExpr("false", "!lbitfield.z");
- checkExpr("false", "!lbitfield.w");
- checkExpr("true", "!!lbitfield.w");
- // ~
- checkExpr("-2", "~lbitfield.x");
- checkExpr("-3", "~lbitfield.y");
- checkExpr("-4", "~lbitfield.z");
- checkExpr("-27", "~lbitfield.w");
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * enum enum_type { zero, one, two, three, four };
- *
- * enum enum_type lenum;
- *
- * lenum = three;
- */
- @Test
- public void testExpressionsWithEnums() throws Exception {
- openSnapshotAndWaitForSuspendedContext(4);
-
- checkExprNoError("lenum");
- checkExpr("three [3]", "lenum");
-
- // logical operations
- // ==
- checkExpr("true", "lenum == 3");
- checkExpr("true", "lenum == three");
- checkExpr("false", "lenum == 4");
- checkExpr("false", "lenum == four");
- // !=
- checkExpr("true", "lenum != 4");
- checkExpr("true", "lenum != four");
- checkExpr("false", "lenum != 3");
- checkExpr("false", "lenum != three");
- // >=
- checkExpr("true", "lenum >= 3");
- checkExpr("true", "lenum >= three");
- checkExpr("false", "lenum >= 5");
- // >
- checkExpr("true", "lenum > 2");
- checkExpr("true", "lenum > two");
- checkExpr("false", "lenum > 4");
- checkExpr("false", "lenum > four");
- // <=
- checkExpr("true", "lenum <= 3");
- checkExpr("false", "lenum <= 2");
- // <
- checkExpr("true", "lenum < 5");
- checkExpr("false", "lenum < 3");
- // &&
- checkExpr("true", "lenum && 4");
- checkExpr("true", "lenum && 1");
- // ||
- checkExpr("true", "lenum || 4");
- checkExpr("true", "lenum || 1");
-
- // arithmetic operations
- // &
- checkExpr("0", "lenum & 4");
- checkExpr("3", "lenum & 3");
- // |
- checkExpr("7", "lenum | 4");
- checkExpr("3", "lenum | 3");
- // ^
- checkExpr("7", "lenum ^ 4");
- checkExpr("0", "lenum ^ 3");
- // +
- checkExpr("7", "lenum + 4");
- checkExpr("6", "lenum + 3");
- checkExpr("6", "lenum + three");
- // -
- checkExpr("-1", "lenum - 4");
- checkExpr("0", "lenum - 3");
- // *
- checkExpr("12", "lenum * 4");
- checkExpr("9", "lenum * 3");
- // /
- checkExpr("0", "lenum / 4");
- checkExpr("1", "lenum / 3");
- // %
- checkExpr("3", "lenum % 4");
- checkExpr("0", "lenum % 3");
- // <<
- checkExpr("12", "lenum << 2");
- checkExpr("24", "lenum << three");
- // >>
- checkExpr("0", "lenum >> 4");
- checkExpr("0", "lenum >> 3");
-
- // unary operations
- // +
- checkExpr("3", "+lenum");
- // -
- checkExpr("-3", "-lenum");
- // !
- checkExpr("false", "!lenum");
- checkExpr("true", "!!lenum");
- // ~
- checkExpr("-4", "~lenum");
- }
-
-
- @Override
- public String getAlbumName() {
- return "ExpressionsAggregatesAndEnums.dsa";
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
+import org.junit.Test;
+
+public class ExpressionsAggregatesAndEnums extends BaseExpressionTest {
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ * typedef struct {
+ * char achar;
+ * UCHAR auchar;
+ * SCHAR aschar;
+ * short ashort;
+ * USHORT aushort;
+ * SSHORT asshort;
+ * int aint;
+ * UINT auint;
+ * SINT asint;
+ * long along;
+ * ULONG aulong;
+ * SLONG aslong;
+ * ULONGLONG aulonglong;
+ * SLONGLONG aslonglong;
+ * float afloat;
+ * double adouble;
+ * } struct_type;
+ *
+ * struct_type lstruct;
+ *
+ * lstruct.achar = '1';
+ * lstruct.auchar = 2;
+ * lstruct.aschar = '3';
+ * lstruct.ashort = 4;
+ * lstruct.aushort = 5;
+ * lstruct.asshort = 6;
+ * lstruct.aint = 7;
+ * lstruct.auint = 8;
+ * lstruct.asint = 9;
+ * lstruct.along = 10;
+ * lstruct.aulong = 11;
+ * lstruct.aslong = 12;
+ * lstruct.aulonglong = 13;
+ * lstruct.aslonglong = 14;
+ * lstruct.afloat = 15.0;
+ * lstruct.adouble = 16.0;
+ */
+ @Test
+ public void testExpressionsWithStructs() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+
+ checkExprNoError("lstruct");
+ checkExpr("49 ('1')", "lstruct.achar");
+ checkExpr("2 ('\\002')", "lstruct.auchar");
+ checkExpr("51 ('3')", "lstruct.aschar");
+ checkExpr("4", "lstruct.ashort");
+ checkExpr("5", "lstruct.aushort");
+ checkExpr("6", "lstruct.asshort");
+ checkExpr("7", "lstruct.aint");
+ checkExpr("8", "lstruct.auint");
+ checkExpr("9", "lstruct.asint");
+ checkExpr("10", "lstruct.along");
+ checkExpr("11", "lstruct.aulong");
+ checkExpr("12", "lstruct.aslong");
+ checkExpr("13", "lstruct.aulonglong");
+ checkExpr("14", "lstruct.aslonglong");
+ checkExpr("15.0", "lstruct.afloat");
+ checkExpr("16.0", "lstruct.adouble");
+
+ // logical operations
+ // ==
+ checkExpr("true", "lstruct.achar == 49");
+ checkExpr("true", "lstruct.ashort == 4");
+ checkExpr("true", "lstruct.aint == 7");
+ checkExpr("true", "10 == lstruct.along");
+ checkExpr("true", "lstruct.aslonglong == 14");
+ checkExpr("true", "lstruct.afloat == lstruct.afloat"); // for precision
+ checkExpr("true", "lstruct.adouble == lstruct.adouble"); // for precision
+ checkExpr("false", "lstruct.achar == lstruct.auchar");
+ checkExpr("false", "lstruct.ashort == lstruct.aushort");
+ checkExpr("false", "lstruct.aint == lstruct.asint");
+ checkExpr("false", "lstruct.along == lstruct.aulong");
+ checkExpr("false", "lstruct.aulonglong == lstruct.aslonglong");
+ checkExpr("false", "lstruct.afloat == lstruct.adouble");
+ // !=
+ checkExpr("false", "lstruct.achar != 49");
+ checkExpr("false", "lstruct.ashort != 4");
+ checkExpr("false", "7 != lstruct.aint");
+ checkExpr("false", "lstruct.along != 10");
+ checkExpr("false", "lstruct.aslonglong != 14");
+ checkExpr("false", "15.0F != lstruct.afloat");
+ checkExpr("false", "lstruct.adouble != 16.0");
+ checkExpr("true", "lstruct.achar != lstruct.aschar");
+ checkExpr("true", "lstruct.ashort != lstruct.aushort");
+ checkExpr("true", "lstruct.aint != lstruct.asint");
+ checkExpr("true", "lstruct.along != lstruct.aulong");
+ checkExpr("true", "lstruct.aulonglong != lstruct.aslonglong");
+ checkExpr("true", "lstruct.afloat != lstruct.adouble");
+ // >=
+ checkExpr("true", "lstruct.achar >= 49");
+ checkExpr("true", "lstruct.ashort >= 4");
+ checkExpr("true", "lstruct.aint >= 7");
+ checkExpr("true", "lstruct.along >= 10");
+ checkExpr("true", "lstruct.aslonglong >= 14");
+ checkExpr("true", "lstruct.afloat >= 15.0F");
+ checkExpr("true", "lstruct.adouble >= 16.0");
+ checkExpr("false", "lstruct.achar >= lstruct.aschar");
+ checkExpr("false", "lstruct.ashort >= lstruct.aushort");
+ checkExpr("false", "lstruct.aint >= lstruct.asint");
+ checkExpr("false", "lstruct.along >= lstruct.aulong");
+ checkExpr("false", "lstruct.aulonglong >= lstruct.aslonglong");
+ checkExpr("false", "lstruct.afloat >= lstruct.adouble");
+ // >
+ checkExpr("false", "lstruct.achar > 49");
+ checkExpr("false", "lstruct.ashort > 4");
+ checkExpr("false", "lstruct.aint > 7");
+ checkExpr("false", "lstruct.along > 10");
+ checkExpr("false", "lstruct.aslonglong > 14");
+ checkExpr("false", "lstruct.afloat > 15.0F");
+ checkExpr("false", "lstruct.adouble > 16.0");
+ checkExpr("false", "lstruct.achar > lstruct.aschar");
+ checkExpr("false", "lstruct.ashort > lstruct.aushort");
+ checkExpr("false", "lstruct.aint > lstruct.asint");
+ checkExpr("false", "lstruct.along > lstruct.aulong");
+ checkExpr("false", "lstruct.aulonglong > lstruct.aslonglong");
+ checkExpr("false", "lstruct.afloat > lstruct.adouble");
+ // <=
+ checkExpr("true", "lstruct.achar <= 49");
+ checkExpr("true", "lstruct.ashort <= 4");
+ checkExpr("true", "lstruct.aint <= 7");
+ checkExpr("true", "lstruct.along <= 10");
+ checkExpr("true", "lstruct.aslonglong <= 14");
+ checkExpr("true", "lstruct.afloat <= 15.0F");
+ checkExpr("true", "lstruct.adouble <= 16.0");
+ checkExpr("true", "lstruct.achar <= lstruct.aschar");
+ checkExpr("true", "lstruct.ashort <= lstruct.aushort");
+ checkExpr("true", "lstruct.aint <= lstruct.asint");
+ checkExpr("true", "lstruct.along <= lstruct.aulong");
+ checkExpr("true", "lstruct.aulonglong <= lstruct.aslonglong");
+ checkExpr("true", "lstruct.afloat <= lstruct.adouble");
+ // <
+ checkExpr("false", "lstruct.achar < 49");
+ checkExpr("false", "lstruct.ashort < 4");
+ checkExpr("false", "lstruct.aint < 7");
+ checkExpr("false", "lstruct.along < 10");
+ checkExpr("false", "lstruct.aslonglong < 14");
+ checkExpr("false", "lstruct.afloat < 15.0F");
+ checkExpr("false", "lstruct.adouble < 16.0");
+ checkExpr("true", "lstruct.achar < lstruct.aschar");
+ checkExpr("true", "lstruct.ashort < lstruct.aushort");
+ checkExpr("true", "lstruct.aint < lstruct.asint");
+ checkExpr("true", "lstruct.along < lstruct.aulong");
+ checkExpr("true", "lstruct.aulonglong < lstruct.aslonglong");
+ checkExpr("true", "lstruct.afloat < lstruct.adouble");
+ // &&
+ checkExpr("true", "lstruct.achar && 49");
+ checkExpr("true", "lstruct.ashort && 4");
+ checkExpr("true", "lstruct.aint && 7");
+ checkExpr("true", "lstruct.along && 10");
+ checkExpr("true", "lstruct.aslonglong && 14");
+ checkExpr("true", "lstruct.afloat && 15.0F");
+ checkExpr("true", "lstruct.adouble && 16.0");
+ checkExpr("true", "lstruct.achar || lstruct.aschar");
+ checkExpr("true", "lstruct.ashort || lstruct.aushort");
+ checkExpr("true", "lstruct.aint || lstruct.asint");
+ checkExpr("true", "lstruct.along || lstruct.aulong");
+ checkExpr("true", "lstruct.aulonglong || lstruct.aslonglong");
+ checkExpr("true", "lstruct.afloat || lstruct.adouble");
+ // ||
+ checkExpr("true", "lstruct.achar || 49");
+ checkExpr("true", "lstruct.ashort || 4");
+ checkExpr("true", "lstruct.aint || 7");
+ checkExpr("true", "lstruct.along || 10");
+ checkExpr("true", "lstruct.aslonglong || 14");
+ checkExpr("true", "lstruct.afloat || 15.0F");
+ checkExpr("true", "lstruct.adouble || 16.0");
+ checkExpr("true", "lstruct.achar || lstruct.aschar");
+ checkExpr("true", "lstruct.ashort || lstruct.aushort");
+ checkExpr("true", "lstruct.aint || lstruct.asint");
+ checkExpr("true", "lstruct.along || lstruct.aulong");
+ checkExpr("true", "lstruct.aulonglong || lstruct.aslonglong");
+ checkExpr("true", "lstruct.afloat || lstruct.adouble");
+
+ // arithmetic operations
+ // &
+ checkExpr("49", "lstruct.achar & 49");
+ checkExpr("4", "lstruct.ashort & 4");
+ checkExpr("7", "lstruct.aint & 7");
+ checkExpr("10", "lstruct.along & 10");
+ checkExpr("14", "lstruct.aslonglong & 14");
+ checkExpr("0.0", "lstruct.afloat & 15.0F");
+ checkExpr("0.0", "lstruct.adouble & 16.0");
+ // |
+ checkExpr("49", "lstruct.achar | 0");
+ checkExpr("4", "lstruct.ashort | 0");
+ checkExpr("7", "lstruct.aint | 0");
+ checkExpr("10", "lstruct.along | 0");
+ checkExpr("14", "lstruct.aslonglong | 0");
+ checkExpr("0.0", "lstruct.afloat | 0.0F");
+ checkExpr("0.0", "lstruct.adouble | 0.0");
+ // ^
+ checkExpr("49", "lstruct.achar ^ 0");
+ checkExpr("4", "lstruct.ashort ^ 0");
+ checkExpr("7", "lstruct.aint ^ 0");
+ checkExpr("10", "lstruct.along ^ 0");
+ checkExpr("14", "lstruct.aslonglong ^ 0");
+ checkExpr("0.0", "lstruct.afloat ^ 0.0F");
+ checkExpr("0.0", "lstruct.adouble ^ 0.0");
+ // +
+ checkExpr("50", "lstruct.achar + 1");
+ checkExpr("5", "lstruct.ashort + 1");
+ checkExpr("8", "lstruct.aint + 1");
+ checkExpr("11", "lstruct.along + 1");
+ checkExpr("15", "lstruct.aslonglong + 1");
+ checkExpr("16.0", "lstruct.afloat + 1.0F");
+ checkExpr("17.0", "lstruct.adouble + 1.0");
+ // -
+ checkExpr("48", "lstruct.achar - 1");
+ checkExpr("3", "lstruct.ashort - 1");
+ checkExpr("6", "lstruct.aint - 1");
+ checkExpr("9", "lstruct.along - 1");
+ checkExpr("13", "lstruct.aslonglong - 1");
+ checkExpr("14.0", "lstruct.afloat - 1.0F");
+ checkExpr("15.0", "lstruct.adouble - 1.0");
+ // *
+ checkExpr("98", "lstruct.achar * 2");
+ checkExpr("8", "lstruct.ashort * 2");
+ checkExpr("14", "lstruct.aint * 2");
+ checkExpr("20", "lstruct.along * 2");
+ checkExpr("28", "lstruct.aslonglong * 2");
+ checkExpr("30.0", "lstruct.afloat * 2.0F");
+ checkExpr("32.0", "lstruct.adouble * 2.0");
+ // /
+ checkExpr("24", "lstruct.achar / 2");
+ checkExpr("2", "lstruct.ashort / 2");
+ checkExpr("3", "lstruct.aint / 2");
+ checkExpr("5", "lstruct.along / 2");
+ checkExpr("7", "lstruct.aslonglong / 2");
+ checkExpr("7.5", "lstruct.afloat / 2.0F");
+ checkExpr("8.0", "lstruct.adouble / 2.0");
+ // %
+ checkExpr("1", "lstruct.achar % 2");
+ checkExpr("0", "lstruct.ashort % 2");
+ checkExpr("1", "lstruct.aint % 2");
+ checkExpr("0", "lstruct.along % 2");
+ checkExpr("0", "lstruct.aslonglong % 2");
+ checkExpr("1.0", "lstruct.afloat % 2.0F");
+ checkExpr("0.0", "lstruct.adouble % 2.0");
+ // <<
+ checkExpr("98", "lstruct.achar << 1");
+ checkExpr("8", "lstruct.ashort << 1");
+ checkExpr("14", "lstruct.aint << 1");
+ checkExpr("20", "lstruct.along << 1");
+ checkExpr("28", "lstruct.aslonglong << 1");
+ checkExpr("0.0", "lstruct.afloat << 1");
+ checkExpr("0.0", "lstruct.adouble << 1");
+ // >>
+ checkExpr("24", "lstruct.achar >> 1");
+ checkExpr("2", "lstruct.ashort >> 1");
+ checkExpr("3", "lstruct.aint >> 1");
+ checkExpr("5", "lstruct.along >> 1");
+ checkExpr("7", "lstruct.aslonglong >> 1");
+ checkExpr("0.0", "lstruct.afloat >> 1");
+ checkExpr("0.0", "lstruct.adouble >> 1");
+
+ // unary operations
+ // +
+ checkExpr(intType, "49", "+lstruct.achar");
+ checkExpr(intType, "4", "+lstruct.ashort");
+ checkExpr(intType, "7", "+lstruct.aint");
+ checkExpr(longType, "10", "+lstruct.along");
+ checkExpr("14", "+lstruct.aslonglong");
+ checkExpr(floatType, "15.0", "+lstruct.afloat");
+ checkExpr(doubleType, "16.0", "+lstruct.adouble");
+ // -
+ checkExpr(intType, "-49", "-lstruct.achar");
+ checkExpr("-4", "-lstruct.ashort");
+ checkExpr("-7", "-lstruct.aint");
+ checkExpr("-10", "-lstruct.along");
+ checkExpr("-14", "-lstruct.aslonglong");
+ checkExpr("-15.0", "-lstruct.afloat");
+ checkExpr("-16.0", "-lstruct.adouble");
+ // !
+ checkExpr("false", "!lstruct.achar");
+ checkExpr("false", "!lstruct.ashort");
+ checkExpr("false", "!lstruct.aint");
+ checkExpr("false", "!lstruct.along");
+ checkExpr("false", "!lstruct.aslonglong");
+ checkExpr("false", "!lstruct.afloat");
+ checkExpr("false", "!lstruct.adouble");
+ // ~
+ checkExpr("-5", "~lstruct.ashort");
+ checkExpr("-8", "~lstruct.aint");
+ checkExpr("-11", "~lstruct.along");
+ checkExpr("-15", "~lstruct.aslonglong");
+ checkExpr("0.0", "~lstruct.afloat");
+ checkExpr("0.0", "~lstruct.adouble");
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * int larray[40];
+ *
+ * larray[0] = 40;
+ * larray[1] = 39;
+ * larray[2] = 38;
+ * ....
+ * larray[37] = 3;
+ * larray[38] = 2;
+ * larray[39] = 1;
+ * l2darray[0,0] = 791555372;
+ * l2darray[0,1] = 858927408;
+ * l2darray[0,2] = 926299444;
+ * l2darray[0,3] = 993671480;
+ * l2darray[0,4] = 4072408;
+ * l2darray[0,5] = 1128415552;
+ * l2darray[0,6] = 2089865082;
+ * l2darray[0,7] = 2089919139;
+ * l2darray[0,8] = 4294967295;
+ * l2darray[0,9] = 2291288;
+ */
+ @Test
+ public void testExpressionsWithArrays() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(1);
+
+ checkExprNoError("larray");
+ checkExprNoError("&larray");
+ checkExprNoError("l2darray");
+ checkExprNoError("&l2darray");
+
+ checkExpr("0", "larray[0]");
+ checkExpr("1", "larray[1]");
+ checkExpr("2", "larray[2]");
+ checkExpr("37", "larray[37]");
+ checkExpr("38", "larray[38]");
+ checkExpr("39", "larray[39]");
+ checkExpr("2089865082", "l2darray[0][6]");
+
+ // logical operations
+ // ==
+ checkExpr("true", "larray[0] == 0");
+ checkExpr("false", "larray[0] == 1");
+ checkExpr("true", "39 == larray[39]");
+ checkExpr("false", "larray[39] == 40");
+ checkExpr("false", "larray[0] == larray[39]");
+ checkExpr("true", "4294967295 == l2darray[0][8]");
+ // !=
+ checkExpr("true", "larray[0] != 1");
+ checkExpr("false", "larray[0] != 0");
+ checkExpr("true", "40 != larray[39]");
+ checkExpr("false", "larray[39] != 39");
+ checkExpr("true", "larray[0] != larray[39]");
+ // >=
+ checkExpr("true", "larray[0] >= 0");
+ checkExpr("false", "larray[0] >= 41");
+ checkExpr("true", "larray[39] >= 1");
+ checkExpr("false", "38 >= larray[39]");
+ checkExpr("false", "larray[0] >= larray[39]");
+ // >
+ checkExpr("true", "larray[0] > -1");
+ checkExpr("false", "larray[0] > 40");
+ checkExpr("true", "larray[39] > 0");
+ checkExpr("false", "38 > larray[39]");
+ checkExpr("false", "larray[0] > larray[39]");
+ // <=
+ checkExpr("true", "larray[0] <= 40");
+ checkExpr("false", "larray[0] <= -1");
+ checkExpr("true", "38 <= larray[39]");
+ checkExpr("false", "larray[39] <= 0");
+ checkExpr("true", "larray[0] <= larray[39]");
+ // <
+ checkExpr("true", "larray[0] < 41");
+ checkExpr("false", "larray[0] < -1");
+ checkExpr("true", "larray[39] < 40");
+ checkExpr("false", "larray[39] < 1");
+ checkExpr("true", "larray[0] < larray[39]");
+ // &&
+ checkExpr("false", "larray[0] && 40");
+ checkExpr("true", "1 && larray[39]");
+ checkExpr("false", "larray[0] && larray[39]");
+ // ||
+ checkExpr("true", "larray[0] || 40");
+ checkExpr("true", "larray[39] || 1");
+ checkExpr("true", "larray[0] || larray[39]");
+
+ // arithmetic operations
+ // &
+ checkExpr("1", "larray[39] & 1");
+ checkExpr("0", "larray[0] & larray[39]");
+ // |
+ checkExpr("0", "larray[0] | 0");
+ checkExpr("39", "0 | larray[39]");
+ checkExpr("39", "larray[1] | larray[38]");
+ // ^
+ checkExpr("0", "larray[0] ^ 0");
+ checkExpr("39", "larray[39] ^ 0");
+ checkExpr("38", "larray[1] ^ larray[39]");
+ // +
+ checkExpr("1", "larray[0] + 1");
+ checkExpr("40", "1 + larray[39]");
+ checkExpr("39", "larray[0] + larray[39]");
+ // -
+ checkExpr("-1", "larray[0] - 1");
+ checkExpr("38", "larray[39] - 1");
+ checkExpr("-39", "larray[0] - larray[39]");
+ // *
+ checkExpr("2", "larray[1] * 2");
+ checkExpr("78", "2 * larray[39]");
+ checkExpr("39", "larray[1] * larray[39]");
+ // /
+ checkExpr("0", "larray[0] / 2");
+ checkExpr("19", "larray[39] / 2");
+ checkExpr("39", "larray[39] / larray[1]");
+ // %
+ checkExpr("0", "larray[0] % 2");
+ checkExpr("1", "larray[39] % 2");
+ checkExpr("1", "larray[1] % larray[39]");
+ // <<
+ checkExpr("0", "larray[0] << 1");
+ checkExpr("78", "larray[39] << 1");
+ checkExpr("16", "larray[2] << larray[3]");
+ // >>
+ checkExpr("0", "larray[0] >> 1");
+ checkExpr("19", "larray[39] >> 1");
+ checkExpr("4", "larray[39] >> larray[3]");
+
+ // unary operations
+ // +
+ checkExpr("0", "+larray[0]");
+ checkExpr("39", "+larray[39]");
+ // -
+ checkExpr("0", "-larray[0]");
+ checkExpr("-39", "-larray[39]");
+ // !
+ checkExpr("true", "!larray[0]");
+ checkExpr("false", "!larray[39]");
+ // ~
+ checkExpr("-2", "~larray[1]");
+ checkExpr("-40", "~larray[39]");
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * typedef union {
+ * volatile int x;
+ * volatile long y;
+ * } union_type;
+ *
+ * union_type lunion;
+ *
+ * lunion.x = 2;
+ * lunion.y = 2;
+ */
+ @Test
+ public void testExpressionsWithUnions() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(2);
+
+ checkExprNoError("lunion");
+ checkExprNoError("&lunion");
+ checkExpr("2", "lunion.x");
+ checkExpr("2", "lunion.y");
+
+ // logical operations
+ // ==
+ checkExpr("true", "lunion.x == 2");
+ checkExpr("false", "lunion.x == 1");
+ checkExpr("true", "lunion.y == 2");
+ checkExpr("false", "lunion.y == 1");
+ checkExpr("true", "lunion.x == lunion.y");
+ // !=
+ checkExpr("false", "lunion.x != 2");
+ checkExpr("true", "lunion.x != 1");
+ checkExpr("false", "lunion.y != 2");
+ checkExpr("true", "lunion.y != 1");
+ checkExpr("false", "lunion.x != lunion.y");
+ // >=
+ checkExpr("true", "lunion.x >= 2");
+ checkExpr("false", "lunion.x >= 3");
+ checkExpr("true", "lunion.y >= 2");
+ checkExpr("true", "2 >= lunion.y");
+ checkExpr("false", "lunion.y >= 3");
+ checkExpr("true", "lunion.x >= lunion.y");
+ // >
+ checkExpr("false", "lunion.x > 2");
+ checkExpr("true", "lunion.x > 1");
+ checkExpr("false", "lunion.y > 2");
+ checkExpr("true", "lunion.y > 1");
+ checkExpr("false", "lunion.x > lunion.y");
+ // <=
+ checkExpr("true", "lunion.x <= 2");
+ checkExpr("false", "lunion.x <= 1");
+ checkExpr("true", "lunion.y <= 2");
+ checkExpr("false", "lunion.y <= 1");
+ checkExpr("true", "lunion.x <= lunion.y");
+ // <
+ checkExpr("false", "lunion.x < 2");
+ checkExpr("true", "lunion.x < 3");
+ checkExpr("false", "lunion.y < 2");
+ checkExpr("true", "lunion.y < 3");
+ checkExpr("false", "lunion.x < lunion.y");
+ // &&
+ checkExpr("true", "lunion.x && 2");
+ checkExpr("true", "1 && lunion.x");
+ checkExpr("false", "lunion.x && 0");
+ checkExpr("false", "0 && lunion.x");
+ checkExpr("true", "lunion.y && 2");
+ checkExpr("true", "1 && lunion.y");
+ checkExpr("true", "lunion.x && lunion.y");
+ // ||
+ checkExpr("true", "lunion.x || 2");
+ checkExpr("true", "lunion.x || 1");
+ checkExpr("true", "lunion.y || 2");
+ checkExpr("true", "lunion.y || 1");
+ checkExpr("true", "lunion.x || lunion.y");
+
+ // arithmetic operations
+ // &
+ checkExpr("2", "lunion.x & 2");
+ checkExpr("0", "lunion.x & 1");
+ checkExpr("2", "lunion.y & 2");
+ checkExpr("0", "lunion.y & 1");
+ checkExpr("2", "lunion.x & lunion.y");
+ // |
+ checkExpr("2", "lunion.x | 2");
+ checkExpr("3", "lunion.x | 1");
+ checkExpr("2", "lunion.y | 2");
+ checkExpr("3", "lunion.y | 1");
+ checkExpr("2", "lunion.x | lunion.y");
+ // ^
+ checkExpr("0", "lunion.x ^ 2");
+ checkExpr("3", "lunion.x ^ 1");
+ checkExpr("0", "lunion.y ^ 2");
+ checkExpr("3", "lunion.y ^ 1");
+ checkExpr("0", "lunion.x ^ lunion.y");
+ // +
+ checkExpr("4", "lunion.x + 2");
+ checkExpr("3", "lunion.x + 1");
+ checkExpr("4", "lunion.y + 2");
+ checkExpr("3", "lunion.y + 1");
+ checkExpr("4", "lunion.x + lunion.y");
+ // -
+ checkExpr("0", "lunion.x - 2");
+ checkExpr("1", "lunion.x - 1");
+ checkExpr("0", "lunion.y - 2");
+ checkExpr("1", "lunion.y - 1");
+ checkExpr("0", "lunion.x - lunion.y");
+ // *
+ checkExpr("4", "lunion.x * 2");
+ checkExpr("2", "lunion.x * 1");
+ checkExpr("4", "lunion.y * 2");
+ checkExpr("2", "lunion.y * 1");
+ checkExpr("4", "lunion.x * lunion.y");
+ // /
+ checkExpr("1", "lunion.x / 2");
+ checkExpr("2", "lunion.x / 1");
+ checkExpr("1", "lunion.y / 2");
+ checkExpr("2", "lunion.y / 1");
+ checkExpr("1", "lunion.x / lunion.y");
+ // %
+ checkExpr("0", "lunion.x % 2");
+ checkExpr("0", "lunion.x % 1");
+ checkExpr("0", "lunion.y % 2");
+ checkExpr("0", "lunion.y % 1");
+ checkExpr("0", "lunion.x % lunion.y");
+ // <<
+ checkExpr("8", "lunion.x << 2");
+ checkExpr("4", "lunion.x << 1");
+ checkExpr("8", "lunion.y << 2");
+ checkExpr("4", "lunion.y << 1");
+ checkExpr("8", "lunion.x << lunion.y");
+ // >>
+ checkExpr("0", "lunion.x >> 2");
+ checkExpr("1", "lunion.x >> 1");
+ checkExpr("0", "lunion.y >> 2");
+ checkExpr("1", "lunion.y >> 1");
+ checkExpr("0", "lunion.x >> lunion.y");
+
+ // unary operations
+ // +
+ checkExpr("2", "+lunion.x");
+ checkExpr("2", "+lunion.y");
+ // -
+ checkExpr("-2", "-lunion.x");
+ checkExpr("-2", "-lunion.y");
+ // !
+ checkExpr("false", "!lunion.x");
+ checkExpr("false", "!lunion.y");
+ checkExpr("true", "!!lunion.y");
+ // ~
+ checkExpr("-3", "~lunion.x");
+ checkExpr("-3", "~lunion.y");
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * typedef struct {
+ * volatile unsigned x:1;
+ * volatile unsigned y:2;
+ * volatile unsigned z:3;
+ * volatile unsigned w:16;
+ * } bitfield_type;
+ *
+ * bitfield_type lbitfield;
+ *
+ * lbitfield.x = 1;
+ * lbitfield.y = 2;
+ * lbitfield.z = 3;
+ * lbitfield.w = 26;
+ */
+ @Test
+ public void testExpressionsWithBitfields() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(3);
+
+ checkExprNoError("lbitfield");
+ checkExpr("1", "lbitfield.x");
+ checkExpr("2", "lbitfield.y");
+ checkExpr("3", "lbitfield.z");
+ checkExpr("26", "lbitfield.w");
+
+ // logical operations
+ // ==
+ checkExpr("true", "lbitfield.x == 1");
+ checkExpr("false", "lbitfield.x == 0");
+ checkExpr("true", "lbitfield.y == 2");
+ checkExpr("false", "lbitfield.y == 0");
+ checkExpr("false", "lbitfield.x == lbitfield.y");
+ // !=
+ checkExpr("true", "lbitfield.x != 0");
+ checkExpr("false", "lbitfield.x != 1");
+ checkExpr("true", "lbitfield.y != 0");
+ checkExpr("false", "lbitfield.y != 2");
+ checkExpr("true", "lbitfield.x != lbitfield.y");
+ // >=
+ checkExpr("true", "lbitfield.x >= 1");
+ checkExpr("false", "lbitfield.x >= 2");
+ checkExpr("true", "lbitfield.y >= 2");
+ checkExpr("false", "lbitfield.y >= 3");
+ checkExpr("false", "lbitfield.x >= lbitfield.y");
+ // >
+ checkExpr("true", "lbitfield.x > 0");
+ checkExpr("false", "lbitfield.x > 1");
+ checkExpr("true", "lbitfield.y > 1");
+ checkExpr("false", "lbitfield.y > 2");
+ checkExpr("false", "lbitfield.x > lbitfield.y");
+ // <=
+ checkExpr("true", "lbitfield.x <= 1");
+ checkExpr("false", "lbitfield.x <= 0");
+ checkExpr("true", "lbitfield.y <= 2");
+ checkExpr("false", "lbitfield.y <= 1");
+ checkExpr("true", "lbitfield.x <= lbitfield.y");
+ // <
+ checkExpr("true", "lbitfield.x < 2");
+ checkExpr("false", "lbitfield.x < 1");
+ checkExpr("true", "lbitfield.y < 3");
+ checkExpr("false", "lbitfield.y < 2");
+ checkExpr("true", "lbitfield.x < lbitfield.y");
+ // &&
+ checkExpr("true", "lbitfield.x && 2");
+ checkExpr("true", "lbitfield.x && 1");
+ checkExpr("true", "lbitfield.y && 3");
+ checkExpr("true", "lbitfield.y && 2");
+ checkExpr("true", "lbitfield.x && lbitfield.y");
+ // ||
+ checkExpr("true", "lbitfield.x || 2");
+ checkExpr("true", "lbitfield.x || 1");
+ checkExpr("true", "lbitfield.y || 3");
+ checkExpr("true", "lbitfield.y || 2");
+ checkExpr("true", "lbitfield.x || lbitfield.y");
+
+ // arithmetic operations
+ // &
+ checkExpr("0", "lbitfield.x & 0");
+ checkExpr("1", "lbitfield.x & 1");
+ checkExpr("0", "lbitfield.y & 0");
+ checkExpr("2", "lbitfield.y & 2");
+ checkExpr("0", "lbitfield.x & lbitfield.y");
+ // |
+ checkExpr("1", "lbitfield.x | 0");
+ checkExpr("1", "lbitfield.x | 1");
+ checkExpr("2", "lbitfield.y | 0");
+ checkExpr("2", "lbitfield.y | 2");
+ checkExpr("3", "lbitfield.x | lbitfield.y");
+ // ^
+ checkExpr("1", "lbitfield.x ^ 0");
+ checkExpr("0", "lbitfield.x ^ 1");
+ checkExpr("2", "lbitfield.y ^ 0");
+ checkExpr("0", "lbitfield.y ^ 2");
+ checkExpr("3", "lbitfield.x ^ lbitfield.y");
+ // +
+ checkExpr("0", "lbitfield.x + (-1)");
+ checkExpr("2", "lbitfield.x + 1");
+ checkExpr("1", "lbitfield.y + (-1)");
+ checkExpr("3", "lbitfield.y + 1");
+ checkExpr("3", "lbitfield.x + lbitfield.y");
+ // -
+ checkExpr("2", "lbitfield.x - (-1)");
+ checkExpr("0", "lbitfield.x - 1");
+ checkExpr("3", "lbitfield.y - (-1)");
+ checkExpr("1", "lbitfield.y - 1");
+ checkExpr("-1", "lbitfield.x - lbitfield.y");
+ // *
+ checkExpr("0", "lbitfield.x * 0");
+ checkExpr("1", "lbitfield.x * 1");
+ checkExpr("0", "lbitfield.y * 0");
+ checkExpr("4", "lbitfield.y * 2");
+ checkExpr("2", "lbitfield.x * lbitfield.y");
+ // /
+ checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.x / 0");
+ checkExpr("1", "lbitfield.x / 1");
+ checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.y / 0");
+ checkExpr("1", "lbitfield.y / 2");
+ checkExpr("0", "lbitfield.x / lbitfield.y");
+ // %
+ checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.x % 0");
+ checkExpr("0", "lbitfield.x % 1");
+ checkExprError(ASTEvalMessages.DivideByZero, "lbitfield.y % 0");
+ checkExpr("0", "lbitfield.y % 2");
+ checkExpr("1", "lbitfield.x % lbitfield.y");
+ // <<
+ checkExpr("1", "lbitfield.x << 0");
+ checkExpr("2", "lbitfield.x << 1");
+ checkExpr("2", "lbitfield.y << 0");
+ checkExpr("4", "lbitfield.y << 1");
+ checkExpr("4", "lbitfield.x << lbitfield.y");
+ // >>
+ checkExpr("1", "lbitfield.x >> 0");
+ checkExpr("0", "lbitfield.x >> 1");
+ checkExpr("2", "lbitfield.y >> 0");
+ checkExpr("1", "lbitfield.y >> 1");
+ checkExpr("0", "lbitfield.x >> lbitfield.y");
+
+ // unary operations
+ // +
+ checkExpr("1", "+lbitfield.x");
+ checkExpr("2", "+lbitfield.y");
+ checkExpr("3", "+lbitfield.z");
+ checkExpr("26", "+lbitfield.w");
+ // -
+ checkExpr("-1", "-lbitfield.x");
+ checkExpr("-2", "-lbitfield.y");
+ checkExpr("-3", "-lbitfield.z");
+ checkExpr("-26", "-lbitfield.w");
+ // !
+ checkExpr("false", "!lbitfield.x");
+ checkExpr("false", "!lbitfield.y");
+ checkExpr("false", "!lbitfield.z");
+ checkExpr("false", "!lbitfield.w");
+ checkExpr("true", "!!lbitfield.w");
+ // ~
+ checkExpr("-2", "~lbitfield.x");
+ checkExpr("-3", "~lbitfield.y");
+ checkExpr("-4", "~lbitfield.z");
+ checkExpr("-27", "~lbitfield.w");
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * enum enum_type { zero, one, two, three, four };
+ *
+ * enum enum_type lenum;
+ *
+ * lenum = three;
+ */
+ @Test
+ public void testExpressionsWithEnums() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(4);
+
+ checkExprNoError("lenum");
+ checkExpr("three [3]", "lenum");
+
+ // logical operations
+ // ==
+ checkExpr("true", "lenum == 3");
+ checkExpr("true", "lenum == three");
+ checkExpr("false", "lenum == 4");
+ checkExpr("false", "lenum == four");
+ // !=
+ checkExpr("true", "lenum != 4");
+ checkExpr("true", "lenum != four");
+ checkExpr("false", "lenum != 3");
+ checkExpr("false", "lenum != three");
+ // >=
+ checkExpr("true", "lenum >= 3");
+ checkExpr("true", "lenum >= three");
+ checkExpr("false", "lenum >= 5");
+ // >
+ checkExpr("true", "lenum > 2");
+ checkExpr("true", "lenum > two");
+ checkExpr("false", "lenum > 4");
+ checkExpr("false", "lenum > four");
+ // <=
+ checkExpr("true", "lenum <= 3");
+ checkExpr("false", "lenum <= 2");
+ // <
+ checkExpr("true", "lenum < 5");
+ checkExpr("false", "lenum < 3");
+ // &&
+ checkExpr("true", "lenum && 4");
+ checkExpr("true", "lenum && 1");
+ // ||
+ checkExpr("true", "lenum || 4");
+ checkExpr("true", "lenum || 1");
+
+ // arithmetic operations
+ // &
+ checkExpr("0", "lenum & 4");
+ checkExpr("3", "lenum & 3");
+ // |
+ checkExpr("7", "lenum | 4");
+ checkExpr("3", "lenum | 3");
+ // ^
+ checkExpr("7", "lenum ^ 4");
+ checkExpr("0", "lenum ^ 3");
+ // +
+ checkExpr("7", "lenum + 4");
+ checkExpr("6", "lenum + 3");
+ checkExpr("6", "lenum + three");
+ // -
+ checkExpr("-1", "lenum - 4");
+ checkExpr("0", "lenum - 3");
+ // *
+ checkExpr("12", "lenum * 4");
+ checkExpr("9", "lenum * 3");
+ // /
+ checkExpr("0", "lenum / 4");
+ checkExpr("1", "lenum / 3");
+ // %
+ checkExpr("3", "lenum % 4");
+ checkExpr("0", "lenum % 3");
+ // <<
+ checkExpr("12", "lenum << 2");
+ checkExpr("24", "lenum << three");
+ // >>
+ checkExpr("0", "lenum >> 4");
+ checkExpr("0", "lenum >> 3");
+
+ // unary operations
+ // +
+ checkExpr("3", "+lenum");
+ // -
+ checkExpr("-3", "-lenum");
+ // !
+ checkExpr("false", "!lenum");
+ checkExpr("true", "!!lenum");
+ // ~
+ checkExpr("-4", "~lenum");
+ }
+
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsAggregatesAndEnums.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsBasicTypes.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsBasicTypes.java
index 0fda3a2..3701f8d 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsBasicTypes.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsBasicTypes.java
@@ -1,707 +1,791 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
-import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests of expression evaluation using basic types.
- * <p>
- * Note: if you want to determine the "real type" for an expression, it is convenient to
- * use a C++ compiler. Make a program like this:
- *
- * <pre>
- typeof(...your expression...) foo;
- </pre>
-
- Build with your favorite compiler and debug info, disassemble to see what type the
- compiler picked.
- */
-public class ExpressionsBasicTypes extends BaseExpressionTest {
-
-
- boolean formatterSetting;
-
- @Before
- public void turnOnFormatter() {
- formatterSetting = FormatExtensionManager.instance().isEnabled();
- FormatExtensionManager.instance().setEnabled(true);
- }
- @After
- public void restoreFormatter() {
- FormatExtensionManager.instance().setEnabled(formatterSetting);
- }
-
-
- @Test
- public void testExpressionsWithoutVariables() throws Exception {
-
- // expressions without operators
- // No booleans, which need logical operators (e.g. ==, !=, etc.)
-
- checkExpr(charType, "98 ('b')", "'b'"); // char
- checkExpr(wcharType, "0x3039 (L'\u3039')", "L'\\u3039'"); // wchar_t
- checkExpr(intType, "15", "15"); // int
- checkExpr(longType, "15", "15L"); // long
- checkExpr(floatType, "1.5678", "1.5678F"); // float
- checkExpr(doubleType, "234.567", "234.567"); // double
- checkExpr(longDoubleType, "234.567", "234.567L"); // double
- //checkExpr(doubleType, "234.567", "234.567"); // double
-
- // check types of decimal, hex and octal constants
- checkExpr(intType, "1", "1"); // int
- checkExpr(intType, "2147483647", "2147483647"); // int
- checkExpr(intType, "-2147483647", "-2147483647"); // int
- checkExpr(longLongType, "2147483648", "2147483648"); // long long
- checkExpr(longLongType, "4294967295", "4294967295"); // long long
- checkExpr(longLongType, "-4294967296", "-4294967296"); // long long
- checkExpr(longLongType, "4294967295", "4294967295"); // long long
- checkExpr(longLongType, "4294967296", "4294967296"); // long long
- checkExpr(unsignedIntType, "2147483647", "2147483647u"); // unsigned int
- checkExpr(unsignedIntType, "4294967295", "4294967295u"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "4294967296u"); // unsigned long long
- checkExpr(unsignedIntType, "4294967295", "4294967295U"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "4294967296U"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "4294967295ul"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "4294967296ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "4294967295Ul"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "4294967296Ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "4294967295uL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "4294967296uL"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "4294967295UL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "4294967296UL"); // unsigned long long
- checkExpr(longLongType, "4294967296", "4294967296ll"); // long long
- checkExpr(longLongType, "4294967295", "4294967295LL"); // long long
- checkExpr(longLongType, "9223372036854775807", "9223372036854775807"); // long long
- checkExpr(longLongType, "9223372036854775808", "9223372036854775808"); // unsigned long long
- checkExpr(longLongType, "18446744073709551615", "18446744073709551615"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "9223372036854775807ll"); // long long
- checkExpr(longLongType, "9223372036854775808", "9223372036854775808ll"); // unsigned long long
- checkExpr(longLongType, "18446744073709551615", "18446744073709551615ll"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "9223372036854775807LL"); // long long
- checkExpr(longLongType, "9223372036854775808", "9223372036854775808LL"); // unsigned long long
- checkExpr(longLongType, "18446744073709551615", "18446744073709551615LL"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "9223372036854775807ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "9223372036854775808Ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "18446744073709551615ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "9223372036854775807uLL"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "9223372036854775808ULL"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "18446744073709551615uLL"); // unsigned long long
-
- checkExpr(intType, "2147483647", "0x7fffffff"); // int
- checkExpr(unsignedIntType, "2147483648", "0x80000000"); // unsigned int
- checkExpr(unsignedIntType, "4294967295", "0xffffffff"); // unsigned int
- checkExpr(longLongType, "4294967296", "0x100000000"); // long long
- checkExpr(unsignedIntType, "4294967295", "0xffffffffu"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000u"); // unsigned long long
- checkExpr(unsignedIntType, "4294967295", "0xffffffffU"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000U"); // unsigned long long
- checkExpr(longType, "2147483647", "0x7fffffffl"); // long
- checkExpr(unsignedLongType, "2147483648", "0x80000000l"); // unsigned long
- checkExpr(unsignedLongType, "4294967295", "0xffffffffl"); // unsigned long
- checkExpr(longLongType, "4294967296", "0x100000000l"); // long long
- checkExpr(longType, "2147483647", "0x7fffffffL"); // long
- checkExpr(unsignedLongType, "2147483648", "0x80000000L"); // unsigned long
- checkExpr(unsignedLongType, "4294967295", "0xffffffffL"); // unsigned long
- checkExpr(longLongType, "4294967296", "0x100000000L"); // long long
- checkExpr(unsignedLongType, "4294967295", "0xfffffffful"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "0xffffffffUl"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000Ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "0xffffffffuL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000uL"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "0xffffffffUL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "0x100000000UL"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "0x7fffffffffffffffll"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ll"); // long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffll"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "0x7fffffffffffffffLL"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000LL"); // long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffLL"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "0x7fffffffffffffffUll"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ull"); // long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffUll"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "0x7fffffffffffffffuLL"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ULL"); // long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffuLL"); // unsigned long long
-
- checkExpr(intType, "2147483647", "017777777777"); // int
- checkExpr(unsignedIntType, "2147483648", "020000000000"); // unsigned int
- checkExpr(unsignedIntType, "4294967295", "037777777777"); // unsigned int
- checkExpr(longLongType, "4294967296", "040000000000"); // long long
- checkExpr(unsignedIntType, "4294967295", "037777777777u"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "040000000000u"); // unsigned long long
- checkExpr(unsignedIntType, "4294967295", "037777777777U"); // unsigned int
- checkExpr(unsignedLongLongType, "4294967296", "040000000000U"); // unsigned long long
- checkExpr(longType, "2147483647", "017777777777l"); // long
- checkExpr(unsignedLongType, "2147483648", "020000000000l"); // unsigned long
- checkExpr(unsignedLongType, "4294967295", "037777777777l"); // unsigned long
- checkExpr(longLongType, "4294967296", "040000000000l"); // long long
- checkExpr(longType, "2147483647", "017777777777L"); // long
- checkExpr(unsignedLongType, "2147483648", "020000000000L"); // unsigned long
- checkExpr(unsignedLongType, "4294967295", "037777777777L"); // unsigned long
- checkExpr(longLongType, "4294967296", "040000000000L"); // long long
- checkExpr(unsignedLongType, "4294967295", "037777777777ul"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "040000000000ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "037777777777Ul"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "040000000000Ul"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "037777777777uL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "040000000000uL"); // unsigned long long
- checkExpr(unsignedLongType, "4294967295", "037777777777UL"); // unsigned long
- checkExpr(unsignedLongLongType, "4294967296", "040000000000UL"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "0777777777777777777777ll"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000ll"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ll"); // unsigned long long
- checkExpr(longLongType, "9223372036854775807", "0777777777777777777777LL"); // long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000LL"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777LL"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "0777777777777777777777Ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000Ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ull"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775807", "0777777777777777777777uLL"); // unsigned long long
- checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000uLL"); // unsigned long long
- checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ULL"); // unsigned long long
-
- // logical operations
-
- // ==
- checkExpr(boolType, "true", "'b' == 'b'"); // char
- checkExpr(boolType, "false", "'c' == 'b'"); // char
- checkExpr(boolType, "true", "5 == 5"); // int
- checkExpr(boolType, "false", "6 == 5"); // int
- checkExpr(boolType, "true", "5L == 5L"); // long
- checkExpr(boolType, "false", "6l == 5l"); // long
- checkExpr(boolType, "true", "5.5F == 5.5F"); // float
- checkExpr(boolType, "false", "6.5F == 5.5F"); // float
- checkExpr(boolType, "true", "5.5 == 5.5"); // double
- checkExpr(boolType, "false", "6.5 == 5.5"); // double
- checkExpr(boolType, "true", "(5 == 5) == (6 == 6)");// boolean
- checkExpr(boolType, "false", "(5 == 5) == (6 == 5)");// boolean
- // !=
- checkExpr(boolType, "false", "'b' != 'b'"); // char
- checkExpr(boolType, "true", "'c' != 'b'"); // char
- checkExpr(boolType, "false", "5 != 5"); // int
- checkExpr(boolType, "true", "6 != 5"); // int
- checkExpr(boolType, "false", "5l != 5l"); // long
- checkExpr(boolType, "true", "6L != 5L"); // long
- checkExpr(boolType, "false", "5.5F != 5.5F"); // float
- checkExpr(boolType, "true", "6.5F != 5.5F"); // float
- checkExpr(boolType, "false", "5.5 != 5.5"); // double
- checkExpr(boolType, "true", "6.5 != 5.5"); // double
- checkExpr(boolType, "false", "(5 == 5) != (6 == 6)");// boolean
- checkExpr(boolType, "true", "(5 == 5) != (6 == 5)");// boolean
- // >=
- checkExpr(boolType, "true", "'c' >= 'b'"); // char
- checkExpr(boolType, "false", "'b' >= 'c'"); // char
- checkExpr(boolType, "true", "6 >= 5"); // int
- checkExpr(boolType, "false", "5 >= 6"); // int
- checkExpr(boolType, "true", "6L >= 5L"); // long
- checkExpr(boolType, "false", "5L >= 6L"); // long
- checkExpr(boolType, "true", "6.5F >= 5.5F"); // float
- checkExpr(boolType, "false", "5.5F >= 6.5F"); // float
- checkExpr(boolType, "true", "6.5 >= 5.5"); // double
- checkExpr(boolType, "false", "5.5 >= 6.5"); // double
- checkExpr(boolType, "true", "(5 == 5) >= (6 == 5)");// boolean
- checkExpr(boolType, "true", "(5 == 5) >= (6 == 6)");// boolean
- // >
- checkExpr(boolType, "true", "'c' > 'b'"); // char
- checkExpr(boolType, "false", "'b' > 'c'"); // char
- checkExpr(boolType, "true", "6 > 5"); // int
- checkExpr(boolType, "false", "5 > 6"); // int
- checkExpr(boolType, "true", "6L > 5L"); // long
- checkExpr(boolType, "false", "5L > 6L"); // long
- checkExpr(boolType, "true", "6.5F > 5.5F"); // float
- checkExpr(boolType, "false", "5.5F > 6.5F"); // float
- checkExpr(boolType, "true", "6.5 > 5.5"); // double
- checkExpr(boolType, "false", "5.5 > 6.5"); // double
- checkExpr(boolType, "true", "(5 == 5) > (6 == 5)"); // boolean
- checkExpr(boolType, "false", "(5 == 5) > (6 == 6)"); // boolean
- // <=
- checkExpr(boolType, "false", "'c' <= 'b'"); // char
- checkExpr(boolType, "true", "'b' <= 'c'"); // char
- checkExpr(boolType, "false", "6 <= 5"); // int
- checkExpr(boolType, "true", "5 <= 6"); // int
- checkExpr(boolType, "false", "6L <= 5L"); // long
- checkExpr(boolType, "true", "5L <= 6L"); // long
- checkExpr(boolType, "false", "6.5F <= 5.5F"); // float
- checkExpr(boolType, "true", "5.5F <= 6.5F"); // float
- checkExpr(boolType, "false", "6.5 <= 5.5"); // double
- checkExpr(boolType, "true", "5.5 <= 6.5"); // double
- checkExpr(boolType, "false", "(5 == 5) <= (6 == 5)");// boolean
- checkExpr(boolType, "true", "(5 == 5) <= (6 == 6)");// boolean
- // <
- checkExpr(boolType, "false", "'c' < 'b'"); // char
- checkExpr(boolType, "true", "'b' < 'c'"); // char
- checkExpr(boolType, "false", "6 < 5"); // int
- checkExpr(boolType, "true", "5 < 6"); // int
- checkExpr(boolType, "false", "6L < 5L"); // long
- checkExpr(boolType, "true", "5L < 6L"); // long
- checkExpr(boolType, "false", "6.5F < 5.5F"); // float
- checkExpr(boolType, "true", "5.5F < 6.5F"); // float
- checkExpr(boolType, "false", "6.5 < 5.5"); // double
- checkExpr(boolType, "true", "5.5 < 6.5"); // double
- checkExpr(boolType, "false", "(5 == 5) < (6 == 5)"); // boolean
- checkExpr(boolType, "false", "(5 == 5) < (6 == 6)"); // boolean
- // &&
- checkExpr(boolType, "true", "'c' && 'b'"); // char
- checkExpr(boolType, "true", "6 && 5"); // int
- checkExpr(boolType, "false", "6 && 0"); // int
- checkExpr(boolType, "false", "0 && 6"); // int
- checkExpr(boolType, "true", "6L && 5L"); // long
- checkExpr(boolType, "true", "6.5F && 5.5F"); // float
- checkExpr(boolType, "false", "6.5F && 0"); // float
- checkExpr(boolType, "true", "6.5 && 5.5"); // double
- checkExpr(boolType, "false", "'\\0' && 5.5");
- checkExpr(boolType, "false", "(5 == 5) && (6 == 5)");// boolean
- checkExpr(boolType, "true", "(5 == 5) && (6 == 6)");// boolean
- // ||
- checkExpr(boolType, "true", "'c' || 'b'"); // char
- checkExpr(boolType, "true", "6 || 5"); // int
- checkExpr(boolType, "true", "6L || 5L"); // long
- checkExpr(boolType, "true", "6.5F || 5.5F"); // float
- checkExpr(boolType, "true", "6.5 || 5.5"); // double
- checkExpr(boolType, "false", "0 || 0L");
- checkExpr(boolType, "true", "(5 == 5) || (6 == 5)");// boolean
- checkExpr(boolType, "true", "(5 == 5) || (6 == 6)");// boolean
- checkExpr(boolType, "true", "(5 == 6) || (6 == 6)");// boolean
-
- // arithmetic operations
-
- // &
- checkExpr(intType, "98", "'c'&'b'"); // char
- checkExpr(intType, "4", "6&5"); // int
- checkExpr(longType, "4", "6L&5L"); // long
- checkExpr(floatType, "0.0", "6.5F&5.5F"); // float
- checkExpr(doubleType, "0.0", "6.5&5.5"); // double
- checkExpr(intType, "0", "(5 == 5)&(6 == 5)"); // boolean
- // |
- checkExpr(intType, "99", "'c' |'b'"); // char
- checkExpr(intType, "7", "6 |5"); // int
- checkExpr(longType, "7", "6L |5L"); // long
- checkExpr(floatType, "0.0", "6.5F |5.5F"); // float
- checkExpr(doubleType, "0.0", "6.5 |5.5"); // double
- checkExpr(intType, "1", "(5 == 5) |(6 == 5)"); // boolean
- // ^
- checkExpr(intType, "1", "'c'^ 'b'"); // char
- checkExpr(intType, "3", "6^ 5"); // int
- checkExpr(longType, "3", "6L^ 5L"); // long
- checkExpr(floatType, "0.0", "6.5F^ 5.5F"); // float
- checkExpr(doubleType, "0.0", "6.5^ 5.5"); // double
- checkExpr(intType, "1", "(5 == 5)| (6 == 5)"); // boolean
- // +
- checkExpr(intType, "197", "'c' + 'b'"); // char
- checkExpr(intType, "1", "'c' + -'b'"); // char
- checkExpr(intType, "11", "6 + 5"); // int
- checkExpr(intType, "11", "6- -5"); // int
- checkExpr(longType, "11", "6L + 5L"); // long
- checkExpr(longType, "11", "6L- -5L"); // long
- checkExpr(floatType, "12.0", "6.5F + 5.5F"); // float
- checkExpr(floatType, "12.0", "6.5F- -5.5F"); // float
- checkExpr(doubleType, "12.0", "6.5 + 5.5"); // double
- checkExpr(doubleType, "12.0", "6.5- -5.5"); // double
- checkExpr(intType, "1", "(5 == 5) + (6 == 5)"); // boolean
- // -
- checkExpr(intType, "1", "'c'-'b'"); // char
- checkExpr(intType, "1", " 6-5"); // int
- checkExpr(longType, "1", " 6L-5L"); // long
- checkExpr(floatType, "1.0", " 6.5F-5.5F"); // float
- checkExpr(doubleType, "1.0", " 6.5-5.5"); // double
- checkExpr(intType, "1", "(5 == 5) - (6 == 5)"); // boolean
- // *
- checkExpr(intType, "9702", "'c'*'b'"); // char
- checkExpr(intType, "30", "6*5"); // int
- checkExpr(longType, "30", "6L*5L"); // long
- checkExpr(floatType, "35.75", "6.5F*5.5F"); // float
- checkExpr(doubleType, "35.75", "6.5*5.5"); // double
- checkExpr(intType, "0", "(5 == 5) * (6 == 5)"); // boolean
- // /
- checkExpr(intType, "1", "'c' / 'b'"); // char
- checkExpr(intType, "1", "6 / 5"); // int
- checkExprError(ASTEvalMessages.DivideByZero, "6 / 0"); // int
- checkExpr(longType, "1", "6L / 5L"); // long
- checkExprError(ASTEvalMessages.DivideByZero, "6L / 0L"); // long
- checkExpr(floatType, "1.1818181", "6.5F / 5.5F"); // float
- checkExpr(doubleType, "1.1818181818181819", "6.5 / 5.5"); // double
- checkExprError(ASTEvalMessages.DivideByZero, "(5 == 5) / (6 == 5)"); // boolean
- checkExpr(intType, "0", "(6 == 5) / (6 == 6)"); // boolean
- checkExpr(intType, "1", "(5 == 5) / (6 == 6)"); // boolean
- // %
- checkExpr(intType, "1", "'c' % 'b'"); // char
- checkExpr(intType, "1", "6 % 5"); // int
- checkExprError(ASTEvalMessages.DivideByZero, "6 % 0"); // int
- checkExpr(longType, "1", "6L % 5L"); // long
- checkExprError(ASTEvalMessages.DivideByZero, "6L % 0L"); // long
- checkExpr(floatType, "1.0", "6.5F % 5.5F"); // float
- checkExpr(doubleType, "1.0", "6.5 % 5.5"); // double
- checkExprError(ASTEvalMessages.DivideByZero, "(5 == 5) % (6 == 5)"); // boolean
- // <<
- checkExpr(intType, "396", "'c' << 2"); // char
- checkExpr(intType, "192", "6 << 5"); // int
- checkExpr(longType, "192", "6L << 5L"); // long
- checkExpr(floatType, "0.0", "6.5F << 5.5F"); // float
- checkExpr(doubleType, "0.0", "6.5 << 5.5"); // double
- checkExpr(intType, "1", "(5 == 5) << (6 == 5)"); // boolean
- // >>
- checkExpr(intType, "12", "'c' >> 3"); // char
- checkExpr(intType, "1", "6 >> 2"); // int
- checkExpr(longType, "1", "6L >> 2L"); // long
- checkExpr(floatType, "0.0", "6.5F >> 5.5F"); // float
- checkExpr(doubleType, "0.0", "6.5 >> 5.5"); // double
- checkExpr(intType, "1", "(5 == 5) >> (6 == 5)"); // boolean
- // TODO: ->
- // TODO: .
-
- // unary operations
-
- // +
- checkExpr(intType, "99", "+'c'"); // char
- checkExpr(intType, "6", "+6"); // int
- checkExpr(longType, "6", "+6L"); // long
- checkExpr(floatType, "6.5", "+6.5F"); // float
- checkExpr(doubleType, "6.5", "+6.5"); // double
- checkExpr(intType, "1", "+(5 == 5)"); // boolean
- // -
- checkExpr(intType, "-99", "-'c'"); // char
- checkExpr(intType, "-6", "-6"); // int
- checkExpr(longType, "-6", "-6L"); // long
- checkExpr(floatType, "-6.5", "-6.5F"); // float
- checkExpr(doubleType, "-6.5", "-6.5"); // double
- checkExpr(intType, "-1", "-(5 == 5)"); // boolean
- // !
- checkExpr(boolType, "false", "!'c'"); // char
- checkExpr(boolType, "false", "!6"); // int
- checkExpr(boolType, "false", "!6"); // long
- checkExpr(boolType, "false", "!6.5"); // float
- checkExpr(boolType, "false", "!6.5"); // double
- checkExpr(boolType, "false", "!(5 == 5)"); // boolean
- checkExpr(boolType, "true", "!(5 == 6)"); // boolean
- // ~
- checkExpr(intType, "-100", "~'c'"); // ~'c'
- checkExpr(intType, "-7", "~6"); // int
- checkExpr(longType, "-7", "~6L"); // long
- checkExpr(floatType, "0.0", "~6.5F"); // float
- checkExpr(doubleType, "0.0", "~6.5"); // double
- checkExpr(intType, "-2", "~(5 == 5)"); // boolean
- checkExpr(intType, "-1", "~(5 == 6)"); // boolean
- // TODO: *
- // TODO: &
-
- // precedence
- checkExpr(intType, "783", "6 + 'a' * 8 + 14 / 7 - 4 % 3"); // char
- // &
- // int
- checkExpr(intType, "377", "(6 + 'a') * (8 + 14) / (7 - 4 % 3)"); // char
- // &
- // int
- checkExpr(longType, "55", "6L + 6l * 8L + 14l / 7L - 4l % 3L"); // long
- checkExpr(longType, "28", "6L + 6l * (8L + 14l) / (7L - 4l % 3L)"); // long
- checkExpr(floatType, "55.366665", "6.5F + 6.F * 8.5F + 14.F / 7.5F - 4.F"); // float
- checkExpr(floatType, "80.35714", "(6.5F + 6.F) * (8.5F + 14.F) / (7.5F - 4.F)"); // float
- checkExpr(doubleType, "55.36666666666667", "6.5 + 6 * 8.5 + 14 / 7.5 - 4"); // double
- checkExpr(doubleType, "80.35714285714286", "(6.5 + 6) * (8.5 + 14) / (7.5 - 4)"); // double
- checkExpr(boolType, "false", "(5 == 6) && ((6 == 5) || (5 == 5))"); // boolean
- checkExpr(boolType, "true", "((5 == 6) && (6 == 5)) || (5 == 5)"); // boolean
- }
-
- /**
- * Test strings, treated as temporary char arrays.
- * These don't really make much sense in C/C++ but the support is there...
- * @throws Exception
- */
- @Test
- public void testStringExpressionsWithoutVariables() throws Exception {
-
- // expressions without operators
- // No booleans, which need logical operators (e.g. ==, !=, etc.)
-
- checkExpr(null, "\"hi\"", "\"hi\""); // string
-
- // logical operations
-
- // ==
- checkExpr(boolType, "true", "\"hi\" == \"hi\""); // string
- checkExpr(boolType, "false", "\"hi\" == \"bye\""); // string
- // !=
- checkExpr(boolType, "false", "\"hi\" != \"hi\""); // string
- checkExpr(boolType, "true", "\"hi\" != \"bye\""); // string
- // >=
- checkExpr(boolType, "true", "\"hi\" >= \"bye\""); // string
- checkExpr(boolType, "false", "\"bye\" >= \"hi\""); // string
- // >
- checkExpr(boolType, "true", "\"hi\" > \"bye\""); // string
- checkExpr(boolType, "false", "\"bye\" > \"hi\""); // string
- // <=
- checkExpr(boolType, "false", "\"hi\" <= \"bye\""); // string
- checkExpr(boolType, "true", "\"bye\" <= \"hi\""); // string
- // <
- checkExpr(boolType, "false", "\"hi\" < \"bye\""); // string
- checkExpr(boolType, "true", "\"bye\" < \"hi\""); // string
- // &&
- checkExpr(boolType, "true", "\"hi\" && \"bye\""); // string
- // ||
- checkExpr(boolType, "true", "\"hi\" || \"bye\""); // string
-
- // arithmetic operations
-
- // &
- checkExprError("\"hi\"&\"bye\""); // string
- // |
- checkExprError("\"hi\" |\"bye\""); // string
- // ^
- checkExprError("\"hi\"^ \"bye\""); // string
- // +
- checkExpr(null, "\"hibye\"", "\"hi\" + \"bye\"");// string
- // -
- checkExprError(" \"hi\"-\"bye\""); // string
- // *
- checkExprError("\"hi\"*\"bye\""); // string
- // /
- checkExprError("\"hi\" / \"bye\""); // string
- // %
- checkExprError("\"hi\" % \"bye\""); // string
- // <<
- checkExprError("\"hi\" << \"bye\""); // string
- // >>
- checkExprError("\"hi\" >> \"bye\""); // string
- // TODO: ->
- // TODO: .
-
- // unary operations
-
- // +
- checkExprError("+\"hi\""); // string
- // -
- checkExprError("-\"hi\""); // string
- // !
- checkExpr(boolType, "false", "!\"hi\""); // string
- // ~
- checkExprError("~\"hi\""); // string
- // TODO: *
- // TODO: &
- }
-
- /*
- * Note: This assumes you are at a breakpoint where the following are true:
- * local int SizeOfInt = sizeof (int)
- * local int lint = 1024
- * local char lchar = 'a'(97)
- * local float lfloat = 55.55
- * local double ldouble = 222.222
- * local long llong = 123456789
- * local char larray[8] = "testing" (address = 0x22ff00)
- */
- @Test
- public void testExpressionsWithVariables() throws Exception {
-
- // Expressions with variables, but without operators.
- // Types should be the original types of the variables.
-
- checkExpr("volatile int", "4", "SizeOfInt");
- checkExpr("volatile int", "1024", "lint");
- checkExpr("volatile char", "97 ('a')", "lchar");
- checkExpr("volatile float", "55.55", "lfloat");
- checkExpr("volatile double", "222.222", "ldouble");
- checkExpr("volatile long", "123456789", "llong");
- // custom formatting of character arrays is on by default and as a string now
-// checkExpr(intType, "0x22ff00", "larray");
- checkExpr("char[8]", "\"testing\"", "larray");
-
- // logical operations
-
- // ==
- checkExpr(boolType, "true", "lint == 1024"); // int
- checkExpr(boolType, "false", "lint == 2058"); // int
- checkExpr(boolType, "true", "lchar == 97"); // char
- checkExpr(boolType, "false", "lchar == 88"); // char
- checkExpr(boolType, "true", "lfloat == lfloat"); // float
- checkExpr(boolType, "true", "lfloat == lfloat"); // float (adjust for imprecision)
- checkExpr(boolType, "false", "lfloat == 66.66"); // float
- checkExpr(boolType, "true", "ldouble == ldouble"); // double (adjust for imprecision)
- checkExpr(boolType, "false", "ldouble == 111.111"); // double
- checkExpr(boolType, "true", "llong == 123456789"); // long
- checkExpr(boolType, "false", "llong == 987654321"); // long
- // !=
- checkExpr(boolType, "true", "lint != 2058"); // int
- checkExpr(boolType, "false", "lint != 1024"); // int
- checkExpr(boolType, "true", "lchar != 88"); // char
- checkExpr(boolType, "false", "lchar != 97"); // char
- checkExpr(boolType, "true", "lfloat != 66.66"); // float
- checkExpr(boolType, "false", "lfloat != lfloat"); // float (adjust for imprecision)
- checkExpr(boolType, "true", "ldouble != 111.111"); // double
- checkExpr(boolType, "false", "ldouble != ldouble"); // double(adjust for imprecision)
- checkExpr(boolType, "true", "llong != 987654321"); // long
- checkExpr(boolType, "false", "llong != 123456789"); // long
- // >=
- checkExpr(boolType, "true", "lint >= 1024"); // int
- checkExpr(boolType, "false", "lint >= 2058"); // int
- checkExpr(boolType, "true", "lchar >= 97"); // char
- checkExpr(boolType, "false", "lchar >= 99"); // char
- checkExpr(boolType, "true", "lfloat >= 55.54"); // float (adjust for imprecision)
- checkExpr(boolType, "false", "lfloat >= 66.66"); // float
- checkExpr(boolType, "true", "ldouble >= 222.221"); // double (adjust for imprecision)
- checkExpr(boolType, "false", "ldouble >= 333.333"); // double
- checkExpr(boolType, "true", "llong >= 123456789"); // long
- checkExpr(boolType, "false", "llong >= 987654321"); // long
- // >
- checkExpr(boolType, "true", "lint > 1023"); // int
- checkExpr(boolType, "false", "lint > 2058"); // int
- checkExpr(boolType, "true", "lchar > 96"); // char
- checkExpr(boolType, "false", "lchar > 99"); // char
- checkExpr(boolType, "true", "lfloat > 55.54"); // float
- checkExpr(boolType, "false", "lfloat > 66.66"); // float
- checkExpr(boolType, "true", "ldouble > 222.221"); // double
- checkExpr(boolType, "false", "ldouble > 333.333"); // double
- checkExpr(boolType, "true", "llong > 123456788"); // long
- checkExpr(boolType, "false", "llong > 987654321"); // long
- // <=
- checkExpr(boolType, "true", "lint <= 1024"); // int
- checkExpr(boolType, "false", "lint <= 999"); // int
- checkExpr(boolType, "true", "lchar <= 97"); // char
- checkExpr(boolType, "false", "lchar <= 88"); // char
- checkExpr(boolType, "true", "lfloat <= 55.55"); // float
- checkExpr(boolType, "false", "lfloat <= 44.44"); // float
- checkExpr(boolType, "true", "ldouble <= 222.222"); // double
- checkExpr(boolType, "false", "ldouble <= 111.111"); // double
- checkExpr(boolType, "true", "llong <= 123456789"); // long
- checkExpr(boolType, "false", "llong <= 100000000"); // long
- // <
- checkExpr(boolType, "true", "lint < 1025"); // int
- checkExpr(boolType, "false", "lint < 999"); // int
- checkExpr(boolType, "true", "lchar < 98"); // char
- checkExpr(boolType, "false", "lchar < 88"); // char
- checkExpr(boolType, "true", "lfloat < 55.56"); // float
- checkExpr(boolType, "false", "lfloat < 44.44"); // float
- checkExpr(boolType, "true", "ldouble < 222.223"); // double
- checkExpr(boolType, "false", "ldouble < 111.111"); // double
- checkExpr(boolType, "true", "llong < 123456790"); // long
- checkExpr(boolType, "false", "llong < 100000000"); // long
- // &&
- checkExpr(boolType, "true", "lint && 1024"); // int
- checkExpr(boolType, "false", "lint && 0"); // int
- checkExpr(boolType, "true", "lchar && 97"); // char
- checkExpr(boolType, "true", "lfloat && 55.55"); // float
- checkExpr(boolType, "false", "0 && lfloat"); // float
- checkExpr(boolType, "true", "ldouble && 222.222"); // double
- checkExpr(boolType, "true", "llong && 123456789"); // long
- // ||
- checkExpr(boolType, "true", "lint || 1024"); // int
- checkExpr(boolType, "true", "lchar || 97"); // char
- checkExpr(boolType, "true", "lfloat || 55.55"); // float
- checkExpr(boolType, "true", "ldouble || 222.222"); // double
- checkExpr(boolType, "true", "llong || 123456789"); // long
-
- // arithmetic operations
-
- // &
- checkExpr(intType, "0", "lint & 0"); // int
- checkExpr(intType, "0", "lchar & 0"); // char
- checkExpr(floatType, "0.0", "lfloat & 0.0F"); // float
- checkExpr(doubleType, "0.0", "ldouble & 0.0"); // double
- checkExpr(longType, "0", "llong & 0"); // long
- // |
- checkExpr(intType, "1024", "lint | 0"); // int
- checkExpr(intType, "97", "lchar | 0"); // char
- checkExpr(floatType, "0.0", "lfloat | 0.0F"); // float
- checkExpr(doubleType, "0.0", "ldouble | 0.0"); // double
- checkExpr(longType, "123456789", "llong | 0"); // long
- // ^
- checkExpr(intType, "1024", "lint ^ 0"); // int
- checkExpr(intType, "97", "lchar ^ 0"); // char
- checkExpr(floatType, "0.0", "lfloat ^ 0.0F"); // float
- checkExpr(doubleType, "0.0", "ldouble ^ 0.0"); // double
- checkExpr(longType, "123456789", "llong ^ 0"); // long
- // +
- checkExpr(intType, "1025", "lint + 1"); // int
- checkExpr(intType, "98", "lchar + 1"); // char
- checkExpr(floatType, "56.55", "lfloat + 1.0F"); // float
- checkExpr(doubleType, "223.222", "ldouble + 1.0"); // double
- checkExpr(longType, "123456790", "llong + 1"); // long
- // -
- checkExpr(intType, "1023", "lint - 1"); // int
- checkExpr(intType, "96", "lchar - 1"); // char
- checkExpr(floatType, "54.55", "lfloat - 1.0F"); // float
- checkExpr(doubleType, "221.222", "ldouble - 1.0"); // double
- checkExpr(longType, "123456788", "llong - 1"); // long
- // *
- checkExpr(intType, "2048", "lint * 2"); // int
- checkExpr(intType, "1048576", "lint * lint"); // int // was a BUG -- treated as <type>* <var>
- checkExpr(intType, "194", "lchar * 2"); // char
- checkExpr(floatType, "111.1", "lfloat * 2.0F"); // float
- checkExpr(doubleType, "444.444", "ldouble * 2.0"); // double
- checkExpr(longType, "246913578", "llong * 2"); // long
- // /
- checkExpr(intType, "512", "lint / 2"); // int
- checkExpr(intType, "48", "lchar / 2"); // char
- checkExpr(floatType, "27.775", "lfloat / 2.0F"); // float
- checkExpr(doubleType, "111.111", "ldouble / 2.0"); // double
- checkExpr(longType, "61728394", "llong / 2"); // long
- // %
- checkExpr(intType, "0", "lint % 2"); // int
- checkExpr(intType, "1", "lchar % 2"); // char
- String val = getExpressionValue("lfloat % 55.0");
- Assert.assertTrue(val, "0.55".equals(val.substring(0, 4)) || "0.54".equals(val.substring(0, 4))); // float (and imprecise)
- val = getExpressionValue("ldouble % 222.0");
- Assert.assertTrue(val, "0.222".equals(val.substring(0, 5))); // double (and imprecise)
- checkExpr(longType, "1", "llong % 2"); // long
- // <<
- checkExpr(intType, "2048", "lint << 1"); // int
- checkExpr(intType, "194", "lchar << 1"); // char
- checkExpr(floatType, "0.0", "lfloat << 1.0F"); // float
- checkExpr(doubleType, "0.0", "ldouble << 1.0"); // double
- checkExpr(longType, "246913578", "llong << 1"); // long
- // >>
- checkExpr(intType, "512", "lint >> 1"); // int
- checkExpr(intType, "48", "lchar >> 1"); // char
- checkExpr(floatType, "0.0", "lfloat >> 1.0F"); // float
- checkExpr(doubleType, "0.0", "ldouble >> 1.0"); // double
- checkExpr(longType, "61728394", "llong >> 1"); // long
-
- // unary operations
-
- // +
- checkExpr(intType, "1024", "+lint"); // int
- checkExpr(intType, "97", "+lchar"); // char (promoted to int)
- checkExpr(floatType, "55.55", "+lfloat"); // float
- checkExpr(doubleType, "222.222", "+ldouble"); // double
- checkExpr(longType, "123456789", "+llong"); // long
- // -
- checkExpr(intType, "-1024", "-lint"); // int
- checkExpr(intType, "-97", "-lchar"); // char (promoted to int)
- checkExpr(floatType, "-55.55", "-lfloat"); // float
- checkExpr(doubleType, "-222.222", "-ldouble"); // double
- checkExpr(longType, "-123456789", "-llong"); // long
- // !
- checkExpr(boolType, "false", "!lint"); // int
- checkExpr(boolType, "false", "!lchar"); // char
- checkExpr(boolType, "false", "!lfloat"); // float
- checkExpr(boolType, "false", "!ldouble"); // double
- checkExpr(boolType, "false", "!llong"); // long
- // ~
- checkExpr(intType, "-1025", "~lint"); // int
- checkExpr(intType, "-98", "~lchar"); // char
- checkExpr(floatType, "0.0", "~lfloat"); // float
- checkExpr(doubleType, "0.0", "~ldouble"); // double
- checkExpr(longType, "-123456790", "~llong"); // long
- // TODO: *
- // TODO: &
- }
-
- @Override
- public String getAlbumName() {
- return "ExpressionsBasic.dsa";
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.GetValue;
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.OperandValue;
+import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
+import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests of expression evaluation using basic types.
+ * <p>
+ * Note: if you want to determine the "real type" for an expression, it is convenient to
+ * use a C++ compiler. Make a program like this:
+ *
+ * <pre>
+ typeof(...your expression...) foo;
+ </pre>
+
+ Build with your favorite compiler and debug info, disassemble to see what type the
+ compiler picked.
+ */
+public class ExpressionsBasicTypes extends BaseExpressionTest {
+
+ private class TestType implements IBasicType {
+ public String getName() { return null; }
+ public IScope getScope() { return null; }
+ public int getByteSize() { return 0; }
+ public java.util.Map<Object, Object> getProperties() { return null; }
+ public IType getType() { return null; }
+ public void setType(IType type) { }
+ public void dispose() { }
+ public int getBaseType() { return 0; }
+ public boolean isSigned() { return false; }
+ public boolean isUnsigned() { return false; }
+ public boolean isShort() { return false; }
+ public boolean isLong() { return false; }
+ public boolean isLongLong() { return false; }
+ public boolean isComplex() { return false; }
+ }
+
+ boolean formatterSetting;
+
+ @Before
+ public void turnOnFormatter() {
+ formatterSetting = FormatExtensionManager.instance().isEnabled();
+ FormatExtensionManager.instance().setEnabled(true);
+ }
+ @After
+ public void restoreFormatter() {
+ FormatExtensionManager.instance().setEnabled(formatterSetting);
+ }
+
+
+ @Test
+ public void testExpressionsWithoutVariables() throws Exception {
+
+ // expressions without operators
+ // No booleans, which need logical operators (e.g. ==, !=, etc.)
+
+ checkExpr(charType, "98 ('b')", "'b'"); // char
+ checkExpr(wcharType, "0x3039 (L'\u3039')", "L'\\u3039'"); // wchar_t
+ checkExpr(intType, "15", "15"); // int
+ checkExpr(longType, "15", "15L"); // long
+ checkExpr(floatType, "1.5678", "1.5678F"); // float
+ checkExpr(doubleType, "234.567", "234.567"); // double
+ checkExpr(longDoubleType, "234.567", "234.567L"); // double
+ //checkExpr(doubleType, "234.567", "234.567"); // double
+
+ // check types of decimal, hex and octal constants
+ checkExpr(intType, "1", "1"); // int
+ checkExpr(intType, "2147483647", "2147483647"); // int
+ checkExpr(intType, "-2147483647", "-2147483647"); // int
+ checkExpr(longLongType, "2147483648", "2147483648"); // long long
+ checkExpr(longLongType, "4294967295", "4294967295"); // long long
+ checkExpr(longLongType, "-4294967296", "-4294967296"); // long long
+ checkExpr(longLongType, "4294967295", "4294967295"); // long long
+ checkExpr(longLongType, "4294967296", "4294967296"); // long long
+ checkExpr(unsignedIntType, "2147483647", "2147483647u"); // unsigned int
+ checkExpr(unsignedIntType, "4294967295", "4294967295u"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296u"); // unsigned long long
+ checkExpr(unsignedIntType, "4294967295", "4294967295U"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296U"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "4294967295ul"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "4294967295Ul"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296Ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "4294967295uL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296uL"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "4294967295UL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "4294967296UL"); // unsigned long long
+ checkExpr(longLongType, "4294967296", "4294967296ll"); // long long
+ checkExpr(longLongType, "4294967295", "4294967295LL"); // long long
+ checkExpr(longLongType, "9223372036854775807", "9223372036854775807"); // long long
+ checkExpr(longLongType, "9223372036854775808", "9223372036854775808"); // unsigned long long
+ checkExpr(longLongType, "18446744073709551615", "18446744073709551615"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "9223372036854775807ll"); // long long
+ checkExpr(longLongType, "9223372036854775808", "9223372036854775808ll"); // unsigned long long
+ checkExpr(longLongType, "18446744073709551615", "18446744073709551615ll"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "9223372036854775807LL"); // long long
+ checkExpr(longLongType, "9223372036854775808", "9223372036854775808LL"); // unsigned long long
+ checkExpr(longLongType, "18446744073709551615", "18446744073709551615LL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "9223372036854775807ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "9223372036854775808Ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "18446744073709551615ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "9223372036854775807uLL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "9223372036854775808ULL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "18446744073709551615uLL"); // unsigned long long
+
+ checkExpr(intType, "2147483647", "0x7fffffff"); // int
+ checkExpr(unsignedIntType, "2147483648", "0x80000000"); // unsigned int
+ checkExpr(unsignedIntType, "4294967295", "0xffffffff"); // unsigned int
+ checkExpr(longLongType, "4294967296", "0x100000000"); // long long
+ checkExpr(unsignedIntType, "4294967295", "0xffffffffu"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000u"); // unsigned long long
+ checkExpr(unsignedIntType, "4294967295", "0xffffffffU"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000U"); // unsigned long long
+ checkExpr(longType, "2147483647", "0x7fffffffl"); // long
+ checkExpr(unsignedLongType, "2147483648", "0x80000000l"); // unsigned long
+ checkExpr(unsignedLongType, "4294967295", "0xffffffffl"); // unsigned long
+ checkExpr(longLongType, "4294967296", "0x100000000l"); // long long
+ checkExpr(longType, "2147483647", "0x7fffffffL"); // long
+ checkExpr(unsignedLongType, "2147483648", "0x80000000L"); // unsigned long
+ checkExpr(unsignedLongType, "4294967295", "0xffffffffL"); // unsigned long
+ checkExpr(longLongType, "4294967296", "0x100000000L"); // long long
+ checkExpr(unsignedLongType, "4294967295", "0xfffffffful"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "0xffffffffUl"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000Ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "0xffffffffuL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000uL"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "0xffffffffUL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "0x100000000UL"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "0x7fffffffffffffffll"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ll"); // long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffll"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "0x7fffffffffffffffLL"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000LL"); // long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffLL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "0x7fffffffffffffffUll"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ull"); // long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffUll"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "0x7fffffffffffffffuLL"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "0x8000000000000000ULL"); // long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "0xffffffffffffffffuLL"); // unsigned long long
+
+ checkExpr(intType, "2147483647", "017777777777"); // int
+ checkExpr(unsignedIntType, "2147483648", "020000000000"); // unsigned int
+ checkExpr(unsignedIntType, "4294967295", "037777777777"); // unsigned int
+ checkExpr(longLongType, "4294967296", "040000000000"); // long long
+ checkExpr(unsignedIntType, "4294967295", "037777777777u"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000u"); // unsigned long long
+ checkExpr(unsignedIntType, "4294967295", "037777777777U"); // unsigned int
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000U"); // unsigned long long
+ checkExpr(longType, "2147483647", "017777777777l"); // long
+ checkExpr(unsignedLongType, "2147483648", "020000000000l"); // unsigned long
+ checkExpr(unsignedLongType, "4294967295", "037777777777l"); // unsigned long
+ checkExpr(longLongType, "4294967296", "040000000000l"); // long long
+ checkExpr(longType, "2147483647", "017777777777L"); // long
+ checkExpr(unsignedLongType, "2147483648", "020000000000L"); // unsigned long
+ checkExpr(unsignedLongType, "4294967295", "037777777777L"); // unsigned long
+ checkExpr(longLongType, "4294967296", "040000000000L"); // long long
+ checkExpr(unsignedLongType, "4294967295", "037777777777ul"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "037777777777Ul"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000Ul"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "037777777777uL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000uL"); // unsigned long long
+ checkExpr(unsignedLongType, "4294967295", "037777777777UL"); // unsigned long
+ checkExpr(unsignedLongLongType, "4294967296", "040000000000UL"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "0777777777777777777777ll"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000ll"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ll"); // unsigned long long
+ checkExpr(longLongType, "9223372036854775807", "0777777777777777777777LL"); // long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000LL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777LL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "0777777777777777777777Ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000Ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ull"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775807", "0777777777777777777777uLL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "9223372036854775808", "01000000000000000000000uLL"); // unsigned long long
+ checkExpr(unsignedLongLongType, "18446744073709551615", "01777777777777777777777ULL"); // unsigned long long
+
+ // logical operations
+
+ // ==
+ checkExpr(boolType, "true", "'b' == 'b'"); // char
+ checkExpr(boolType, "false", "'c' == 'b'"); // char
+ checkExpr(boolType, "true", "5 == 5"); // int
+ checkExpr(boolType, "false", "6 == 5"); // int
+ checkExpr(boolType, "true", "5L == 5L"); // long
+ checkExpr(boolType, "false", "6l == 5l"); // long
+ checkExpr(boolType, "false", "0x8765432100000001 == 1"); // unsigned long long
+ checkExpr(boolType, "true", "0x8765432100000001 == 9756277976781029377"); // unsigned long long
+ checkExpr(boolType, "true", "5.5F == 5.5F"); // float
+ checkExpr(boolType, "false", "6.5F == 5.5F"); // float
+ checkExpr(boolType, "true", "5.5 == 5.5"); // double
+ checkExpr(boolType, "false", "6.5 == 5.5"); // double
+ checkExpr(boolType, "true", "(5 == 5) == (6 == 6)");// boolean
+ checkExpr(boolType, "false", "(5 == 5) == (6 == 5)");// boolean
+ // !=
+ checkExpr(boolType, "false", "'b' != 'b'"); // char
+ checkExpr(boolType, "true", "'c' != 'b'"); // char
+ checkExpr(boolType, "false", "5 != 5"); // int
+ checkExpr(boolType, "true", "6 != 5"); // int
+ checkExpr(boolType, "false", "5l != 5l"); // long
+ checkExpr(boolType, "true", "6L != 5L"); // long
+ checkExpr(boolType, "true", "0x8765432100000001 != 1"); // unsigned long long
+ checkExpr(boolType, "false", "5.5F != 5.5F"); // float
+ checkExpr(boolType, "true", "6.5F != 5.5F"); // float
+ checkExpr(boolType, "false", "5.5 != 5.5"); // double
+ checkExpr(boolType, "true", "6.5 != 5.5"); // double
+ checkExpr(boolType, "false", "(5 == 5) != (6 == 6)");// boolean
+ checkExpr(boolType, "true", "(5 == 5) != (6 == 5)");// boolean
+ // >=
+ checkExpr(boolType, "true", "'c' >= 'b'"); // char
+ checkExpr(boolType, "false", "'b' >= 'c'"); // char
+ checkExpr(boolType, "true", "6 >= 5"); // int
+ checkExpr(boolType, "false", "5 >= 6"); // int
+ checkExpr(boolType, "true", "6L >= 5L"); // long
+ checkExpr(boolType, "false", "5L >= 6L"); // long
+ checkExpr(boolType, "true", "0x8765432100000001 >= 1"); // unsigned long long
+ checkExpr(boolType, "false", "0x8765432100000001 >= 9756277976781029380"); // unsigned long long
+ checkExpr(boolType, "true", "6.5F >= 5.5F"); // float
+ checkExpr(boolType, "false", "5.5F >= 6.5F"); // float
+ checkExpr(boolType, "true", "6.5 >= 5.5"); // double
+ checkExpr(boolType, "false", "5.5 >= 6.5"); // double
+ checkExpr(boolType, "true", "(5 == 5) >= (6 == 5)");// boolean
+ checkExpr(boolType, "true", "(5 == 5) >= (6 == 6)");// boolean
+ // >
+ checkExpr(boolType, "true", "'c' > 'b'"); // char
+ checkExpr(boolType, "false", "'b' > 'c'"); // char
+ checkExpr(boolType, "true", "6 > 5"); // int
+ checkExpr(boolType, "false", "5 > 6"); // int
+ checkExpr(boolType, "true", "6L > 5L"); // long
+ checkExpr(boolType, "false", "5L > 6L"); // long
+ checkExpr(boolType, "false", "1 > 0x8765432100000001"); // unsigned long long
+ checkExpr(boolType, "true", "0x8765432100000001 >= 9756277976781029377"); // unsigned long long
+ checkExpr(boolType, "true", "6.5F > 5.5F"); // float
+ checkExpr(boolType, "false", "5.5F > 6.5F"); // float
+ checkExpr(boolType, "true", "6.5 > 5.5"); // double
+ checkExpr(boolType, "false", "5.5 > 6.5"); // double
+ checkExpr(boolType, "true", "(5 == 5) > (6 == 5)"); // boolean
+ checkExpr(boolType, "false", "(5 == 5) > (6 == 6)"); // boolean
+ // <=
+ checkExpr(boolType, "false", "'c' <= 'b'"); // char
+ checkExpr(boolType, "true", "'b' <= 'c'"); // char
+ checkExpr(boolType, "false", "6 <= 5"); // int
+ checkExpr(boolType, "true", "5 <= 6"); // int
+ checkExpr(boolType, "false", "6L <= 5L"); // long
+ checkExpr(boolType, "true", "5L <= 6L"); // long
+ checkExpr(boolType, "true", "1 <= 0x8765432100000001"); // unsigned long long
+ checkExpr(boolType, "false", "0x8765432100000001 <= 9756277976781029376"); // unsigned long long
+ checkExpr(boolType, "false", "6.5F <= 5.5F"); // float
+ checkExpr(boolType, "true", "5.5F <= 6.5F"); // float
+ checkExpr(boolType, "false", "6.5 <= 5.5"); // double
+ checkExpr(boolType, "true", "5.5 <= 6.5"); // double
+ checkExpr(boolType, "false", "(5 == 5) <= (6 == 5)");// boolean
+ checkExpr(boolType, "true", "(5 == 5) <= (6 == 6)");// boolean
+ // <
+ checkExpr(boolType, "false", "'c' < 'b'"); // char
+ checkExpr(boolType, "true", "'b' < 'c'"); // char
+ checkExpr(boolType, "false", "6 < 5"); // int
+ checkExpr(boolType, "true", "5 < 6"); // int
+ checkExpr(boolType, "false", "6L < 5L"); // long
+ checkExpr(boolType, "true", "5L < 6L"); // long
+ checkExpr(boolType, "true", "1 < 0x8765432100000001"); // unsigned long long
+ checkExpr(boolType, "false", "0x8765432100000001 < 9756277976781029377"); // unsigned long long
+ checkExpr(boolType, "false", "6.5F < 5.5F"); // float
+ checkExpr(boolType, "true", "5.5F < 6.5F"); // float
+ checkExpr(boolType, "false", "6.5 < 5.5"); // double
+ checkExpr(boolType, "true", "5.5 < 6.5"); // double
+ checkExpr(boolType, "false", "(5 == 5) < (6 == 5)"); // boolean
+ checkExpr(boolType, "false", "(5 == 5) < (6 == 6)"); // boolean
+ // &&
+ checkExpr(boolType, "true", "'c' && 'b'"); // char
+ checkExpr(boolType, "true", "6 && 5"); // int
+ checkExpr(boolType, "false", "6 && 0"); // int
+ checkExpr(boolType, "false", "0 && 6"); // int
+ checkExpr(boolType, "true", "6L && 5L"); // long
+ checkExpr(boolType, "true", "0x8765432100000001 && 1"); // unsigned long long
+ checkExpr(boolType, "false", "0x8765432100000001 && 0"); // unsigned long long
+ checkExpr(boolType, "true", "6.5F && 5.5F"); // float
+ checkExpr(boolType, "false", "6.5F && 0"); // float
+ checkExpr(boolType, "true", "6.5 && 5.5"); // double
+ checkExpr(boolType, "false", "'\\0' && 5.5");
+ checkExpr(boolType, "false", "(5 == 5) && (6 == 5)");// boolean
+ checkExpr(boolType, "true", "(5 == 5) && (6 == 6)");// boolean
+ // ||
+ checkExpr(boolType, "true", "'c' || 'b'"); // char
+ checkExpr(boolType, "true", "6 || 5"); // int
+ checkExpr(boolType, "true", "6L || 5L"); // long
+ checkExpr(boolType, "true", "0x8765432100000001 || 1"); // unsigned long long
+ checkExpr(boolType, "true", "6.5F || 5.5F"); // float
+ checkExpr(boolType, "true", "6.5 || 5.5"); // double
+ checkExpr(boolType, "false", "0 || 0L");
+ checkExpr(boolType, "true", "(5 == 5) || (6 == 5)");// boolean
+ checkExpr(boolType, "true", "(5 == 5) || (6 == 6)");// boolean
+ checkExpr(boolType, "true", "(5 == 6) || (6 == 6)");// boolean
+
+ // arithmetic operations
+
+ // &
+ checkExpr(intType, "98", "'c'&'b'"); // char
+ checkExpr(intType, "4", "6&5"); // int
+ checkExpr(longType, "4", "6L&5L"); // long
+ checkExpr(unsignedLongLongType, "1", " 0x8765432100000001 & 1 "); // unsigned long long
+ checkExpr(floatType, "0.0", "6.5F&5.5F"); // float
+ checkExpr(doubleType, "0.0", "6.5&5.5"); // double
+ checkExpr(intType, "0", "(5 == 5)&(6 == 5)"); // boolean
+ // |
+ checkExpr(intType, "99", "'c' |'b'"); // char
+ checkExpr(intType, "7", "6 |5"); // int
+ checkExpr(longType, "7", "6L |5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029379", " 0x8765432100000001 | 3 "); // unsigned long long
+ checkExpr(floatType, "0.0", "6.5F |5.5F"); // float
+ checkExpr(doubleType, "0.0", "6.5 |5.5"); // double
+ checkExpr(intType, "1", "(5 == 5) |(6 == 5)"); // boolean
+ // ^
+ checkExpr(intType, "1", "'c'^ 'b'"); // char
+ checkExpr(intType, "3", "6^ 5"); // int
+ checkExpr(longType, "3", "6L^ 5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029382", " 0x8765432100000001 ^ 7 "); // unsigned long long
+ checkExpr(floatType, "0.0", "6.5F^ 5.5F"); // float
+ checkExpr(doubleType, "0.0", "6.5^ 5.5"); // double
+ checkExpr(intType, "1", "(5 == 5)| (6 == 5)"); // boolean
+ // +
+ checkExpr(intType, "197", "'c' + 'b'"); // char
+ checkExpr(intType, "1", "'c' + -'b'"); // char
+ checkExpr(intType, "11", "6 + 5"); // int
+ checkExpr(intType, "11", "6- -5"); // int
+ checkExpr(longType, "11", "6L + 5L"); // long
+ checkExpr(longType, "11", "6L- -5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029378", "0x8765432100000001 + 1"); // unsigned long long
+ checkExpr(floatType, "12.0", "6.5F + 5.5F"); // float
+ checkExpr(floatType, "12.0", "6.5F- -5.5F"); // float
+ checkExpr(doubleType, "12.0", "6.5 + 5.5"); // double
+ checkExpr(doubleType, "12.0", "6.5- -5.5"); // double
+ checkExpr(intType, "1", "(5 == 5) + (6 == 5)"); // boolean
+ // -
+ checkExpr(intType, "1", "'c'-'b'"); // char
+ checkExpr(intType, "1", " 6-5"); // int
+ checkExpr(longType, "1", "6L-5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029376", " 0x8765432100000001 - 1"); // unsigned long long
+ checkExpr(floatType, "1.0", "6.5F-5.5F"); // float
+ checkExpr(doubleType, "1.0", "6.5-5.5"); // double
+ checkExpr(intType, "1", "(5 == 5) - (6 == 5)"); // boolean
+ // *
+ checkExpr(intType, "9702", "'c'*'b'"); // char
+ checkExpr(intType, "30", "6*5"); // int
+ checkExpr(longType, "30", "6L*5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029377", "0x8765432100000001 * 1"); // unsigned long long
+ checkExpr(floatType, "35.75", "6.5F*5.5F"); // float
+ checkExpr(doubleType, "35.75", "6.5*5.5"); // double
+ checkExpr(intType, "0", "(5 == 5) * (6 == 5)"); // boolean
+ // /
+ checkExpr(intType, "1", "'c' / 'b'"); // char
+ checkExpr(intType, "1", "6 / 5"); // int
+ checkExprError(ASTEvalMessages.DivideByZero, "6 / 0"); // int
+ checkExpr(longType, "1", "6L / 5L"); // long
+ checkExprError(ASTEvalMessages.DivideByZero, "6L / 0L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029377", "0x8765432100000001 / 1"); // unsigned long long
+ checkExpr(floatType, "1.1818181", "6.5F / 5.5F"); // float
+ checkExpr(doubleType, "1.1818181818181819", "6.5 / 5.5"); // double
+ checkExprError(ASTEvalMessages.DivideByZero, "(5 == 5) / (6 == 5)"); // boolean
+ checkExpr(intType, "0", "(6 == 5) / (6 == 6)"); // boolean
+ checkExpr(intType, "1", "(5 == 5) / (6 == 6)"); // boolean
+ // %
+ checkExpr(intType, "1", "'c' % 'b'"); // char
+ checkExpr(intType, "1", "6 % 5"); // int
+ checkExprError(ASTEvalMessages.DivideByZero, "6 % 0"); // int
+ checkExpr(longType, "1", "6L % 5L"); // long
+ checkExprError(ASTEvalMessages.DivideByZero, "6L % 0L"); // long
+ checkExpr(unsignedLongLongType, "1", "0x8765432100000001 % 3"); // unsigned long long
+ checkExpr(floatType, "1.0", "6.5F % 5.5F"); // float
+ checkExpr(doubleType, "1.0", "6.5 % 5.5"); // double
+ checkExprError(ASTEvalMessages.DivideByZero, "(5 == 5) % (6 == 5)"); // boolean
+ // <<
+ checkExpr(intType, "396", "'c' << 2"); // char
+ checkExpr(intType, "192", "6 << 5"); // int
+ checkExpr(longType, "192", "6L << 5L"); // long
+ checkExpr(unsignedLongLongType, "9756277976781029376", "0x8765432100000000 << 0"); // unsigned long long
+ checkExpr(floatType, "0.0", "6.5F << 5.5F"); // float
+ checkExpr(doubleType, "0.0", "6.5 << 5.5"); // double
+ checkExpr(intType, "1", "(5 == 5) << (6 == 5)"); // boolean
+ // >>
+ checkExpr(intType, "12", "'c' >> 3"); // char
+ checkExpr(intType, "1", "6 >> 2"); // int
+ checkExpr(longType, "1", "6L >> 2L"); // long
+ checkExpr(unsignedLongLongType, "4878138988390514688", " 0x8765432100000001 >> 1"); // unsigned long long
+ checkExpr(floatType, "0.0", "6.5F >> 5.5F"); // float
+ checkExpr(doubleType, "0.0", "6.5 >> 5.5"); // double
+ checkExpr(intType, "1", "(5 == 5) >> (6 == 5)"); // boolean
+ // TODO: ->
+ // TODO: .
+
+ // unary operations
+
+ // +
+ checkExpr(intType, "99", "+'c'"); // char
+ checkExpr(intType, "6", "+6"); // int
+ checkExpr(longType, "6", "+6L"); // long
+ checkExpr(longLongType, "6", "+6LL"); // long long
+ checkExpr(unsignedLongLongType, "9756277976781029376", "+0x8765432100000000"); // unsigned long long
+ checkExpr(floatType, "6.5", "+6.5F"); // float
+ checkExpr(doubleType, "6.5", "+6.5"); // double
+ checkExpr(intType, "1", "+(5 == 5)"); // boolean
+ // -
+ checkExpr(intType, "-99", "-'c'"); // char
+ checkExpr(intType, "-6", "-6"); // int
+ checkExpr(longType, "-6", "-6L"); // long
+ checkExpr(longLongType, "-6", "-6LL"); // long
+ checkExpr(unsignedLongLongType, "-9756277976781029376", "-0x8765432100000000"); // unsigned long long
+ checkExpr(floatType, "-6.5", "-6.5F"); // float
+ checkExpr(doubleType, "-6.5", "-6.5"); // double
+ checkExpr(intType, "-1", "-(5 == 5)"); // boolean
+ // !
+ checkExpr(boolType, "false", "!'c'"); // char
+ checkExpr(boolType, "false", "!6"); // int
+ checkExpr(boolType, "false", "!6L"); // long
+ checkExpr(boolType, "false", "!6LL"); // long long
+ checkExpr(boolType, "false", "!0x8765432100000001"); // unsigned long long
+ checkExpr(boolType, "false", "!6.5F"); // float
+ checkExpr(boolType, "false", "!6.5"); // double
+ checkExpr(boolType, "false", "!(5 == 5)"); // boolean
+ checkExpr(boolType, "true", "!(5 == 6)"); // boolean
+ // ~
+ checkExpr(intType, "-100", "~'c'"); // ~'c'
+ checkExpr(intType, "-7", "~6"); // int
+ checkExpr(longType, "-7", "~6L"); // long
+ checkExpr(longLongType, "-7", "~6LL"); // long long
+ checkExpr(unsignedLongLongType, "-9756277976781029378", "~0x8765432100000001"); // unsigned long long
+ checkExpr(floatType, "0.0", "~6.5F"); // float
+ checkExpr(doubleType, "0.0", "~6.5"); // double
+ checkExpr(intType, "-2", "~(5 == 5)"); // boolean
+ checkExpr(intType, "-1", "~(5 == 6)"); // boolean
+ // TODO: *
+ // TODO: &
+
+ // precedence
+ checkExpr(intType, "783", "6 + 'a' * 8 + 14 / 7 - 4 % 3"); // char
+ // &
+ // int
+ checkExpr(intType, "377", "(6 + 'a') * (8 + 14) / (7 - 4 % 3)"); // char
+ // &
+ // int
+ checkExpr(longType, "55", "6L + 6l * 8L + 14l / 7L - 4l % 3L"); // long
+ checkExpr(longType, "28", "6L + 6l * (8L + 14l) / (7L - 4l % 3L)"); // long
+ checkExpr(floatType, "55.366665", "6.5F + 6.F * 8.5F + 14.F / 7.5F - 4.F"); // float
+ checkExpr(floatType, "80.35714", "(6.5F + 6.F) * (8.5F + 14.F) / (7.5F - 4.F)"); // float
+ checkExpr(doubleType, "55.36666666666667", "6.5 + 6 * 8.5 + 14 / 7.5 - 4"); // double
+ checkExpr(doubleType, "80.35714285714286", "(6.5 + 6) * (8.5 + 14) / (7.5 - 4)"); // double
+ checkExpr(boolType, "false", "(5 == 6) && ((6 == 5) || (5 == 5))"); // boolean
+ checkExpr(boolType, "true", "((5 == 6) && (6 == 5)) || (5 == 5)"); // boolean
+
+ checkExpr(unsignedLongType, "2147483648", "0x80000000L");
+ checkExpr(unsignedLongLongType, "9756277976781029377", "0x8765432100000001");
+ checkExpr(floatType, "7.0", "7.0F");
+ checkExpr(boolType, "true", "true");
+ checkExpr(boolType, "false", "false");
+ }
+
+ /**
+ * Test strings, treated as temporary char arrays.
+ * These don't really make much sense in C/C++ but the support is there...
+ * @throws Exception
+ */
+ @Test
+ public void testStringExpressionsWithoutVariables() throws Exception {
+
+ // expressions without operators
+ // No booleans, which need logical operators (e.g. ==, !=, etc.)
+
+ checkExpr(null, "\"hi\"", "\"hi\""); // string
+
+ // logical operations
+
+ // ==
+ checkExpr(boolType, "true", "\"hi\" == \"hi\""); // string
+ checkExpr(boolType, "false", "\"hi\" == \"bye\""); // string
+ // !=
+ checkExpr(boolType, "false", "\"hi\" != \"hi\""); // string
+ checkExpr(boolType, "true", "\"hi\" != \"bye\""); // string
+ // >=
+ checkExpr(boolType, "true", "\"hi\" >= \"bye\""); // string
+ checkExpr(boolType, "false", "\"bye\" >= \"hi\""); // string
+ // >
+ checkExpr(boolType, "true", "\"hi\" > \"bye\""); // string
+ checkExpr(boolType, "false", "\"bye\" > \"hi\""); // string
+ // <=
+ checkExpr(boolType, "false", "\"hi\" <= \"bye\""); // string
+ checkExpr(boolType, "true", "\"bye\" <= \"hi\""); // string
+ // <
+ checkExpr(boolType, "false", "\"hi\" < \"bye\""); // string
+ checkExpr(boolType, "true", "\"bye\" < \"hi\""); // string
+ // &&
+ checkExpr(boolType, "true", "\"hi\" && \"bye\""); // string
+ // ||
+ checkExpr(boolType, "true", "\"hi\" || \"bye\""); // string
+
+ // arithmetic operations
+
+ // &
+ checkExprError("\"hi\"&\"bye\""); // string
+ // |
+ checkExprError("\"hi\" |\"bye\""); // string
+ // ^
+ checkExprError("\"hi\"^ \"bye\""); // string
+ // +
+ checkExpr(null, "\"hibye\"", "\"hi\" + \"bye\"");// string
+ // -
+ checkExprError(" \"hi\"-\"bye\""); // string
+ // *
+ checkExprError("\"hi\"*\"bye\""); // string
+ // /
+ checkExprError("\"hi\" / \"bye\""); // string
+ // %
+ checkExprError("\"hi\" % \"bye\""); // string
+ // <<
+ checkExprError("\"hi\" << \"bye\""); // string
+ // >>
+ checkExprError("\"hi\" >> \"bye\""); // string
+ // TODO: ->
+ // TODO: .
+ // unknown variable or enumerator
+ checkExprError("nonsense");
+
+ // unary operations
+
+ // +
+ checkExprError("+\"hi\""); // string
+ // -
+ checkExprError("-\"hi\""); // string
+ // !
+ checkExpr(boolType, "false", "!\"hi\""); // string
+ // ~
+ checkExprError("~\"hi\""); // string
+ // TODO: *
+ // TODO: &
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where the following are true:
+ * local int SizeOfInt = sizeof (int)
+ * local int lint = 1024
+ * local char lchar = 'a'(97)
+ * local float lfloat = 55.55
+ * local double ldouble = 222.222
+ * local long llong = 123456789
+ * local char larray[8] = "testing" (address = 0x22ff00)
+ */
+ @Test
+ public void testExpressionsWithVariables() throws Exception {
+
+ // Expressions with variables, but without operators.
+ // Types should be the original types of the variables.
+
+ checkExpr("volatile int", "4", "SizeOfInt");
+ checkExpr("volatile int", "1024", "lint");
+ checkExpr("volatile char", "97 ('a')", "lchar");
+ checkExpr("volatile float", "55.55", "lfloat");
+ checkExpr("volatile double", "222.222", "ldouble");
+ checkExpr("volatile long", "123456789", "llong");
+ // custom formatting of character arrays is on by default and as a string now
+// checkExpr(intType, "0x22ff00", "larray");
+ checkExpr("char[8]", "\"testing\"", "larray");
+
+ // logical operations
+
+ // ==
+ checkExpr(boolType, "true", "lint == 1024"); // int
+ checkExpr(boolType, "false", "lint == 2058"); // int
+ checkExpr(boolType, "true", "lchar == 97"); // char
+ checkExpr(boolType, "false", "lchar == 88"); // char
+ checkExpr(boolType, "true", "lfloat == lfloat"); // float
+ checkExpr(boolType, "true", "lfloat == lfloat"); // float (adjust for imprecision)
+ checkExpr(boolType, "false", "lfloat == 66.66"); // float
+ checkExpr(boolType, "true", "ldouble == ldouble"); // double (adjust for imprecision)
+ checkExpr(boolType, "false", "ldouble == 111.111"); // double
+ checkExpr(boolType, "true", "llong == 123456789"); // long
+ checkExpr(boolType, "false", "llong == 987654321"); // long
+ // !=
+ checkExpr(boolType, "true", "lint != 2058"); // int
+ checkExpr(boolType, "false", "lint != 1024"); // int
+ checkExpr(boolType, "true", "lchar != 88"); // char
+ checkExpr(boolType, "false", "lchar != 97"); // char
+ checkExpr(boolType, "true", "lfloat != 66.66"); // float
+ checkExpr(boolType, "false", "lfloat != lfloat"); // float (adjust for imprecision)
+ checkExpr(boolType, "true", "ldouble != 111.111"); // double
+ checkExpr(boolType, "false", "ldouble != ldouble"); // double(adjust for imprecision)
+ checkExpr(boolType, "true", "llong != 987654321"); // long
+ checkExpr(boolType, "false", "llong != 123456789"); // long
+ // >=
+ checkExpr(boolType, "true", "lint >= 1024"); // int
+ checkExpr(boolType, "false", "lint >= 2058"); // int
+ checkExpr(boolType, "true", "lchar >= 97"); // char
+ checkExpr(boolType, "false", "lchar >= 99"); // char
+ checkExpr(boolType, "true", "lfloat >= 55.54"); // float (adjust for imprecision)
+ checkExpr(boolType, "false", "lfloat >= 66.66"); // float
+ checkExpr(boolType, "true", "ldouble >= 222.221"); // double (adjust for imprecision)
+ checkExpr(boolType, "false", "ldouble >= 333.333"); // double
+ checkExpr(boolType, "true", "llong >= 123456789"); // long
+ checkExpr(boolType, "false", "llong >= 987654321"); // long
+ // >
+ checkExpr(boolType, "true", "lint > 1023"); // int
+ checkExpr(boolType, "false", "lint > 2058"); // int
+ checkExpr(boolType, "true", "lchar > 96"); // char
+ checkExpr(boolType, "false", "lchar > 99"); // char
+ checkExpr(boolType, "true", "lfloat > 55.54"); // float
+ checkExpr(boolType, "false", "lfloat > 66.66"); // float
+ checkExpr(boolType, "true", "ldouble > 222.221"); // double
+ checkExpr(boolType, "false", "ldouble > 333.333"); // double
+ checkExpr(boolType, "true", "llong > 123456788"); // long
+ checkExpr(boolType, "false", "llong > 987654321"); // long
+ // <=
+ checkExpr(boolType, "true", "lint <= 1024"); // int
+ checkExpr(boolType, "false", "lint <= 999"); // int
+ checkExpr(boolType, "true", "lchar <= 97"); // char
+ checkExpr(boolType, "false", "lchar <= 88"); // char
+ checkExpr(boolType, "true", "lfloat <= 55.55"); // float
+ checkExpr(boolType, "false", "lfloat <= 44.44"); // float
+ checkExpr(boolType, "true", "ldouble <= 222.222"); // double
+ checkExpr(boolType, "false", "ldouble <= 111.111"); // double
+ checkExpr(boolType, "true", "llong <= 123456789"); // long
+ checkExpr(boolType, "false", "llong <= 100000000"); // long
+ // <
+ checkExpr(boolType, "true", "lint < 1025"); // int
+ checkExpr(boolType, "false", "lint < 999"); // int
+ checkExpr(boolType, "true", "lchar < 98"); // char
+ checkExpr(boolType, "false", "lchar < 88"); // char
+ checkExpr(boolType, "true", "lfloat < 55.56"); // float
+ checkExpr(boolType, "false", "lfloat < 44.44"); // float
+ checkExpr(boolType, "true", "ldouble < 222.223"); // double
+ checkExpr(boolType, "false", "ldouble < 111.111"); // double
+ checkExpr(boolType, "true", "llong < 123456790"); // long
+ checkExpr(boolType, "false", "llong < 100000000"); // long
+ // &&
+ checkExpr(boolType, "true", "lint && 1024"); // int
+ checkExpr(boolType, "false", "lint && 0"); // int
+ checkExpr(boolType, "true", "lchar && 97"); // char
+ checkExpr(boolType, "true", "lfloat && 55.55"); // float
+ checkExpr(boolType, "false", "0 && lfloat"); // float
+ checkExpr(boolType, "true", "ldouble && 222.222"); // double
+ checkExpr(boolType, "true", "llong && 123456789"); // long
+ // ||
+ checkExpr(boolType, "true", "lint || 1024"); // int
+ checkExpr(boolType, "true", "lchar || 97"); // char
+ checkExpr(boolType, "true", "lfloat || 55.55"); // float
+ checkExpr(boolType, "true", "ldouble || 222.222"); // double
+ checkExpr(boolType, "true", "llong || 123456789"); // long
+
+ // arithmetic operations
+
+ // &
+ checkExpr(intType, "0", "lint & 0"); // int
+ checkExpr(intType, "0", "lchar & 0"); // char
+ checkExpr(floatType, "0.0", "lfloat & 0.0F"); // float
+ checkExpr(doubleType, "0.0", "ldouble & 0.0"); // double
+ checkExpr(longType, "0", "llong & 0"); // long
+ // |
+ checkExpr(intType, "1024", "lint | 0"); // int
+ checkExpr(intType, "97", "lchar | 0"); // char
+ checkExpr(floatType, "0.0", "lfloat | 0.0F"); // float
+ checkExpr(doubleType, "0.0", "ldouble | 0.0"); // double
+ checkExpr(longType, "123456789", "llong | 0"); // long
+ // ^
+ checkExpr(intType, "1024", "lint ^ 0"); // int
+ checkExpr(intType, "97", "lchar ^ 0"); // char
+ checkExpr(floatType, "0.0", "lfloat ^ 0.0F"); // float
+ checkExpr(doubleType, "0.0", "ldouble ^ 0.0"); // double
+ checkExpr(longType, "123456789", "llong ^ 0"); // long
+ // +
+ checkExpr(intType, "1025", "lint + 1"); // int
+ checkExpr(intType, "98", "lchar + 1"); // char
+ checkExpr(floatType, "56.55", "lfloat + 1.0F"); // float
+ checkExpr(doubleType, "223.222", "ldouble + 1.0"); // double
+ checkExpr(longType, "123456790", "llong + 1"); // long
+ // -
+ checkExpr(intType, "1023", "lint - 1"); // int
+ checkExpr(intType, "96", "lchar - 1"); // char
+ checkExpr(floatType, "54.55", "lfloat - 1.0F"); // float
+ checkExpr(doubleType, "221.222", "ldouble - 1.0"); // double
+ checkExpr(longType, "123456788", "llong - 1"); // long
+ // *
+ checkExpr(intType, "2048", "lint * 2"); // int
+ checkExpr(intType, "1048576", "lint * lint"); // int // was a BUG -- treated as <type>* <var>
+ checkExpr(intType, "194", "lchar * 2"); // char
+ checkExpr(floatType, "111.1", "lfloat * 2.0F"); // float
+ checkExpr(doubleType, "444.444", "ldouble * 2.0"); // double
+ checkExpr(longType, "246913578", "llong * 2"); // long
+ // /
+ checkExpr(intType, "512", "lint / 2"); // int
+ checkExpr(intType, "48", "lchar / 2"); // char
+ checkExpr(floatType, "27.775", "lfloat / 2.0F"); // float
+ checkExpr(doubleType, "111.111", "ldouble / 2.0"); // double
+ checkExpr(longType, "61728394", "llong / 2"); // long
+ // %
+ checkExpr(intType, "0", "lint % 2"); // int
+ checkExpr(intType, "1", "lchar % 2"); // char
+ String val = getExpressionValue("lfloat % 55.0");
+ Assert.assertTrue(val, "0.55".equals(val.substring(0, 4)) || "0.54".equals(val.substring(0, 4))); // float (and imprecise)
+ val = getExpressionValue("ldouble % 222.0");
+ Assert.assertTrue(val, "0.222".equals(val.substring(0, 5))); // double (and imprecise)
+ checkExpr(longType, "1", "llong % 2"); // long
+ // <<
+ checkExpr(intType, "2048", "lint << 1"); // int
+ checkExpr(intType, "194", "lchar << 1"); // char
+ checkExpr(floatType, "0.0", "lfloat << 1.0F"); // float
+ checkExpr(doubleType, "0.0", "ldouble << 1.0"); // double
+ checkExpr(longType, "246913578", "llong << 1"); // long
+ // >>
+ checkExpr(intType, "512", "lint >> 1"); // int
+ checkExpr(intType, "48", "lchar >> 1"); // char
+ checkExpr(floatType, "0.0", "lfloat >> 1.0F"); // float
+ checkExpr(doubleType, "0.0", "ldouble >> 1.0"); // double
+ checkExpr(longType, "61728394", "llong >> 1"); // long
+
+ // unary operations
+
+ // +
+ checkExpr(intType, "1024", "+lint"); // int
+ checkExpr(intType, "97", "+lchar"); // char (promoted to int)
+ checkExpr(floatType, "55.55", "+lfloat"); // float
+ checkExpr(doubleType, "222.222", "+ldouble"); // double
+ checkExpr(longType, "123456789", "+llong"); // long
+ // -
+ checkExpr(intType, "-1024", "-lint"); // int
+ checkExpr(intType, "-97", "-lchar"); // char (promoted to int)
+ checkExpr(floatType, "-55.55", "-lfloat"); // float
+ checkExpr(doubleType, "-222.222", "-ldouble"); // double
+ checkExpr(longType, "-123456789", "-llong"); // long
+ // !
+ checkExpr(boolType, "false", "!lint"); // int
+ checkExpr(boolType, "false", "!lchar"); // char
+ checkExpr(boolType, "false", "!lfloat"); // float
+ checkExpr(boolType, "false", "!ldouble"); // double
+ checkExpr(boolType, "false", "!llong"); // long
+ // ~
+ checkExpr(intType, "-1025", "~lint"); // int
+ checkExpr(intType, "-98", "~lchar"); // char
+ checkExpr(floatType, "0.0", "~lfloat"); // float
+ checkExpr(doubleType, "0.0", "~ldouble"); // double
+ checkExpr(longType, "-123456790", "~llong"); // long
+ // *
+// checkExpr(charType, "'t'", "*larray");
+ // TODO: &
+
+ // array index
+ checkExpr(charType, "116 ('t')", "larray[0]");
+
+ // check some internal operand methods' behavior
+ OperandValue ov;
+ assertNotNull(new GetValue());
+ ov = new OperandValue(new Long("1"), new TestType());
+ assertTrue(GetValue.getBooleanValue(ov));
+ ov = new OperandValue(new Float(1E200), new TestType());
+ boolean badInt = false;
+ try {
+ // force a core exception
+ GetValue.getIntValue(ov);
+ } catch (CoreException ce) {
+ badInt = true;
+ }
+ assertTrue(badInt);
+ }
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsBasic.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsInvalidExpressions.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsInvalidExpressions.java
index ce8b7d6..ef76253 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsInvalidExpressions.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsInvalidExpressions.java
@@ -1,195 +1,222 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.text.MessageFormat;
-
-import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCServicesMessages;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ExpressionsInvalidExpressions extends SimpleDebuggerTest {
-
- @Test
- public void testExpressionsInvalid() throws Exception {
- openSnapshotAndWaitForSuspendedContext(0);
-
- // badly formed expressions
- Assert.assertEquals(getExpressionValue("1 + 6)"), EDCServicesMessages.Expressions_SyntaxError);
- Assert.assertEquals(getExpressionValue("(1 + 7 * 9)) + 6"), EDCServicesMessages.Expressions_SyntaxError);
- Assert.assertEquals(getExpressionValue("78 +/ 87"), EDCServicesMessages.Expressions_SyntaxError);
- // invalid number formats
- Assert.assertEquals(getExpressionValue("10 + 7g6"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("0x67t9"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("6 + 10E"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("1.6E.1"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("'\\u09T'"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("'\\768'"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- Assert.assertEquals(getExpressionValue("'\\1234'"),
- ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
- // non-existent variables
- Assert.assertEquals(getExpressionValue("10 * 65 + jajaja - 12 * 76"),
- MessageFormat.format(ASTEvalMessages.EvaluateID_VariableNotFound, "jajaja"));
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- * typedef struct {
- * char achar;
- * UCHAR auchar;
- * SCHAR aschar;
- * short ashort;
- * USHORT aushort;
- * SSHORT asshort;
- * int aint;
- * UINT auint;
- * SINT asint;
- * long along;
- * ULONG aulong;
- * SLONG aslong;
- * ULONGLONG aulonglong;
- * SLONGLONG aslonglong;
- * float afloat;
- * double adouble;
- * } struct_type;
- *
- * struct_type lstruct;
- *
- * lstruct.achar = '1';
- * lstruct.auchar = 2;
- * lstruct.aschar = '3';
- * lstruct.ashort = 4;
- * lstruct.aushort = 5;
- * lstruct.asshort = 6;
- * lstruct.aint = 7;
- * lstruct.auint = 8;
- * lstruct.asint = 9;
- * lstruct.along = 10;
- * lstruct.aulong = 11;
- * lstruct.aslong = 12;
- * lstruct.aulonglong = 13;
- * lstruct.aslonglong = 14;
- * lstruct.afloat = 15.0;
- * lstruct.adouble = 16.0;
- */
- @Test
- public void testExpressionsInvalidStructs() throws Exception {
- openSnapshotAndWaitForSuspendedContext(0);
-
- // trying to use struct as composite pointer
- Assert.assertEquals(getExpressionValue("lstruct->achar"),
- ASTEvalMessages.FieldReference_InvalidPointerDeref);
- // non-existent members
- Assert.assertEquals(getExpressionValue("lstruct.bad"),
- MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * int larray[40];
- *
- * larray[0] = 40;
- * larray[1] = 39;
- * larray[2] = 38;
- * ....
- * larray[37] = 3;
- * larray[38] = 2;
- * larray[39] = 1;
- */
- @Test
- public void testExpressionsInvalidArrays() throws Exception {
- openSnapshotAndWaitForSuspendedContext(1);
-
- // trying to use array as struct/class
- Assert.assertEquals(getExpressionValue("larray.member"),
- ASTEvalMessages.FieldReference_InvalidDotDeref);
- Assert.assertEquals(getExpressionValue("larray[1].member"),
- ASTEvalMessages.FieldReference_InvalidDotDeref);
- // subscripting
- Assert.assertEquals(getExpressionValue("larray[1.0]"),
- ASTEvalMessages.ArraySubscript_SubscriptMustBeInteger);
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * typedef union {
- * volatile int x;
- * volatile long y;
- * } union_type;
- *
- * union_type lunion;
- *
- * lunion.x = 2;
- * lunion.y = 2;
- */
- @Test
- public void testExpressionsInvalidUnions() throws Exception {
- openSnapshotAndWaitForSuspendedContext(2);
-
- // non-existent members
- Assert.assertEquals(getExpressionValue("lunion.bad"),
- MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
- // subscripting
- Assert.assertEquals(getExpressionValue("(lunion.x)[6]"),
- ASTEvalMessages.ArraySubscript_MustSubscriptArray);
- // unary '*'
- Assert.assertEquals(getExpressionValue("*(lunion.x)"),
- ASTEvalMessages.OperatorIndirection_RequiresPointer);
- }
-
- /*
- * Note: This assumes you are at a breakpoint where:
- *
- * typedef struct {
- * volatile unsigned x:1;
- * volatile unsigned y:2;
- * volatile unsigned z:3;
- * volatile unsigned w:16;
- * } bitfield_type;
- *
- * bitfield_type lbitfield;
- *
- * lbitfield.x = 1;
- * lbitfield.y = 2;
- * lbitfield.z = 3;
- * lbitfield.w = 26;
- */
- @Test
- public void testExpressionsInvalidBitfields() throws Exception {
- openSnapshotAndWaitForSuspendedContext(3);
-
- // non-existent members
- Assert.assertEquals(getExpressionValue("lbitfield.bad"),
- MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
- Assert.assertEquals(getExpressionValue("lbitfield.x.bad"),
- ASTEvalMessages.FieldReference_InvalidDotDeref);
- // address of & applied to a non-variable or bit-field
- Assert.assertEquals(getExpressionValue("&0x123456"),
- ASTEvalMessages.OperatorAddrOf_RequiresVariable);
- Assert.assertEquals(getExpressionValue("&(lbitfield.x)"),
- ASTEvalMessages.OperatorAddrOf_NoBitField);
- }
-
- @Override
- public String getAlbumName() {
- return "ExpressionsAggregatesAndEnums.dsa";
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.text.MessageFormat;
+
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCServicesMessages;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ExpressionsInvalidExpressions extends SimpleDebuggerTest {
+
+ @Test
+ public void testExpressionsInvalid() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+
+ // badly formed expressions
+ Assert.assertEquals(getExpressionValue("1 + 6)"), EDCServicesMessages.Expressions_SyntaxError);
+ Assert.assertEquals(getExpressionValue("(1 + 7 * 9)) + 6"), EDCServicesMessages.Expressions_SyntaxError);
+ Assert.assertEquals(getExpressionValue("78 +/ 87"), EDCServicesMessages.Expressions_SyntaxError);
+ // invalid number formats
+ Assert.assertEquals(getExpressionValue("10 + 7g6"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("0x67t9"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("6 + 10E"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("1.6E.1"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("'\\u09T'"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("'\\768'"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ Assert.assertEquals(getExpressionValue("'\\1234'"),
+ ASTEvalMessages.ASTInstructionCompiler_InvalidNumber);
+ // non-existent variables
+ Assert.assertEquals(getExpressionValue("10 * 65 + jajaja - 12 * 76"),
+ MessageFormat.format(ASTEvalMessages.EvaluateID_VariableNotFound, "jajaja"));
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ * typedef struct {
+ * char achar;
+ * UCHAR auchar;
+ * SCHAR aschar;
+ * short ashort;
+ * USHORT aushort;
+ * SSHORT asshort;
+ * int aint;
+ * UINT auint;
+ * SINT asint;
+ * long along;
+ * ULONG aulong;
+ * SLONG aslong;
+ * ULONGLONG aulonglong;
+ * SLONGLONG aslonglong;
+ * float afloat;
+ * double adouble;
+ * } struct_type;
+ *
+ * struct_type lstruct;
+ *
+ * lstruct.achar = '1';
+ * lstruct.auchar = 2;
+ * lstruct.aschar = '3';
+ * lstruct.ashort = 4;
+ * lstruct.aushort = 5;
+ * lstruct.asshort = 6;
+ * lstruct.aint = 7;
+ * lstruct.auint = 8;
+ * lstruct.asint = 9;
+ * lstruct.along = 10;
+ * lstruct.aulong = 11;
+ * lstruct.aslong = 12;
+ * lstruct.aulonglong = 13;
+ * lstruct.aslonglong = 14;
+ * lstruct.afloat = 15.0;
+ * lstruct.adouble = 16.0;
+ */
+ @Test
+ public void testExpressionsInvalidStructs() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+
+ // trying to use struct as composite pointer
+ Assert.assertEquals(getExpressionValue("lstruct->achar"),
+ ASTEvalMessages.FieldReference_InvalidPointerDeref);
+ // non-existent members
+ Assert.assertEquals(getExpressionValue("lstruct.bad"),
+ MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * int larray[40];
+ *
+ * larray[0] = 40;
+ * larray[1] = 39;
+ * larray[2] = 38;
+ * ....
+ * larray[37] = 3;
+ * larray[38] = 2;
+ * larray[39] = 1;
+ */
+ @Test
+ public void testExpressionsInvalidArrays() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(1);
+
+ // trying to use array as struct/class
+ Assert.assertEquals(getExpressionValue("larray.member"),
+ ASTEvalMessages.FieldReference_InvalidDotDeref);
+ Assert.assertEquals(getExpressionValue("larray[1].member"),
+ ASTEvalMessages.FieldReference_InvalidDotDeref);
+ // subscripting
+ Assert.assertEquals(getExpressionValue("larray[1.0]"),
+ ASTEvalMessages.ArraySubscript_SubscriptMustBeInteger);
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * typedef union {
+ * volatile int x;
+ * volatile long y;
+ * } union_type;
+ *
+ * union_type lunion;
+ *
+ * lunion.x = 2;
+ * lunion.y = 2;
+ */
+ @Test
+ public void testExpressionsInvalidUnions() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(2);
+
+ // non-existent members
+ Assert.assertEquals(getExpressionValue("lunion.bad"),
+ MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
+ // subscripting
+ Assert.assertEquals(getExpressionValue("(lunion.x)[6]"),
+ ASTEvalMessages.ArraySubscript_MustSubscriptArray);
+ // unary '*'
+ Assert.assertEquals(getExpressionValue("*(lunion.x)"),
+ ASTEvalMessages.OperatorIndirection_RequiresPointer);
+ }
+
+ /*
+ * Note: This assumes you are at a breakpoint where:
+ *
+ * typedef struct {
+ * volatile unsigned x:1;
+ * volatile unsigned y:2;
+ * volatile unsigned z:3;
+ * volatile unsigned w:16;
+ * } bitfield_type;
+ *
+ * bitfield_type lbitfield;
+ *
+ * lbitfield.x = 1;
+ * lbitfield.y = 2;
+ * lbitfield.z = 3;
+ * lbitfield.w = 26;
+ */
+ @Test
+ public void testExpressionsInvalidBitfields() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(3);
+
+ // non-existent members
+ Assert.assertEquals(getExpressionValue("lbitfield.bad"),
+ MessageFormat.format(ASTEvalMessages.FieldReference_InvalidMember, "bad"));
+ Assert.assertEquals(getExpressionValue("lbitfield.x.bad"),
+ ASTEvalMessages.FieldReference_InvalidDotDeref);
+ // address of & applied to a non-variable or bit-field
+ Assert.assertEquals(getExpressionValue("&0x123456"),
+ ASTEvalMessages.OperatorAddrOf_RequiresVariable);
+ Assert.assertEquals(getExpressionValue("&(lbitfield.x)"),
+ ASTEvalMessages.OperatorAddrOf_NoBitField);
+ }
+
+ private static class TestExpressionClass extends Expressions {
+
+ private TestExpressionClass(DsfSession session) {
+ super(session);
+ }
+
+ private static boolean isInvalidContextExpressionDMC(IExpressionDMContext dm) {
+ return (dm instanceof InvalidContextExpressionDMC);
+ }
+ }
+
+ @Test
+ public void testExpressionsInternalInvalidContextExpressionDMC() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ IExpressionDMContext exprDMC = expressionsService.createExpression(threadDMC, "thread context is wrong");
+ Assert.assertTrue(TestExpressionClass.isInvalidContextExpressionDMC(exprDMC));
+ Assert.assertTrue(exprDMC.equals(exprDMC));
+ Assert.assertEquals("thread context is wrong", exprDMC.getExpression());
+ Assert.assertEquals(exprDMC.hashCode(), exprDMC.hashCode());
+ Assert.assertEquals(threadDMC.toString().concat(".invalid_expr[thread context is wrong]"), exprDMC.toString());
+ }
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsAggregatesAndEnums.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsServiceInternalsTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsServiceInternalsTest.java
new file mode 100644
index 0000000..09787a1
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ExpressionsServiceInternalsTest.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.debug.service.IExpressions;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ExpressionsServiceInternalsTest extends SimpleDebuggerTest {
+
+ @Test
+ public void testBaseEDCExpressionDMCsetEvaluatedValue() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ IEDCExpression expr = TestUtils.getExpressionDMC(session, frame, "lstruct.achar");
+ Assert.assertNotNull(expr);
+ expr.setEvaluatedValue(0);
+ expr.setEvaluatedValueString("2");
+ }
+
+ @Test
+ public void testExpressionDMAddressGetLocation() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ final IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct");
+
+ Query<IExpressions.IExpressionDMAddress> query = new Query<IExpressions.IExpressionDMAddress>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IExpressions.IExpressionDMAddress> drm) {
+ expressionsService.getExpressionAddressData(exprDMC, drm);
+ }
+ };
+
+ session.getExecutor().execute(query);
+ IExpressions.IExpressionDMAddress exprDMAddr = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(exprDMAddr instanceof Expressions.ExpressionDMAddress);
+ Assert.assertEquals("0x22feb0", ((Expressions.ExpressionDMAddress)exprDMAddr).getLocation());
+ }
+
+ @Test
+ public void testExpressionData() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ final IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct");
+
+ Query<IExpressions.IExpressionDMData> query = new Query<IExpressions.IExpressionDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IExpressions.IExpressionDMData> drm) {
+ expressionsService.getExpressionData(exprDMC, drm);
+ }
+ };
+
+ session.getExecutor().execute(query);
+ IExpressions.IExpressionDMData exprDMData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(exprDMData instanceof Expressions.ExpressionData);
+
+ // TODO Expression$ExpressionData#getEncoding() just returns null
+ Assert.assertNull(exprDMData.getEncoding());
+
+ // TODO Expression$ExpressionData#getEnumerations() just returns null
+ Assert.assertNull(exprDMData.getEnumerations());
+
+ Assert.assertEquals("lstruct", exprDMData.getName());
+
+ // TODO Expression$ExpressionData#getRegister() just returns null
+ Assert.assertNull(exprDMData.getRegister());
+
+ Assert.assertEquals(IExpressions.IExpressionDMData.TYPEID_INTEGER, exprDMData.getTypeId());
+ Assert.assertEquals("struct struct_type", exprDMData.getTypeName());
+ }
+
+// @Test
+// public void testGetSubExpressions() throws Exception {
+// openSnapshotAndWaitForSuspendedContext(0);
+// final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+// final IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct");
+// IEDCExpression expr = TestUtils.getExpressionDMC(session, frame, "lstruct");
+//
+// Assert.assertEquals(exprDMC.getExpression(), expr.getExpression());
+//
+// Query<IExpressions.IExpressionDMContext[]> query = new Query<IExpressions.IExpressionDMContext[]>() {
+// @Override
+// protected void execute(final DataRequestMonitor<IExpressions.IExpressionDMContext[]> drm) {
+/// requires a custom type content provider, meaning a Qt or Symbian type for us with what's available
+/// and the uncovered function is protected, so skip this _one_ uncovered method for now
+// }
+// };
+//
+// session.getExecutor().execute(query);
+// IExpressions.IExpressionDMContext[] baseExpressions = query.get(5, TimeUnit.SECONDS);
+// Assert.assertNotNull(baseExpressions);
+// }
+
+/// TODO there's some sort of timing problem when calling
+/// getExpressionValue() like this so immediately after
+/// creating the expression with createExpression(),
+/// and most things call getFormattedExpressionValue()
+/// directly, with the DRM that goes with it, rather
+/// than this getExpressionValue() .
+///
+/// so ... for coverage, we'll rely on the fact that
+/// the coverageLoadExpressionValues() below will
+/// eventually invoke this getExpressionValue()
+///
+// @Test
+// public void testGetExpressionValue() throws Exception {
+// openSnapshotAndWaitForSuspendedContext(0);
+// final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+// final IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct.achar");
+// expressionsService.
+//
+// Assert.assertEquals("49 ('1')", expressionsService.getExpressionValue(exprDMC));
+// }
+
+// /**
+// * TODO method {@link Expressions$CastInfoCachedData} currently is not public
+// * and has zero references, so is filtered out of emma coverage results
+// */
+// @Test
+// public void coverageCastInfoCachedData() {
+// Expressions.CastInfoCachedData cache;
+// }
+
+ /**
+ * TODO method {@link Expressions#getModelData} currently almost nothing
+ * except setData(new IDCExpression[0]);
+ * @throws Exception
+ */
+ @Test
+ public void coverageGetBaseExpressions() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ final IExpressions.IExpressionDMContext exprDMC
+ = expressionsService.createExpression(frame, "lstruct.achar");
+
+ Query<IExpressions.IExpressionDMContext[]> query = new Query<IExpressions.IExpressionDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IExpressions.IExpressionDMContext[]> drm) {
+ expressionsService.getBaseExpressions(exprDMC, drm);
+ }
+ };
+
+ session.getExecutor().execute(query);
+ IExpressions.IExpressionDMContext[] baseExpressions = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(baseExpressions);
+ Assert.assertEquals(0, baseExpressions.length);
+ }
+
+ /**
+ * TODO method {@link Expressions#getModelData} currently does nothing.
+ * @throws Exception
+ */
+ @Test
+ public void coverageGetModelData() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ final Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ final IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct.achar");
+
+ Query<Object> query = new Query<Object>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Object> drm) {
+ expressionsService.getModelData(exprDMC, drm);
+ drm.done();
+ }
+ };
+ session.getExecutor().execute(query);
+
+ query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ /**
+ * TODO this is listed as coverage only because the attempts to get the evaluated
+ * value after load were failing with null evaluated values. this is probably
+ * because the getExressionValue() inside the nested loadExpressionValues()
+ * isn't normally used, and especially not right after a createExpression() call
+ * @throws Exception
+ */
+ @Test
+ public void coverageLoadExpressionValues() throws Exception {
+ openSnapshotAndWaitForSuspendedContext(0);
+ Expressions expressionsService = TestUtils.getService(session, Expressions.class);
+ IExpressions.IExpressionDMContext exprDMC = expressionsService.createExpression(frame, "lstruct");
+ Assert.assertNull(((IEDCExpression)exprDMC).getEvaluatedValue());
+ expressionsService.loadExpressionValues(exprDMC, 3);
+// Assert.assertNotNull("lstruct not yet evaluated after loadExpressionValues() depth 3", ((IEDCExpression)exprDMC).getEvaluatedValue());
+// Assert.assertEquals(TODO, ((IEDCExpression)exprDMC).getEvaluatedValue().intValue());
+// Assert.assertEquals("TODO", ((IEDCExpression)exprDMC).getEvaluatedValueString());
+// IExpressions.IExpressionDMContext subExprDMC = expressionsService.createExpression(frame, "lstruct.aulong");
+// Assert.assertNotNull("lstruct.aulong not yet evaluated after loadExpressionValues() depth 3", ((IEDCExpression)subExprDMC).getEvaluatedValue());
+// Assert.assertEquals(TODO, ((IEDCExpression)subExprDMC).getEvaluatedValue().intValue());
+// Assert.assertEquals("TODO", ((IEDCExpression)subExprDMC).getEvaluatedValueString());
+// IExpressions.IExpressionDMContext subSubExprDMC = expressionsService.createExpression(frame, "lstruct.structb.aslong");
+// Assert.assertNotNull("lstruct not yet evaluated after loadExpressionValues() depth 3", ((IEDCExpression)subSubExprDMC).getEvaluatedValue());
+// Assert.assertEquals(TODO, ((IEDCExpression)subSubExprDMC).getEvaluatedValue().intValue());
+// Assert.assertEquals("TODO", ((IEDCExpression)subSubExprDMC).getEvaluatedValueString());
+ }
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsAggregatesAndEnums.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/MemoryView.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/MemoryView.java
index b1a59e9..903e30c 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/MemoryView.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/MemoryView.java
@@ -1,89 +1,94 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.util.ArrayList;
-import java.util.Random;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Memory;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.IEDCMemory;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
-import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
-import org.eclipse.cdt.dsf.service.DsfServicesTracker;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.model.MemoryByte;
-import org.junit.Test;
-
-public class MemoryView extends BaseLaunchTest {
-
- @Test
- public void testMemoryView() throws Exception {
- TestUtils.showDebugPerspective();
- final EDCLaunch launch = createLaunch();
- assertNotNull(launch);
- final Addr32 addr32 = new Addr32(0x405400);
- final DsfSession session = waitForSession(launch);
- assertNotNull(session);
- final DsfMemoryBlockRetrieval memoryBlock = launch.getMemoryBlockRetrieval();
- assertNotNull(memoryBlock);
- final ExecutionDMC executionDMC = waitForExecutionDMC(session);
- assertNotNull(executionDMC);
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- final Memory mem = servicesTracker.getService(Memory.class);
- // Write memory, read memory back and compare
- final byte[] data = new byte[1000];
- new Random().nextBytes(data);
-
- // Use a Query to synchronize the downstream calls
- Query<MemoryByte[]> query = new Query<MemoryByte[]>() {
- @Override
- protected void execute(final DataRequestMonitor<MemoryByte[]> drm) {
- mem.setMemory(executionDMC, addr32, 0, 1, 1000, data,
- new RequestMonitor(memoryBlock.getExecutor(), drm));
- drm.done();
- }
- };
- memoryBlock.getExecutor().execute(query);
-
- waitForMemoryValues(addr32, executionDMC, mem, data);
- }
-
- private void waitForMemoryValues(final Addr32 addr32, final ExecutionDMC executionDMC, final IEDCMemory mem,
- final byte[] data) throws Exception {
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- ArrayList<MemoryByte> buf = new ArrayList<MemoryByte>();
- IStatus memGetStatus = mem.getMemory(executionDMC, addr32, buf, data.length, 1);
-
- if (memGetStatus.isOK()) {
- for (int i = 0; (i < buf.size()) && (i < data.length); i++) {
- // check each byte
- if (!buf.get(i).isReadable())
- return false;
- if (data[i] != buf.get(i).getValue())
- return false;
- }
- } else
- return false;
-
- return true;
- }
- });
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Memory;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.model.MemoryByte;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MemoryView extends BaseLaunchTest {
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launch() throws Exception {
+ basicLaunch();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ @Test
+ public void testMemoryView() throws Exception {
+ TestUtils.waitForUIUpdate(1500);
+ final DsfMemoryBlockRetrieval memoryBlock = launch.getMemoryBlockRetrieval();
+ assertNotNull(memoryBlock);
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+ final Memory mem = edcTracker.getService(Memory.class);
+ assertNotNull(edcTracker);
+
+ // Write memory, read memory back and compare
+ final Addr32 addr32 = new Addr32(0x405400);
+ final byte[] data = new byte[1000];
+ new Random().nextBytes(data);
+
+ // Use a Query to synchronize the downstream calls
+ Query<MemoryByte[]> query = new Query<MemoryByte[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<MemoryByte[]> drm) {
+ mem.setMemory(threadDMC, addr32, 0, 1, 1000, data,
+ new RequestMonitor(memoryBlock.getExecutor(), drm));
+ }
+ };
+ memoryBlock.getExecutor().execute(query);
+
+ TestUtils.wait(new TestUtils.Condition() {
+ public boolean isConditionValid() {
+ ArrayList<MemoryByte> buf = new ArrayList<MemoryByte>();
+ IStatus memGetStatus = mem.getMemory(threadDMC, addr32, buf, data.length, 1);
+
+ if (memGetStatus.isOK()) {
+ for (int i = 0; (i < buf.size()) && (i < data.length); i++) {
+ // check each byte
+ if (!buf.get(i).isReadable())
+ return false;
+ if (data[i] != buf.get(i).getValue())
+ return false;
+ }
+ } else
+ return false;
+
+ return true;
+ }
+ });
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ModulesTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ModulesTest.java
new file mode 100644
index 0000000..2414eed
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ModulesTest.java
@@ -0,0 +1,321 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.IEDCDMContext;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.debug.service.IModules;
+import org.eclipse.cdt.dsf.debug.service.IModules.IModuleDMContext;
+import org.eclipse.cdt.dsf.debug.service.IModules.LineInfo;
+import org.eclipse.cdt.utils.Addr32;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test that we can recover expressions from stack frames other than the TOS
+ */
+public class ModulesTest {
+
+ private static final String MODULE_PATH = "C:\\sources\\runtime-New_configuration\\Bug10716\\frame2.exe";//$NON-NLS-1$
+ private static final String MODULE_NAME = "frame2.exe";//$NON-NLS-1$
+
+ private static final String MODULE_START = "4194304";//$NON-NLS-N$
+ private static final long MODULE_SIZE = 27648;
+
+ private static final String ADDRESS_RANGE_CHECK = "[0x00400000,0x00406c00)";//$NON-NLS-1$
+
+ private static final String LINE_ADDRESSES_FINAL_CHECK
+ = "EDCLineAddresses [lineNumber=12345, addresses=(0x00400000 0x00400001 0x00400002 0x00400003 0x00400000 0x00400001 0x00400002 0x00400003 )]";//$NON-NLS-1$
+
+ private static SimpleDebuggerTest snapshot;
+
+ private static Modules modulesService;
+
+ private static ExecutionDMC moduleUnloadedExecutionDMC;
+ private static ModuleDMC moduleUnloadedModuleDMC;
+
+// private static class TestModulesDsfService extends AbstractDsfService {
+//
+// public TestModulesDsfService(DsfSession session) {
+// super(session);
+// }
+//
+// @Override
+// protected BundleContext getBundleContext() {
+// return EDCTestPlugin.getBundleContext();
+// }
+//
+// @Override
+// public void initialize(final RequestMonitor rm) {
+// // - Collect references for the services we interact with
+// // - Register to interesting events
+// // - Obtain the list of platform breakpoints
+// // - Register the service for interested parties
+// super.initialize(
+// new RequestMonitor(getExecutor(), rm) {
+// @Override
+// protected void handleSuccess() {
+// doInitialize(rm);
+// }});
+// }
+//
+// /**
+// * Asynchronous service initialization
+// *
+// * @param requestMonitor
+// */
+// private void doInitialize(RequestMonitor rm) {
+// // Register this service
+// register(new String[] { TestModulesDsfService.class.getName() },
+// new Hashtable<String, String>());
+// rm.done();
+// }
+//
+// @Override
+// public void shutdown(final RequestMonitor rm) {
+// unregister();
+// super.shutdown(rm);
+// }
+//
+// @SuppressWarnings("unused")
+// @DsfServiceEventHandler
+// public void testEventHandler_moduleUnloaded(ModuleUnloadedDMEvent e) {
+// // An existing module (including main exe) is unloaded. Uninstall
+// // breakpoints for it.
+// ModuleUnloadedEvent event = (ModuleUnloadedEvent) e;
+// synchronized (moduleUnloadedExecutionDMC) {
+// moduleUnloadedExecutionDMC = (ExecutionDMC)event.getExecutionDMC();
+// moduleUnloadedModuleDMC = (ModuleDMC) e.getUnloadedModuleContext();
+// }
+// }
+// }
+// private static TestModulesDsfService testModulesDsfService;
+
+ @BeforeClass
+ public static void loadSnapshot() throws Exception {
+ snapshot = new SimpleDebuggerTest() {
+ @Override
+ public String getAlbumName() {
+ return "RegisterFrameTests.dsa";//$NON-NLS-1$
+ }
+ };
+ snapshot.launchAndWaitForSuspendedContext();
+
+// testModulesDsfService = new TestModulesDsfService(snapshot.session);
+// Query<Boolean> query = new Query<Boolean>() {
+// @Override
+// protected void execute(final DataRequestMonitor<Boolean> rm) {
+// testModulesDsfService.initialize(rm);
+// }
+// };
+// snapshot.session.getExecutor().execute(query);
+//
+// query.get(3, TimeUnit.SECONDS);
+// Assert.assertTrue(query.isDone());
+
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), snapshot.session.getId());
+ Assert.assertNotNull(edcTracker);
+ modulesService = edcTracker.getService(Modules.class);
+ }
+
+ @AfterClass
+ public static void shutdown() throws Exception {
+ TestUtils.shutdownDebugSession(snapshot.launch, snapshot.session);
+
+// Query<Boolean> query = new Query<Boolean>() {
+// @Override
+// protected void execute(final DataRequestMonitor<Boolean> drm) {
+// testModulesDsfService.shutdown(drm);
+// }
+// };
+// snapshot.session.getExecutor().execute(query);
+//
+// query.get(3, TimeUnit.SECONDS);
+ snapshot = null;
+// Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageCalcLineInfo() throws Exception {
+ Query<LineInfo[]> query = new Query<LineInfo[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<LineInfo[]> drm) {
+ // TODO Modules.calcLineInfo() is currently auto-generated stub
+ modulesService.calcLineInfo(snapshot.threadDMC.getSymbolDMContext(),
+ (IAddress)null, drm);
+ drm.done();
+ }
+ };
+
+ snapshot.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void testGetFile() throws Exception {
+ IModules.ISymbolDMContext symbolDMC = snapshot.threadDMC.getSymbolDMContext();
+ Assert.assertNotNull(symbolDMC);
+ ModuleDMC moduleDMC = modulesService.getModuleByName(symbolDMC, MODULE_NAME);
+ Assert.assertNotNull(moduleDMC);
+
+ Assert.assertEquals(MODULE_NAME, moduleDMC.getFile());
+ }
+
+ @Test
+ public void testGetModuleData() throws Exception {
+ final IModules.ISymbolDMContext symbolDMC = snapshot.threadDMC.getSymbolDMContext();
+ Assert.assertNotNull(symbolDMC);
+ final ModuleDMC moduleDMC = modulesService.getModuleByName(symbolDMC, MODULE_NAME);
+ Assert.assertNotNull(moduleDMC);
+
+ Query<IModules.IModuleDMData> query = new Query<IModules.IModuleDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IModules.IModuleDMData> drm) {
+ modulesService.getModuleData(moduleDMC, drm);
+ }
+ };
+
+ snapshot.session.getExecutor().execute(query);
+
+ IModules.IModuleDMData moduleDMData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(moduleDMData);
+ Assert.assertEquals(MODULE_START, moduleDMData.getBaseAddress());
+ Assert.assertEquals(MODULE_PATH, moduleDMData.getFile());
+ Assert.assertEquals(MODULE_NAME, moduleDMData.getName());
+ Assert.assertEquals(MODULE_SIZE, moduleDMData.getSize());
+
+ // TODO this is not properly complete in Modules.ModuleDMData
+ Assert.assertEquals(0, moduleDMData.getTimeStamp());
+
+ // TODO Modules.ModuleDMData should return BaseAddress + size
+ Assert.assertEquals(MODULE_START, moduleDMData.getToAddress());
+
+ // TODO Modules.ModuleDMData.isSymbolsLoaded() always returns false right now
+ Assert.assertFalse(moduleDMData.isSymbolsLoaded());
+ }
+
+ @Test
+ public void testModulesEDCAddressRange() throws Exception {
+ IAddress start = new Addr32(MODULE_START);
+ IAddress end = start.add(MODULE_SIZE);
+ Modules.EDCAddressRange range = new Modules.EDCAddressRange(start, end);
+ Assert.assertNotNull(range);
+
+ Assert.assertEquals(start, range.getStartAddress());
+
+ Assert.assertEquals(end, range.getEndAddress());
+
+ Assert.assertTrue(range.contains(start));
+ Assert.assertTrue(range.contains(start.add(1)));
+ Assert.assertTrue(range.contains(end.add(-1)));
+ Assert.assertFalse(range.contains(end));
+
+ Assert.assertEquals(ADDRESS_RANGE_CHECK, range.toString());
+
+ range.setStartAddress(end);
+ range.setEndAddress(end.add(1));
+ Assert.assertTrue(range.contains(end));
+ }
+
+ @Test
+ public void testModulesEDCLineAddresses() throws Exception {
+ IAddress start = new Addr32(MODULE_START);
+ IAddress[] addrs = new IAddress[] {start.add(1), start.add(2), start.add(3) };
+ List<IAddress> addrList = new ArrayList<IAddress>(addrs.length);
+ addrList.add(start);
+ for (IAddress addr : addrs) {
+ addrList.add(addr);
+ }
+
+ Modules.EDCLineAddresses rangeConstructed = new Modules.EDCLineAddresses(12345, start);
+ Modules.EDCLineAddresses rangeFull = new Modules.EDCLineAddresses(12345, addrList);
+
+ Assert.assertNotNull(rangeConstructed);
+ Assert.assertNotNull(rangeFull);
+
+ Assert.assertEquals(1, rangeConstructed.getAddress().length);
+ Assert.assertEquals(4, rangeFull.getAddress().length);
+
+ Assert.assertEquals(12345, rangeConstructed.getLineNumber());
+ Assert.assertEquals(12345, rangeFull.getLineNumber());
+
+ rangeConstructed.addAddress(addrs);
+ Assert.assertEquals(rangeFull.toString(), rangeConstructed.toString());
+
+ rangeConstructed.addAddress(addrList);
+ Assert.assertEquals(LINE_ADDRESSES_FINAL_CHECK, rangeConstructed.toString());
+ }
+
+ // the following test needs to be last
+ @Test
+ public void testModuleUnloaded() throws Exception {
+ Assert.assertNull(moduleUnloadedExecutionDMC);
+ Assert.assertNull(moduleUnloadedModuleDMC);
+ final IModules.ISymbolDMContext symbolDMC
+ = snapshot.threadDMC.getSymbolDMContext();
+ Query<IModuleDMContext[]> query = new Query<IModuleDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IModuleDMContext[]> drm) {
+ modulesService.getModules(symbolDMC, drm);
+ }
+ };
+
+ snapshot.session.getExecutor().execute(query);
+
+ IModules.IModuleDMContext before[] = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(before != null && before.length != 0);
+
+ Map<String, Object> moduleProps = new HashMap<String, Object> ();
+ moduleProps.put(IEDCDMContext.PROP_ID, "152");
+ modulesService.moduleUnloaded(symbolDMC, snapshot.threadDMC, moduleProps);
+
+ query = new Query<IModuleDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IModuleDMContext[]> drm) {
+ modulesService.getModules(symbolDMC, drm);
+ }
+ };
+
+ snapshot.session.getExecutor().execute(query);
+
+ IModules.IModuleDMContext after[] = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(after == null || after.length == before.length - 1);
+
+// synchronized (moduleUnloadedExecutionDMC) {
+// Assert.assertNotNull(moduleUnloadedExecutionDMC);
+// Assert.assertNotNull(moduleUnloadedModuleDMC);
+// }
+
+ }
+ // the preceding test needs to be last
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/OpaqueTypeResolving.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/OpaqueTypeResolving.java
index 30bffc0..ac7756c 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/OpaqueTypeResolving.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/OpaqueTypeResolving.java
@@ -1,107 +1,108 @@
-/*******************************************************************************
- * Copyright (c) 2011 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation. Jun 9, 2011
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
-import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
-import org.eclipse.cdt.debug.edc.services.IEDCExpression;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.dsf.datamodel.DMContexts;
-import org.eclipse.cdt.dsf.debug.service.IModules.ISymbolDMContext;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Tests the opaque type resolution.
- */
-public class OpaqueTypeResolving extends SimpleDebuggerTest {
-
- @Override
- public String getAlbumName() {
- // This EDC Snapshot album is based on a CPP project that has opaque pointer.
- // Please unzip the .dsa file and look into the resources folder for the source
- // files of the project.
- return "OpaquePtr_resolution.dsa";
- }
-
- @Test
- public void testOpaqueTypeResolving() throws Exception {
- // An opaque type that's defined somewhere else. We can resolve it.
- //
- // typedef struct PrivateStruct* PrivatePTR;
- // PrivatePTR opaque_ptr = 0;
- //
- // At this point, debug session from the snapshot is stopped at
- // a the end of the executable.
-
- IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr");
- IType type = exprVal.getEvaluatedType();
-
- // First ensure if the original type of the var is an opaque type.
- //
- Assert.assertTrue(type instanceof TypedefType);
- type = type.getType(); // de-typedef
- Assert.assertTrue(type instanceof PointerType);
- type = type.getType(); // de-reference
-
- Assert.assertTrue(type instanceof ICompositeType);
- Assert.assertTrue(((ICompositeType)type).isOpaque());
- Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
-
- // Now resolve the opaque type
- //
- Symbols symService = TestUtils.getService(session, Symbols.class);
- ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
- ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
- Assert.assertFalse(defined.isOpaque());
- Assert.assertEquals(type.getName(), defined.getName());
-
- // Resolve one that's not an opaque type, fail.
- type = symService.resolveOpaqueType(symCtx, defined);
- Assert.assertNull(type);
- }
-
- @Test
- public void testOpaqueTypeNeverDefined() throws Exception {
- // An opaque type that's never defined anywhere. We can resolve it.
- //
- // typedef struct UndefinedStruct* UndefinedPTR;
- // UndefinedPTR opaque_ptr_to_undefined;
- //
- // At this point, debug session from the snapshot is stopped at
- // a the end of the executable.
-
- IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr_to_undefined");
- IType type = exprVal.getEvaluatedType();
-
- // First ensure if the original type of the var is an opaque type.
- //
- Assert.assertTrue(type instanceof TypedefType);
- type = type.getType(); // de-typedef
- Assert.assertTrue(type instanceof PointerType);
- type = type.getType(); // de-reference
-
- Assert.assertTrue(type instanceof ICompositeType);
- Assert.assertTrue(((ICompositeType)type).isOpaque());
- Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
-
- // Now try to resolve the opaque type, should fail
- //
- Symbols symService = TestUtils.getService(session, Symbols.class);
- ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
- ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
- Assert.assertNull(defined);
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. Jun 9, 2011
+ * Broadcom - Fix name "OpaquePtr_Resolution.dsa" for any case-sensitive OS
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
+import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IModules.ISymbolDMContext;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests the opaque type resolution.
+ */
+public class OpaqueTypeResolving extends SimpleDebuggerTest {
+
+ @Override
+ public String getAlbumName() {
+ // This EDC Snapshot album is based on a CPP project that has opaque pointer.
+ // Please unzip the .dsa file and look into the resources folder for the source
+ // files of the project.
+ return "OpaquePtr_Resolution.dsa";
+ }
+
+ @Test
+ public void testOpaqueTypeResolving() throws Exception {
+ // An opaque type that's defined somewhere else. We can resolve it.
+ //
+ // typedef struct PrivateStruct* PrivatePTR;
+ // PrivatePTR opaque_ptr = 0;
+ //
+ // At this point, debug session from the snapshot is stopped at
+ // a the end of the executable.
+
+ IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr");
+ IType type = exprVal.getEvaluatedType();
+
+ // First ensure if the original type of the var is an opaque type.
+ //
+ Assert.assertTrue(type instanceof TypedefType);
+ type = type.getType(); // de-typedef
+ Assert.assertTrue(type instanceof PointerType);
+ type = type.getType(); // de-reference
+
+ Assert.assertTrue(type instanceof ICompositeType);
+ Assert.assertTrue(((ICompositeType)type).isOpaque());
+ Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
+
+ // Now resolve the opaque type
+ //
+ Symbols symService = TestUtils.getService(session, Symbols.class);
+ ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
+ ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
+ Assert.assertFalse(defined.isOpaque());
+ Assert.assertEquals(type.getName(), defined.getName());
+
+ // Resolve one that's not an opaque type, fail.
+ type = symService.resolveOpaqueType(symCtx, defined);
+ Assert.assertNull(type);
+ }
+
+ @Test
+ public void testOpaqueTypeNeverDefined() throws Exception {
+ // An opaque type that's never defined anywhere. We can resolve it.
+ //
+ // typedef struct UndefinedStruct* UndefinedPTR;
+ // UndefinedPTR opaque_ptr_to_undefined;
+ //
+ // At this point, debug session from the snapshot is stopped at
+ // a the end of the executable.
+
+ IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr_to_undefined");
+ IType type = exprVal.getEvaluatedType();
+
+ // First ensure if the original type of the var is an opaque type.
+ //
+ Assert.assertTrue(type instanceof TypedefType);
+ type = type.getType(); // de-typedef
+ Assert.assertTrue(type instanceof PointerType);
+ type = type.getType(); // de-reference
+
+ Assert.assertTrue(type instanceof ICompositeType);
+ Assert.assertTrue(((ICompositeType)type).isOpaque());
+ Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
+
+ // Now try to resolve the opaque type, should fail
+ //
+ Symbols symService = TestUtils.getService(session, Symbols.class);
+ ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
+ ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
+ Assert.assertNull(defined);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesDetachDebuggerFromSession.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesDetachDebuggerFromSession.java
new file mode 100644
index 0000000..b8ae267
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesDetachDebuggerFromSession.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Processes;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.service.DsfSession;
+
+public class ProcessesDetachDebuggerFromSession {
+
+ private Processes processesService;
+ private DsfSession session;
+
+ private BaseLaunchTest subLaunch0 = new BaseLaunchTest() {
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ private BaseLaunchTest subLaunch1 = new BaseLaunchTest() {
+
+ @Override
+ protected String getExeFileName() {
+ return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ private BaseLaunchTest subLaunch2 = new BaseLaunchTest() {
+
+ @Override
+ protected String getExeFileName() {
+ return "SimpleCpp_gcc_x86.exe"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ @Before
+ public void launchSessions() throws Exception {
+ subLaunch0.basicLaunch();
+ subLaunch1.basicLaunch();
+ subLaunch2.basicLaunch();
+
+ session = subLaunch0.session;
+ Assert.assertEquals(session, subLaunch1.session);
+ Assert.assertEquals(session, subLaunch2.session);
+
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+ Assert.assertNotNull(edcTracker);
+ processesService = edcTracker.getService(Processes.class);
+ Assert.assertNotNull(processesService);
+ }
+
+ @Test
+ public void testDetachDebuggerFromSession() throws Exception {
+ Query<Integer> query = new Query<Integer>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Integer> drm) {
+ processesService.detachDebuggerFromSession(drm);
+ }
+
+ };
+ session.getExecutor().execute(query);
+
+ query.get(10, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesServiceTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesServiceTest.java
new file mode 100644
index 0000000..abe2db5
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ProcessesServiceTest.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.Assert;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Processes;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IProcesses;
+import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
+import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
+
+public class ProcessesServiceTest {
+
+// private static final String dbg_derived_types_cpp
+// = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$
+
+ private static Processes processesService;
+
+ private static BaseLaunchTest simpleLaunch;
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+
+ simpleLaunch = new BaseLaunchTest() {
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ };
+
+ simpleLaunch.basicLaunch();
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(
+ EDCDebugger.getBundleContext(), simpleLaunch.session.getId());
+ Assert.assertNotNull(edcTracker);
+ processesService = edcTracker.getService(Processes.class);
+ Assert.assertNotNull(processesService);
+ }
+
+ @AfterClass
+ public static void shutdown() {
+ TestUtils.shutdownDebugSession(simpleLaunch.launch, simpleLaunch.session);
+ processesService = null;
+ simpleLaunch = null;
+ }
+
+ @Test
+ public void coverageAttachDebuggerToProcess() throws Exception {
+ Query<IDMContext> query = new Query<IDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IDMContext> drm) {
+ processesService.attachDebuggerToProcess(null, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageDebugNewProcess() throws Exception {
+ Query<IDMContext> query = new Query<IDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IDMContext> drm) {
+ processesService.debugNewProcess(
+ simpleLaunch.threadDMC, simpleLaunch.getExeFileName(), null, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageEventReceived() {
+ // nothing expected, nothing set, nothing returned, no side-effects
+ processesService.eventDispatched(null);
+ }
+
+ @Test
+ public void coverageGetDebuggingContext() throws Exception {
+ Query<IDMContext> query = new Query<IDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IDMContext> drm) {
+ IProcesses.IThreadDMContext processThreadDMC
+ = DMContexts.getAncestorOfType(
+ simpleLaunch.threadDMC, IProcesses.IThreadDMContext.class);
+ processesService.getDebuggingContext(processThreadDMC, drm);
+ }
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageGetModelData() throws Exception {
+ Query<IDMContext> query = new Query<IDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IDMContext> drm) {
+ processesService.getModelData(simpleLaunch.threadDMC, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageGetRunningProcesses() throws Exception {
+ Query<IProcessDMContext[]> query = new Query<IProcessDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IProcessDMContext[]> drm) {
+ processesService.getRunningProcesses(simpleLaunch.threadDMC, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageIsDebugNewProcessSupported() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ processesService.isDebugNewProcessSupported(simpleLaunch.threadDMC, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ Boolean bData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(bData);
+ Assert.assertFalse(bData);
+ }
+
+ @Test
+ public void coverageIsDebuggerAttachSupported() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ processesService.isDebuggerAttachSupported(simpleLaunch.threadDMC, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ Boolean bData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(bData);
+ Assert.assertFalse(bData);
+ }
+
+ @Test
+ public void coverageIsRunNewProcessSupported() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ processesService.isRunNewProcessSupported(simpleLaunch.threadDMC, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ Boolean bData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(bData);
+ Assert.assertFalse(bData);
+ }
+
+ @Test
+ public void coverageRunNewProcess() throws Exception {
+ Query<IProcessDMContext> query = new Query<IProcessDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IProcessDMContext> drm) {
+ processesService.runNewProcess(
+ simpleLaunch.threadDMC, simpleLaunch.getExeFileName(), null, drm);
+ }
+
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void testExecutionDataIsDebuggerAttached() throws Exception {
+ Query<IThreadDMData> query = new Query<IThreadDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IThreadDMData> drm) {
+ IProcesses.IThreadDMContext processThreadDMC
+ = DMContexts.getAncestorOfType(
+ simpleLaunch.threadDMC, IProcesses.IThreadDMContext.class);
+ processesService.getExecutionData(processThreadDMC, drm);
+ }
+ };
+ simpleLaunch.session.getExecutor().execute(query);
+
+ IThreadDMData threadData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(threadData.isDebuggerAttached());
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RegisterView.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RegisterView.java
index 26638b9..cf2d2cf 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RegisterView.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RegisterView.java
@@ -1,106 +1,333 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import junit.framework.Assert;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ThreadExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.Registers;
-import org.eclipse.cdt.debug.edc.services.Registers.RegisterDMC;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.datamodel.CompositeDMContext;
-import org.eclipse.cdt.dsf.datamodel.IDMContext;
-import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext;
-import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterGroupDMContext;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.core.runtime.CoreException;
-import org.junit.Test;
-
-public class RegisterView extends BaseLaunchTest {
-
- private EDCLaunch launch;
- private DsfSession session;
-
- @Test
- public void testRegisterView() throws Exception {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- assertNotNull(session);
- final ExecutionDMC executionDMC = TestUtils.waitForSuspendedThread(session);
- assertNotNull(executionDMC);
- Thread.sleep(10 * 1000);
-
- final Registers regService = TestUtils.getService(session, Registers.class);
- final IRegisterGroupDMContext regGroupDMC = waitForRegisterGroup((ThreadExecutionDMC) executionDMC, regService);
- final IRegisterDMContext[] regDMCs = waitForRegisterDMCs(executionDMC, regGroupDMC, regService);
-
- testRegisterWrites(regService, regDMCs);
- }
-
- private void testRegisterWrites(final Registers regService, final IRegisterDMContext[] regDMCs)
- throws Exception {
- for (IRegisterDMContext regContext : regDMCs) {
- final RegisterDMC regDMC = (RegisterDMC) regContext;
- regService.writeRegister(regDMC, "0000000d", "NATURAL.Format");
- Assert.assertEquals("d", regService.getRegisterValueAsHexString(regDMC));
- }
- }
-
- private IRegisterDMContext[] waitForRegisterDMCs(final ExecutionDMC executionDMC,
- final IRegisterGroupDMContext regGroupDMC, final Registers regService) throws Exception {
- final IRegisterDMContext contextsHolder[][] = { null };
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- CompositeDMContext compositeDMC = new CompositeDMContext(new IDMContext[] { executionDMC, regGroupDMC });
- regService.getRegisters(compositeDMC, new DataRequestMonitor<IRegisterDMContext[]>(regService
- .getExecutor(), null) {
- @Override
- protected void handleSuccess() {
- contextsHolder[0] = getData();
- }
- });
- if (contextsHolder[0] != null)
- return true;
-
- return false;
- }
- });
- return contextsHolder[0];
- }
-
- private IRegisterGroupDMContext waitForRegisterGroup(final ThreadExecutionDMC threadExeDMC,
- final Registers regService) throws Exception {
- final IRegisterGroupDMContext contextHolder[] = { null };
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- try {
- IRegisterGroupDMContext[] regGroups = regService.getGroupsForContext(threadExeDMC);
- if (regGroups.length > 0) {
- contextHolder[0] = regGroups[0];
- return true;
- }
- } catch (CoreException e) {
- e.printStackTrace();
- return false;
- }
-
- return false;
- }
- });
- return contextHolder[0];
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.Assert;
+
+import org.eclipse.cdt.debug.edc.services.Registers;
+import org.eclipse.cdt.debug.edc.services.Registers.RegisterDMC;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.CompositeDMContext;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.IFormattedDataDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IBitFieldDMData;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IMnemonic;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMData;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterGroupDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterGroupDMData;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RegisterView {
+
+ static class RegisterViewLaunch extends BaseLaunchTest {
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+ }
+
+ static RegisterViewLaunch testLaunch;
+ static Registers regService;
+ static IRegisterDMContext[] regDMCs;
+ static IRegisterGroupDMContext regGroupDMC;
+
+ @BeforeClass
+ public static void launch() throws Exception {
+ testLaunch = new RegisterViewLaunch();
+ testLaunch.basicLaunch();
+ regService = TestUtils.getService(testLaunch.session, Registers.class);
+ regGroupDMC = waitForRegisterGroup(regService);
+ String regGroupString = regGroupDMC.toString();
+ Assert.assertTrue("RegisterGroup toString()", regGroupString.startsWith("DMContext [id="));
+ Assert.assertTrue("RegisterGroup toString()", regGroupString.endsWith("].group[Basic]"));
+ regDMCs = waitForRegisterDMCs(regGroupDMC, regService);
+ String regDMCString = regDMCs[0].toString();
+ Assert.assertTrue("RegisterDMC[0] toString()", regDMCString.startsWith("DMContext [id="));
+ Assert.assertTrue("RegisterDMC[0] toString()", regDMCString.endsWith("].group[Basic].register[EAX]"));
+ }
+
+ @AfterClass
+ public static void shutdown() {
+ TestUtils.shutdownDebugSession(testLaunch.launch, testLaunch.session);
+ testLaunch = null;
+ }
+
+ @Test
+ public void testRegisterView() throws Exception {
+ testRegisterWrites(regService, regDMCs);
+ }
+
+ @Test
+ public void coverageInternalFindBitFieldNotSupported() throws Exception {
+ Query<IBitFieldDMContext> query = new Query<IBitFieldDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IBitFieldDMContext> drm) {
+ regService.findBitField(testLaunch.threadDMC, "", drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ try {
+ IBitFieldDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertNull("Not expecting filled IBitFieldDMContext", unexpectedResult);
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof CoreException);
+ Assert.assertEquals("findBitField not supported", e.getCause().getMessage());
+ }
+ }
+
+ @Test
+ public void coverageInternalFindRegisterNotSupported() throws Exception {
+ Query<IRegisterDMContext> query = new Query<IRegisterDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IRegisterDMContext> drm) {
+ regService.findRegister(testLaunch.threadDMC, "", drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ try {
+ IRegisterDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertNull("Not expecting filled IRegisterDMContext", unexpectedResult);
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof CoreException);
+ Assert.assertEquals("findRegister not supported", e.getCause().getMessage());
+ }
+ }
+
+ @Test
+ public void coverageInternalFindRegisterGroupNotSupported() throws Exception {
+ Query<IRegisterGroupDMContext> query = new Query<IRegisterGroupDMContext>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IRegisterGroupDMContext> drm) {
+ regService.findRegisterGroup(testLaunch.threadDMC, "", drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ try {
+ IRegisterGroupDMContext unexpectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertNull("Not expecting filled IRegisterGroupDMContext", unexpectedResult);
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof CoreException);
+ Assert.assertEquals("findRegisterGroup not supported", e.getCause().getMessage());
+ }
+ }
+
+ @Test
+ public void testInternalGetAvailableFormats() throws Exception {
+ Query<String[]> query = new Query<String[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String[]> drm) {
+ regService.getAvailableFormats((IFormattedDataDMContext)null, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ String[] expectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull("Registers.getAvailableFormats() result", expectedResult);
+ Assert.assertEquals("Registers.getAvailableFormats() result size", 5, expectedResult.length);
+
+ String[] comparisonFormats
+ = new String[]
+ { IFormattedValues.HEX_FORMAT,
+ IFormattedValues.DECIMAL_FORMAT,
+ IFormattedValues.OCTAL_FORMAT,
+ IFormattedValues.BINARY_FORMAT,
+ IFormattedValues.NATURAL_FORMAT };
+ for (int i=0; i<comparisonFormats.length; ++i) {
+ Assert.assertEquals("Registers.getAvailableFormats()[" + i + "] contents",
+ comparisonFormats[i], expectedResult[i]);
+ }
+ }
+
+ @Test
+ public void coverageInternalGetBitFieldsNotSupported() throws Exception {
+ Query<IBitFieldDMContext[]> query = new Query<IBitFieldDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IBitFieldDMContext[]> drm) {
+ regService.getBitFields(testLaunch.threadDMC, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ try {
+ IBitFieldDMContext[] unexpectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertNull("Not expecting filled IBitFieldDMContext[]", unexpectedResult);
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof CoreException);
+ Assert.assertEquals("BitField not supported", e.getCause().getMessage());
+ }
+ }
+
+ @Test
+ public void coverageInternalGetBitFieldDataNotSupported() throws Exception {
+ Query<IBitFieldDMData> query = new Query<IBitFieldDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IBitFieldDMData> drm) {
+ regService.getBitFieldData((IBitFieldDMContext)null, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ try {
+ IBitFieldDMData unexpectedResult = query.get(1, TimeUnit.SECONDS);
+ Assert.assertNull("Not expecting filled IBitFieldDMData", unexpectedResult);
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof CoreException);
+ Assert.assertEquals("Bit fields not yet supported", e.getCause().getMessage());
+ }
+ }
+
+ @Test
+ public void testInternalGetFormattedExpressionValue() throws Exception {
+ final FormattedValueDMContext formattedValueDMC
+ = regService.getFormattedValueContext(regDMCs[0], IFormattedValues.NATURAL_FORMAT);
+ Query<FormattedValueDMData> query = new Query<FormattedValueDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<FormattedValueDMData> drm) {
+ regService.getModelData(formattedValueDMC, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+ FormattedValueDMData formatValueDMData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(formatValueDMData);
+ }
+
+ @Test
+ public void testInternalGetRegisterData() throws Exception {
+ Query<IRegisterDMData> query = new Query<IRegisterDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IRegisterDMData> drm) {
+ regService.getModelData(regDMCs[0], drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+ IRegisterDMData regDMData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(regDMData);
+ Assert.assertNull("RegisterData.getDescription()", regDMData.getDescription());
+ Assert.assertEquals("RegisterData.getName()", "EAX", regDMData.getName());
+ Assert.assertFalse("RegisterData.hasSideEffects()", regDMData.hasSideEffects());
+ Assert.assertFalse("RegisterData.isFloat()", regDMData.isFloat());
+ Assert.assertTrue("RegisterData.isReadable()", regDMData.isReadable());
+ Assert.assertFalse("RegisterData.isReadOnce()", regDMData.isReadOnce());
+ Assert.assertFalse("RegisterData.isVolatile()", regDMData.isVolatile());
+ Assert.assertTrue("RegisterData.isWriteable()", regDMData.isWriteable());
+ Assert.assertFalse("RegisterData.isWriteOnce()", regDMData.isWriteOnce());
+ }
+
+ @Test
+ public void testInternalGetRegisterGroupData() throws Exception {
+ Query<IRegisterGroupDMData> query = new Query<IRegisterGroupDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IRegisterGroupDMData> drm) {
+ regService.getModelData(regGroupDMC, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+ IRegisterGroupDMData regGroupData = query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(regGroupData);
+ Assert.assertEquals("RegisterGroupData.getDescription()",
+ "Basic Program Execution Registers of x86", regGroupData.getDescription());
+ Assert.assertEquals("RegisterGroupData.getName()", "Basic", regGroupData.getName());
+ }
+
+ @Test
+ public void coverageInternalWriteBitFieldStringEmptyImplementation() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ regService.writeBitField((IBitFieldDMContext)null, (String)"bitFieldValue", (String)"formatID", drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ @Test
+ public void coverageInternalWriteBitFieldIMnemonicEmptyImplementation() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ regService.writeBitField((IBitFieldDMContext)null, (IMnemonic)null, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+ query.get(1, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ }
+
+ private void testRegisterWrites(final Registers regService, final IRegisterDMContext[] regDMCs)
+ throws Exception {
+ for (IRegisterDMContext regContext : regDMCs) {
+ final RegisterDMC regDMC = (RegisterDMC) regContext;
+ regService.writeRegister(regDMC, "0000000d", "NATURAL.Format");
+ Assert.assertEquals("d", regService.getRegisterValueAsHexString(regDMC));
+ }
+ }
+
+ private static IRegisterDMContext[] waitForRegisterDMCs(final IRegisterGroupDMContext regGroupDMC,
+ final Registers regService) throws Exception {
+ final IRegisterDMContext contextsHolder[][] = { null };
+ TestUtils.wait(new Condition() {
+ public boolean isConditionValid() {
+ CompositeDMContext compositeDMC
+ = new CompositeDMContext(new IDMContext[] { testLaunch.threadDMC, regGroupDMC });
+ regService.getRegisters(compositeDMC,
+ new DataRequestMonitor<IRegisterDMContext[]>(regService.getExecutor(), null) {
+ @Override
+ protected void handleSuccess() {
+ contextsHolder[0] = getData();
+ }
+ });
+ if (contextsHolder[0] != null)
+ return true;
+
+ return false;
+ }
+ });
+ return contextsHolder[0];
+ }
+
+ private static IRegisterGroupDMContext waitForRegisterGroup(final Registers regService) throws Exception {
+ Query<IRegisterGroupDMContext[]> query = new Query<IRegisterGroupDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IRegisterGroupDMContext[]> drm) {
+ regService.getRegisterGroups(testLaunch.threadDMC, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ IRegisterGroupDMContext[] expectedResult = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue("", 0 < expectedResult.length);
+ return expectedResult[0];
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ResumeFromLineAtBreakpoint.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ResumeFromLineAtBreakpoint.java
new file mode 100644
index 0000000..ecd67ec
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/ResumeFromLineAtBreakpoint.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. Mar, 2010
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
+import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl2;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test run-to-line, move-to-line and resume-at-line.
+ *
+ */
+public class ResumeFromLineAtBreakpoint extends BaseLaunchTest {
+
+ protected IStack stackService;
+ protected Breakpoints breakpointsService;
+ protected IRunControl2 runControlService;
+ protected IBreakpointDMContext userBPContext;
+
+ final private String dbg_derived_types_cpp
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp";
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ return "BlackFlagMinGW_NoHardcodedBreak.exe";
+ }
+
+ @Override
+ protected IStack getStackService() {
+ return stackService;
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launch() throws Exception {
+ basicLaunch();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ /**
+ * test resuming from a line with a breakpoint set on it
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testRunFromLineWithBreakpoint() throws Exception {
+ getDsfServices();
+
+ updateSuspendedFrame(1000);
+
+/// TODO initial breakpoint currently isn't stopping at main, but somewhere earlier.
+// assertControlIsAt("BlackFlagWascana.cpp", "main", 15);
+
+ TestUtils.waitForUIUpdate(1000);
+
+ /*
+ * Now we test control in structs() function of
+ * dbg_derived_type.cpp in Blackflag.
+ * Here's the snippet of the source lines in structs():
+ *
+ 52 lstruct.achar = '1';
+ 53 lstruct.auchar = 2;
+ 54 lstruct.aschar = '3';
+ 55 lstruct.ashort = 4;
+ 56 lstruct.aushort = 5;
+ 57 lstruct.asshort = 6;
+ 58 lstruct.aint = 7;
+ 59 lstruct.auint = 8;
+ *
+ * Here's what's done below:
+ * 1) Run to line 53.
+ * 2) Set a breakpoint on line 53
+ * 3) Run to line 57.
+ * it should continue from the line with the breakpoint,
+ * and the next point of stoppage should set all values.
+ */
+ // run to line 53, so "lstruct.achar = '1'" is executed.
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 53);
+
+ updateSuspendedFrame(800);
+
+ assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
+ assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar"));// 54
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 53);
+
+ // Set user breakpoint at line 56.
+ userBPContext = setUserBreakpoint(breakpointsService, dbg_derived_types_cpp, 53);
+
+ TestUtils.waitForUIUpdate(400);
+
+ // run to line 57, then later demonstrate that all lines in between were executed.
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 57);
+
+ updateSuspendedFrame(400);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 57);
+
+ assertEquals("2 ('\\002')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
+ assertEquals("51 ('3')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar")); // 54
+ assertEquals("4", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
+ assertEquals("5", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
+
+ TestUtils.waitForUIUpdate(500);
+
+ removeUserBreakpoint(breakpointsService, userBPContext);
+ }
+
+ private void getDsfServices() throws Exception {
+ assertNotNull(session); // this must be initialized already.
+
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+
+ public boolean isConditionValid() {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+
+ stackService = servicesTracker.getService(IStack.class);
+ breakpointsService = servicesTracker.getService(Breakpoints.class);
+ runControlService = servicesTracker.getService(IRunControl2.class);
+ return true;
+ }
+ });
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunAndMoveToLine.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunAndMoveToLine.java
index 2d2c905..b7c04d5 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunAndMoveToLine.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunAndMoveToLine.java
@@ -1,338 +1,319 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation. Mar, 2010
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
-import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
-import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
-import org.eclipse.cdt.dsf.debug.service.IRunControl2;
-import org.eclipse.cdt.dsf.debug.service.IStack;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
-import org.eclipse.cdt.dsf.service.DsfServicesTracker;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.swt.widgets.Display;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test run-to-line, move-to-line and resume-at-line.
- *
- */
-public class RunAndMoveToLine extends BaseLaunchTest {
-
- protected DsfSession session;
- protected ExecutionDMC threadDMC;
- protected IFrameDMContext frame;
- protected EDCLaunch launch;
- protected IStack stackService;
- protected Breakpoints breakpointsService;
- protected IRunControl2 runControlService;
-
- @Override
- protected String getExeFileName() {
- // This is the executable built by Cygwin gcc 3.4.4
- // All source files are built from this foler:
- // "C:\\myprog\\BlackFlagWascana\\src\\"
- // Note we don't need any source file to perform the test.
- //
- return "BlackFlagMinGW_NoHardcodedBreak.exe";
- }
-
- @Override
- protected void configureLaunchConfiguration(
- ILaunchConfigurationWorkingCopy configuration) {
-
- // Make sure it stop at main
- configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, true);
- configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, "main");
- }
-
- @After
- public void shutdown() {
- TestUtils.shutdownDebugSession(launch, session);
- }
-
- /**
- * test run-to-line, move-to-line and resume-at-line.
- *
- * @throws Exception
- */
- @Test
- public void testRunAndMoveToLine() throws Exception {
- TestUtils.showDebugPerspective();
- launch = createLaunch();
- assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- Assert.assertNotNull(session);
- getDsfServices();
- IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
- Assert.assertNotNull(executionDMC);
-
- updateSuspendedThreadAndFrame(2000);
-
- assertControlIsAt("BlackFlagWascana.cpp", "main", 15);
-
- waitForUIUpdate(2000);
-
- /*
- * Now we test control in structs() function of
- * dbg_derived_type.cpp in Blackflag.
- * Here's the snippet of the source lines in structs():
- *
- 52 lstruct.achar = '1';
- 53 lstruct.auchar = 2;
- 54 lstruct.aschar = '3';
- 55 lstruct.ashort = 4;
- 56 lstruct.aushort = 5;
- 57 lstruct.asshort = 6;
- 58 lstruct.aint = 7;
- 59 lstruct.auint = 8;
- *
- * Here's what's done below:
- * 1) Run to line 53.
- * 2) Move to line 56.
- * 3) Run to line 57.
- * 4) Set temp breakpoint at line 56
- * 5) resume from line 54, which should stop at line 56.
- */
- // run to line 53, so "lstruct.achar = '1'" is executed.
- waitRunToLine("C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp", 53);
-
- assertControlIsAt("dbg_derived_types.cpp", "structs", 53);
-
- // move to line 56, namely skip line 53, 54 & 55
- waitMoveToLine("C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp", 56, false);
-
- assertControlIsAt("dbg_derived_types.cpp", "structs", 56);
-
- // run to line 57, namely line 56 is executed, "aushort" is assigned.
- waitRunToLine("C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp", 57);
-
- assertControlIsAt("dbg_derived_types.cpp", "structs", 57);
-
- // Now check which lines are executed by checking which struct fields are set.
- assertEquals("49 ('1')", TestUtils.getExpressionValue(session, frame, "lstruct.achar")); // 52
- assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
- assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar"));// 54
- assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
- assertEquals("5", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
- assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
-
- // Set temp breakpoint at line 56.
- setTempBreakpoint(threadDMC, breakpointsService, "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp", 56);
-
- // Resume from line 54, namely execute line 54, 55.
- waitMoveToLine("C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp", 54, true);
-
- assertControlIsAt("dbg_derived_types.cpp", "structs", 56);
-
- assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
- assertEquals("51 ('3')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar"));// 54
- assertEquals("4", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
- assertEquals("5", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
- assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
-
- waitForUIUpdate(2000);
- }
-
- private void getDsfServices() throws Exception {
- assertNotNull(session); // this must be initialized already.
-
- TestUtils.waitOnExecutorThread(session, new Condition() {
-
- public boolean isConditionValid() {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
-
- stackService = servicesTracker.getService(IStack.class);
- breakpointsService = servicesTracker.getService(Breakpoints.class);
- runControlService = servicesTracker.getService(IRunControl2.class);
- return true;
- }
- });
- }
-
- /**
- * Wait for UI to update so that we can see the debugger work in
- * test workbench.
- * For headless mode, this just does nothing and return immediately.
- *
- * @param timeout
- */
- private void waitForUIUpdate(int timeout) {
- long limit = System.currentTimeMillis() + timeout;
- Display display = Display.getCurrent();
- if (display == null || null == display.getActiveShell())
- return;
-
- while (true) {
- while (display.readAndDispatch());
- if (System.currentTimeMillis() > limit)
- break;
- }
- }
-
- /**
- * Perform run to line and wait till it's done. Underlying members "thread" and "frame"
- * will be updated.
- *
- * @param fileName
- * @param lineNo
- * @throws Exception
- */
- private void waitRunToLine(final String fileName, final int lineNo) throws Exception {
- Query<IStatus> query = new Query<IStatus>() {
- @Override
- protected void execute(final DataRequestMonitor<IStatus> drm) {
- runControlService.runToLine(threadDMC, fileName, lineNo, false, new RequestMonitor(session.getExecutor(), drm) {
- @Override
- protected void handleCompleted() {
- drm.setData(getStatus());
- drm.done();
- }});
-
- }
- };
-
- session.getExecutor().execute(query);
-
- IStatus status = query.get(5, TimeUnit.SECONDS);
-
- if (status == null || ! status.isOK())
- fail("Error in run-to-line: " + (status == null ? "Exception happened." : status.getMessage()));
-
- updateSuspendedThreadAndFrame(500);
- }
-
- /**
- * Perform run to line and wait till it's done. Underlying members "thread" and "frame"
- * will be updated.
- *
- * @param fileName
- * @param lineNo
- * @param resume TODO
- * @throws Exception
- */
- private void waitMoveToLine(final String fileName, final int lineNo, final boolean resume) throws Exception {
- Query<IStatus> query = new Query<IStatus>() {
- @Override
- protected void execute(final DataRequestMonitor<IStatus> drm) {
- runControlService.moveToLine(threadDMC, fileName, lineNo, resume, new RequestMonitor(session.getExecutor(), drm) {
- @Override
- protected void handleCompleted() {
- drm.setData(getStatus());
- drm.done();
- }});
-
- }
- };
-
- session.getExecutor().execute(query);
-
- IStatus status = query.get(5, TimeUnit.SECONDS);
-
- if (status == null || ! status.isOK())
- fail("Error in move-to-line: " + (status == null ? "Exception happened." : status.getMessage()));
-
- updateSuspendedThreadAndFrame(500);
- }
-
- /**
- * Wait for a suspend and update suspended thread and frame.
- * @param waitForSuspend time to wait for suspend event to be broadcasted.
- *
- * @throws Exception
- */
- private void updateSuspendedThreadAndFrame(int waitForSuspend) throws Exception {
- threadDMC = TestUtils.waitForSuspendedThread(session);
- Assert.assertNotNull(threadDMC);
- // Wait some time for the suspend event to get broadcasted.
- Thread.sleep(waitForSuspend);
-
- frame = TestUtils.waitForStackFrame(session, threadDMC, 0);
- }
-
- private void assertControlIsAt(String fileName,
- String functionName, int lineNo) throws Exception {
- assertFrameMatches(frame, fileName, functionName, lineNo);
- }
-
- private void assertFrameMatches(final IFrameDMContext frame2, String fileName,
- String functionName, int lineNo) throws Exception {
-
- Query<IFrameDMData> query = new Query<IFrameDMData>() {
- @Override
- protected void execute(final DataRequestMonitor<IFrameDMData> drm) {
- stackService.getFrameData(frame2, drm);
- }
- };
- session.getExecutor().execute(query);
-
- IFrameDMData fdata = null;
- fdata = query.get(5, TimeUnit.SECONDS);
-
- if (fdata == null)
- fail("Error getting stack frame data.");
-
- assertNotNull(fdata);
- assertNotNull(fdata.getFile());
- assertTrue(
- "Expected source file is [" + fileName + "] but got [" + fdata.getFile() + "].",
- fdata.getFile().contains(fileName));
- assertEquals(functionName, fdata.getFunction());
- assertEquals(lineNo, fdata.getLine());
- }
-
- private void setTempBreakpoint(final ExecutionDMC executionDMC, final Breakpoints bpService,
- final String srcFile, final int lineNo) throws Exception {
- Query<IBreakpointDMContext> query = new Query<IBreakpoints.IBreakpointDMContext>() {
-
- @Override
- protected void execute(
- final DataRequestMonitor<IBreakpoints.IBreakpointDMContext> drm) {
-
- Modules modulesService = getDsfServicesTracker(session).getService(Modules.class);
-
- modulesService.getLineAddress(executionDMC, srcFile, lineNo, new DataRequestMonitor<List<IAddress>>(session.getExecutor(), drm) {
-
- @Override
- protected void handleSuccess() {
- List<IAddress> addrs = getData();
-
- // IBreakpointsTargetDMContext bt_dmc = DMContexts.getAncestorOfType(executionDMC, IBreakpointsTargetDMContext.class);
- bpService.setTempBreakpoint(executionDMC, addrs.get(0), new RequestMonitor(session.getExecutor(), drm));
- }});
-
- }
- };
-
- session.getExecutor().execute(query);
-
- query.get(5, TimeUnit.SECONDS);
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. Mar, 2010
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.debug.service.IRunControl2;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+import org.eclipse.core.runtime.IStatus;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test run-to-line, move-to-line and resume-at-line.
+ *
+ */
+public class RunAndMoveToLine extends BaseLaunchTest {
+
+ protected IStack stackService;
+ protected Breakpoints breakpointsService;
+ protected IRunControl2 runControlService;
+
+ final static private String dbg_derived_types_cpp
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp";
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ return "BlackFlagMinGW_NoHardcodedBreak.exe";
+ }
+
+ @Override
+ protected IStack getStackService() {
+ return stackService;
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launch() throws Exception {
+ basicLaunch();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ /**
+ * test run-to-line, move-to-line and resume-at-line.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testRunAndMoveToLine() throws Exception {
+ getDsfServices();
+
+/// TODO initial breakpoint currently isn't stopping at main, but somewhere earlier.
+// assertControlIsAt("BlackFlagWascana.cpp", "main", 15);
+
+ TestUtils.waitForUIUpdate(1000);
+
+ /*
+ * Now we test control in structs() function of
+ * dbg_derived_type.cpp in Blackflag.
+ * Here's the snippet of the source lines in structs():
+ *
+ 52 lstruct.achar = '1';
+ 53 lstruct.auchar = 2;
+ 54 lstruct.aschar = '3';
+ 55 lstruct.ashort = 4;
+ 56 lstruct.aushort = 5;
+ 57 lstruct.asshort = 6;
+ 58 lstruct.aint = 7;
+ 59 lstruct.auint = 8;
+ *
+ * Here's what's done below:
+ * 1) Run to line 53.
+ * 2) Move to line 56.
+ * 3) Run to line 57.
+ * 4) Set temp breakpoint at line 56
+ * 5) resume from line 54, which should stop at line 56.
+ */
+ // run to line 53, so "lstruct.achar = '1'" is executed.
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 53, 1000);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 53);
+
+ // move to line 56, namely skip line 53, 54 & 55
+ waitMoveToLine(dbg_derived_types_cpp, 56, false);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 56);
+
+ // run to line 57, namely line 56 is executed, "aushort" is assigned.
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 57);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 57);
+
+ // Now check which lines are executed by checking which struct fields are set.
+ assertEquals("49 ('1')", TestUtils.getExpressionValue(session, frame, "lstruct.achar")); // 52
+ assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
+ assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar"));// 54
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
+ assertEquals("5", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
+
+ // Set temp breakpoint at line 56.
+ setTempBreakpoint(breakpointsService, dbg_derived_types_cpp, 56);
+
+ // Resume from line 54, namely execute line 54, 55.
+ waitMoveToLine(dbg_derived_types_cpp, 54, true);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 56);
+
+ assertEquals("0 ('\\0')", TestUtils.getExpressionValue(session, frame, "lstruct.auchar"));// 53
+ assertEquals("51 ('3')", TestUtils.getExpressionValue(session, frame, "lstruct.aschar"));// 54
+ assertEquals("4", TestUtils.getExpressionValue(session, frame, "lstruct.ashort")); // 55
+ assertEquals("5", TestUtils.getExpressionValue(session, frame, "lstruct.aushort")); // 56
+ assertEquals("0", TestUtils.getExpressionValue(session, frame, "lstruct.asshort")); // 57
+
+ // move back to address that's supposed to be associated with line 53
+ waitMoveToAddress(dbg_derived_types_cpp, 53);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 53);
+
+ // move back to address that's supposed to be associated with line 53
+ waitRunToAddress(dbg_derived_types_cpp, 59);
+
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 59);
+
+ TestUtils.waitForUIUpdate(500);
+ }
+
+ private void getDsfServices() throws Exception {
+ assertNotNull(session); // this must be initialized already.
+
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+
+ public boolean isConditionValid() {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+
+ stackService = servicesTracker.getService(IStack.class);
+ breakpointsService = servicesTracker.getService(Breakpoints.class);
+ runControlService = servicesTracker.getService(IRunControl2.class);
+ return true;
+ }
+ });
+ }
+
+ /**
+ * Perform run to line and wait till it's done. Underlying members "thread" and "frame"
+ * will be updated.
+ *
+ * @param fileName
+ * @param lineNo
+ * @param resume TODO
+ * @throws Exception
+ */
+ private void waitMoveToLine(final String fileName, final int lineNo, final boolean resume) throws Exception {
+ Query<IStatus> query = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ runControlService.moveToLine(threadDMC, fileName, lineNo, resume, new RequestMonitor(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getStatus());
+ drm.done();
+ }});
+
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ IStatus status = query.get(5, TimeUnit.SECONDS);
+
+ if (status == null || ! status.isOK())
+ fail("Error in move-to-line: " + (status == null ? "Exception happened." : status.getMessage()));
+
+ updateSuspendedFrame(400);
+ }
+
+ /**
+ * Perform run to address and wait till it's done. Underlying members "thread" and "frame"
+ * will be updated.
+ *
+ * @param executionDMC
+ * @param source
+ * @param line
+ * @throws Exception
+ */
+ private void waitRunToAddress(final String source, final int line) throws Exception {
+ final IAddress addr = waitGetLineAddress(source, line);
+
+ Query<Boolean> bQuery = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ runControlService.canRunToAddress(threadDMC, addr,
+ new DataRequestMonitor<Boolean>(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getData());
+ drm.done();
+ }});
+ }
+ };
+
+ session.getExecutor().execute(bQuery);
+
+ Boolean canRunToAddress = bQuery.get(5, TimeUnit.SECONDS);
+
+ if (canRunToAddress == null)
+ fail("Error calling CanRunToAddress() ");
+ assertTrue("Expecting true return from canRunToAddress()", canRunToAddress);
+
+ Query<IStatus> sQuery = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ runControlService.runToAddress(threadDMC, addr, false,
+ new RequestMonitor(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getStatus());
+ drm.done();
+ }});
+
+ }
+ };
+
+ session.getExecutor().execute(sQuery);
+
+ IStatus status = sQuery.get(5, TimeUnit.SECONDS);
+
+ if (status == null || ! status.isOK())
+ fail("Error in run-to-address: " + (status == null ? "Exception happened." : status.getMessage()));
+
+ updateSuspendedFrame(400);
+ }
+
+ /**
+ * Perform move to address and wait till it's done. Underlying members "thread" and "frame"
+ * will be updated.
+ *
+ * @param source
+ * @param line
+ * @throws Exception
+ */
+ private void waitMoveToAddress(final String source, final int line) throws Exception {
+ final IAddress addr = waitGetLineAddress(source, line);
+ Query<Boolean> bQuery = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ runControlService.canMoveToAddress(threadDMC, addr, false,
+ new DataRequestMonitor<Boolean>(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getData());
+ drm.done();
+ }});
+ }
+ };
+
+ session.getExecutor().execute(bQuery);
+
+ Boolean canMoveToAddress = bQuery.get(5, TimeUnit.SECONDS);
+
+ if (canMoveToAddress == null)
+ fail("Error calling canMoveToAddress() ");
+ assertTrue("Expecting true return from canMoveToAddress()", canMoveToAddress);
+
+ Query<IStatus> sQuery = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ runControlService.moveToAddress(threadDMC, addr, false,
+ new RequestMonitor(session.getExecutor(), drm) {
+ @Override
+ protected void handleCompleted() {
+ drm.setData(getStatus());
+ drm.done();
+ }});
+
+ }
+ };
+
+ session.getExecutor().execute(sQuery);
+
+ IStatus status = sQuery.get(5, TimeUnit.SECONDS);
+ if (status == null || ! status.isOK())
+ fail("Error in move-to-address: " + (status == null ? "Exception happened." : status.getMessage()));
+
+ updateSuspendedFrame(400);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunControlDMCSubclass.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunControlDMCSubclass.java
new file mode 100644
index 0000000..a48f69b
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/RunControlDMCSubclass.java
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.Stack;
+import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
+import org.eclipse.cdt.debug.edc.tests.TestReflectionHelper;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.tm.tcf.services.IRunControl;
+
+public class RunControlDMCSubclass extends BaseLaunchTest {
+
+ private static final String bareDMC_id = "testBareDeviceExcecutionDMC"; //$NON-NLS-1$
+ private static final String dbg_derived_types_cpp
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$
+ private static final String unitTestRCExeDMCContextException
+ = "unitTestRunControlExecutionDMCContextException"; //$NON-NLS-1$
+
+ private RunControl runControlService;
+ private Breakpoints breakpointsService;
+ private IStack stackService;
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ // used because the locations of certain line numbers are known,
+ // not because there's no hardcoded break
+ return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected IStack getStackService() {
+ return stackService;
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launch() throws Exception {
+ basicLaunch();
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+ Assert.assertNotNull(edcTracker);
+ runControlService = edcTracker.getService(RunControl.class);
+ Assert.assertNotNull(runControlService);
+ stackService = edcTracker.getService(Stack.class);
+ Assert.assertNotNull(stackService);
+ breakpointsService = edcTracker.getService(Breakpoints.class);
+ Assert.assertNotNull(breakpointsService);
+ }
+
+ @After
+ public void shutdown() {
+ threadDMC.purgeFromDebugger();
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ @Test
+ public void testBareDeviceExecutionDMC() throws Exception {
+ Map<String, Object> bdeDMCProps = new HashMap<String, Object>();
+ bdeDMCProps.put(RunControl.PROP_IS_CONTAINER, false);
+ bdeDMCProps.put(RunControl.BareDeviceExecutionDMC.PROP_ID, bareDMC_id);
+ RunControl.BareDeviceExecutionDMC bdeDMC
+ = runControlService.new BareDeviceExecutionDMC(threadDMC, bdeDMCProps, threadDMC.getTCFContext());
+ assertNotNull(bdeDMC);
+ assertTrue(bdeDMC.canDetach());
+
+ // DMCSuspendedEvent createSuspendedEvent(StateChangeReason reason, Map<String, Object> properties)
+ Map<String, Object> cseProps = new HashMap<String, Object>();
+ cseProps.put("cseKey1", "cseVal1");
+ cseProps.put("cseKey2", "cseVal2");
+ RunControl.StateChangeReason scr = RunControl.StateChangeReason.CONTAINER;
+ Object[] cseArgs = new Object[] {scr, cseProps};
+ Class<?>[] cseArgClasses = new Class<?>[] {scr.getClass(), Map.class};
+ RunControl.ContainerSuspendedEvent cse
+ = (RunControl.ContainerSuspendedEvent)TestReflectionHelper
+ .objectFromPrivateFunctionWithArgs(bdeDMC, "createSuspendedEvent",
+ cseArgs, cseArgClasses);
+ assertNotNull(cse);
+
+ Map<String, Object> cseParams = cse.getParams();
+ assertNotNull(cseParams);
+ Assert.assertEquals(cseProps, cseParams);
+
+ RunControl.IExecutionDMContext[] dmc = cse.getTriggeringContexts();
+ assertNotNull(dmc);
+ assertEquals(1, dmc.length);
+ Assert.assertEquals(bdeDMC, dmc[0]);
+
+ // protected DMCResumedEvent createResumedEvent()
+ RunControl.ContainerResumedEvent cre
+ = (RunControl.ContainerResumedEvent)TestReflectionHelper
+ .objectFromPrivateFunctionWithArgs(bdeDMC, "createResumedEvent", null);
+ assertNotNull(cre);
+
+ dmc = cre.getTriggeringContexts();
+ assertNotNull(dmc);
+ assertEquals(1, dmc.length);
+ Assert.assertEquals(bdeDMC, dmc[0]);
+ }
+
+ @Test
+ public void testExecutionDMCStepOut() throws Exception {
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 57);
+
+ // set this so it stops someplace, even if it's after the expected step out point
+ setTempBreakpoint(breakpointsService, dbg_derived_types_cpp, 288);
+
+ // public abstract class ExectionDMC { protected void stepOut(RequestMonitor) }
+
+ final Class<?>[] stepOutArgClasses = new Class<?>[] {RequestMonitor.class};
+ Query<IStatus> query = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ ExecutionDMC exeDMC = DMContexts.getAncestorOfType(threadDMC, ExecutionDMC.class);
+ Object[] stepOutArgs = new Object[] {drm};
+ try {
+ TestReflectionHelper.objectFromPrivateFunctionWithArgs(
+ exeDMC, ExecutionDMC.class, "stepOut", stepOutArgs, stepOutArgClasses);
+ } catch (InvocationTargetException ite) {
+ Throwable t = ite.getTargetException();
+ if ((t instanceof AssertionError)
+ && t.getMessage().equals(RunControl.STEP_RETURN_NOT_SUPPORTED)) {
+ drm.setData(new Status(IStatus.INFO, EDCDebugger.PLUGIN_ID,
+ RunControl.STEP_RETURN_NOT_SUPPORTED));
+ } else {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ "InvocationTargetException thrown invoking ExecutionDMC#stepOut() : "//$NON-NLS-1$
+ + ite.getLocalizedMessage()));
+ }
+ drm.done();
+ } catch (Exception e) {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ "exception thrown invoking ExecutionDMC#stepOut() : "//$NON-NLS-1$
+ + e.getLocalizedMessage()));
+ drm.done();
+ }
+ }
+ };
+
+ try {
+ session.getExecutor().execute(query);
+ } catch (Exception e) {
+ Assert.fail(e.getLocalizedMessage());
+ }
+
+ IStatus status = query.get(5, TimeUnit.SECONDS);
+ if (status != null) {
+ assertTrue(status.getSeverity() == IStatus.INFO);
+ assertEquals(RunControl.STEP_RETURN_NOT_SUPPORTED, status.getMessage());
+ } else {
+ updateSuspendedFrame(200);
+ assertControlIsAt("dbg_derived_types.cpp", "dbg_derived_types", 286);
+ }
+ }
+
+ @Test
+ public void testRootDMC() {
+ RunControl.RootExecutionDMC rootDMC = runControlService.getRootDMC();
+ assertNotNull(rootDMC);
+ assertNull(rootDMC.getSymbolDMContext());
+ assertFalse(rootDMC.canDetach());
+ assertFalse(rootDMC.canStep());
+ }
+
+ @Test
+ public void testThreadDMC() {
+ assertFalse(threadDMC.canDetach());
+ ExecutionDMC exeDMC = null;
+ try {
+ // first arg is a map of properties, but we expect an immediate assert
+ exeDMC = threadDMC.contextAdded(null, threadDMC.getTCFContext());
+ } catch (AssertionError ae) {
+ // this is expected
+ }
+ assertNull(exeDMC);
+ }
+
+ @Test
+ public void unitTestRunControlGetModelData() throws Exception {
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ runControlService.getModelData(threadDMC, drm);
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ query.get(2, TimeUnit.SECONDS);
+ assertTrue(query.isDone());
+ }
+
+ @Test
+ public void unitTestRunControlStepIntoOneInstruction() throws Exception {
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 285);
+
+ // private void stepOverOneInstruction(ExecutionDMC, IAddress, RequestMonitor)
+
+ final Class<?>[] stepIntoArgClasses = new Class<?>[] {ExecutionDMC.class, RequestMonitor.class};
+ Query<IStatus> query = new Query<IStatus>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStatus> drm) {
+ Object[] stepIntoArgs = new Object[] {threadDMC, drm};
+ try {
+ TestReflectionHelper.objectFromPrivateFunctionWithArgs(
+ runControlService, "stepIntoOneInstruction", stepIntoArgs, stepIntoArgClasses);
+ } catch (Exception e) {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ "exception thrown invoking RunControl#stepIntoOneInstruction()"//$NON-NLS-1$
+ + e.getLocalizedMessage()));
+ drm.done();
+ }
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ query.get(5, TimeUnit.SECONDS);
+ assertTrue(query.isDone());
+
+ updateSuspendedFrame(200);
+ assertControlIsAt("dbg_derived_types.cpp", "structs", 40);
+ }
+
+ @Test
+ public void unitTestRunControlStepOverOneInstruction() throws Exception {
+ waitRunToLine(runControlService, dbg_derived_types_cpp, 285);
+
+ final IAddress line285Addr = waitGetLineAddress(dbg_derived_types_cpp, 285);
+ final Class<?>[] stepOverArgClasses = new Class<?>[] {ExecutionDMC.class, IAddress.class, RequestMonitor.class};
+ // private void stepOverOneInstruction(ExecutionDMC, IAddress pcAddress, RequestMonitor)
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Boolean> drm) {
+ Object[] stepOverArgs = new Object[] {threadDMC, line285Addr, drm};
+ try {
+ TestReflectionHelper.objectFromPrivateFunctionWithArgs(
+ runControlService, "stepOverOneInstruction", stepOverArgs, stepOverArgClasses);
+ } catch (Exception e) {
+ drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ "exception thrown invoking RunControl#stepOverOneInstruction()"//$NON-NLS-1$
+ + e.getLocalizedMessage()));
+ drm.done();
+ }
+ }
+ };
+
+ session.getExecutor().execute(query);
+
+ query.get(5, TimeUnit.SECONDS);
+ assertTrue(query.isDone());
+
+ updateSuspendedFrame(100);
+ assertControlIsAt("dbg_derived_types.cpp", "dbg_derived_types", 286);
+ }
+
+ @Test
+ public void coverageRunControlGetSteppingStartTime() {
+ long steppingStartTime = RunControl.getSteppingStartTime();
+ if (RunControl.timeStepping()) {
+
+ } else {
+ assertEquals(0, steppingStartTime);
+ }
+ }
+
+ @Test
+ public void coverageRunControlRunListener() throws Exception {
+ IRunControl.RunControlListener runListener
+ = (IRunControl.RunControlListener)
+ TestReflectionHelper.getPrivateField("runListener", runControlService);
+
+ assertNotNull(runListener);
+
+ // the following will also test ExecutionDMC#contextException()
+ runListener.contextException(threadDMC.getID(), unitTestRCExeDMCContextException);
+ Thread.sleep(400); // wait a little for the exception to propagate
+ String propMessage = (String)threadDMC.getProperty(RunControl.PROP_MESSAGE);
+ assertEquals(unitTestRCExeDMCContextException, propMessage);
+
+ // the next 3 are empty and expected to do nothing
+ runListener.containerResumed(null);
+ runListener.containerSuspended(null, null, null, null, null);
+ runListener.contextChanged(null);
+
+ // resume our thread
+ assertTrue(threadDMC.isSuspended());
+ runListener.contextResumed(threadDMC.getID());
+ Thread.sleep(400); // wait a little for it to get re-started
+ assertFalse(threadDMC.isSuspended());
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SimpleDebuggerTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SimpleDebuggerTest.java
index e6f8bde..ed04436 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SimpleDebuggerTest.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SimpleDebuggerTest.java
@@ -1,95 +1,110 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-
-public abstract class SimpleDebuggerTest {
-
- protected DsfSession session;
- protected ExecutionDMC threadDMC;
- protected IFrameDMContext frame;
- protected Expressions expressionsService;
- protected EDCLaunch launch;
-
- /** Get the id the launch configuation type used by the snapshot, when it
- * might not be available at runtime. If non-<code>null</code>, your test should
- * check launch != <code>null</code> before continuing.
- * @return launchConfigurationType id, or null if the snapshot uses a standard CDT EDC launcher */
- protected String getRequiredLaunchConfigurationType() {
- return null;
- }
-
- /** Get the id (class name) the TCF agent launcher used by the snapshot, when it
- * might not be available at runtime. If non-<code>null</code>, your test should
- * check launch != <code>null</code> before continuing.
- * @return org.eclipse.debug.edc.tcfAgentLauncher id, or null if the snapshot uses a host CDT EDC launcher */
- protected String getRequiredTCFAgentLauncher() {
- return null;
- }
-
- @Before
- public void launchAndWaitForSuspendedContext() throws Exception {
- String reqdLauncher = getRequiredLaunchConfigurationType();
- if (reqdLauncher != null) {
- if (!TestUtils.hasLaunchConfiguationType(reqdLauncher)) {
- return;
- }
- }
- reqdLauncher = getRequiredTCFAgentLauncher();
- if (reqdLauncher != null) {
- if (!TestUtils.hasTCFAgentLauncher(reqdLauncher)) {
- return;
- }
- }
- launch = TestUtils.createLaunchForAlbum(getAlbumName());
- Assert.assertNotNull(launch);
- session = TestUtils.waitForSession(launch);
- Assert.assertNotNull(session);
- IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
- Assert.assertNotNull(executionDMC);
- threadDMC = TestUtils.waitForSuspendedThread(session);
- Assert.assertNotNull(threadDMC);
- frame = TestUtils.waitForStackFrame(session, threadDMC);
- }
-
- @After
- public void shutdown() {
- TestUtils.shutdownDebugSession(launch, session);
- session = null;
- }
-
- public void openSnapshotAndWaitForSuspendedContext(int index) throws Exception {
- launch.getAlbum().openSnapshot(index);
- session = TestUtils.waitForSession(launch);
- Assert.assertNotNull(session);
- IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
- Assert.assertNotNull(executionDMC);
- threadDMC = TestUtils.waitForSuspendedThread(session);
- Assert.assertNotNull(threadDMC);
- frame = TestUtils.waitForStackFrame(session, threadDMC);
- }
-
- abstract public String getAlbumName();
-
- public String getExpressionValue(String expression) throws Exception {
- return TestUtils.getExpressionValue(session, frame, expression);
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
+import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+
+public abstract class SimpleDebuggerTest {
+
+ protected DsfSession session;
+ protected ExecutionDMC threadDMC;
+ protected IFrameDMContext frame;
+ protected Expressions expressionsService;
+ protected EDCLaunch launch;
+ private EDCServicesTracker edcTracker;
+
+ /** Get the id the launch configuation type used by the snapshot, when it
+ * might not be available at runtime. If non-<code>null</code>, your test should
+ * check launch != <code>null</code> before continuing.
+ * @return launchConfigurationType id, or null if the snapshot uses a standard CDT EDC launcher */
+ protected String getRequiredLaunchConfigurationType() {
+ return null;
+ }
+
+ /** Get the id (class name) the TCF agent launcher used by the snapshot, when it
+ * might not be available at runtime. If non-<code>null</code>, your test should
+ * check launch != <code>null</code> before continuing.
+ * @return org.eclipse.debug.edc.tcfAgentLauncher id, or null if the snapshot uses a host CDT EDC launcher */
+ protected String getRequiredTCFAgentLauncher() {
+ return null;
+ }
+
+ @Before
+ public void launchAndWaitForSuspendedContext() throws Exception {
+ String reqdLauncher = getRequiredLaunchConfigurationType();
+ if (reqdLauncher != null) {
+ if (!TestUtils.hasLaunchConfiguationType(reqdLauncher)) {
+ return;
+ }
+ }
+ reqdLauncher = getRequiredTCFAgentLauncher();
+ if (reqdLauncher != null) {
+ if (!TestUtils.hasTCFAgentLauncher(reqdLauncher)) {
+ return;
+ }
+ }
+ TestUtils.showDebugPerspective();
+ TestUtils.showView("org.eclipse.cdt.debug.edc.TraceView");
+
+ launch = TestUtils.createLaunchForAlbum(getAlbumName());
+ Assert.assertNotNull(launch);
+ session = TestUtils.waitForSession(launch);
+ Assert.assertNotNull(session);
+ edcTracker = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+
+ IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
+ Assert.assertNotNull(executionDMC);
+ threadDMC = TestUtils.waitForSuspendedThread(session);
+ Assert.assertNotNull(threadDMC);
+ frame = TestUtils.waitForStackFrame(session, threadDMC);
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ public void openSnapshotAndWaitForSuspendedContext(int index) throws Exception {
+ launch.getAlbum().openSnapshot(index);
+
+ session = TestUtils.waitForSession(launch);
+ Assert.assertNotNull(session);
+ edcTracker = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+
+ IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
+ Assert.assertNotNull(executionDMC);
+ threadDMC = TestUtils.waitForSuspendedThread(session);
+ Assert.assertNotNull(threadDMC);
+ frame = TestUtils.waitForStackFrame(session, threadDMC);
+ }
+
+ public EDCServicesTracker getEdcServiceTracker() {
+ return edcTracker;
+ }
+
+ abstract public String getAlbumName();
+
+ public String getExpressionValue(String expression) throws Exception {
+ return TestUtils.getExpressionValue(session, frame, expression);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SnapshotTests.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SnapshotTests.java
index bd559db..db86f23 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SnapshotTests.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/SnapshotTests.java
@@ -1,252 +1,253 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.debugger.tests;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.cdt.debug.edc.internal.HostOS;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.internal.snapshot.Album;
-import org.eclipse.cdt.debug.edc.internal.snapshot.ISnapshotAlbumEventListener;
-import org.eclipse.cdt.debug.edc.internal.snapshot.Snapshot;
-import org.eclipse.cdt.debug.edc.internal.snapshot.SnapshotUtils;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
-import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
-import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
-import org.eclipse.cdt.debug.edc.tests.TestUtils;
-import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
-import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.core.runtime.CoreException;
-import org.junit.Assert;
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-public class SnapshotTests extends BaseLaunchTest {
-
- private boolean testComplete;
-
- @Test
- public void testSnapshot() throws Exception {
- if (!HostOS.IS_WIN32)
- return;
- testComplete = false;
- TestUtils.showDebugPerspective();
- EDCLaunch launch = createLaunch();
- assertNotNull(launch);
- final DsfSession session = waitForSession(launch);
- assertNotNull(session);
- IEDCExecutionDMC executionDMC = waitForExecutionDMC(session);
- assertNotNull(executionDMC);
- ExecutionDMC threadDMC = TestUtils.waitForSuspendedThread(session);
- Assert.assertNotNull(threadDMC);
-
- Album.addSnapshotAlbumEventListener(new ISnapshotAlbumEventListener() {
-
- public void snapshotSessionEnded(Album album, DsfSession session) {}
-
- public void snapshotOpened(Snapshot snapshot) {}
-
- public void snapshotCreated(Album album, Snapshot snapshot,
- final DsfSession session, StackFrameDMC stackFrame) {
- assertTrue(album.isRecording());
- assertEquals(1, album.getSnapshots().size());
- try {
- assertAlbumStructureCorrect(album);
- } catch (Exception e) {
- EDCTestPlugin.logError(null, e);
- }
- final Snapshot snap = album.getSnapshots().get(0);
- assertNotNull(snap);
-
- session.getExecutor().execute(new DsfRunnable() {
-
- public void run() {
- snap.open(session); // parse snapshot data in album (.dsa)
- try {
- assertSnapshotStructureCorrect(snap);
- } catch (Exception e) {
- EDCTestPlugin.logError(null, e);
- }
- testComplete = true;
- }
- });
- }
- });
-
- Album.captureSnapshotForSession(session);
-
- TestUtils.wait(new Condition() {
-
- public boolean isConditionValid() {
- return testComplete;
- }
- });
-
- TestUtils.terminateLaunch(launch);
-
- }
-
- private void assertAlbumStructureCorrect(Album album) throws Exception {
- Document document = (Document) album.getAdapter(Document.class);
-
- assertNotNull(document);
- // find the snapshot meta data element
- NodeList nodeList = document.getElementsByTagName(Album.METADATA);
- assertEquals(1, nodeList.getLength());
-
- assertTrue(album.getLocation().toOSString().endsWith(".dsa"));
- assertEquals(0, album.getCurrentSnapshotIndex());
-
- }
-
- private void assertSnapshotStructureCorrect(Snapshot snapshot) throws Exception {
-
- assertTrue(snapshot.getCreationDate().length() > 0);
- assertTrue(snapshot.getSnapshotFileName().endsWith(".xml"));
-
- Document snapShotdocument = (Document) snapshot.getAdapter(Document.class);
- assertNotNull(snapShotdocument);
-
- // find the snapshot element
- NodeList nodeList = snapShotdocument.getElementsByTagName(Snapshot.SNAPSHOT);
- assertEquals(1, nodeList.getLength());
-
- Element snapshotElement = (Element) nodeList.item(0);
- // check nested execution contexts as list
- nodeList = snapshotElement.getElementsByTagName("execution_context");
- assertEquals(2, nodeList.getLength());
- // check properties of top-level execution context
- // (BlackFlagMinGW.exe)
- Element bfElement = (Element) nodeList.item(0);
- assertNotNull(bfElement.getAttribute("ID"));
- NodeList propsList = bfElement.getChildNodes();
-
- assertTrue(propsList.getLength() > 0);
-
- Element propElement = (Element) bfElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
- .item(0);
-
- Properties properties = createPropertiesFromElement(propElement);
- assertEquals("BlackFlagMinGW.exe", properties.get("Name"));
- assertEquals("root", properties.get("ParentID"));
- String mainExeContextID = (String) properties.get("ID");
-// TODO: CanResume is being set as a integer and not a boolean
-// assertEquals("true", properties.get("CanResume"));
- assertEquals(true, properties.get("CanSuspend"));
- assertEquals(true, properties.get("CanTerminate"));
- // check properties of second one (shared lib)
- Element slElement = (Element) nodeList.item(1);
-
- propElement = (Element) bfElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
- .item(1);
-
- properties = createPropertiesFromElement(propElement);
- assertTrue(properties.containsKey("Name"));
- assertTrue(properties.containsKey("OSID"));
- String subExecContextID = (String) properties.get("ID");
- assertEquals(mainExeContextID, properties.get("ParentID"));
-// TODO: CanResume is being set as a integer and not a boolean
-// assertEquals("true", properties.get("CanResume"));
- assertEquals(true, properties.get("CanSuspend"));
- assertEquals(true, properties.get("CanTerminate"));
-// assertEquals("Exception", properties.get("Message")); // This is sometimes "Exception" and sometimes "Shared Library"
- assertEquals(true, properties.get("State"));
-
- // check the registers
- nodeList = slElement.getElementsByTagName("execution_context_registers");
- assertEquals(1, nodeList.getLength());
- Element regGroupElement = (Element) slElement.getElementsByTagName("register_group")
- .item(0);
- assertEquals("register_group", regGroupElement.getTagName());
- String regGroupID = regGroupElement.getAttribute("ID");
- assertTrue("Wrong register group ID: " + regGroupID, regGroupID.equals("GPX") || regGroupID.contains("Basic"));
-
- propElement = (Element) regGroupElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
- .item(0);
-
- properties = createPropertiesFromElement(propElement);
- String name = (String)properties.get("Name");
- assertTrue("Wrong register group name: " + name, name.equals("General") || name.contains("Basic"));
- assertEquals(subExecContextID, properties.get("Context_ID"));
- assertX86RegisterValuesOk(regGroupElement, subExecContextID);
-
- // check the modules
- nodeList = snapshotElement.getElementsByTagName("execution_context_modules");
- assertEquals(1, nodeList.getLength());
- Element moduleE = (Element) nodeList.item(0);
- Element stackFrameElement = (Element) moduleE.getElementsByTagName(SnapshotUtils.PROPERTIES)
- .item(0);
-
- properties = createPropertiesFromElement(stackFrameElement);
- assertTrue(properties.containsKey("File"));
- assertTrue(properties.containsKey("Loaded"));
- assertTrue(properties.containsKey("ImageBaseAddress"));
- assertTrue(properties.containsKey("CodeSize"));
-
- }
-
- private void assertX86RegisterValuesOk(Element regGroupElement, String execContextID) {
- NodeList registerNodes = regGroupElement.getElementsByTagName("register");
- assertEquals(16, registerNodes.getLength());
- Set<String> registerNames = new HashSet<String>();
- for (int i = 0; i < registerNodes.getLength(); i++) {
- Element register = (Element) registerNodes.item(i);
- String id = register.getAttribute("ID");
- Node propertiesNode = register.getFirstChild();
- assertNotNull(propertiesNode);
-
- Element propElement = (Element) regGroupElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
- .item(i+1);
-
- Properties properties = createPropertiesFromElement(propElement);
- String name = (String)properties.get("Name");
- assertEquals(id, properties.get("ID"));
- assertEquals(execContextID, properties.get("Context_ID"));
- registerNames.add(name);
- }
- String[] registerNameVals = new String[] { "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "GS", "FS",
- "ES", "DS", "EIP", "CS", "EFL", "SS" };
- Set<String> expectedRegisterIds = new HashSet<String>(Arrays.asList(registerNameVals));
- assertEquals(expectedRegisterIds, registerNames);
- }
-
- private Properties createPropertiesFromElement(Element propertyElement) {
- Properties properties = new Properties();
- HashMap<String, Object> propMap = new HashMap<String, Object>();
- try {
- SnapshotUtils.initializeFromXML(propertyElement, propMap);
- } catch (CoreException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- Iterator<?> it = propMap.entrySet().iterator();
- while (it.hasNext()){
- Map.Entry<?,?> pairs = (Map.Entry<?,?>)it.next();
- //System.out.println(pairs.getKey() + " = " + pairs.getValue());
- properties.put(pairs.getKey(), pairs.getValue());
- }
-
- return properties;
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.cdt.debug.edc.internal.HostOS;
+import org.eclipse.cdt.debug.edc.internal.snapshot.Album;
+import org.eclipse.cdt.debug.edc.internal.snapshot.ISnapshotAlbumEventListener;
+import org.eclipse.cdt.debug.edc.internal.snapshot.Snapshot;
+import org.eclipse.cdt.debug.edc.internal.snapshot.SnapshotUtils;
+import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
+import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.debug.edc.tests.TestUtils.Condition;
+import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class SnapshotTests extends BaseLaunchTest {
+
+ private boolean testComplete;
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void launchAndWait() throws Exception {
+ if (!HostOS.IS_WIN32)
+ return;
+ basicLaunch();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ @Test
+ public void testSnapshot() throws Exception {
+ testComplete = false;
+ Album.addSnapshotAlbumEventListener(new ISnapshotAlbumEventListener() {
+
+ public void snapshotSessionEnded(Album album, DsfSession session) {}
+
+ public void snapshotOpened(Snapshot snapshot) {}
+
+ public void snapshotCreated(Album album, Snapshot snapshot,
+ final DsfSession session, StackFrameDMC stackFrame) {
+ assertTrue(album.isRecording());
+ assertEquals(1, album.getSnapshots().size());
+ try {
+ assertAlbumStructureCorrect(album);
+ } catch (Exception e) {
+ EDCTestPlugin.logError(null, e);
+ }
+ final Snapshot snap = album.getSnapshots().get(0);
+ assertNotNull(snap);
+
+ session.getExecutor().execute(new DsfRunnable() {
+
+ public void run() {
+ snap.open(session); // parse snapshot data in album (.dsa)
+ try {
+ assertSnapshotStructureCorrect(snap);
+ } catch (Exception e) {
+ EDCTestPlugin.logError(null, e);
+ }
+ testComplete = true;
+ }
+ });
+ }
+ });
+
+ Album.captureSnapshotForSession(session);
+
+ TestUtils.wait(new Condition() {
+
+ public boolean isConditionValid() {
+ return testComplete;
+ }
+ });
+ }
+
+ private void assertAlbumStructureCorrect(Album album) throws Exception {
+ Document document = (Document) album.getAdapter(Document.class);
+
+ assertNotNull(document);
+ // find the snapshot meta data element
+ NodeList nodeList = document.getElementsByTagName(Album.METADATA);
+ assertEquals(1, nodeList.getLength());
+
+ assertTrue(album.getLocation().toOSString().endsWith(".dsa"));
+ assertEquals(0, album.getCurrentSnapshotIndex());
+
+ }
+
+ private void assertSnapshotStructureCorrect(Snapshot snapshot) throws Exception {
+
+ assertTrue(snapshot.getCreationDate().length() > 0);
+ assertTrue(snapshot.getSnapshotFileName().endsWith(".xml"));
+
+ Document snapShotdocument = (Document) snapshot.getAdapter(Document.class);
+ assertNotNull(snapShotdocument);
+
+ // find the snapshot element
+ NodeList nodeList = snapShotdocument.getElementsByTagName(Snapshot.SNAPSHOT);
+ assertEquals(1, nodeList.getLength());
+
+ Element snapshotElement = (Element) nodeList.item(0);
+ // check nested execution contexts as list
+ nodeList = snapshotElement.getElementsByTagName("execution_context");
+ assertEquals(2, nodeList.getLength());
+ // check properties of top-level execution context
+ // (BlackFlagMinGW.exe)
+ Element bfElement = (Element) nodeList.item(0);
+ assertNotNull(bfElement.getAttribute("ID"));
+ NodeList propsList = bfElement.getChildNodes();
+
+ assertTrue(propsList.getLength() > 0);
+
+ Element propElement = (Element) bfElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
+ .item(0);
+
+ Properties properties = createPropertiesFromElement(propElement);
+ assertEquals("BlackFlagMinGW.exe", properties.get("Name"));
+ assertEquals("root", properties.get("ParentID"));
+ String mainExeContextID = (String) properties.get("ID");
+// TODO: CanResume is being set as a integer and not a boolean
+// assertEquals("true", properties.get("CanResume"));
+ assertEquals(true, properties.get("CanSuspend"));
+ assertEquals(true, properties.get("CanTerminate"));
+ // check properties of second one (shared lib)
+ Element slElement = (Element) nodeList.item(1);
+
+ propElement = (Element) bfElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
+ .item(1);
+
+ properties = createPropertiesFromElement(propElement);
+ assertTrue(properties.containsKey("Name"));
+ assertTrue(properties.containsKey("OSID"));
+ String subExecContextID = (String) properties.get("ID");
+ assertEquals(mainExeContextID, properties.get("ParentID"));
+// TODO: CanResume is being set as a integer and not a boolean
+// assertEquals("true", properties.get("CanResume"));
+ assertEquals(true, properties.get("CanSuspend"));
+ assertEquals(true, properties.get("CanTerminate"));
+// assertEquals("Exception", properties.get("Message")); // This is sometimes "Exception" and sometimes "Shared Library"
+ assertEquals(true, properties.get("State"));
+
+ // check the registers
+ nodeList = slElement.getElementsByTagName("execution_context_registers");
+ assertEquals(1, nodeList.getLength());
+ Element regGroupElement = (Element) slElement.getElementsByTagName("register_group")
+ .item(0);
+ assertEquals("register_group", regGroupElement.getTagName());
+ String regGroupID = regGroupElement.getAttribute("ID");
+ assertTrue("Wrong register group ID: " + regGroupID, regGroupID.equals("GPX") || regGroupID.contains("Basic"));
+
+ propElement = (Element) regGroupElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
+ .item(0);
+
+ properties = createPropertiesFromElement(propElement);
+ String name = (String)properties.get("Name");
+ assertTrue("Wrong register group name: " + name, name.equals("General") || name.contains("Basic"));
+ assertEquals(subExecContextID, properties.get("Context_ID"));
+ assertX86RegisterValuesOk(regGroupElement, subExecContextID);
+
+ // check the modules
+ nodeList = snapshotElement.getElementsByTagName("execution_context_modules");
+ assertEquals(1, nodeList.getLength());
+ Element moduleE = (Element) nodeList.item(0);
+ Element stackFrameElement = (Element) moduleE.getElementsByTagName(SnapshotUtils.PROPERTIES)
+ .item(0);
+
+ properties = createPropertiesFromElement(stackFrameElement);
+ assertTrue(properties.containsKey("File"));
+ assertTrue(properties.containsKey("Loaded"));
+ assertTrue(properties.containsKey("ImageBaseAddress"));
+ assertTrue(properties.containsKey("CodeSize"));
+
+ }
+
+ private void assertX86RegisterValuesOk(Element regGroupElement, String execContextID) {
+ NodeList registerNodes = regGroupElement.getElementsByTagName("register");
+ assertEquals(16, registerNodes.getLength());
+ Set<String> registerNames = new HashSet<String>();
+ for (int i = 0; i < registerNodes.getLength(); i++) {
+ Element register = (Element) registerNodes.item(i);
+ String id = register.getAttribute("ID");
+ Node propertiesNode = register.getFirstChild();
+ assertNotNull(propertiesNode);
+
+ Element propElement = (Element) regGroupElement.getElementsByTagName(SnapshotUtils.PROPERTIES)
+ .item(i+1);
+
+ Properties properties = createPropertiesFromElement(propElement);
+ String name = (String)properties.get("Name");
+ assertEquals(id, properties.get("ID"));
+ assertEquals(execContextID, properties.get("Context_ID"));
+ registerNames.add(name);
+ }
+ String[] registerNameVals = new String[] { "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "GS", "FS",
+ "ES", "DS", "EIP", "CS", "EFL", "SS" };
+ Set<String> expectedRegisterIds = new HashSet<String>(Arrays.asList(registerNameVals));
+ assertEquals(expectedRegisterIds, registerNames);
+ }
+
+ private Properties createPropertiesFromElement(Element propertyElement) {
+ Properties properties = new Properties();
+ HashMap<String, Object> propMap = new HashMap<String, Object>();
+ try {
+ SnapshotUtils.initializeFromXML(propertyElement, propMap);
+ } catch (CoreException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ Iterator<?> it = propMap.entrySet().iterator();
+ while (it.hasNext()){
+ Map.Entry<?,?> pairs = (Map.Entry<?,?>)it.next();
+ //System.out.println(pairs.getKey() + " = " + pairs.getValue());
+ properties.put(pairs.getKey(), pairs.getValue());
+ }
+
+ return properties;
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/StackService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/StackService.java
new file mode 100644
index 0000000..fa7033c
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/StackService.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.math.BigInteger;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.IFrameRegisters;
+import org.eclipse.cdt.debug.edc.services.Stack;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.debug.service.IRunControl2;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Status;
+
+public class StackService {
+
+ final static private String dbg_derived_types_cpp
+ = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp";
+ static final int sLineNumber = 57; // line in above source file.
+
+ private static EDCServicesTracker edcTracker;
+ private static Stack stackService;
+
+ private static class StackServiceLaunch extends BaseLaunchTest {
+
+ @Override
+ protected String getExeFileName() {
+ // This is the executable built by Cygwin gcc 3.4.4
+ // All source files are built from this folder:
+ // "C:\\myprog\\BlackFlagWascana\\src\\"
+ // Note we don't need any source file to perform the test.
+ //
+ return "BlackFlagMinGW_NoHardcodedBreak.exe";
+ }
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Override
+ protected IStack getStackService() {
+ if (stackService == null) {
+ EDCServicesTracker edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
+ stackService = edcTracker.getService(Stack.class);
+ Assert.assertNotNull(stackService);
+ }
+ return stackService;
+ }
+ }
+
+ private static StackServiceLaunch testLaunch;
+
+ @BeforeClass
+ public static void launch() throws Exception {
+ testLaunch = new StackServiceLaunch();
+ testLaunch.basicLaunch();
+ edcTracker
+ = new EDCServicesTracker(EDCDebugger.getBundleContext(), testLaunch.session.getId());
+ stackService = edcTracker.getService(Stack.class);
+ Assert.assertNotNull(stackService);
+ }
+
+ @AfterClass
+ public static void shutdown() {
+ TestUtils.shutdownDebugSession(testLaunch.launch, testLaunch.session);
+ testLaunch = null;
+ }
+
+ @Test
+ /**
+ * comments in Stack.getArguments() says it's never
+ * called and that Dsf expects args in with locals,
+ * so this is a "coverage" test only (and will cover
+ * the case where getArguments() starts returning
+ * something.
+ */
+ public void coverageGetArguments() throws Exception {
+ Query<IStack.IVariableDMContext[]> query = new Query<IStack.IVariableDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IVariableDMContext[]> drm) {
+ stackService.getArguments(testLaunch.frame, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ IStack.IVariableDMContext[] argsShouldBeNull = query.get(5, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNull(argsShouldBeNull);
+ }
+
+ @Test
+ public void testGetFrameData() throws Exception {
+ Query<IStack.IFrameDMData> query = new Query<IStack.IFrameDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IFrameDMData> drm) {
+ stackService.getModelData(testLaunch.frame, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ IStack.IFrameDMData frameData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertNotNull(frameData);
+ Assert.assertTrue(frameData instanceof Stack.StackFrameData);
+ Stack.StackFrameData stackData = (Stack.StackFrameData)frameData;
+ Assert.assertEquals(0, stackData.getLevel());
+
+ query = new Query<IStack.IFrameDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IFrameDMData> drm) {
+ stackService.getFrameData(testLaunch.frame, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ frameData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(frameData instanceof Stack.StackFrameData);
+ Assert.assertTrue(stackData.equals(frameData));
+ }
+
+ @Test
+ public void testAlwaysFailingFrameRegisters() {
+ Stack.AlwaysFailingFrameRegisters regs
+ = new Stack.AlwaysFailingFrameRegisters(new CoreException(Status.OK_STATUS));
+ Assert.assertNotNull(regs);
+ try {
+ regs.getRegister(0, 0);
+ Assert.fail("AlwaysFailingFrameRegisters.readRegister() did not throw exception; should have thrown CoreException");
+ } catch (CoreException ce) {
+ Assert.assertSame(Status.OK_STATUS, ce.getStatus());
+ } catch (Exception e) {
+ Assert.fail("AlwaysFailingFrameRegisters.readRegister() should have thrown CoreException;"
+ + " instead threw exception with message" + e.getMessage());
+ }
+ try {
+ regs.writeRegister(0, 0, null);
+ Assert.fail("AlwaysFailingFrameRegisters.writeRegister() should have thrown CoreException");
+ } catch (CoreException ce) {
+ Assert.assertSame("Expecting CoreException with OK_STATUS", Status.OK_STATUS, ce.getStatus());
+ } catch (Exception e) {
+ Assert.fail("AlwaysFailingFrameRegisters.writeRegister() should have thrown CoreException;"
+ + " instead threw exception with message" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testPreservedFrameRegisters () {
+ IStack.IFrameDMContext[] frames;
+ try {
+ frames = stackService.getFramesForDMC(testLaunch.threadDMC, 0, IStack.ALL_FRAMES);
+ Assert.assertNotNull(frames);
+ Assert.assertEquals("Checking number of frames", 4, frames.length);
+ Assert.assertTrue("Expected frame[0] would be instanceof StackFrameDMC",
+ frames[0] instanceof Stack.StackFrameDMC);
+ Assert.assertTrue("Expected frame[3] would be instanceof StackFrameDMC",
+ frames[3] instanceof Stack.StackFrameDMC);
+ Stack.StackFrameDMC frame0 = (Stack.StackFrameDMC)frames[0];
+ Stack.StackFrameDMC frame3 = (Stack.StackFrameDMC)frames[3];
+ Assert.assertEquals("Expected frame0 would be equal testLaunch.frame",
+ 0, frame0.compareTo((Stack.StackFrameDMC)testLaunch.frame));
+ Assert.assertEquals("Expected frame0 would be 'greater than' testLaunch.frame",
+ 1, frame3.compareTo((Stack.StackFrameDMC)testLaunch.frame));
+ IFrameRegisters frame3Regs = frame3.getFrameRegisters();
+ Assert.assertTrue("Expected frame1 regs would be instanceof PreservedFrameRegisters",
+ frame3Regs instanceof Stack.PreservedFrameRegisters);
+ BigInteger r5 = frame3Regs.getRegister(5, 4);
+ frame3Regs.writeRegister(5, 4, r5.add(BigInteger.ONE));
+ Thread.sleep(400); // allow write to memory to finish
+ Assert.assertEquals(r5.intValue()+1, frame3Regs.getRegister(5, 4).intValue());
+
+ frame3Regs.writeRegister(5, 4, r5); // put it back the way it was
+ } catch (Exception e) {
+ Assert.fail(e.getMessage());
+ }
+ }
+
+// @Test
+// public void testStackFrameDMCFindEnumeratorByName () {
+// // TODO no enumerators in this stack
+// // need to create an example with IEnumerators
+// }
+
+ @Test
+ public void testVariableData () throws Exception {
+ testLaunch.waitRunToLine(edcTracker.getService(IRunControl2.class),
+ dbg_derived_types_cpp, sLineNumber, 800); // 800ms to wait for run
+ TestUtils.waitForUIUpdate(1500); // 1500ms to wait for UI update
+ Assert.assertTrue(testLaunch.frame instanceof Stack.StackFrameDMC);
+ Query<IStack.IVariableDMContext[]> localsQuery = new Query<IStack.IVariableDMContext[]>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IVariableDMContext[]> drm) {
+ stackService.getLocals(testLaunch.frame, drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(localsQuery);
+
+ final IStack.IVariableDMContext[] locals = localsQuery.get(5, TimeUnit.SECONDS);
+ Assert.assertTrue(localsQuery.isDone());
+ Assert.assertEquals(3, locals.length);
+ Query<IStack.IVariableDMData> query = new Query<IStack.IVariableDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
+ stackService.getVariableData(locals[0], drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ IStack.IVariableDMData varData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(varData instanceof Stack.VariableData);
+ Stack.VariableData var0 = (Stack.VariableData)varData;
+ Assert.assertEquals("i", var0.getName());
+// TODO getValue() currently returns null
+// if/when it is finally impelemnted, uncomment this
+// and remove the Assert.assertNull() on the following line
+// Assert.assertEquals("0", var0.getValue());
+ Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
+ var0.getValue());
+
+ query = new Query<IStack.IVariableDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
+ stackService.getVariableData(locals[1], drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ varData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(varData instanceof Stack.VariableData);
+ Stack.VariableData var1 = (Stack.VariableData)varData;
+ Assert.assertEquals("lstruct", var1.getName());
+// TODO getValue() currently returns null
+// if/when it is finally impelemnted, uncomment this
+// and remove the Assert.assertNull() on the following line
+// Assert.assertEquals("0x22feb0", var1.getValue());
+ Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
+ var1.getValue());
+
+ query = new Query<IStack.IVariableDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
+ stackService.getVariableData(locals[2], drm);
+ }
+ };
+ testLaunch.session.getExecutor().execute(query);
+
+ varData = query.get(2, TimeUnit.SECONDS);
+ Assert.assertTrue(query.isDone());
+ Assert.assertTrue(varData instanceof Stack.VariableData);
+ Stack.VariableData var2 = (Stack.VariableData)varData;
+ Assert.assertEquals("lnested_struct", var2.getName());
+// TODO getValue() currently returns null
+// if/when it is finally impelemnted, uncomment this
+// and remove the Assert.assertNull() on the following line
+// Assert.assertEquals("0x22fa60", var2.getValue());
+ Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
+ var2.getValue());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/TestTraceView.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/TestTraceView.java
new file mode 100644
index 0000000..c1a226d
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/TestTraceView.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import junit.framework.Assert;
+
+import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestTraceView extends BaseLaunchTest {
+
+ @Override
+ protected boolean getStopAtMain() {
+ return true;
+ }
+
+ @Before
+ public void setup() throws Exception {
+ TestUtils.showDebugPerspective();
+ }
+
+ @After
+ public void shutdown() {
+ TestUtils.shutdownDebugSession(launch, session);
+ session = null;
+ }
+
+ @Test
+ public void testTraceView() throws Exception {
+ TestUtils.showView("org.eclipse.cdt.debug.edc.TraceView");
+
+ launch = createLaunch();
+ assertNotNull(launch);
+ session = waitForSession(launch);
+ assertNotNull(session);
+ IEDCExecutionDMC executionDMC = TestUtils.waitForExecutionDMC(session);
+ assertNotNull(executionDMC);
+ threadDMC = TestUtils.waitForSuspendedThread(session);
+ Assert.assertNotNull(threadDMC);
+ frame = TestUtils.waitForStackFrame(session, threadDMC);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/VariableLocationTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/VariableLocationTest.java
new file mode 100644
index 0000000..1fe9751
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/debugger/tests/VariableLocationTest.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. June, 2011
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.debugger.tests;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
+import org.eclipse.cdt.debug.edc.symbols.IInvalidVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.IRegisterOffsetVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.IRegisterVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.IValueVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.IVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.VariableLocationFactory;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test various VariableLocations.
+ */
+public class VariableLocationTest extends SimpleDebuggerTest {
+
+
+ boolean formatterSetting;
+
+ @Before
+ public void turnOnFormatter() {
+ formatterSetting = FormatExtensionManager.instance().isEnabled();
+ FormatExtensionManager.instance().setEnabled(true);
+ }
+ @After
+ public void restoreFormatter() {
+ FormatExtensionManager.instance().setEnabled(formatterSetting);
+ }
+
+
+ /*
+ * Control should stop at a location in the snapshot launch.
+ */
+ @Test
+ public void testRegisterVariableLocation() throws Exception {
+
+ // create an artificial RegisterVariableLocation.
+ IRegisterVariableLocation loc = VariableLocationFactory.createRegisterVariableLocation(getEdcServiceTracker(), frame, 0);
+
+ IAddress addr = loc.getAddress();
+ Assert.assertNull(addr); // no addr for register location
+
+ String str = loc.getRegisterName();
+ Assert.assertEquals("EAX", str);
+
+ // This is the register value of "EAX"
+ BigInteger val = loc.readValue(4);
+ Assert.assertEquals(0x425e3333, val.intValue());
+
+ /* Hmm, this is asynchronous write. */
+ loc.writeValue(4, BigInteger.valueOf(0x10));
+ Thread.sleep(1000);
+ val = loc.readValue(4);
+ Assert.assertEquals(0x10, val.intValue());
+
+ IVariableLocation loc2 = loc.addOffset(0x10);
+ Assert.assertTrue(loc2 instanceof IRegisterOffsetVariableLocation);
+ IRegisterOffsetVariableLocation rovLoc = (IRegisterOffsetVariableLocation)loc2;
+ addr = rovLoc.getAddress();
+ Assert.assertNull(addr);
+
+ val = rovLoc.readValue(4);
+ Assert.assertEquals(0x20, val.intValue());
+ Assert.assertEquals("0x20", rovLoc.getLocationName());
+
+ Assert.assertEquals("EAX + 16", rovLoc.toString());
+
+ Assert.assertEquals(0x10, rovLoc.getOffset());
+
+ // Add more "offset"
+ //
+ loc2 = rovLoc.addOffset(0x10);
+ Assert.assertTrue(loc2 instanceof IRegisterOffsetVariableLocation);
+ rovLoc = (IRegisterOffsetVariableLocation)loc2;
+ Assert.assertEquals(0x30, rovLoc.readValue(4).intValue());
+ Assert.assertEquals("EAX + 32", rovLoc.toString());
+ }
+
+ @Test
+ public void testValueVariableLocation() {
+
+ // create an artificial RegisterVariableLocation.
+ IValueVariableLocation loc = VariableLocationFactory.createValueVariableLocation(BigInteger.valueOf(0x1000));
+
+ String str = loc.toString();
+ Assert.assertEquals("0x1000", str);
+
+ BigInteger val;
+ try {
+ val = loc.readValue(4);
+ } catch (CoreException e) {
+ Assert.fail("readValue() failed.");
+ return;
+ }
+
+ Assert.assertEquals(0x1000, val.intValue());
+
+ IAddress addr = loc.getAddress();
+ Assert.assertNull(addr); // no addr
+
+ Assert.assertNull(loc.getServicesTracker());
+
+ Assert.assertEquals("", loc.getLocationName());
+
+ Assert.assertNull(loc.getContext());
+
+ /* this just throws exception. */
+ try {
+ loc.writeValue(4, BigInteger.valueOf(0x10));
+ Assert.fail("writeValue fails to throw exception.");
+ } catch (CoreException e) {
+ }
+
+ // Now addOffset to create a new location.
+ //
+ IVariableLocation loc2 = loc.addOffset(0x10);
+ Assert.assertTrue(loc2 instanceof IValueVariableLocation);
+ IValueVariableLocation vvLoc = (IValueVariableLocation)loc2;
+ addr = vvLoc.getAddress();
+ Assert.assertNull(addr);
+
+ try {
+ val = vvLoc.readValue(4);
+ } catch (CoreException e) {
+ Assert.fail("readValue() failed.");
+ return;
+ }
+ Assert.assertEquals(0x1010, val.intValue());
+ }
+
+ @Test
+ public void testInvalidVariableLocation() {
+
+ String msg = "testTrash";
+
+ // create an artificial RegisterVariableLocation.
+ IInvalidVariableLocation loc = VariableLocationFactory.createInvalidVariableLocation(msg);
+
+ String str = loc.toString();
+ Assert.assertTrue(str.contains(msg));
+
+ Assert.assertEquals(msg, loc.getMessage());
+
+ try {
+ loc.readValue(4);
+ Assert.fail("readValue() should fail but didn't.");
+ } catch (CoreException e) {
+ Assert.assertTrue(e.getMessage().contains(msg));
+ }
+
+ Assert.assertEquals("", loc.getLocationName());
+
+ Assert.assertNull(loc.getAddress()); // no addr
+
+ Assert.assertNull(loc.getContext());
+
+ Assert.assertNull(loc.getServicesTracker());
+
+ /* this just throws exception. */
+ try {
+ loc.writeValue(4, BigInteger.valueOf(0x10));
+ Assert.fail("writeValue() should fail but didn't.");
+ } catch (CoreException e) {
+ }
+
+ loc.setMessage("msg2");
+ loc.getMessage().equals("msg2");
+
+ // Now addOffset to create a new location.
+ //
+ IVariableLocation loc2 = loc.addOffset(0x10);
+ Assert.assertEquals(loc, loc2);
+ }
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsBasic.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/system/tests/K9SystemViewTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/system/tests/K9SystemViewTest.java
index 0b426ef..08ee07b 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/system/tests/K9SystemViewTest.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/system/tests/K9SystemViewTest.java
@@ -1,129 +1,134 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.system.tests;
-
-import java.util.List;
-
-import org.eclipse.cdt.debug.edc.internal.ui.views.SystemDMContainer;
-import org.eclipse.cdt.debug.edc.internal.ui.views.SystemVMContainer;
-import org.eclipse.cdt.debug.edc.internal.ui.views.SystemViewInput;
-import org.eclipse.cdt.debug.edc.system.tests.K9SystemView.K9ViewModel;
-import org.eclipse.cdt.internal.ui.util.StringMatcher;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-@SuppressWarnings("restriction")
-public class K9SystemViewTest {
-
- K9SystemView k9View;
-
- @Before
- public void setUp() throws Exception {
- PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
- public void run() {
- // Open the K9 System View
- IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
- try {
- k9View = (K9SystemView)page.showView(K9SystemView.VIEW_ID);
- } catch (PartInitException e) {
- Assert.fail(e.getMessage());
- }
- Assert.assertNotNull("Can't open K9 System View", k9View != null);
- }
- });
- }
-
- @Test
- public void testCreatePartControl() {
- List<TreeModelViewer> k9Viewers = k9View.getViewers();
- List<SystemVMContainer> rootContainers = k9View.getViewModel().getRootContainers();
- for (int i = 0; i < rootContainers.size(); i++) {
- Assert.assertTrue(k9Viewers.get(i).getInput() instanceof SystemViewInput);
- Assert.assertEquals(rootContainers.get(i), ((SystemViewInput)k9Viewers.get(i).getInput()).getContainer());
- }
- }
-
- @Test
- public void testRefresh() throws InterruptedException {
- SystemDMContainer oldDogs = k9View.getAllDogs();
- k9View.getRefreshJob().schedule();
- k9View.getRefreshJob().join();
- Assert.assertNotSame(oldDogs, k9View.getAllDogs());
- }
-
- @Test
- public void testGetOverviewVMContainer() {
- Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getOverviewVMContainer());
- }
-
- @Test
- public void testGetBreedsVMContainer() {
- Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getBreedsVMContainer());
- }
-
- @Test
- public void testGetDogsVMContainer() {
- Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getDogsVMContainer());
- }
-
- @Test
- public void testGetToysVMContainer() {
- Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getToysVMContainer());
- }
-
- @Test
- public void testGetPresentationContext() {
- Assert.assertNotNull(k9View.getPresentationContext());
- }
-
- @Test
- public void testSetRefreshInterval() {
- int interval = k9View.getRefreshInterval();
- k9View.setRefreshInterval(8000);
- Assert.assertEquals(8000, k9View.getRefreshInterval());
- k9View.setRefreshInterval(interval);
- }
-
- @Test
- public void testGetRefreshInterval() {
- Assert.assertEquals(5000, k9View.getRefreshInterval());
- }
-
- @Test
- public void testGetRefreshjob() {
- Assert.assertNotNull(k9View.getRefreshJob());
- }
-
- @Test
- public void testGetFilterMatcher() {
- StringMatcher matcher = k9View.getFilterMatcher();
- Assert.assertTrue(matcher.match("Indy"));
- }
-
- @Test
- public void testCreateRefreshAction() {
- IActionBars bars = k9View.getViewSite().getActionBars();
- Assert.assertNotNull(bars.getToolBarManager().find("SYSTEM_REFRESH"));
- }
-
- @Test
- public void testContributeToActionBars() {
- IActionBars bars = k9View.getViewSite().getActionBars();
- Assert.assertNotNull(bars.getMenuManager().find("SYSTEM_REFRESH"));
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.system.tests;
+
+import java.util.List;
+
+import org.eclipse.cdt.debug.edc.internal.ui.views.SystemDMContainer;
+import org.eclipse.cdt.debug.edc.internal.ui.views.SystemRefreshOptionsDialog;
+import org.eclipse.cdt.debug.edc.internal.ui.views.SystemVMContainer;
+import org.eclipse.cdt.debug.edc.internal.ui.views.SystemViewInput;
+import org.eclipse.cdt.debug.edc.system.tests.K9SystemView.K9ViewModel;
+import org.eclipse.cdt.debug.edc.tests.TestUtils;
+import org.eclipse.cdt.internal.ui.util.StringMatcher;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.PlatformUI;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+@SuppressWarnings("restriction")
+public class K9SystemViewTest {
+
+ K9SystemView k9View;
+
+ @Before
+ public void setUp() throws Exception {
+ k9View = (K9SystemView) TestUtils.showView(K9SystemView.VIEW_ID);
+ }
+
+ @Test
+ public void testCreatePartControl() {
+ List<TreeModelViewer> k9Viewers = k9View.getViewers();
+ List<SystemVMContainer> rootContainers = k9View.getViewModel().getRootContainers();
+ for (int i = 0; i < rootContainers.size(); i++) {
+ Assert.assertTrue(k9Viewers.get(i).getInput() instanceof SystemViewInput);
+ Assert.assertEquals(rootContainers.get(i), ((SystemViewInput)k9Viewers.get(i).getInput()).getContainer());
+ }
+ }
+
+ @Test
+ public void testRefresh() throws InterruptedException {
+ SystemDMContainer oldDogs = k9View.getAllDogs();
+ k9View.getRefreshJob().schedule();
+ k9View.getRefreshJob().join();
+ Assert.assertNotSame(oldDogs, k9View.getAllDogs());
+ }
+
+ @Test
+ public void testGetOverviewVMContainer() {
+ Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getOverviewVMContainer());
+ }
+
+ @Test
+ public void testGetBreedsVMContainer() {
+ Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getBreedsVMContainer());
+ }
+
+ @Test
+ public void testGetDogsVMContainer() {
+ Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getDogsVMContainer());
+ }
+
+ @Test
+ public void testGetToysVMContainer() {
+ Assert.assertNotNull(((K9ViewModel)k9View.getViewModel()).getToysVMContainer());
+ }
+
+ @Test
+ public void testGetPresentationContext() {
+ Assert.assertNotNull(k9View.getPresentationContext());
+ }
+
+ @Test
+ public void testSetRefreshInterval() {
+ int interval = k9View.getRefreshInterval();
+ k9View.setRefreshInterval(8000);
+ Assert.assertEquals(8000, k9View.getRefreshInterval());
+ k9View.setRefreshInterval(interval);
+ }
+
+ @Test
+ public void testGetRefreshInterval() {
+ Assert.assertEquals(5000, k9View.getRefreshInterval());
+ }
+
+ @Test
+ public void testGetRefreshjob() {
+ Assert.assertNotNull(k9View.getRefreshJob());
+ }
+
+ @Test
+ public void testGetFilterMatcher() {
+ StringMatcher matcher = k9View.getFilterMatcher();
+ Assert.assertTrue(matcher.match("Indy"));
+ }
+
+ @Test
+ public void testCreateRefreshAction() {
+ IActionBars bars = k9View.getViewSite().getActionBars();
+ Assert.assertNotNull(bars.getToolBarManager().find("SYSTEM_REFRESH"));
+ }
+
+ @Test
+ public void testContributeToActionBars() {
+ IActionBars bars = k9View.getViewSite().getActionBars();
+ Assert.assertNotNull(bars.getMenuManager().find("SYSTEM_REFRESH"));
+ }
+
+ @Test
+ public void testOptions() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ SystemRefreshOptionsDialog dialog = new SystemRefreshOptionsDialog(null);
+ dialog.setAutoRefresh(k9View.shouldAutoRefresh());
+ dialog.setRefreshInterval(k9View.getRefreshInterval() / 1000);
+ dialog.getRefreshInterval();
+ dialog.isAutoRefresh();
+ dialog.setBlockOnOpen(false);
+ dialog.open();
+ dialog.close();
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AbstractDwarfReaderTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AbstractDwarfReaderTest.java
new file mode 100644
index 0000000..ef7bced
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AbstractDwarfReaderTest.java
@@ -0,0 +1,932 @@
+/*
+ * Copyright (c) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.HostOS;
+import org.eclipse.cdt.debug.edc.internal.PathUtils;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCSymbolReader;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfInfoReader;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IPath;
+import org.junit.Before;
+
+/**
+ *
+ */
+public abstract class AbstractDwarfReaderTest extends BaseDwarfTestCase {
+ protected static final String[] symFilesToTest = {
+ "BlackFlagMinGW.exe",
+ "BlackFlag_gcce.sym",
+ "BlackFlag_linuxgcc.exe",
+ "BlackFlag_rvct.sym",
+ "BlackFlag_gcce_343.sym",
+ "HelloWorld_rvct_2_2.exe.sym",
+ "HelloWorld_rvct_4_0.exe.sym",
+ "QtConsole_gcce_343.sym",
+ "SimpleCpp_rvct_22.sym",
+ "SimpleCpp_rvct_40.sym",
+ "SimpleCpp_gcce_432.sym",
+ "SimpleCpp_gcc_x86.exe",
+ };
+
+ /** Bag of data for testing sym files. The key is 'symFile' and other
+ * elements are used by specific tests.
+ */
+ protected static class TestInfo {
+ public IPath symFile;
+ IPath exeFile;
+ int numberOfSources;
+ int numberOfModuleScopeChildren;
+ int numberOfVariables;
+ Map<String, Map<String, VariableInfo>> cuVarMap
+ = new HashMap<String, Map<String,VariableInfo>>();
+ int numberOfTypes;
+ IPath blackFlagMainFilePath;
+ int numberOfSymbols;
+ int numberOfPubFuncNames;
+ int numberOfPubFuncEntries;
+ int numberOfPubVarNames;
+ int numberOfPubVarEntries;
+ List<String> pubVars = new ArrayList<String>();
+ List<String> pubFuncs = new ArrayList<String>();
+ Map<String, List<ScopeInfo>> scopeInfos
+ = new LinkedHashMap<String, List<ScopeInfo>>();
+ IAddress lowAddress;
+ IAddress highAddress;
+ Collection<SymbolInfo> symbols;
+ }
+
+ protected static Map<String, TestInfo> testInfos
+ = new LinkedHashMap<String, TestInfo>();
+
+ static {
+ for (String sym : symFilesToTest) {
+ TestInfo info = new TestInfo();
+ info.symFile = getFile(sym);
+ testInfos.put(sym, info);
+ }
+ }
+
+ protected static TestInfo lookupInfo(String sym) {
+ return testInfos.get(sym);
+ }
+
+ protected static void setExe(String sym, String exe) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.exeFile = getFile(exe);
+ }
+
+ // not all the *.exes really exist; used to test mapping from *.exe to *.sym
+ static {
+ setExe("BlackFlagMinGW.exe", "BlackFlagMinGW.exe");
+ setExe("BlackFlag_gcce.sym", "BlackFlag_gcce.exe");
+ setExe("BlackFlag_linuxgcc.exe", "BlackFlag_linuxgcc.exe");
+ setExe("BlackFlag_rvct.sym", "BlackFlag_rvct.exe");
+ setExe("HelloWorld_rvct_2_2.exe.sym", "HelloWorld_rvct_2_2.exe");
+ setExe("HelloWorld_rvct_4_0.exe.sym", "HelloWorld_rvct_4_0.exe");
+ setExe("QtConsole_gcce_343.sym", "QtConsole_gcce_343.exe");
+ }
+
+ protected static void setSources(String sym, int i) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.numberOfSources = i;
+ }
+
+ static {
+ // TODO: this differs in Win and Lin
+
+ setSources("BlackFlagMinGW.exe", 121);
+ setSources("BlackFlag_gcce.sym", 108);
+ setSources("BlackFlag_linuxgcc.exe", 139);
+ setSources("BlackFlag_rvct.sym", HostOS.IS_WIN32 ? 207 : 172);
+ setSources("HelloWorld_rvct_2_2.exe.sym", HostOS.IS_WIN32 ? 323 : 320);
+ setSources("HelloWorld_rvct_4_0.exe.sym", 315);
+ setSources("QtConsole_gcce_343.sym", 434);
+ }
+
+ protected static void setModuleScopeChilden(String sym, int i) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.numberOfModuleScopeChildren = i;
+ }
+
+ static {
+ setModuleScopeChilden("BlackFlagMinGW.exe", 29);
+ setModuleScopeChilden("BlackFlag_gcce.sym", 27);
+ setModuleScopeChilden("BlackFlag_linuxgcc.exe", 25);
+ setModuleScopeChilden("BlackFlag_rvct.sym", 693);
+ setModuleScopeChilden("HelloWorld_rvct_2_2.exe.sym", 1579);
+ setModuleScopeChilden("HelloWorld_rvct_4_0.exe.sym", 1014);
+ setModuleScopeChilden("QtConsole_gcce_343.sym", 3);
+ }
+
+ protected static void setStartEndAddress(String sym, IAddress startAddress, IAddress endAddress) {
+ TestInfo info = lookupInfo(sym);
+ assertNotNull(info);
+ info.lowAddress = startAddress;
+ info.highAddress = endAddress;
+ }
+
+ static {
+ setStartEndAddress("BlackFlagMinGW.exe", new Addr32("0x00401000"), new Addr32("0x0046d2c0"));
+ setStartEndAddress("BlackFlag_gcce.sym", new Addr32("0x00008000"), new Addr32("0x0040a028"));
+ //start address for linuxgcc indicated only by program header not by sections or symbols
+ setStartEndAddress("BlackFlag_linuxgcc.exe", new Addr32("0x08048000"), new Addr32("0x0805a01c"));
+ setStartEndAddress("BlackFlag_rvct.sym", new Addr32("0x00008000"), new Addr32("0x0040a018"));
+ setStartEndAddress("HelloWorld_rvct_2_2.exe.sym", new Addr32("0x00008000"), new Addr32("0x00400008"));
+ setStartEndAddress("HelloWorld_rvct_4_0.exe.sym", new Addr32("0x00008000"), new Addr32("0x00400070"));
+ setStartEndAddress("QtConsole_gcce_343.sym", new Addr32("0x00008000"), new Addr32("0x00400008"));
+ }
+
+ protected static void setVariableCount(String sym, int i) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.numberOfVariables = i;
+ }
+
+ static {
+ setVariableCount("BlackFlagMinGW.exe", 52);
+ setVariableCount("BlackFlag_gcce.sym", 105);
+ setVariableCount("BlackFlag_linuxgcc.exe", 48);
+ setVariableCount("BlackFlag_rvct.sym", 61);
+ setVariableCount("HelloWorld_rvct_2_2.exe.sym", 1);
+ setVariableCount("HelloWorld_rvct_4_0.exe.sym", 1);
+ setVariableCount("QtConsole_gcce_343.sym", 2);
+ }
+
+ static class VariableInfo {
+ String name;
+ String typeName;
+
+ public VariableInfo(String name, String typeName) {
+ this.name = name;
+ this.typeName = typeName;
+ }
+ }
+
+ protected static void setCUVariableInfo(String sym, String cu, String var,
+ String type) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ VariableInfo vi = new VariableInfo(var, type);
+ Map<String, VariableInfo> varMap = info.cuVarMap.get(cu);
+ if (varMap == null) {
+ varMap = new HashMap<String, VariableInfo>();
+ info.cuVarMap.put(cu, varMap);
+ }
+ varMap.put(var, vi);
+ }
+ }
+
+ static {
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KBase",
+ "const class TLitC8");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KDer1",
+ "const class TLitC8");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KDer2",
+ "const class TLitC8");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KDerDer",
+ "const class TLitC8");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KIFace1",
+ "const class TLitC8");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/dbg_namespaceRealms.h", "KIFace2",
+ "const class TLitC8");
+ setCUVariableInfo(
+ "BlackFlag_rvct.sym",
+ "M:/sf/os/kernelhwsrv/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp",
+ "KLitUser", "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "KTxtEPOC32EX",
+ "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "KTxtExampleCode",
+ "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "KFormatFailed",
+ "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "KTxtOK",
+ "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "KTxtPressAnyKey",
+ "const class TLitC");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/INC/CommonFramework.h", "console",
+ "class CConsoleBase *");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgchar", "char");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgdouble", "double");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgfloat", "float");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgint", "int");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sglong", "long");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sglongdouble",
+ "long double");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgschar", "SCHAR");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgshort", "short");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgsint", "SINT");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgslong", "SLONG");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgslonglong",
+ "SLONGLONG");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgsshort", "SSHORT");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sguchar", "UCHAR");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sguint", "UINT");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgulong", "ULONG");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgulonglong",
+ "ULONGLONG");
+ setCUVariableInfo("BlackFlag_rvct.sym",
+ "/BlackFlag/SRC/dbg_simple_types.cpp", "sgushort", "USHORT");
+ setCUVariableInfo(
+ "HelloWorld_rvct_2_2.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/inc/ArmTestApplication.h",
+ "KUidArmTestApp", "const class TUid");
+ setCUVariableInfo(
+ "HelloWorld_rvct_2_2.exe.sym",
+ "/src/cedar/generic/base/e32/compsupp/symaehabi/callfirstprocessfn.cpp",
+ "KLitUser", "const class TLitC");
+ setCUVariableInfo(
+ "HelloWorld_rvct_2_2.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp",
+ "KFileName", "const class TLitC");
+ setCUVariableInfo(
+ "HelloWorld_rvct_2_2.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp",
+ "KText", "const class TLitC");
+ setCUVariableInfo(
+ "HelloWorld_rvct_4_0.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestApplication.cpp",
+ "KUidArmTestApp", "const struct TUid");
+ setCUVariableInfo(
+ "HelloWorld_rvct_4_0.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestDocument.cpp",
+ "mylit", "char[5]");
+ setCUVariableInfo(
+ "HelloWorld_rvct_4_0.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp",
+ "KFileName", "const struct TLitC");
+ setCUVariableInfo(
+ "HelloWorld_rvct_4_0.exe.sym",
+ "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp",
+ "KText", "const struct TLitC");
+ setCUVariableInfo(
+ "HelloWorld_rvct_4_0.exe.sym",
+ "M:/dev2/sf/os/kernelhwsrv/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp",
+ "KLitUser", "const struct TLitC");
+ setCUVariableInfo("QtConsole_gcce_343.sym",
+ "/Source/GCCE3/GCCE3/main.cpp", "myGlobalInt", "int");
+ }
+
+ protected static void setTypeCount(String sym, int i) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.numberOfTypes = i;
+ }
+
+ static {
+ setTypeCount("BlackFlagMinGW.exe", 1378);
+ setTypeCount("BlackFlag_gcce.sym", 3419);
+ setTypeCount("BlackFlag_linuxgcc.exe", 1104);
+ setTypeCount("BlackFlag_rvct.sym", 33708);
+ setTypeCount("HelloWorld_rvct_2_2.exe.sym", 84689);
+ setTypeCount("HelloWorld_rvct_4_0.exe.sym", 31565);
+ setTypeCount("QtConsole_gcce_343.sym", 1434);
+ }
+
+ protected static void setMainBlackFlagFilePath(String sym, String path) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.blackFlagMainFilePath = PathUtils.createPath(path);
+ }
+
+ static {
+ setMainBlackFlagFilePath("BlackFlagMinGW.exe",
+ "C:/wascana/workspace/BlackFlagWascana/src/BlackFlagWascana.cpp");
+ setMainBlackFlagFilePath("BlackFlag_gcce.sym",
+ "/BlackFlag/SRC/main.cpp");
+ setMainBlackFlagFilePath("BlackFlag_linuxgcc.exe",
+ "/mydisk/myprog/BlackFlag/src/BlackFlagWascana.cpp");
+ setMainBlackFlagFilePath("BlackFlag_rvct.sym",
+ "\\BlackFlag\\SRC\\main.cpp");
+ }
+
+ private static void setSymbolCount(String sym, int i) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.numberOfSymbols = i;
+ }
+
+ static {
+ setSymbolCount("BlackFlagMinGW.exe", 2520);
+ setSymbolCount("BlackFlag_gcce.sym", 2941);
+ setSymbolCount("BlackFlag_linuxgcc.exe", 469);
+ setSymbolCount("BlackFlag_rvct.sym", 750);
+ setSymbolCount("HelloWorld_rvct_2_2.exe.sym", 194);
+ setSymbolCount("HelloWorld_rvct_4_0.exe.sym", 332);
+ setSymbolCount("QtConsole_gcce_343.sym", 1008);
+ }
+
+ protected static void setPubCount(String sym, int funcnames,
+ int funcentries, int varnames, int varentries) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ info.numberOfPubFuncNames = funcnames;
+ info.numberOfPubFuncEntries = funcentries;
+ info.numberOfPubVarNames = varnames;
+ info.numberOfPubVarEntries = varentries;
+ }
+ }
+
+ static {
+ setPubCount("BlackFlagMinGW.exe", 209, 241, 52, 52);
+ setPubCount("BlackFlag_gcce.sym", 217, 286, 87, 105);
+ setPubCount("BlackFlag_linuxgcc.exe", 174, 206, 48, 48);
+ setPubCount("BlackFlag_rvct.sym", 100, 101, 51, 87);
+ setPubCount("HelloWorld_rvct_2_2.exe.sym", 11, 14, 2, 4);
+ setPubCount("HelloWorld_rvct_4_0.exe.sym", 958, 978, 1, 1);
+ }
+
+ protected static void addPubFuncs(String sym, Object... names) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ for (Object o : names) {
+ info.pubFuncs.add(o.toString());
+ }
+ }
+ }
+
+ static {
+ addPubFuncs("BlackFlagMinGW.exe", "main", "dbg_watchpoints",
+ "Base01::~Base01");
+ addPubFuncs("BlackFlag_gcce.sym", "E32Main", "dbg_watchpoints",
+ "Base01::~Base01");
+ addPubFuncs("BlackFlag_gcce_343.sym", "E32Main", "dbg_watchpoints",
+ "Base01::~Base01");
+ addPubFuncs("BlackFlag_linuxgcc.exe", "main", "dbg_watchpoints",
+ "Base01::~Base01");
+ addPubFuncs("BlackFlag_rvct.sym", "E32Main", "dbg_watchpoints",
+ "globalDestructorFunc");
+ addPubFuncs("HelloWorld_rvct_2_2.exe.sym", "E32Main",
+ "CallThrdProcEntry", "CleanupClosePushL");
+ addPubFuncs("HelloWorld_rvct_4_0.exe.sym", "E32Main",
+ "CallThrdProcEntry", "CleanupClosePushL");
+ addPubFuncs("QtConsole_gcce_343.sym", "main", "__gxx_personality_v0",
+ "__gnu_unwind_frame");
+ }
+
+ protected static void addPubVars(String sym, Object... names) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ for (Object o : names) {
+ info.pubVars.add(o.toString());
+ }
+ }
+ }
+
+ static {
+ addPubVars("BlackFlagMinGW.exe", "vgushort", "gulong", "char_wp");
+ addPubVars("BlackFlag_gcce.sym", "vgushort", "gulong", "g_char");
+ addPubVars("BlackFlag_gcce_343.sym", "vgushort", "gulong", "g_char");
+ addPubVars("BlackFlag_linuxgcc.exe", "vgushort", "gulong", "gchar");
+ addPubVars("BlackFlag_rvct.sym", "vgushort", "gulong", "g_char");
+ addPubVars("HelloWorld_rvct_2_2.exe.sym", "mylit");
+ addPubVars("HelloWorld_rvct_4_0.exe.sym", "mylit");
+ addPubVars("QtConsole_gcce_343.sym", "myGlobalInt");
+ }
+
+ @Before
+ public void setup() throws Exception {
+ // each test relies on starting from scratch
+ Symbols.releaseReaderCache();
+ }
+
+ protected String getTypeName(IType type) {
+ return TypeUtils.getFullTypeName(type);
+ }
+
+ /**
+ * Get a low-level DWARF reader for the symbol reader for testing
+ * @param symbolReader
+ * @return
+ */
+ protected DwarfDebugInfoProvider getDwarfDebugInfoProvider(
+ IEDCSymbolReader symbolReader) {
+
+ if (!(symbolReader instanceof EDCSymbolReader))
+ return null;
+
+ IDebugInfoProvider debugInfoProvider
+ = ((EDCSymbolReader) symbolReader).getDebugInfoProvider();
+ if (!(debugInfoProvider instanceof DwarfDebugInfoProvider))
+ return null;
+
+ DwarfDebugInfoProvider dip
+ = (DwarfDebugInfoProvider) debugInfoProvider;
+
+ // do initial parse (so forward types are detected)
+ DwarfInfoReader reader = new DwarfInfoReader(dip);
+ dip.setParsedInitially();
+ reader.parseInitial();
+ dip.setParsedForAddresses();
+ reader.parseForAddresses(true);
+
+ return dip;
+ }
+
+ /**
+ * @param symbolReader
+ */
+ protected void readFully(IEDCSymbolReader symbolReader) {
+ IModuleScope moduleScope = symbolReader.getModuleScope();
+ moduleScope.getChildren();
+ moduleScope.getVariablesByName(null, false);
+ moduleScope.getVariablesByName(null, true);
+ moduleScope.getFunctionsByName(null);
+ moduleScope.getFunctionByName(null);
+ }
+
+ /**
+ * @param symbolReader
+ */
+ protected void readRandomly(IEDCSymbolReader symbolReader) {
+ IModuleScope moduleScope = symbolReader.getModuleScope();
+ IAddress low = moduleScope.getLowAddress();
+ IAddress high = moduleScope.getHighAddress();
+
+ long range = high.getValue().subtract(low.getValue()).longValue();
+ assertTrue(range > 0);
+
+ Random random = new Random(0x120044ff);
+
+ for (int cnt = 0; cnt < 1000; cnt++) {
+ switch (random.nextInt() % 4) {
+ case 0: {
+ IAddress addr = low.add(random.nextLong() % range);
+ moduleScope.getScopeAtAddress(addr);
+ break;
+ }
+ case 1: {
+ ICompileUnitScope scope
+ = getRandomCU(symbolReader, random, true);
+ if (scope != null) {
+ long curange
+ = scope.getHighAddress()
+ .getValue()
+ .subtract(scope.getLowAddress().getValue())
+ .longValue();
+ IAddress addr
+ = scope.getLowAddress()
+ .add(random.nextLong() % curange);
+ scope.getFunctionAtAddress(addr);
+ }
+ break;
+ }
+ case 2: {
+ ICompileUnitScope scope
+ = getRandomCU(symbolReader, random, false);
+ if (scope != null) {
+ scope.getVariables();
+ }
+ break;
+ }
+ case 3: {
+ ICompileUnitScope scope
+ = getRandomCU(symbolReader, random, false);
+ if (scope != null) {
+ scope.getEnumerators();
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * @param symbolReader
+ * @return
+ */
+ protected ICompileUnitScope getRandomCU(IEDCSymbolReader symbolReader,
+ Random random, boolean withCode) {
+ String[] srcs = symbolReader.getSourceFiles();
+ int tries = 10;
+ Collection<ICompileUnitScope> scopes = null;
+ while (tries-- > 0) {
+ IPath src
+ = PathUtils.createPath(srcs[(random.nextInt() & 0xfffff)
+ % srcs.length]);
+ scopes = symbolReader.getModuleScope().getCompileUnitsForFile(src);
+ if (!scopes.isEmpty())
+ break;
+ }
+ if (scopes == null)
+ return null;
+
+ ICompileUnitScope last = null;
+ for (ICompileUnitScope scope : scopes) {
+ if (withCode) {
+ long curange
+ = scope.getHighAddress()
+ .getValue()
+ .subtract(scope.getLowAddress().getValue())
+ .longValue();
+ if (curange > 0) {
+ last = scope;
+ if (random.nextBoolean()) {
+ return scope;
+ }
+ }
+ }
+ else if (random.nextInt(5) == 0) {
+ return scope;
+ }
+ }
+ return last;
+ }
+
+ /**
+ * @return
+ */
+ protected String describeScope(IScope scope) {
+ if (scope == null)
+ return "";
+ String myscope
+ = scope.getClass().getSimpleName() + "["
+ + scope.getName() + "]";
+ return describeScope(scope.getParent()) + ": " + myscope;
+ }
+
+ /**
+ * @param name
+ * @return
+ */
+ protected String stripName(String name) {
+ int idx = name.lastIndexOf(':');
+ if (idx > 0)
+ return name.substring(idx+1);
+ else
+ return name;
+ }
+
+ static class ScopeInfo {
+ int address;
+ String[] names;
+ public ScopeInfo(int address, String[] names) {
+ super();
+ this.address = address;
+ this.names = names;
+ }
+ }
+
+ protected static void addScopeVars(String sym, String srcFile,
+ String function, String className, int address, String... names) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ ScopeInfo scope = new ScopeInfo(address, names);
+ List<ScopeInfo> scopes;
+ String key = srcFile + "|" + function + "|" + className;
+ scopes = info.scopeInfos.get(key);
+ if (scopes == null) {
+ scopes = new ArrayList<ScopeInfo>();
+ info.scopeInfos.put(key, scopes);
+ }
+ scopes.add(scope);
+ }
+ }
+
+ static {
+ /*
+ * The address information for the unit test is gathered like this:
+ *
+ * 1) Find a function of interest, usually with DW_TAG_lexical_block
+ * entries inside DW_TAG_subroutine.
+ *
+ * 2) Add a PC for the entry point (DW_AT_low_pc for that subroutine).
+ * Usually DW_TAG_formal_parameter entries are live here. Any
+ * DW_TAG_variable entries with DW_AT_scope==0 (or unspecified) are also
+ * live.
+ *
+ * 3) Find some interesting points where lexical blocks open and add the
+ * variables from there.
+ *
+ * 4) Referencing the original source code is useful too, to avoid
+ * getting confused.
+ *
+ * 5) Finally, ALSO check the DW_AT_location entries for the variables.
+ * If it references a location list (rather than a static expression),
+ * then the compiler is indicating that the variable has a narrower
+ * scope than otherwise indicated. But, that location list may specify
+ * locations *outside* the advertised lexical block scope. So those
+ * should not be considered. Note that RVCT may have bogus lexical block
+ * ranges, but the location lists are useful. GCC-E, on the other hand,
+ * has better lexical block ranges, but never uses location lists.
+ */
+
+ // RVCT has totally broken scope info; all lexical scopes go backwards,
+ // so
+ // we clamp them to the end of the function
+
+ // entry to function
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3e0);
+
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3e4, "stackArray");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3ee, "stackArray" /* , "pstackArray" */);
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3f0, "stackArray", "pstackArray");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3f0 + 2, "stackArray", "pstackArray");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb3f4, "stackArray", "pstackArray", "i", "value");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0xb40a, "stackArray", "pstackArray", "pheapArray",
+ "value");
+
+ // GCCE has valid scope info
+
+ // entry to function
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x10854);
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x1085a, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj");
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x10876, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj", "i");
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x108ac + 2, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj");
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x108b8 + 4, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj", "j");
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x108f2 + 2, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj", "k");
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x10970 + 2, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj", "m");
+ // show all variables at end of function, but not variable of last for
+ // loop scope
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x10a2a, "stackArray", "pstackArray", "value",
+ "pheapArray", "objArray", "pobj");
+ // but not past, in case instruction stepping at end of function
+ addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray",
+ null, 0x10a2a + 2);
+
+ // entry to function
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "arrayOfPtrs",
+ null, 0xb802);
+
+ addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "arrayOfPtrs",
+ null, 0xb808, "parray", "pClass2", "i");
+
+ // entry to function
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "dlist", 0xa82a, "this", "k");
+
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "dlist", 0xa82e, "this", "k");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "dlist", 0xa830, "this", "found", "k", "search_node");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "dlist", 0xa83c, "this", "found", "k", "search_node",
+ "__result");
+
+ // entry to function
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "list", 0xa652, "this", "k");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "list", 0xa656, "this", "k");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "list", 0xa658, "this", "k", "found", "aux");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find",
+ "list", 0xa666, "this", "k", "__result", "found", "aux");
+
+ // good lexical scopes here
+
+ // entry to function
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa07a, "this", "key");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa080, "this", "key",
+ "direction", "previous");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa082, "this", "key",
+ "direction", "previous");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa082, "this", "key",
+ "direction", "previous");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa092, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa098, "this", "key",
+ "__result", "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa0f2, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa0f8, "this", "key",
+ "direction", "previous", "theNode", "subtree");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa11e, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa138, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa164, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa166, "this", "key",
+ "direction", "previous", "theNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa16c, "this", "key",
+ "direction", "previous", "theNode", "pcurrentNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa1ea, "this", "key",
+ "direction", "previous", "theNode", "next", "pcurrentNode");
+ addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp",
+ "DeleteFromTree", "binary_tree", 0xa21e, "this", "key",
+ "direction", "previous", "theNode");
+
+ // enty to function
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x8386, "this", "item");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x8394, "this", "item");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x8398, "this", "item", "newmax");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x83a6, "this", "item", "newmax", "copy");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x83a8, "this", "item", "newmax", "copy", "i");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x83b0, "this", "item", "newmax", "copy", "i");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x83bc, "this", "item", "newmax", "copy");
+ addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List",
+ 0x83cc);
+
+ // enty to function
+ addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List",
+ 0x835a, "this", "item", "__result$$1$$_Znaj");
+ addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List",
+ 0x836c, "this", "item", "newmax", "__result$$1$$_Znaj");
+ addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List",
+ 0x837a, "this", "item", "newmax", "copy", "__result$$1$$_Znaj");
+ addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List",
+ 0x837c, "this", "item", "newmax", "copy", "i",
+ "__result$$1$$_Znaj");
+ addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List",
+ 0x83a0, "this", "item", "__result$$1$$_Znaj");
+
+ // entry to function
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x80487a6, "this", "item");
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x80487c0, "this", "item", "newmax", "copy");
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x80487e9, "this", "item", "newmax", "copy", "i");
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x804881e + 1, "this", "item", "newmax", "copy");
+ // show all locals at end of function
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x8048854, "this", "item", "newmax", "copy");
+ // but not past
+ addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List",
+ 0x8048854 + 1, "this", "item");
+ }
+
+ /**
+ *
+ */
+ protected static class SymbolInfo {
+ public final String name;
+ public final String address;
+ public final long size;
+ public SymbolInfo(String name, String string, long size){
+ this.name = name;
+ this.address = string;
+ this.size = size;
+ }
+ @Override
+ public String toString(){
+ return name + ", " + address + ", " + size;
+ }
+ }
+
+ /**
+ * @param sym
+ * @param symbols
+ */
+ protected static void addSymbols(String sym,SymbolInfo... symbols){
+ TestInfo info = lookupInfo(sym);
+ assertNotNull(info);
+ Collection<SymbolInfo> symInfos = info.symbols;
+ if (symInfos == null){
+ symInfos = new ArrayList<SymbolInfo>(symbols.length);
+ info.symbols = symInfos;
+ }
+ for (SymbolInfo symInfo : symbols){
+ symInfos.add(symInfo);
+ }
+ }
+
+ static {
+ addSymbols("BlackFlag_linuxgcc.exe",
+ new SymbolInfo("vgfloat", "08050300", 4),
+ new SymbolInfo("_Z6arraysv", "0804a09c", 629),
+ new SymbolInfo("_ZN4list14removeFromBackEv", "0804ac10", 102),
+ new SymbolInfo("_ZTI6DerDer", "0804dff4", 12),
+ new SymbolInfo("_GLOBAL__I_gchar", "08048864", 28));
+ addSymbols("SimpleCpp_gcc_x86.exe",
+ new SymbolInfo("dtor_idx.6637","0804a024",4),
+ new SymbolInfo("_Z41__static_initialization_and_destruction_0ii","0804853f",35),
+ new SymbolInfo("main","080485be",31),
+ new SymbolInfo("__libc_csu_fini","08048860",5),
+ new SymbolInfo("_ZN4ListIcE3addEc","08048602",174));
+ addSymbols("QtConsole_gcce_343.sym",
+ new SymbolInfo("KErrNone","00009188",4),
+ new SymbolInfo("KDriveAttRom","0000939c",4),
+ new SymbolInfo("_Z21base_of_encoded_valuehP15_Unwind_Context","00008290",116),
+ new SymbolInfo("next_unwind_byte","00008ae8",88),
+ new SymbolInfo("KLitUser","00009638",16),
+ //Address 14 rather than 15 due to ARM thumb bit
+ new SymbolInfo("RunThread","00008014",48));
+ }
+
+ /**
+ * @param scope
+ * @return
+ */
+ protected String getClassFor(IFunctionScope scope) {
+ for (IVariable arg : scope.getParameters()) {
+ if (arg.getName().equals("this")) {
+ ICompositeType ct
+ = (ICompositeType) TypeUtils.getBaseType(arg.getType());
+ return ct.getName();
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AllEDCTests.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AllEDCTests.java
index be525db..7ae5f18 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AllEDCTests.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/AllEDCTests.java
@@ -1,67 +1,110 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.tests;
-
-import org.eclipse.cdt.debug.edc.debugger.tests.Concurrent;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsAggregatesAndEnums;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsBasicTypes;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsCasting;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsCasting2;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsInheritance;
-import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsInvalidExpressions;
-import org.eclipse.cdt.debug.edc.debugger.tests.OpaqueTypeResolving;
-import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTests;
-import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsBlackFlag;
-import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsBlackFlagRVCT;
-import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsLinux;
-import org.eclipse.cdt.debug.edc.debugger.tests.RegisterView;
-import org.eclipse.cdt.debug.edc.debugger.tests.SnapshotTests;
-import org.eclipse.cdt.debug.edc.system.tests.K9SystemViewTest;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses( {
- Concurrent.class,
- DisassembleARMBinary.class,
- DisassembleX86Binary.class,
- ExpressionsAggregatesAndEnums.class,
- ExpressionsBasicTypes.class,
- ExpressionsCasting.class,
- ExpressionsCasting2.class,
- ExpressionsInheritance.class,
- ExpressionsInvalidExpressions.class,
- K9SystemViewTest.class,
- OpaqueTypeResolving.class,
- RegisterFrameTests.class,
- RegisterFrameTestsBlackFlag.class,
- RegisterFrameTestsBlackFlagRVCT.class,
- RegisterFrameTestsLinux.class,
- RegisterView.class,
- SnapshotMetaDataTests.class,
- SnapshotTests.class,
- SymbolReader.class,
- TestAgentUtils.class,
- TestByteBufferStreamBuffer.class,
- TestDwarfReader.class,
- TestDisassemblerARM.class,
- TestDisassemblerX86.class,
- TestExecutableReader.class,
- TestFileStreamBuffer.class,
- TestFindCodeLine.class,
- TestMemoryStreamBuffer.class,
- TestOpcodeARM.class,
- TestSourceToAddressMapping.class,
- TestUnmanglerEABI.class,
-})
-
-public class AllEDCTests {
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.debugger.tests.BreakpointActionsTest;
+import org.eclipse.cdt.debug.edc.debugger.tests.BreakpointsServiceTest;
+import org.eclipse.cdt.debug.edc.debugger.tests.Concurrent;
+import org.eclipse.cdt.debug.edc.debugger.tests.DisassemblyView;
+import org.eclipse.cdt.debug.edc.debugger.tests.DisassemblyViewARMBlackFlagRVCT;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsAggregatesAndEnums;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsBasicTypes;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsCasting;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsCasting2;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsInheritance;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsInvalidExpressions;
+import org.eclipse.cdt.debug.edc.debugger.tests.ExpressionsServiceInternalsTest;
+import org.eclipse.cdt.debug.edc.debugger.tests.MemoryView;
+import org.eclipse.cdt.debug.edc.debugger.tests.ModulesTest;
+import org.eclipse.cdt.debug.edc.debugger.tests.OpaqueTypeResolving;
+import org.eclipse.cdt.debug.edc.debugger.tests.ProcessesServiceTest;
+import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTests;
+import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsBlackFlag;
+import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsBlackFlagRVCT;
+import org.eclipse.cdt.debug.edc.debugger.tests.RegisterFrameTestsLinux;
+import org.eclipse.cdt.debug.edc.debugger.tests.RegisterView;
+import org.eclipse.cdt.debug.edc.debugger.tests.ResumeFromLineAtBreakpoint;
+import org.eclipse.cdt.debug.edc.debugger.tests.RunAndMoveToLine;
+import org.eclipse.cdt.debug.edc.debugger.tests.RunControlDMCSubclass;
+import org.eclipse.cdt.debug.edc.debugger.tests.SnapshotTests;
+import org.eclipse.cdt.debug.edc.debugger.tests.StackService;
+import org.eclipse.cdt.debug.edc.debugger.tests.TestTraceView;
+import org.eclipse.cdt.debug.edc.debugger.tests.VariableLocationTest;
+import org.eclipse.cdt.debug.edc.system.tests.K9SystemViewTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {
+ BreakpointActionsTest.class,
+ BreakpointsServiceTest.class,
+ Concurrent.class,
+ ConsoleErrorDialog.class,
+ DisassembleARMBinary.class,
+ DisassembleX86Binary.class,
+ DisassemblyView.class,
+ DisassemblyViewARMBlackFlagRVCT.class,
+ ExpressionsAggregatesAndEnums.class,
+ ExpressionsBasicTypes.class,
+ ExpressionsCasting.class,
+ ExpressionsCasting2.class,
+ ExpressionsInheritance.class,
+ ExpressionsInvalidExpressions.class,
+ ExpressionsServiceInternalsTest.class,
+ K9SystemViewTest.class,
+ MemoryView.class,
+ ModulesTest.class,
+ OpaqueTypeResolving.class,
+ ProcessesServiceTest.class,
+ RegisterFrameTests.class,
+ RegisterFrameTestsBlackFlag.class,
+ RegisterFrameTestsBlackFlagRVCT.class,
+ RegisterFrameTestsLinux.class,
+ RegisterView.class,
+ ResumeFromLineAtBreakpoint.class,
+ RunAndMoveToLine.class,
+ RunControlDMCSubclass.class,
+ ScopeTest.class,
+ Scripting.class,
+ ScriptedLaunching.class,
+ SnapshotMetaDataTests.class,
+ SnapshotTests.class,
+ StackService.class,
+ SymbolReader.class,
+ TestAgentUtils.class,
+ TestARMPlugin.class,
+ TestArrayType.class,
+ TestByteBufferStreamBuffer.class,
+ TestTCFLoggingService.class,
+ TestTCFSettingsService.class,
+ TestDwarfCompileUnitChildren.class,
+ TestDwarfReader.class,
+ TestDisassemblerARM.class,
+ TestDisassemblerX86.class,
+ TestExecutableReader.class,
+ TestExecutableSymbolicsReaderFactory.class,
+ TestFileStreamBuffer.class,
+ TestFindCodeLine.class,
+ TestIAddressInterval.class,
+ TestMemoryStreamBuffer.class,
+ TestOpcodeARM.class,
+ TestRangeList.class,
+ TestSourceToAddressMapping.class,
+ TestSymbolicsReader.class,
+ TestTraceView.class,
+ TestUnmanglerEABI.class,
+ TestUnmanglerWin32.class,
+ VariableLocationTest.class,
+ // add new cases in alphabetic order
+})
+
+public class AllEDCTests {
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseTCFServiceTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseTCFServiceTest.java
new file mode 100644
index 0000000..0dcda1e
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseTCFServiceTest.java
@@ -0,0 +1,305 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation, June, 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.edc.tests.tcfagent.EDCTestAgent;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.IUnitTestDriver;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.UnitTestDriverProxy;
+import org.eclipse.tm.tcf.core.AbstractPeer;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IChannel.IChannelListener;
+import org.eclipse.tm.tcf.protocol.IPeer;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IServiceProvider;
+import org.eclipse.tm.tcf.protocol.Protocol;
+import org.eclipse.tm.tcf.services.ILocator;
+import org.eclipse.tm.tcf.services.ILocator.LocatorListener;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test TCF services especially those defined by EDC.
+ */
+abstract public class BaseTCFServiceTest {
+
+ private boolean peerTested = false;
+
+ private Exception errorInTCF = null;
+
+ private boolean errorEncountered = false;
+
+ private IServiceProvider commonServiceProvider = new IServiceProvider() {
+ /*
+ * Tell the framework the proxy we offer.
+ */
+ public IService getServiceProxy(IChannel channel, String serviceName) {
+ if (serviceName.equals(IUnitTestDriver.NAME))
+ return new UnitTestDriverProxy(channel);
+
+ // These will be done when EDCDebugger plugin is started.
+ //
+// else if (serviceName.equals(ILogging.NAME))
+// return new LoggingProxy(channel);
+// else if (serviceName.equals(ISettings.NAME))
+// return new SettingsProxy(channel);
+
+ return null;
+ }
+
+ public IService[] getLocalService(IChannel channel) {
+ return null;
+ }
+ };
+
+ @Before
+ public void setup() {
+ Protocol.invokeLater(new Runnable() {
+ public void run() {
+ System.out.println("!!!! TCF is ready.");
+ }
+ });
+
+ Protocol.addServiceProvider(commonServiceProvider);
+
+ /*
+ * Now start the TCF agent. Note here we are not running the agent in a
+ * separate process. Instead it's running in the same process (namely
+ * same runtime framework of TCF) as the host test code (TCF client).
+ *
+ * PROS: simple and easy to start the agent. Otherwise to launch it in a
+ * separate process automatically, we have to put the agent in a
+ * separate simple plugin, export to a jar file, then launch the jar
+ * file. That would require much more effort, and make it a lot more
+ * hassle to modify the test agent then run it. That also requires extra
+ * effort on auto-build/auto-test machine.
+ *
+ * CONS: It's known that it won't always work well to have TCF agent and
+ * client running in the same process. But with our simple agent, it's
+ * no problem yet so far. If you ever suspect, just manually run the
+ * agent as a "Java Application" (namely run it in a separate process)
+ * and see if it helps. If yes, we have to take the harder way.
+ *
+ * .............06/20/2011
+ */
+ try {
+ getTestAgentInstance().start();
+ } catch (IOException e) {
+ Assert.fail("Fail to start test agent: " + e.getMessage());
+ }
+ }
+
+ @After
+ public void tearDown() {
+ Protocol.removeServiceProvider(commonServiceProvider);
+
+ Protocol.invokeAndWait(new Runnable() {
+ public void run() {
+ try {
+ // shutdown agent.
+ getTestAgentInstance().stop();
+ } catch (IOException e) {
+ // ignore
+ }
+
+ System.out.println("!!!! Test done.");
+ }
+ });
+ }
+
+ @Test
+ public void performTest() {
+ Protocol.invokeLater(new Runnable() {
+ public void run() {
+ ILocator loc = Protocol.getLocator();
+
+ Map<String, IPeer> peers = loc.getPeers();
+
+ for (IPeer p : peers.values())
+ examinePeer(p);
+
+ loc.addListener(new LocatorListener() {
+
+ public void peerRemoved(String id) {
+ System.out.println("----->>> Peer removed:" + id + "\n");
+ }
+
+ public void peerHeartBeat(String id) {
+ }
+
+ public void peerChanged(IPeer peer) {
+ System.out.println("----->>> Peer changed:" + peer.getName() + "\n");
+ }
+
+ public void peerAdded(IPeer peer) {
+ System.out.println("----->>> New Peer Discovered:");
+ examinePeer(peer);
+ }
+ });
+ }
+ });
+
+ // Idle, letting agent and client chat,
+ // but with a time limit in case the communication is hosed.
+ long timeout = 30000; // milliseconds
+ long start = System.currentTimeMillis();
+ while (!testDone() && !errorEncountered)
+ try {
+ Thread.sleep(1000);
+ long end = System.currentTimeMillis();
+ if (start + timeout < end) {
+ fail(this.getClass().getName() + " times out, usually because the TCF communication between Eclipse and test agent is hosed.");
+ break;
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ /*
+ * Test done, check result.
+ */
+ if (errorEncountered) {
+ Assert.assertNotNull(errorInTCF);
+
+ // Search your test code for the error message, then you
+ // would know what went wrong.
+ fail(errorInTCF.getMessage());
+ }
+ else {
+ assertTestResult();
+ }
+ }
+
+ private void examinePeer(IPeer p) {
+ if (! p.getName().equals(getTestAgentInstance().getAgentName())) // only care about the test agent
+ return;
+
+ if (peerTested )
+ return;
+
+ peerTested = true;
+
+ System.out.println("----------- Test agent info ------------------");
+ System.out.println("\tID: " + p.getID());
+ System.out.println("\tName: " + p.getName());
+ System.out.println("\tTransport Name: " + p.getTransportName());
+
+ final IChannel channel = p.openChannel();
+
+ channel.addChannelListener(new IChannelListener() {
+
+ public void onChannelOpened() {
+ if (channel.getState() != IChannel.STATE_OPEN)
+ return;
+
+ System.out.println("\nChannel opened: " + channel.getLocalPeer().getID() + " <---> "
+ + channel.getRemotePeer().getID() + "(" + channel.getRemotePeer().getName() + ")");
+
+ Collection<String> lservices = channel.getLocalServices();
+
+ System.out.println("\tLocal services: ");
+ for (String s : lservices)
+ System.out.println("\t\t" + s);
+
+ Collection<String> rservices = channel.getRemoteServices();
+
+ System.out.println("\tRemote services: ");
+ for (String sname : rservices) {
+ System.out.println("\t\t" + sname);
+ }
+
+ /*
+ * Test remote services.
+ */
+ String[] servicesToTest = getServicesToTest();
+
+ // This may be null
+ IUnitTestDriver testDriverSvc = (IUnitTestDriver) channel.getRemoteService(IUnitTestDriver.NAME);
+
+ for (String s : servicesToTest) {
+ if (! rservices.contains(s)) {
+ errorInTCFThread("The TCF service \"" + s + "\" is not supported by test agent");
+ return;
+ }
+
+ IService svc = channel.getRemoteService(s);
+
+ testTCFService(svc, testDriverSvc);
+ }
+ }
+
+ public void onChannelClosed(Throwable error) {
+ System.out.println("Channel to this peer closed: " + channel.getRemotePeer().getID());
+ ((AbstractPeer) channel.getRemotePeer()).dispose();
+
+ channel.removeChannelListener(this);
+ }
+
+ public void congestionLevel(int level) {
+ System.out.println("Congestion level is: " + level);
+ }
+ });
+ }
+
+ /**
+ * Record error/exception in global variable.
+ *
+ * @param msg
+ */
+ protected void errorInTCFThread(String msg) {
+ errorInTCF = new Exception(msg);
+ errorEncountered = true;
+ }
+
+
+ abstract protected EDCTestAgent getTestAgentInstance();
+
+ /**
+ * Subclass use this to indicate ending of test.
+ */
+ abstract protected boolean testDone();
+
+ /**
+ * This is where actual test happens.
+ *
+ * Subclass override this to test one TCF service. If any exception or error
+ * is encountered during the test, call {@link #errorInTCFThread(String)}
+ * and return.
+ *
+ * @param svc
+ * the TCF service to test
+ * @param testDriverSvc
+ * test driver service. Can be null if it's not needed for
+ * testing "svc".
+ */
+ abstract protected void testTCFService(IService svc, IUnitTestDriver testDriverSvc);
+
+ /**
+ * Subclass use this to tell the framework which TCF services it wants
+ * to test.
+ *
+ * @return names of TCF services. Can be empty array but cannot be null.
+ */
+ abstract protected String[] getServicesToTest();
+
+ /**
+ * For subclass to verify test result.
+ */
+ abstract protected void assertTestResult();
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ConsoleErrorDialog.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ConsoleErrorDialog.java
new file mode 100644
index 0000000..f0b63e9
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ConsoleErrorDialog.java
@@ -0,0 +1,46 @@
+package org.eclipse.cdt.debug.edc.tests;
+
+
+import org.eclipse.cdt.debug.edc.internal.ui.IconAndMessageAndDetailsDialog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.ui.PlatformUI;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ConsoleErrorDialog {
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ protected IconAndMessageAndDetailsDialog dialog;
+
+ @Before
+ public void setUp() throws Exception {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ dialog = new IconAndMessageAndDetailsDialog(IStatus.ERROR, "Summary",
+ "Details");
+ }
+ });
+ }
+
+ @Test
+ public void testDialog()
+ {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ dialog.setBlockOnOpen(false);
+ dialog.open();
+ dialog.close();
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScopeTest.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScopeTest.java
new file mode 100644
index 0000000..2576fd4
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScopeTest.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ * Nokia - move to package org.eclipse.cdt.debug.edc.tests
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.core.IAddressFactory;
+import org.eclipse.cdt.debug.edc.internal.symbols.FunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.utils.Addr64Factory;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ScopeTest {
+
+ protected static IScope scopeA;
+ protected static IScope scopeA_;
+ protected static IScope scopeB;
+ protected static IScope scopeC;
+ protected static IScope scopeD;
+ protected static IScope scopeE;
+
+ @BeforeClass
+ public static void setUp(){
+ IAddressFactory addrFactory = new Addr64Factory();
+ // |0 |50 |100 |150 |200 |250
+ // < scopeA >< scopeB >
+ // < scope C >
+ // < scopeD >
+ // < scopeE >
+ scopeA = new FunctionScope("scopeA", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
+ scopeA_ = new FunctionScope("scopeA", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
+ scopeB = new FunctionScope("scopeB", null, addrFactory.createAddress("0x100"), addrFactory.createAddress("0x200"), null);
+ scopeC = new FunctionScope("scopeC", null, addrFactory.createAddress("0x50"), addrFactory.createAddress("0x150"), null);
+ scopeD = new FunctionScope("scopeD", null, addrFactory.createAddress("0x100"), addrFactory.createAddress("0x250"), null);
+ scopeE = new FunctionScope("scopeE", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
+ }
+
+ @Test
+ public void testEquals() {
+// the following two assertions w.r.t. Scope equality are not really
+// valid based upon the fact that one cannot compute a hashCode() for
+// an object based upon mutable values, and lowAddress and highAddress
+// in Scope are mutable. and since two objects that return true for
+// equals() must return the same hashCode(), these members of Scope
+// cannot be used for equals(), either.
+// Assert.assertTrue("Identically valued scopes are equal", scopeA.equals(scopeA_));
+//
+// Assert.assertEquals("Identically valued scopes have same hashCode", scopeA.hashCode(), scopeA_.hashCode());
+
+ Assert.assertTrue("Different scope objects with equal contents return true for contentsEquals()",
+ ((FunctionScope)scopeA).contentsEquals(scopeA_));
+ ((FunctionScope)scopeA).addChild(scopeE);
+ Assert.assertFalse("Scopes with same location but different children return false for contentsEquals()",
+ ((FunctionScope)scopeA).contentsEquals(scopeA_));
+ ((FunctionScope)scopeA_).addChild(scopeE);
+ Assert.assertTrue("Scopes with same location and same children return true for contentsEquals()",
+ ((FunctionScope)scopeA).contentsEquals(scopeA_));
+
+ Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeE));
+ Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeD));
+ Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeB));
+
+ Assert.assertFalse("Different valued scopes have different hashCodes", scopeA.hashCode() == scopeB.hashCode());
+ Assert.assertFalse("Different valued scopes have different hashCodes", scopeA.hashCode() == scopeE.hashCode());
+ }
+
+ @Test
+ public void testScopeComparison(){// Fix 1
+ Assert.assertTrue(scopeA.compareTo(scopeB)<0);
+ Assert.assertTrue(scopeA.compareTo(scopeC)<0);
+ Assert.assertTrue(scopeA.compareTo(scopeD)<0);
+ Assert.assertTrue(scopeB.compareTo(scopeD)<0); // original bug being tested
+ Assert.assertTrue(scopeE.compareTo(scopeA)==0);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScriptedLaunching.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScriptedLaunching.java
new file mode 100644
index 0000000..0f2c935
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/ScriptedLaunching.java
@@ -0,0 +1,50 @@
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.eclipse.cdt.debug.edc.internal.scripting.LaunchConfiguration;
+import org.eclipse.cdt.debug.edc.internal.scripting.Launcher;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@SuppressWarnings("restriction")
+public class ScriptedLaunching {
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testLaunchConfigurations() throws CoreException {
+ Map<String, Object>[] configurations = Launcher.getConfigurations();
+ int numConfigs = configurations.length;
+ Map<String, Object> properties = new HashMap<String, Object>();
+ Map<String, Object> config = Launcher.createLaunchConfiguration("org.eclipse.cdt.debug.edc.snapshot", "TestSnap", properties);
+ configurations = Launcher.getConfigurations();
+ Assert.assertEquals(numConfigs + 1, configurations.length);
+ LaunchConfiguration.getIdentifier(config);
+ String configName = LaunchConfiguration.getName(config);
+ LaunchConfiguration.getType(config);
+ LaunchConfiguration.launch(configName);
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/Scripting.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/Scripting.java
new file mode 100644
index 0000000..1e6a422
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/Scripting.java
@@ -0,0 +1,158 @@
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.cdt.debug.edc.debugger.tests.SimpleDebuggerTest;
+import org.eclipse.cdt.debug.edc.internal.scripting.EDC;
+import org.eclipse.cdt.debug.edc.internal.scripting.Launcher;
+import org.eclipse.cdt.debug.edc.internal.scripting.StackFrame;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@SuppressWarnings("restriction")
+public class Scripting extends SimpleDebuggerTest {
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ new Thread(new Runnable() {
+
+ public void run() {
+ try {
+ Map<String, Object> events = EDC.listenForEvents("Test");
+ Assert.assertTrue(!events.isEmpty());
+ } catch (InterruptedException e) {}
+ }
+ }).start();
+ new StackFrame();
+ new Launcher();
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testGetSessions() {
+ String[] sessions = EDC.getSessions();
+ Assert.assertEquals(1, sessions.length);
+ }
+
+ @Test
+ public void testGetContexts() throws Exception {
+ Map<String, Object>[] contexts = EDC.getContexts(session.getId());
+ Assert.assertEquals(2, contexts.length);
+ }
+
+ @Test
+ public void testGetSuspendedContexts() throws Exception {
+ Map<String, Object>[] contexts = EDC.getSuspendedContexts(session.getId());
+ Assert.assertEquals(2, contexts.length);
+ }
+
+ @Test
+ public void testGetSuspendedThreads() throws Exception {
+ Map<String, Object>[] threads = EDC.getSuspendedThreads(session.getId());
+ Assert.assertEquals(1, threads.length);
+ }
+
+ @Test
+ public void testGetDsfServicesTracker() {
+ Assert.assertNotNull(EDC.getDsfServicesTracker(session.getId()));
+ }
+
+ @Test
+ public void testGetBreakpoints() {
+ IBreakpoint[] breakpoints = EDC.getBreakpoints();
+ Assert.assertEquals(0, breakpoints.length);
+ }
+
+ @Test
+ public void testGetFunctionAtAddress() throws Exception {
+ IFunctionScope function = EDC.getFunctionAtAddress(session.getId(), "405ae0");
+ Assert.assertEquals("dbg_variables_local", function.getName());
+ }
+
+ @Test
+ public void testGetSymbolReader() throws Exception {
+ String res_folder = EDCTestPlugin.projectRelativePath("resources/SymbolFiles/BlackFlag_gcce.sym");
+ IEDCSymbolReader reader = EDC.getSymbolReader(res_folder);
+ Assert.assertNotNull(reader);
+ }
+
+ @Test
+ public void testCreateAddressBreakpoint() throws Exception {
+ IBreakpoint breakpoint = EDC.createAddressBreakpoint(0x405ae0, "");
+ Assert.assertNotNull(breakpoint);
+ }
+
+ @Test
+ public void testCreateFunctionBreakpoint() throws Exception {
+ IBreakpoint breakpoint = EDC.createFunctionBreakpoint(null, "", "Test", 0, "");
+ Assert.assertNotNull(breakpoint);
+ }
+
+ @Test
+ public void testCreateLineBreakpoint() throws Exception {
+ IBreakpoint breakpoint = EDC.createLineBreakpoint(null, "Test", 0, "");
+ Assert.assertNotNull(breakpoint);
+ }
+
+ @Test
+ public void testCreateExpression() throws Exception {
+ IEDCExpression expression = EDC.createExpression(session.getId(), frame, "lint");
+ Assert.assertNotNull(expression);
+ }
+
+ @Test
+ public void testSetBreakpoints() throws Exception {
+ List<Map<String, Object>> breakpoints = new ArrayList<Map<String,Object>>();
+ EDC.setBreakpoints(breakpoints);
+ }
+
+ @Test
+ public void testGetVariables() throws Exception, ExecutionException {
+ List<Map<String, Object>> variables = EDC.getVariables(session.getId(), threadDMC.getID(), 0);
+ Assert.assertEquals(9, variables.size());
+ }
+
+ @Test
+ public void testGetStackFrames() throws Exception, InterruptedException {
+ List<Map<String, Object>> frames = EDC.getStackFrames(session.getId(), threadDMC.getID());
+ Assert.assertEquals(6, frames.size());
+ }
+
+ @Test
+ public void testTerminate() {
+ EDC.terminate(session.getId(), threadDMC.getID());
+ }
+
+ @Test
+ public void testResume() {
+ EDC.resume(session.getId(), threadDMC.getID());
+ }
+
+ @Override
+ public String getAlbumName() {
+ return "ExpressionsBasic.dsa";
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestARMPlugin.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestARMPlugin.java
new file mode 100644
index 0000000..2d736db
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestARMPlugin.java
@@ -0,0 +1,100 @@
+package org.eclipse.cdt.debug.edc.tests;
+
+
+import org.eclipse.cdt.debug.edc.MessageLogger;
+import org.eclipse.cdt.debug.edc.internal.arm.ARMPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestARMPlugin {
+
+ private void throwNewCoreException() throws CoreException {
+ throw ARMPlugin.newCoreException("TestARMPlugin#throwNewCoreException");
+ }
+
+ private void throwNewCoreExceptionCascading() throws CoreException {
+ try {
+ throwNewDebugException();
+ } catch (CoreException e) {
+ throw ARMPlugin.newDebugException("TestARMPlugin#throwNewCoreExceptionCascading", e);
+ }
+ }
+
+ private void throwNewDebugException() throws DebugException {
+ throw ARMPlugin.newDebugException("TestARMPlugin#throwNewDebugException");
+ }
+
+ private void throwNewDebugExceptionCascading() throws DebugException {
+ try {
+ throwNewCoreException();
+ } catch (CoreException e) {
+ throw ARMPlugin.newDebugException("TestARMPlugin#throwNewDebugExceptionCascading", e);
+ }
+ }
+
+ @Test
+ public void testNewCoreException() {
+ boolean caughtProperException = false;
+ try {
+ throwNewCoreException();
+ } catch (CoreException e) {
+ Assert.assertEquals("TestARMPlugin#throwNewCoreException", e.getMessage());
+ caughtProperException = true;
+ } catch (Throwable t) {
+ Assert.fail(t.getLocalizedMessage());
+ }
+ Assert.assertTrue(caughtProperException);
+ }
+
+ @Test
+ public void testNewCoreExceptionCascading() {
+ boolean caughtProperException = false;
+ try {
+ throwNewCoreExceptionCascading();
+ } catch (CoreException e) {
+ Assert.assertEquals("TestARMPlugin#throwNewCoreExceptionCascading", e.getMessage());
+ caughtProperException = true;
+ } catch (Throwable t) {
+ Assert.fail(t.getLocalizedMessage());
+ }
+ Assert.assertTrue(caughtProperException);
+ }
+
+ @Test
+ public void testNewDebugException() {
+ boolean caughtProperException = false;
+ try {
+ throwNewDebugException();
+ } catch (DebugException e) {
+ Assert.assertEquals("TestARMPlugin#throwNewDebugException", e.getMessage());
+ caughtProperException = true;
+ } catch (Throwable t) {
+ Assert.fail(t.getLocalizedMessage());
+ }
+ Assert.assertTrue(caughtProperException);
+ }
+
+ @Test
+ public void testNewDebugExceptionCascading() {
+ boolean caughtProperException = false;
+ try {
+ throwNewDebugExceptionCascading();
+ } catch (DebugException e) {
+ Assert.assertEquals("TestARMPlugin#throwNewDebugExceptionCascading", e.getMessage());
+ caughtProperException = true;
+ } catch (Throwable t) {
+ Assert.fail(t.getLocalizedMessage());
+ }
+ Assert.assertTrue(caughtProperException);
+ }
+
+ @Test
+ public void testMessageLoggerNestedCalls() {
+ MessageLogger logger = ARMPlugin.getMessageLogger();
+ Assert.assertNotNull(logger);
+ Assert.assertEquals("org.eclipse.cdt.debug.edc.arm", logger.getPluginID());
+ Assert.assertEquals("org.eclipse.cdt.debug.edc.arm", logger.getPlugin().getBundle().getSymbolicName());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestArrayType.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestArrayType.java
new file mode 100644
index 0000000..8ce7731
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestArrayType.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ * Nokia - move to package org.eclipse.cdt.debug.edc.tests
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.CPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestArrayType {
+
+ private static ArrayType int4;
+ private static ArrayType long689;
+
+ @BeforeClass
+ public static void setup(){
+ int4 = new ArrayType("int", null, 4, null);
+ int4.setType(new CPPBasicType("int", IBasicType.t_int, 0, 4));
+ int4.addBound(new ArrayBoundType(null, 4));
+
+ long689 = new ArrayType("long", null, 8, null);
+ long689.setType(new CPPBasicType("long", IBasicType.t_int, ICPPBasicType.IS_LONG, 8));
+ long689.addBound(new ArrayBoundType(null, 6));
+ long689.addBound(new ArrayBoundType(null, 8));
+ long689.addBound(new ArrayBoundType(null, 9));
+ }
+
+ @Test
+ public void testNameGeneration(){
+ Assert.assertEquals("int[4]",int4.getName());
+ Assert.assertFalse("int[]".equals(int4.getName()));
+ Assert.assertFalse("int".equals(int4.getName()));
+
+ Assert.assertEquals("long[6][8][9]",long689.getName());
+
+ IArrayType foo = new ArrayType("foo",null,1,null);
+ foo.addBound(new ArrayBoundType(null, 1));
+ Assert.assertEquals("foo[1]",foo.getName());
+ foo.addBound(new ArrayBoundType(null, 5));
+ Assert.assertEquals("foo[1][5]",foo.getName());
+ }
+
+ @Test
+ public void getByteSize() {
+ Assert.assertEquals(16, int4.getByteSize());
+
+ Assert.assertEquals(3456, long689.getByteSize());
+
+ IArrayType foo = new ArrayType("foo", null, 1, null);
+ foo.setType(new CPPBasicType("foo", IBasicType.t_char, 0, 1));
+ foo.addBound(new ArrayBoundType(null, 1));
+ Assert.assertEquals(1, foo.getByteSize());
+ foo.addBound(new ArrayBoundType(null, 5));
+ Assert.assertEquals(5, foo.getByteSize());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDisassemblerARM.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDisassemblerARM.java
index a37976a..aed3a3f 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDisassemblerARM.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDisassemblerARM.java
@@ -1,7036 +1,7110 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.tests;
-
-import java.nio.ByteBuffer;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.IJumpToAddress;
-import org.eclipse.cdt.debug.edc.JumpToAddress;
-import org.eclipse.cdt.debug.edc.disassembler.CodeBufferUnderflowException;
-import org.eclipse.cdt.debug.edc.disassembler.IDisassembledInstruction;
-import org.eclipse.cdt.debug.edc.disassembler.IDisassembler.IDisassemblerOptions;
-import org.eclipse.cdt.debug.edc.internal.arm.disassembler.DisassemblerARM;
-import org.eclipse.cdt.debug.edc.internal.arm.disassembler.DisassemblerARM.IDisassemblerOptionsARM;
-import org.eclipse.cdt.debug.edc.internal.arm.disassembler.InstructionParserARM;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.CoreException;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-/**
- * Unit test for ARM disassembler.
- */
-public class TestDisassemblerARM {
-
- static Map<String, Object> armOptions = null;
- static Map<String, Object> thumbOptions = null;
- static DisassemblerARM sDisassembler;
-
- /**
- * Set up.
- */
- @BeforeClass
- public static void beforeClass() {
- /*
- * set up common disassembler options.
- */
- armOptions = new HashMap<String, Object>();
- armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
- armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
- armOptions.put(IDisassemblerOptionsARM.DISASSEMBLER_MODE, InstructionParserARM.DISASSEMBLER_MODE_ARM);
- armOptions.put(IDisassemblerOptionsARM.ENDIAN_MODE, InstructionParserARM.BIG_ENDIAN_MODE);
-
-
- thumbOptions = new HashMap<String, Object>();
- thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
- thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
- thumbOptions.put(IDisassemblerOptionsARM.DISASSEMBLER_MODE, InstructionParserARM.DISASSEMBLER_MODE_THUMB);
- thumbOptions.put(IDisassemblerOptionsARM.ENDIAN_MODE, InstructionParserARM.BIG_ENDIAN_MODE);
-
-
- sDisassembler = new DisassemblerARM(null);
- }
-
- @Before
- public void setUp() throws Exception {
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- /**
- * Test for non-VFP, 32-bit ARM v4*, v5T*, v6*, v7 instructions.
- */
- @Test
- public void testArmInstructions() {
-
- System.out.println("\n===================== ARMv5 ========================\n");
- String[] insts = {
- "E7 F1 23 F4", "undefined",
- "E7 F0 00 10", "undefined",
- "02 AA 51 FE", "adceq r5,r10,#0x8000003f",
- "00 A9 50 0A", "adceq r5,r9,r10",
- "00 A9 56 5A", "adceq r5,r9,r10,asr r6",
- "E0 A9 56 3A", "adc r5,r9,r10,lsr r6",
- "02 BA 50 71", "adcseq r5,r10,#0x71",
- "00 B9 50 0A", "adcseq r5,r9,r10",
- "00 B9 56 1A", "adcseq r5,r9,r10,lsl r6",
- "E0 B9 56 7A", "adcs r5,r9,r10,ror r6",
- "02 8F 50 71", "addeq r5,pc,#0x71",
- "02 8A 51 FE", "addeq r5,r10,#0x8000003f",
- "00 89 50 0A", "addeq r5,r9,r10",
- "00 89 50 CA", "addeq r5,r9,r10,asr #1",
- "E0 89 56 5A", "add r5,r9,r10,asr r6",
- "E0 89 50 8A", "add r5,r9,r10,lsl #1",
- "E0 89 56 1A", "add r5,r9,r10,lsl r6",
- "E0 89 50 2A", "add r5,r9,r10,lsr #32",
- "E0 89 5F EA", "add r5,r9,r10,ror #31",
- "E0 89 50 6A", "add r5,r9,r10,rrx",
- "02 8D 51 FE", "addeq r5,sp,#0x8000003f",
- "02 9A 50 71", "addseq r5,r10,#0x71",
- "00 99 50 0A", "addseq r5,r9,r10",
- "00 99 50 4A", "addseq r5,r9,r10,asr #32",
- "E0 99 5F 8A", "adds r5,r9,r10,lsl #31",
- "E0 99 50 AA", "adds r5,r9,r10,lsr #1",
- "E0 99 56 3A", "adds r5,r9,r10,lsr r6",
- "E0 99 50 EA", "adds r5,r9,r10,ror #1",
- "E0 99 56 7A", "adds r5,r9,r10,ror r6",
- "E0 99 50 6A", "adds r5,r9,r10,rrx",
- "02 9D 50 71", "addseq r5,sp,#0x71",
- "02 0A 50 71", "andeq r5,r10,#0x71",
- "00 09 50 0A", "andeq r5,r9,r10",
- "00 09 50 CA", "andeq r5,r9,r10,asr #1",
- "E0 09 56 5A", "and r5,r9,r10,asr r6",
- "E0 09 50 8A", "and r5,r9,r10,lsl #1",
- "00 09 56 1A", "andeq r5,r9,r10,lsl r6",
- "E0 09 50 2A", "and r5,r9,r10,lsr #32",
- "E0 09 5F EA", "and r5,r9,r10,ror #31",
- "E0 09 50 6A", "and r5,r9,r10,rrx",
- "02 1A 51 FE", "andseq r5,r10,#0x8000003f",
- "00 19 50 0A", "andseq r5,r9,r10",
- "00 19 50 4A", "andseq r5,r9,r10,asr #32",
- "E0 19 5F 8A", "ands r5,r9,r10,lsl #31",
- "E0 19 50 AA", "ands r5,r9,r10,lsr #1",
- "00 19 56 3A", "andseq r5,r9,r10,lsr r6",
- "E0 19 50 EA", "ands r5,r9,r10,ror #1",
- "E0 19 56 7A", "ands r5,r9,r10,ror r6",
- "01 A0 5E C9", "asreq r5,r9,#29",
- "01 A0 5A 59", "asreq r5,r9,r10",
- "01 B0 5E C9", "asrseq r5,r9,#29",
- "01 B0 5A 59", "asrseq r5,r9,r10",
- "0A FF FF FE", "beq 0x00000000",
- "0A 00 00 1C", "beq 0x00000078",
- "0A FF FF 00", "beq 0xfffffc08",
- "07 DF 50 1F", "bfceq r5,#0,#32",
- "E7 D9 50 9F", "bfc r5,#1,#25",
- "E7 DF 5F 9F", "bfc r5,#31,#1",
- "07 DF 50 1A", "bfieq r5,r10,#0,#32",
- "E7 DF 5F 9A", "bfi r5,r10,#31,#1",
- "E7 DC 53 9A", "bfi r5,r10,#7,#22",
- "03 CA 50 71", "biceq r5,r10,#0x71",
- "01 C9 50 CA", "biceq r5,r9,r10,asr #1",
- "E1 C9 56 5A", "bic r5,r9,r10,asr r6",
- "E1 C9 50 8A", "bic r5,r9,r10,lsl #1",
- "E1 C9 56 1A", "bic r5,r9,r10,lsl r6",
- "E1 C9 50 2A", "bic r5,r9,r10,lsr #32",
- "E1 C9 5F EA", "bic r5,r9,r10,ror #31",
- "E1 C9 50 6A", "bic r5,r9,r10,rrx",
- "03 DA 51 FE", "bicseq r5,r10,#0x8000003f",
- "01 D9 50 4A", "bicseq r5,r9,r10,asr #32",
- "E1 D9 5F 8A", "bics r5,r9,r10,lsl #31",
- "E1 D9 50 AA", "bics r5,r9,r10,lsr #1",
- "01 D9 56 3A", "bicseq r5,r9,r10,lsr r6",
- "E1 D9 50 EA", "bics r5,r9,r10,ror #1",
- "E1 D9 56 7A", "bics r5,r9,r10,ror r6",
- "E1 28 5A 77", "bkpt #0x85a7",
- "0B FF FF FE", "bleq 0x00000000",
- "EB 00 00 1C", "bl 0x00000078",
- "EB FF FF 00", "bl 0xfffffc08",
- "FA FF FF FE", "blx 0x00000000",
- "01 2F FF 39", "blxeq r9",
- "01 2F FF 16", "bxeq r6",
- "01 2F FF 29", "bxjeq r9",
- "0E C9 59 EA", "cdpeq p9,0xc,c5,c9,c10,0x7",
- "FE 19 57 6A", "cdp2 p7,0x1,c5,c9,c10,0x3",
- "F5 7F F0 1F", "clrex",
- "01 6F 5F 19", "clzeq r5,r9",
- "03 7A 00 71", "cmneq r10,#0x71",
- "E3 7A 01 FE", "cmn r10,#0x8000003f",
- "01 75 00 C9", "cmneq r5,r9,asr #1",
- "E1 75 00 49", "cmn r5,r9,asr #32",
- "01 75 06 59", "cmneq r5,r9,asr r6",
- "E1 75 00 89", "cmn r5,r9,lsl #1",
- "E1 75 0F 89", "cmn r5,r9,lsl #31",
- "E1 75 06 19", "cmn r5,r9,lsl r6",
- "E1 75 00 A9", "cmn r5,r9,lsr #1",
- "E1 75 00 29", "cmn r5,r9,lsr #32",
- "E1 75 06 39", "cmn r5,r9,lsr r6",
- "E1 75 00 E9", "cmn r5,r9,ror #1",
- "E1 75 0F E9", "cmn r5,r9,ror #31",
- "E1 75 06 79", "cmn r5,r9,ror r6",
- "E1 75 00 69", "cmn r5,r9,rrx",
- "03 5A 00 71", "cmpeq r10,#0x71",
- "E3 5A 01 FE", "cmp r10,#0x8000003f",
- "01 55 00 C9", "cmpeq r5,r9,asr #1",
- "E1 55 00 49", "cmp r5,r9,asr #32",
- "E1 55 06 59", "cmp r5,r9,asr r6",
- "E1 55 00 89", "cmp r5,r9,lsl #1",
- "E1 55 0F 89", "cmp r5,r9,lsl #31",
- "E1 55 06 19", "cmp r5,r9,lsl r6",
- "E1 55 00 A9", "cmp r5,r9,lsr #1",
- "E1 55 00 29", "cmp r5,r9,lsr #32",
- "E1 55 06 39", "cmp r5,r9,lsr r6",
- "E1 55 00 E9", "cmp r5,r9,ror #1",
- "E1 55 0F E9", "cmp r5,r9,ror #31",
- "E1 55 06 79", "cmp r5,r9,ror r6",
- "E1 55 00 69", "cmp r5,r9,rrx",
- "F1 02 00 00", "cps #0",
- "F1 02 00 1F", "cps #31",
- "F1 0C 01 40", "cpsid af",
- "F1 0E 01 DF", "cpsid aif,#31",
- "F1 0E 00 C1", "cpsid if,#1",
- "F1 08 01 40", "cpsie af",
- "F1 0A 01 DF", "cpsie aif,#31",
- "F1 0A 00 C1", "cpsie if,#1",
- "03 20 F0 FD", "dbgeq #13",
- "F5 7F F0 50", "dmb #0",
- "F5 7F F0 52", "dmb oshst",
- "F5 7F F0 53", "dmb osh",
- "F5 7F F0 56", "dmb nshst",
- "F5 7F F0 57", "dmb nsh",
- "F5 7F F0 5A", "dmb ishst",
- "F5 7F F0 5B", "dmb ish",
- "F5 7F F0 5E", "dmb st",
- "F5 7F F0 5F", "dmb sy",
- "F5 7F F0 42", "dsb oshst",
- "F5 7F F0 43", "dsb osh",
- "F5 7F F0 46", "dsb nshst",
- "F5 7F F0 47", "dsb nsh",
- "F5 7F F0 4A", "dsb ishst",
- "F5 7F F0 4B", "dsb ish",
- "F5 7F F0 4D", "dsb #13",
- "F5 7F F0 4E", "dsb st",
- "F5 7F F0 4F", "dsb sy",
- "02 2A 50 71", "eoreq r5,r10,#0x71",
- "00 29 50 CA", "eoreq r5,r9,r10,asr #1",
- "00 29 56 5A", "eoreq r5,r9,r10,asr r6",
- "E0 29 50 8A", "eor r5,r9,r10,lsl #1",
- "E0 29 56 1A", "eor r5,r9,r10,lsl r6",
- "E0 29 50 2A", "eor r5,r9,r10,lsr #32",
- "E0 29 5F EA", "eor r5,r9,r10,ror #31",
- "E0 29 50 6A", "eor r5,r9,r10,rrx",
- "02 3A 51 FE", "eorseq r5,r10,#0x8000003f",
- "00 39 50 4A", "eorseq r5,r9,r10,asr #32",
- "E0 39 5F 8A", "eors r5,r9,r10,lsl #31",
- "E0 39 50 AA", "eors r5,r9,r10,lsr #1",
- "00 39 56 3A", "eorseq r5,r9,r10,lsr r6",
- "E0 39 50 EA", "eors r5,r9,r10,ror #1",
- "E0 39 56 7A", "eors r5,r9,r10,ror r6",
- "F5 7F F0 60", "isb #0",
- "F5 7F F0 6D", "isb #13",
- "F5 7F F0 6F", "isb sy",
- "0D 1F B9 00", "ldceq p9,c11,[pc,#-0x0]",
- "ED 1F B9 00", "ldc p9,c11,[pc,#-0x0]",
- "0D 1A B9 00", "ldceq p9,c11,[r10,#-0x0]",
- "ED 3A B9 00", "ldc p9,c11,[r10,#-0x0]!",
- "ED 1A B9 21", "ldc p9,c11,[r10,#-0x84]",
- "ED 3A B9 21", "ldc p9,c11,[r10,#-0x84]!",
- "ED 9A B9 21", "ldc p9,c11,[r10,#0x84]",
- "ED BA B9 21", "ldc p9,c11,[r10,#0x84]!",
- "EC 3A B9 00", "ldc p9,c11,[r10],#-0x0",
- "0C 3A B9 21", "ldceq p9,c11,[r10],#-0x84",
- "EC BA B9 21", "ldc p9,c11,[r10],#0x84",
- "EC 9D B9 00", "ldc p9,c11,[sp],{0}",
- "0C 9A B9 FF", "ldceq p9,c11,[r10],{255}",
- "FD 1F B9 00", "ldc2 p9,c11,[pc,#-0x0]",
- "FD 1A B9 21", "ldc2 p9,c11,[r10,#-0x84]",
- "FD 3A B9 21", "ldc2 p9,c11,[r10,#-0x84]!",
- "FD 9A B9 21", "ldc2 p9,c11,[r10,#0x84]",
- "FD BA B9 21", "ldc2 p9,c11,[r10,#0x84]!",
- "FC 3A B9 21", "ldc2 p9,c11,[r10],#-0x84",
- "FC BA B9 21", "ldc2 p9,c11,[r10],#0x84",
- "FC 9A B9 FF", "ldc2 p9,c11,[r10],{255}",
- "FC 9D B9 00", "ldc2 p9,c11,[sp],{0}",
- "FD 5F B9 00", "ldc2l p9,c11,[pc,#-0x0]",
- "FD 5A B9 21", "ldc2l p9,c11,[r10,#-0x84]",
- "FD 7A B9 21", "ldc2l p9,c11,[r10,#-0x84]!",
- "FD DA B9 21", "ldc2l p9,c11,[r10,#0x84]",
- "FD FA B9 21", "ldc2l p9,c11,[r10,#0x84]!",
- "FC 7A B9 21", "ldc2l p9,c11,[r10],#-0x84",
- "FC FA B9 21", "ldc2l p9,c11,[r10],#0x84",
- "FC DA B9 00", "ldc2l p9,c11,[r10],{0}",
- "FC DD B9 FF", "ldc2l p9,c11,[sp],{255}",
- "0D 5F B9 00", "ldcleq p9,c11,[pc,#-0x0]",
- "ED 5F B9 00", "ldcl p9,c11,[pc,#-0x0]",
- "ED 5A B9 00", "ldcl p9,c11,[r10,#-0x0]",
- "ED 7A B9 00", "ldcl p9,c11,[r10,#-0x0]!",
- "0D 5A B9 21", "ldcleq p9,c11,[r10,#-0x84]",
- "ED 7A B9 21", "ldcl p9,c11,[r10,#-0x84]!",
- "ED DA B9 21", "ldcl p9,c11,[r10,#0x84]",
- "ED FA B9 21", "ldcl p9,c11,[r10,#0x84]!",
- "0C 7A B9 00", "ldcleq p9,c11,[r10],#-0x0",
- "EC 7A B9 21", "ldcl p9,c11,[r10],#-0x84",
- "EC FA B9 21", "ldcl p9,c11,[r10],#0x84",
- "0C DA B9 00", "ldcleq p9,c11,[r10],{0}",
- "EC DD B9 FF", "ldcl p9,c11,[sp],{255}",
- "E8 BA 42 40", "ldm r10!,{r6,r9,lr}",
- "08 9A 82 40", "ldmeq r10,{r6,r9,pc}",
- "08 7A C2 40", "ldmdaeq r10!,{r6,r9,lr,pc}^",
- "E8 3A 42 40", "ldmda r10!,{r6,r9,lr}",
- "E8 5A C2 40", "ldmda r10,{r6,r9,lr,pc}^",
- "E8 5A 42 40", "ldmda r10,{r6,r9,lr}^",
- "E8 1A 82 40", "ldmda r10,{r6,r9,pc}",
- "09 7A C2 40", "ldmdbeq r10!,{r6,r9,lr,pc}^",
- "E9 3A 42 40", "ldmdb r10!,{r6,r9,lr}",
- "E9 5A C2 40", "ldmdb r10,{r6,r9,lr,pc}^",
- "E9 5A 42 40", "ldmdb r10,{r6,r9,lr}^",
- "E9 1A 82 40", "ldmdb r10,{r6,r9,pc}",
- "08 D0 00 06", "ldmiaeq r0,{r1,r2}^",
- "E8 D0 00 06", "ldmia r0,{r1,r2}^",
- "E8 FA C2 40", "ldmia r10!,{r6,r9,lr,pc}^",
- "E8 DA C2 40", "ldmia r10,{r6,r9,lr,pc}^",
- "E8 DA 42 40", "ldmia r10,{r6,r9,lr}^",
- "E8 D0 00 06", "ldmia r0,{r1,r2}^",
- "E8 F0 00 06", "ldmia r0,{r1,r2}^",
- "09 FA C2 40", "ldmibeq r10!,{r6,r9,lr,pc}^",
- "E9 BA 42 40", "ldmib r10!,{r6,r9,lr}",
- "E9 DA C2 40", "ldmib r10,{r6,r9,lr,pc}^",
- "E9 DA 42 40", "ldmib r10,{r6,r9,lr}^",
- "E9 9A 82 40", "ldmib r10,{r6,r9,pc}",
- "05 1F 59 87", "ldreq r5,[pc,#-0x987] ; 0xfffff679",
- "E5 9F 59 87", "ldr r5,[pc,#0x987] ; 0x987",
- "E7 9A 50 C9", "ldr r5,[r10,r9,asr #1]",
- "E7 BA 50 C9", "ldr r5,[r10,r9,asr #1]!",
- "E7 9A 50 49", "ldr r5,[r10,r9,asr #32]",
- "E7 BA 50 49", "ldr r5,[r10,r9,asr #32]!",
- "E7 9A 50 89", "ldr r5,[r10,r9,lsl #1]",
- "E7 BA 50 89", "ldr r5,[r10,r9,lsl #1]!",
- "E7 9A 5F 89", "ldr r5,[r10,r9,lsl #31]",
- "E7 BA 5F 89", "ldr r5,[r10,r9,lsl #31]!",
- "E7 9A 50 A9", "ldr r5,[r10,r9,lsr #1]",
- "E7 BA 50 A9", "ldr r5,[r10,r9,lsr #1]!",
- "E7 9A 50 29", "ldr r5,[r10,r9,lsr #32]",
- "E7 BA 50 29", "ldr r5,[r10,r9,lsr #32]!",
- "E7 9A 50 E9", "ldr r5,[r10,r9,ror #1]",
- "E7 BA 50 E9", "ldr r5,[r10,r9,ror #1]!",
- "E7 9A 5F E9", "ldr r5,[r10,r9,ror #31]",
- "E7 BA 5F E9", "ldr r5,[r10,r9,ror #31]!",
- "E7 9A 50 69", "ldr r5,[r10,r9,rrx]",
- "E7 BA 50 69", "ldr r5,[r10,r9,rrx]!",
- "07 9A 50 09", "ldreq r5,[r10,r9]",
- "E7 BA 50 09", "ldr r5,[r10,r9]!",
- "07 1A 50 C9", "ldreq r5,[r10,-r9,asr #1]",
- "E7 3A 50 C9", "ldr r5,[r10,-r9,asr #1]!",
- "E7 1A 50 49", "ldr r5,[r10,-r9,asr #32]",
- "E7 3A 50 49", "ldr r5,[r10,-r9,asr #32]!",
- "E7 1A 50 89", "ldr r5,[r10,-r9,lsl #1]",
- "E7 3A 50 89", "ldr r5,[r10,-r9,lsl #1]!",
- "E7 1A 5F 89", "ldr r5,[r10,-r9,lsl #31]",
- "E7 3A 5F 89", "ldr r5,[r10,-r9,lsl #31]!",
- "E7 1A 50 A9", "ldr r5,[r10,-r9,lsr #1]",
- "E7 3A 50 A9", "ldr r5,[r10,-r9,lsr #1]!",
- "E7 1A 50 29", "ldr r5,[r10,-r9,lsr #32]",
- "E7 3A 50 29", "ldr r5,[r10,-r9,lsr #32]!",
- "E7 1A 50 E9", "ldr r5,[r10,-r9,ror #1]",
- "E7 3A 50 E9", "ldr r5,[r10,-r9,ror #1]!",
- "E7 1A 5F E9", "ldr r5,[r10,-r9,ror #31]",
- "E7 3A 5F E9", "ldr r5,[r10,-r9,ror #31]!",
- "E7 1A 50 69", "ldr r5,[r10,-r9,rrx]",
- "E7 3A 50 69", "ldr r5,[r10,-r9,rrx]!",
- "E7 1A 50 09", "ldr r5,[r10,-r9]",
- "E7 3A 50 09", "ldr r5,[r10,-r9]!",
- "05 1A 59 87", "ldreq r5,[r10,#-0x987]",
- "E5 3A 59 87", "ldr r5,[r10,#-0x987]!",
- "E5 9A 59 87", "ldr r5,[r10,#0x987]",
- "E5 BA 59 87", "ldr r5,[r10,#0x987]!",
- "E5 9A 50 00", "ldr r5,[r10]",
- "E6 1A 50 09", "ldr r5,[r10],-r9",
- "E6 9A 50 09", "ldr r5,[r10],r9",
- "E6 9A 50 C9", "ldr r5,[r10],r9,asr #1",
- "E6 9A 50 49", "ldr r5,[r10],r9,asr #32",
- "E6 9A 50 89", "ldr r5,[r10],r9,lsl #1",
- "E6 9A 5F 89", "ldr r5,[r10],r9,lsl #31",
- "E6 9A 50 A9", "ldr r5,[r10],r9,lsr #1",
- "E6 9A 50 29", "ldr r5,[r10],r9,lsr #32",
- "E6 9A 50 E9", "ldr r5,[r10],r9,ror #1",
- "E6 9A 5F E9", "ldr r5,[r10],r9,ror #31",
- "E6 9A 50 69", "ldr r5,[r10],r9,rrx",
- "06 1A 50 C9", "ldreq r5,[r10],-r9,asr #1",
- "E6 1A 50 49", "ldr r5,[r10],-r9,asr #32",
- "E6 1A 50 89", "ldr r5,[r10],-r9,lsl #1",
- "E6 1A 5F 89", "ldr r5,[r10],-r9,lsl #31",
- "E6 1A 50 A9", "ldr r5,[r10],-r9,lsr #1",
- "E6 1A 50 29", "ldr r5,[r10],-r9,lsr #32",
- "E6 1A 50 E9", "ldr r5,[r10],-r9,ror #1",
- "E6 1A 5F E9", "ldr r5,[r10],-r9,ror #31",
- "E6 1A 50 69", "ldr r5,[r10],-r9,rrx",
- "04 1A 59 87", "ldreq r5,[r10],#-0x987",
- "E4 9A 59 87", "ldr r5,[r10],#0x987",
- "05 5F 59 87", "ldrbeq r5,[pc,#-0x987] ; 0xfffff679",
- "E5 DF 59 87", "ldrb r5,[pc,#0x987] ; 0x987",
- "E7 7A 50 09", "ldrb r5,[r10,-r9]!",
- "05 5A 59 87", "ldrbeq r5,[r10,#-0x987]",
- "E5 7A 59 87", "ldrb r5,[r10,#-0x987]!",
- "E5 DA 59 87", "ldrb r5,[r10,#0x987]",
- "E5 FA 59 87", "ldrb r5,[r10,#0x987]!",
- "07 DA 50 C9", "ldrbeq r5,[r10,r9,asr #1]",
- "E7 FA 50 C9", "ldrb r5,[r10,r9,asr #1]!",
- "E7 DA 50 49", "ldrb r5,[r10,r9,asr #32]",
- "E7 FA 50 49", "ldrb r5,[r10,r9,asr #32]!",
- "E7 DA 50 89", "ldrb r5,[r10,r9,lsl #1]",
- "E7 FA 50 89", "ldrb r5,[r10,r9,lsl #1]!",
- "E7 DA 5F 89", "ldrb r5,[r10,r9,lsl #31]",
- "E7 FA 5F 89", "ldrb r5,[r10,r9,lsl #31]!",
- "E7 DA 50 A9", "ldrb r5,[r10,r9,lsr #1]",
- "E7 FA 50 A9", "ldrb r5,[r10,r9,lsr #1]!",
- "E7 DA 50 29", "ldrb r5,[r10,r9,lsr #32]",
- "E7 FA 50 29", "ldrb r5,[r10,r9,lsr #32]!",
- "E7 DA 50 E9", "ldrb r5,[r10,r9,ror #1]",
- "E7 FA 50 E9", "ldrb r5,[r10,r9,ror #1]!",
- "E7 DA 5F E9", "ldrb r5,[r10,r9,ror #31]",
- "E7 FA 5F E9", "ldrb r5,[r10,r9,ror #31]!",
- "E7 DA 50 69", "ldrb r5,[r10,r9,rrx]",
- "E7 FA 50 69", "ldrb r5,[r10,r9,rrx]!",
- "E7 DA 50 09", "ldrb r5,[r10,r9]",
- "E7 FA 50 09", "ldrb r5,[r10,r9]!",
- "07 5A 50 C9", "ldrbeq r5,[r10,-r9,asr #1]",
- "E7 7A 50 C9", "ldrb r5,[r10,-r9,asr #1]!",
- "E7 5A 50 49", "ldrb r5,[r10,-r9,asr #32]",
- "E7 7A 50 49", "ldrb r5,[r10,-r9,asr #32]!",
- "E7 5A 50 89", "ldrb r5,[r10,-r9,lsl #1]",
- "E7 7A 50 89", "ldrb r5,[r10,-r9,lsl #1]!",
- "E7 5A 5F 89", "ldrb r5,[r10,-r9,lsl #31]",
- "E7 7A 5F 89", "ldrb r5,[r10,-r9,lsl #31]!",
- "E7 5A 50 A9", "ldrb r5,[r10,-r9,lsr #1]",
- "E7 7A 50 A9", "ldrb r5,[r10,-r9,lsr #1]!",
- "E7 5A 50 29", "ldrb r5,[r10,-r9,lsr #32]",
- "E7 7A 50 29", "ldrb r5,[r10,-r9,lsr #32]!",
- "E7 5A 50 E9", "ldrb r5,[r10,-r9,ror #1]",
- "E7 7A 50 E9", "ldrb r5,[r10,-r9,ror #1]!",
- "E7 5A 5F E9", "ldrb r5,[r10,-r9,ror #31]",
- "E7 7A 5F E9", "ldrb r5,[r10,-r9,ror #31]!",
- "E7 5A 50 69", "ldrb r5,[r10,-r9,rrx]",
- "E7 7A 50 69", "ldrb r5,[r10,-r9,rrx]!",
- "E7 5A 50 09", "ldrb r5,[r10,-r9]",
- "E5 DA 50 00", "ldrb r5,[r10]",
- "E4 5A 59 87", "ldrb r5,[r10],#-0x987",
- "E4 DA 59 87", "ldrb r5,[r10],#0x987",
- "E6 DA 50 09", "ldrb r5,[r10],r9",
- "E6 DA 50 C9", "ldrb r5,[r10],r9,asr #1",
- "E6 DA 50 49", "ldrb r5,[r10],r9,asr #32",
- "E6 DA 50 89", "ldrb r5,[r10],r9,lsl #1",
- "E6 DA 5F 89", "ldrb r5,[r10],r9,lsl #31",
- "E6 DA 50 A9", "ldrb r5,[r10],r9,lsr #1",
- "E6 DA 50 29", "ldrb r5,[r10],r9,lsr #32",
- "E6 DA 50 E9", "ldrb r5,[r10],r9,ror #1",
- "E6 DA 5F E9", "ldrb r5,[r10],r9,ror #31",
- "E6 DA 50 69", "ldrb r5,[r10],r9,rrx",
- "E6 5A 50 09", "ldrb r5,[r10],-r9",
- "E6 5A 50 C9", "ldrb r5,[r10],-r9,asr #1",
- "E6 5A 50 49", "ldrb r5,[r10],-r9,asr #32",
- "E6 5A 50 89", "ldrb r5,[r10],-r9,lsl #1",
- "E6 5A 5F 89", "ldrb r5,[r10],-r9,lsl #31",
- "E6 5A 50 A9", "ldrb r5,[r10],-r9,lsr #1",
- "E6 5A 50 29", "ldrb r5,[r10],-r9,lsr #32",
- "E6 5A 50 E9", "ldrb r5,[r10],-r9,ror #1",
- "E6 5A 5F E9", "ldrb r5,[r10],-r9,ror #31",
- "E6 5A 50 69", "ldrb r5,[r10],-r9,rrx",
- "04 7A 59 87", "ldrbteq r5,[r10],#-0x987",
- "E4 FA 59 87", "ldrbt r5,[r10],#0x987",
- "E6 FA 50 09", "ldrbt r5,[r10],r9",
- "E6 FA 50 C9", "ldrbt r5,[r10],r9,asr #1",
- "E6 FA 50 49", "ldrbt r5,[r10],r9,asr #32",
- "E6 FA 50 89", "ldrbt r5,[r10],r9,lsl #1",
- "E6 FA 5F 89", "ldrbt r5,[r10],r9,lsl #31",
- "E6 FA 50 A9", "ldrbt r5,[r10],r9,lsr #1",
- "E6 FA 50 29", "ldrbt r5,[r10],r9,lsr #32",
- "E6 FA 50 E9", "ldrbt r5,[r10],r9,ror #1",
- "E6 FA 5F E9", "ldrbt r5,[r10],r9,ror #31",
- "E6 FA 50 69", "ldrbt r5,[r10],r9,rrx",
- "06 7A 50 09", "ldrbteq r5,[r10],-r9",
- "06 7A 50 C9", "ldrbteq r5,[r10],-r9,asr #1",
- "E6 7A 50 49", "ldrbt r5,[r10],-r9,asr #32",
- "E6 7A 50 89", "ldrbt r5,[r10],-r9,lsl #1",
- "E6 7A 5F 89", "ldrbt r5,[r10],-r9,lsl #31",
- "E6 7A 50 A9", "ldrbt r5,[r10],-r9,lsr #1",
- "E6 7A 50 29", "ldrbt r5,[r10],-r9,lsr #32",
- "E6 7A 50 E9", "ldrbt r5,[r10],-r9,ror #1",
- "E6 7A 5F E9", "ldrbt r5,[r10],-r9,ror #31",
- "E6 7A 50 69", "ldrbt r5,[r10],-r9,rrx",
- "01 4F 68 D7", "ldrdeq r6,r7,[pc,#-0x87] ; 0xffffff79",
- "E1 CF 68 D7", "ldrd r6,r7,[pc,#0x87] ; 0x87",
- "01 4A 68 D7", "ldrdeq r6,r7,[r10,#-0x87]",
- "E1 6A 68 D7", "ldrd r6,r7,[r10,#-0x87]!",
- "E1 CA 68 D7", "ldrd r6,r7,[r10,#0x87]",
- "E1 EA 68 D7", "ldrd r6,r7,[r10,#0x87]!",
- "E1 8A 60 D9", "ldrd r6,r7,[r10,r9]",
- "E1 AA 60 D9", "ldrd r6,r7,[r10,r9]!",
- "01 0A 60 D9", "ldrdeq r6,r7,[r10,-r9]",
- "E1 2A 60 D9", "ldrd r6,r7,[r10,-r9]!",
- "E1 CA 60 D0", "ldrd r6,r7,[r10]",
- "00 4A 68 D7", "ldrdeq r6,r7,[r10],#-0x87",
- "E0 CA 68 D7", "ldrd r6,r7,[r10],#0x87",
- "E0 8A 60 D9", "ldrd r6,r7,[r10],r9",
- "E0 0A 60 D9", "ldrd r6,r7,[r10],-r9",
- "01 9A 5F 9F", "ldrexeq r5,[r10]",
- "01 DA 5F 9F", "ldrexbeq r5,[r10]",
- "01 BA 6F 9F", "ldrexdeq r6,r7,[r10]",
- "01 FA 5F 9F", "ldrexheq r5,[r10]",
- "01 5F 58 B7", "ldrheq r5,[pc,#-0x87] ; 0xffffff79",
- "E1 DF 58 B7", "ldrh r5,[pc,#0x87] ; 0x87",
- "01 5A 58 B7", "ldrheq r5,[r10,#-0x87]",
- "E1 7A 58 B7", "ldrh r5,[r10,#-0x87]!",
- "E1 DA 58 B7", "ldrh r5,[r10,#0x87]",
- "E1 FA 58 B7", "ldrh r5,[r10,#0x87]!",
- "E1 9A 50 B9", "ldrh r5,[r10,r9]",
- "E1 BA 50 B9", "ldrh r5,[r10,r9]!",
- "01 1A 50 B9", "ldrheq r5,[r10,-r9]",
- "E1 3A 50 B9", "ldrh r5,[r10,-r9]!",
- "E1 DA 50 B0", "ldrh r5,[r10]",
- "E0 1A 50 B9", "ldrh r5,[r10],-r9",
- "00 5A 58 B7", "ldrheq r5,[r10],#-0x87",
- "E0 DA 58 B7", "ldrh r5,[r10],#0x87",
- "E0 9A 50 B9", "ldrh r5,[r10],r9",
- "E1 DA 50 B0", "ldrh r5,[r10]",
- "00 FA 50 B0", "ldrhteq r5,[r10]",
- "00 7A 58 B7", "ldrhteq r5,[r10],#-0x87",
- "E0 FA 58 B7", "ldrht r5,[r10],#0x87",
- "E0 BA 50 B9", "ldrht r5,[r10],r9",
- "00 3A 50 B9", "ldrhteq r5,[r10],-r9",
- "01 5F 58 D7", "ldrsbeq r5,[pc,#-0x87] ; 0xffffff79",
- "E1 DF 58 D7", "ldrsb r5,[pc,#0x87] ; 0x87",
- "01 5A 58 D7", "ldrsbeq r5,[r10,#-0x87]",
- "E1 7A 58 D7", "ldrsb r5,[r10,#-0x87]!",
- "E1 DA 58 D7", "ldrsb r5,[r10,#0x87]",
- "E1 FA 58 D7", "ldrsb r5,[r10,#0x87]!",
- "E1 9A 50 D9", "ldrsb r5,[r10,r9]",
- "E1 BA 50 D9", "ldrsb r5,[r10,r9]!",
- "01 1A 50 D9", "ldrsbeq r5,[r10,-r9]",
- "E1 3A 50 D9", "ldrsb r5,[r10,-r9]!",
- "E1 DA 50 D0", "ldrsb r5,[r10]",
- "00 5A 58 D7", "ldrsbeq r5,[r10],#-0x87",
- "E0 DA 58 D7", "ldrsb r5,[r10],#0x87",
- "E0 9A 50 D9", "ldrsb r5,[r10],r9",
- "00 1A 50 D9", "ldrsbeq r5,[r10],-r9",
- "00 FA 50 D0", "ldrsbteq r5,[r10]",
- "00 7A 58 D7", "ldrsbteq r5,[r10],#-0x87",
- "E0 FA 58 D7", "ldrsbt r5,[r10],#0x87",
- "E0 BA 50 D9", "ldrsbt r5,[r10],r9",
- "00 3A 50 D9", "ldrsbteq r5,[r10],-r9",
- "01 5F 58 F7", "ldrsheq r5,[pc,#-0x87] ; 0xffffff79",
- "E1 DF 58 F7", "ldrsh r5,[pc,#0x87] ; 0x87",
- "01 5A 58 F7", "ldrsheq r5,[r10,#-0x87]",
- "E1 7A 58 F7", "ldrsh r5,[r10,#-0x87]!",
- "E1 DA 58 F7", "ldrsh r5,[r10,#0x87]",
- "E1 FA 58 F7", "ldrsh r5,[r10,#0x87]!",
- "E1 9A 50 F9", "ldrsh r5,[r10,r9]",
- "E1 BA 50 F9", "ldrsh r5,[r10,r9]!",
- "01 1A 50 F9", "ldrsheq r5,[r10,-r9]",
- "E1 3A 50 F9", "ldrsh r5,[r10,-r9]!",
- "E1 DA 50 F0", "ldrsh r5,[r10]",
- "00 5A 58 F7", "ldrsheq r5,[r10],#-0x87",
- "E0 DA 58 F7", "ldrsh r5,[r10],#0x87",
- "E0 9A 50 F9", "ldrsh r5,[r10],r9",
- "E0 1A 50 F9", "ldrsh r5,[r10],-r9",
- "00 FA 50 F0", "ldrshteq r5,[r10]",
- "00 7A 58 F7", "ldrshteq r5,[r10],#-0x87",
- "E0 FA 58 F7", "ldrsht r5,[r10],#0x87",
- "E0 BA 50 F9", "ldrsht r5,[r10],r9",
- "00 3A 50 F9", "ldrshteq r5,[r10],-r9",
- "04 BA 50 00", "ldrteq r5,[r10]",
- "04 3A 59 87", "ldrteq r5,[r10],#-0x987",
- "E4 BA 59 87", "ldrt r5,[r10],#0x987",
- "E6 BA 50 09", "ldrt r5,[r10],r9",
- "E6 BA 50 C9", "ldrt r5,[r10],r9,asr #1",
- "E6 BA 50 49", "ldrt r5,[r10],r9,asr #32",
- "E6 BA 50 89", "ldrt r5,[r10],r9,lsl #1",
- "E6 BA 5F 89", "ldrt r5,[r10],r9,lsl #31",
- "E6 BA 50 A9", "ldrt r5,[r10],r9,lsr #1",
- "E6 BA 50 29", "ldrt r5,[r10],r9,lsr #32",
- "E6 BA 50 E9", "ldrt r5,[r10],r9,ror #1",
- "E6 BA 5F E9", "ldrt r5,[r10],r9,ror #31",
- "E6 BA 50 69", "ldrt r5,[r10],r9,rrx",
- "06 3A 50 09", "ldrteq r5,[r10],-r9",
- "06 3A 50 C9", "ldrteq r5,[r10],-r9,asr #1",
- "E6 3A 50 49", "ldrt r5,[r10],-r9,asr #32",
- "E6 3A 50 89", "ldrt r5,[r10],-r9,lsl #1",
- "E6 3A 5F 89", "ldrt r5,[r10],-r9,lsl #31",
- "E6 3A 50 A9", "ldrt r5,[r10],-r9,lsr #1",
- "E6 3A 50 29", "ldrt r5,[r10],-r9,lsr #32",
- "E6 3A 50 E9", "ldrt r5,[r10],-r9,ror #1",
- "E6 3A 5F E9", "ldrt r5,[r10],-r9,ror #31",
- "E6 3A 50 69", "ldrt r5,[r10],-r9,rrx",
- "01 A0 5E 89", "lsleq r5,r9,#29",
- "01 A0 5A 19", "lsleq r5,r9,r10",
- "E1 B0 5E 89", "lsls r5,r9,#29",
- "E1 B0 5A 19", "lsls r5,r9,r10",
- "01 A0 5E A9", "lsreq r5,r9,#29",
- "01 A0 5A 39", "lsreq r5,r9,r10",
- "01 B0 5E A9", "lsrseq r5,r9,#29",
- "01 B0 5A 39", "lsrseq r5,r9,r10",
- "0E C9 59 FA", "mcreq p9,0x6,r5,c9,c10,0x7",
- "FE C9 59 FA", "mcr2 p9,0x6,r5,c9,c10,0x7",
- "0C 46 59 C9", "mcrreq p9,0xc,r5,r6,c9",
- "FC 46 59 C9", "mcrr2 p9,0xc,r5,r6,c9",
- "00 25 8A 99", "mlaeq r5,r9,r10,r8",
- "00 35 8A 99", "mlaseq r5,r9,r10,r8",
- "00 65 8A 99", "mlseq r5,r9,r10,r8",
- "03 A0 50 71", "moveq r5,#0x71",
- "01 A0 50 09", "moveq r5,r9",
- "03 B0 51 FE", "movseq r5,#0x8000003f",
- "01 B0 50 09", "movseq r5,r9",
- "03 49 58 76", "movteq r5,#0x9876",
- "03 09 58 76", "movweq r5,#0x9876",
- "0E D5 F9 B9", "mrceq p9,0x6,apsr_nzcv,c5,c9,0x5",
- "EE F5 59 99", "mrc p9,0x7,r5,c5,c9,0x4",
- "FE 95 F9 F9", "mrc2 p9,0x4,apsr_nzcv,c5,c9,0x7",
- "FE B5 59 D9", "mrc2 p9,0x5,r5,c5,c9,0x6",
- "0C 56 59 F9", "mrrceq p9,0xf,r5,r6,c9",
- "FC 56 59 39", "mrrc2 p9,0x3,r5,r6,c9",
- "01 0F 50 00", "mrseq r5,cpsr",
- "E1 4F 50 00", "mrs r5,spsr",
- "03 2F F1 FE", "msreq cpsr_cxfs,#0x8000003f",
- "01 2F F0 0A", "msreq cpsr_cxfs,r10",
- "E3 6F F1 FE", "msr spsr_cxfs,#0x8000003f",
- "E1 6F F0 0A", "msr spsr_cxfs,r10",
- "03 28 F0 71", "msreq cpsr_f,#0x71",
- "01 28 F0 0A", "msreq cpsr_f,r10",
- "E3 24 F1 FE", "msr cpsr_s,#0x8000003f",
- "E1 24 F0 0A", "msr cpsr_s,r10",
- "E3 2C F1 FE", "msr cpsr_fs,#0x8000003f",
- "E1 2C F0 0A", "msr cpsr_fs,r10",
- "00 05 0A 99", "muleq r5,r9,r10",
- "00 15 0A 99", "mulseq r5,r9,r10",
- "03 E0 50 71", "mvneq r5,#0x71",
- "01 E0 50 C9", "mvneq r5,r9,asr #1",
- "01 E0 56 59", "mvneq r5,r9,asr r6",
- "E1 E0 50 89", "mvn r5,r9,lsl #1",
- "E1 E0 56 19", "mvn r5,r9,lsl r6",
- "E1 E0 50 29", "mvn r5,r9,lsr #32",
- "E1 E0 5F E9", "mvn r5,r9,ror #31",
- "E1 E0 50 69", "mvn r5,r9,rrx",
- "03 F0 51 FE", "mvnseq r5,#0x8000003f",
- "01 F0 50 49", "mvnseq r5,r9,asr #32",
- "E1 F0 5F 89", "mvns r5,r9,lsl #31",
- "E1 F0 50 A9", "mvns r5,r9,lsr #1",
- "01 F0 56 39", "mvnseq r5,r9,lsr r6",
- "E1 F0 50 E9", "mvns r5,r9,ror #1",
- "E1 F0 56 79", "mvns r5,r9,ror r6",
- "E3 20 F0 00", "nop",
- "03 20 F0 00", "nopeq",
- "03 8A 50 71", "orreq r5,r10,#0x71",
- "01 89 50 CA", "orreq r5,r9,r10,asr #1",
- "01 89 56 5A", "orreq r5,r9,r10,asr r6",
- "E1 89 50 8A", "orr r5,r9,r10,lsl #1",
- "E1 89 56 1A", "orr r5,r9,r10,lsl r6",
- "E1 89 50 2A", "orr r5,r9,r10,lsr #32",
- "E1 89 5F EA", "orr r5,r9,r10,ror #31",
- "E1 89 50 6A", "orr r5,r9,r10,rrx",
- "03 9A 51 FE", "orrseq r5,r10,#0x8000003f",
- "01 99 50 4A", "orrseq r5,r9,r10,asr #32",
- "E1 99 5F 8A", "orrs r5,r9,r10,lsl #31",
- "E1 99 50 AA", "orrs r5,r9,r10,lsr #1",
- "01 99 56 3A", "orrseq r5,r9,r10,lsr r6",
- "E1 99 50 EA", "orrs r5,r9,r10,ror #1",
- "E1 99 56 7A", "orrs r5,r9,r10,ror r6",
- "06 89 50 1A", "pkhbteq r5,r9,r10",
- "06 89 5E 9A", "pkhbteq r5,r9,r10,lsl #29",
- "06 89 5E DA", "pkhtbeq r5,r9,r10,asr #29",
- "F5 5F F9 87", "pld [pc,#-0x987] ; 0xfffff679",
- "F5 DF F9 87", "pld [pc,#0x987] ; 0x987",
- "F5 5A F9 87", "pld [r10,#-0x987]",
- "F5 DA F9 87", "pld [r10,#0x987]",
- "F7 DA F0 C9", "pld [r10,r9,asr #1]",
- "F7 DA F0 49", "pld [r10,r9,asr #32]",
- "F7 DA F0 89", "pld [r10,r9,lsl #1]",
- "F7 DA FF 89", "pld [r10,r9,lsl #31]",
- "F7 DA F0 A9", "pld [r10,r9,lsr #1]",
- "F7 DA F0 29", "pld [r10,r9,lsr #32]",
- "F7 DA F0 E9", "pld [r10,r9,ror #1]",
- "F7 DA FF E9", "pld [r10,r9,ror #31]",
- "F7 DA F0 69", "pld [r10,r9,rrx]",
- "F7 DA F0 09", "pld [r10,r9]",
- "F7 5A F0 C9", "pld [r10,-r9,asr #1]",
- "F7 5A F0 49", "pld [r10,-r9,asr #32]",
- "F7 5A F0 89", "pld [r10,-r9,lsl #1]",
- "F7 5A FF 89", "pld [r10,-r9,lsl #31]",
- "F7 5A F0 A9", "pld [r10,-r9,lsr #1]",
- "F7 5A F0 29", "pld [r10,-r9,lsr #32]",
- "F7 5A F0 E9", "pld [r10,-r9,ror #1]",
- "F7 5A FF E9", "pld [r10,-r9,ror #31]",
- "F7 5A F0 69", "pld [r10,-r9,rrx]",
- "F7 5A F0 09", "pld [r10,-r9]",
- "F5 1A F9 87", "pldw [r10,#-0x987]",
- "F5 9A F9 87", "pldw [r10,#0x987]",
- "F7 9A F0 C9", "pldw [r10,r9,asr #1]",
- "F7 9A F0 49", "pldw [r10,r9,asr #32]",
- "F7 9A F0 89", "pldw [r10,r9,lsl #1]",
- "F7 9A FF 89", "pldw [r10,r9,lsl #31]",
- "F7 9A F0 A9", "pldw [r10,r9,lsr #1]",
- "F7 9A F0 29", "pldw [r10,r9,lsr #32]",
- "F7 9A F0 E9", "pldw [r10,r9,ror #1]",
- "F7 9A FF E9", "pldw [r10,r9,ror #31]",
- "F7 9A F0 69", "pldw [r10,r9,rrx]",
- "F7 9A F0 09", "pldw [r10,r9]",
- "F7 1A F0 C9", "pldw [r10,-r9,asr #1]",
- "F7 1A F0 49", "pldw [r10,-r9,asr #32]",
- "F7 1A F0 89", "pldw [r10,-r9,lsl #1]",
- "F7 1A FF 89", "pldw [r10,-r9,lsl #31]",
- "F7 1A F0 A9", "pldw [r10,-r9,lsr #1]",
- "F7 1A F0 29", "pldw [r10,-r9,lsr #32]",
- "F7 1A F0 E9", "pldw [r10,-r9,ror #1]",
- "F7 1A FF E9", "pldw [r10,-r9,ror #31]",
- "F7 1A F0 69", "pldw [r10,-r9,rrx]",
- "F7 1A F0 09", "pldw [r10,-r9]",
- "F4 5F F9 87", "pli [pc,#-0x987] ; 0xfffff679",
- "F4 DF F9 87", "pli [pc,#0x987] ; 0x987",
- "F4 5A F9 87", "pli [r10,#-0x987]",
- "F4 DA F9 87", "pli [r10,#0x987]",
- "F6 DA F0 C9", "pli [r10,r9,asr #1]",
- "F6 DA F0 49", "pli [r10,r9,asr #32]",
- "F6 DA F0 89", "pli [r10,r9,lsl #1]",
- "F6 DA FF 89", "pli [r10,r9,lsl #31]",
- "F6 DA F0 A9", "pli [r10,r9,lsr #1]",
- "F6 DA F0 29", "pli [r10,r9,lsr #32]",
- "F6 DA F0 E9", "pli [r10,r9,ror #1]",
- "F6 DA FF E9", "pli [r10,r9,ror #31]",
- "F6 DA F0 69", "pli [r10,r9,rrx]",
- "F6 DA F0 09", "pli [r10,r9]",
- "04 9D E0 04", "popeq {lr}",
- "F6 5A F0 C9", "pli [r10,-r9,asr #1]",
- "F6 5A F0 49", "pli [r10,-r9,asr #32]",
- "F6 5A F0 89", "pli [r10,-r9,lsl #1]",
- "F6 5A FF 89", "pli [r10,-r9,lsl #31]",
- "F6 5A F0 A9", "pli [r10,-r9,lsr #1]",
- "F6 5A F0 29", "pli [r10,-r9,lsr #32]",
- "F6 5A F0 E9", "pli [r10,-r9,ror #1]",
- "F6 5A FF E9", "pli [r10,-r9,ror #31]",
- "F6 5A F0 69", "pli [r10,-r9,rrx]",
- "F6 5A F0 09", "pli [r10,-r9]",
- "E8 BD 82 40", "pop {r6,r9,pc}",
- "05 2D E0 04", "pusheq {lr}",
- "E9 2D 12 40", "push {r6,r9,r12}",
- "01 0A 50 59", "qaddeq r5,r9,r10",
- "06 29 5F 1A", "qadd16eq r5,r9,r10",
- "06 29 5F 9A", "qadd8eq r5,r9,r10",
- "06 29 5F 3A", "qasxeq r5,r9,r10",
- "01 4A 50 59", "qdaddeq r5,r9,r10",
- "01 6A 50 59", "qdsubeq r5,r9,r10",
- "06 29 5F 5A", "qsaxeq r5,r9,r10",
- "01 2A 50 59", "qsubeq r5,r9,r10",
- "06 29 5F 7A", "qsub16eq r5,r9,r10",
- "06 29 5F FA", "qsub8eq r5,r9,r10",
- "06 FF 5F 39", "rbiteq r5,r9",
- "06 BF 5F 39", "reveq r5,r9",
- "06 BF 5F B9", "rev16eq r5,r9",
- "06 FF 5F B9", "revsheq r5,r9",
- "F8 1A 0A 00", "rfeda r10",
- "F8 3A 0A 00", "rfeda r10!",
- "F9 1A 0A 00", "rfedb r10",
- "F9 3A 0A 00", "rfedb r10!",
- "F8 9A 0A 00", "rfeia r10",
- "F8 BA 0A 00", "rfeia r10!",
- "F9 9A 0A 00", "rfeib r10",
- "F9 BA 0A 00", "rfeib r10!",
- "01 A0 5E E9", "roreq r5,r9,#29",
- "01 A0 5A 79", "roreq r5,r9,r10",
- "E1 B0 5E E9", "rors r5,r9,#29",
- "E1 B0 5A 79", "rors r5,r9,r10",
- "01 A0 50 69", "rrxeq r5,r9",
- "01 B0 50 69", "rrxseq r5,r9",
- "02 6A 50 71", "rsbeq r5,r10,#0x71",
- "00 69 50 CA", "rsbeq r5,r9,r10,asr #1",
- "00 69 56 5A", "rsbeq r5,r9,r10,asr r6",
- "E0 69 50 8A", "rsb r5,r9,r10,lsl #1",
- "E0 69 56 1A", "rsb r5,r9,r10,lsl r6",
- "E0 69 50 2A", "rsb r5,r9,r10,lsr #32",
- "E0 69 5F EA", "rsb r5,r9,r10,ror #31",
- "E0 69 50 6A", "rsb r5,r9,r10,rrx",
- "02 7A 51 FE", "rsbseq r5,r10,#0x8000003f",
- "00 79 50 4A", "rsbseq r5,r9,r10,asr #32",
- "E0 79 5F 8A", "rsbs r5,r9,r10,lsl #31",
- "E0 79 50 AA", "rsbs r5,r9,r10,lsr #1",
- "00 79 56 3A", "rsbseq r5,r9,r10,lsr r6",
- "E0 79 50 EA", "rsbs r5,r9,r10,ror #1",
- "E0 79 56 7A", "rsbs r5,r9,r10,ror r6",
- "02 EA 50 71", "rsceq r5,r10,#0x71",
- "00 E9 50 CA", "rsceq r5,r9,r10,asr #1",
- "00 E9 56 5A", "rsceq r5,r9,r10,asr r6",
- "E0 E9 50 8A", "rsc r5,r9,r10,lsl #1",
- "E0 E9 56 1A", "rsc r5,r9,r10,lsl r6",
- "E0 E9 50 2A", "rsc r5,r9,r10,lsr #32",
- "E0 E9 5F EA", "rsc r5,r9,r10,ror #31",
- "E0 E9 50 6A", "rsc r5,r9,r10,rrx",
- "02 FA 51 FE", "rscseq r5,r10,#0x8000003f",
- "00 F9 50 4A", "rscseq r5,r9,r10,asr #32",
- "E0 F9 5F 8A", "rscs r5,r9,r10,lsl #31",
- "E0 F9 50 AA", "rscs r5,r9,r10,lsr #1",
- "00 F9 56 3A", "rscseq r5,r9,r10,lsr r6",
- "E0 F9 50 EA", "rscs r5,r9,r10,ror #1",
- "E0 F9 56 7A", "rscs r5,r9,r10,ror r6",
- "06 19 5F 1A", "sadd16eq r5,r9,r10",
- "06 19 5F 9A", "sadd8eq r5,r9,r10",
- "06 19 5F 3A", "sasxeq r5,r9,r10",
- "02 CA 50 71", "sbceq r5,r10,#0x71",
- "00 C9 50 CA", "sbceq r5,r9,r10,asr #1",
- "00 C9 56 5A", "sbceq r5,r9,r10,asr r6",
- "E0 C9 50 8A", "sbc r5,r9,r10,lsl #1",
- "E0 C9 56 1A", "sbc r5,r9,r10,lsl r6",
- "E0 C9 50 2A", "sbc r5,r9,r10,lsr #32",
- "E0 C9 5F EA", "sbc r5,r9,r10,ror #31",
- "E0 C9 50 6A", "sbc r5,r9,r10,rrx",
- "02 DA 51 FE", "sbcseq r5,r10,#0x8000003f",
- "00 D9 50 4A", "sbcseq r5,r9,r10,asr #32",
- "E0 D9 5F 8A", "sbcs r5,r9,r10,lsl #31",
- "E0 D9 50 AA", "sbcs r5,r9,r10,lsr #1",
- "00 D9 56 3A", "sbcseq r5,r9,r10,lsr r6",
- "E0 D9 50 EA", "sbcs r5,r9,r10,ror #1",
- "E0 D9 56 7A", "sbcs r5,r9,r10,ror r6",
- "07 BF 50 5A", "sbfxeq r5,r10,#0,#32",
- "E7 A0 5F DA", "sbfx r5,r10,#31,#1",
- "06 89 5F BA", "seleq r5,r9,r10",
- "F1 01 02 00", "setend be",
- "F1 01 00 00", "setend le",
- "03 20 F0 04", "seveq",
- "06 39 5F 1A", "shadd16eq r5,r9,r10",
- "06 39 5F 9A", "shadd8eq r5,r9,r10",
- "06 39 5F 3A", "shasxeq r5,r9,r10",
- "06 39 5F 5A", "shsaxeq r5,r9,r10",
- "06 39 5F 7A", "shsub16eq r5,r9,r10",
- "06 39 5F FA", "shsub8eq r5,r9,r10",
- "01 60 00 7E", "smceq #0xe",
- "01 05 8A 89", "smlabbeq r5,r9,r10,r8",
- "E1 05 8A C9", "smlabt r5,r9,r10,r8",
- "07 05 8A 19", "smladeq r5,r9,r10,r8",
- "07 05 8A 39", "smladxeq r5,r9,r10,r8",
- "00 E9 58 9A", "smlaleq r5,r9,r10,r8",
- "00 F9 58 9A", "smlalseq r5,r9,r10,r8",
- "01 49 58 8A", "smlalbbeq r5,r9,r10,r8",
- "01 49 58 CA", "smlalbteq r5,r9,r10,r8",
- "07 49 58 1A", "smlaldeq r5,r9,r10,r8",
- "07 49 58 3A", "smlaldxeq r5,r9,r10,r8",
- "01 49 58 AA", "smlaltbeq r5,r9,r10,r8",
- "01 49 58 EA", "smlaltteq r5,r9,r10,r8",
- "01 05 8A A9", "smlatbeq r5,r9,r10,r8",
- "01 05 8A E9", "smlatteq r5,r9,r10,r8",
- "01 25 8A 89", "smlawbeq r5,r9,r10,r8",
- "01 25 8A C9", "smlawteq r5,r9,r10,r8",
- "07 05 8A 59", "smlsdeq r5,r9,r10,r8",
- "07 05 8A 79", "smlsdxeq r5,r9,r10,r8",
- "07 49 58 5A", "smlsldeq r5,r9,r10,r8",
- "07 49 58 7A", "smlsldxeq r5,r9,r10,r8",
- "07 55 8A 19", "smmlaeq r5,r9,r10,r8",
- "07 55 8A 39", "smmlareq r5,r9,r10,r8",
- "07 55 8A D9", "smmlseq r5,r9,r10,r8",
- "07 55 8A F9", "smmlsreq r5,r9,r10,r8",
- "07 55 FA 19", "smmuleq r5,r9,r10",
- "07 55 FA 39", "smmulreq r5,r9,r10",
- "07 05 FA 19", "smuadeq r5,r9,r10",
- "07 05 FA 39", "smuadxeq r5,r9,r10",
- "01 65 0A 89", "smulbbeq r5,r9,r10",
- "01 65 0A C9", "smulbteq r5,r9,r10",
- "01 65 0A A9", "smultbeq r5,r9,r10",
- "01 65 0A E9", "smultteq r5,r9,r10",
- "00 C9 58 9A", "smulleq r5,r9,r10,r8",
- "00 D9 58 9A", "smullseq r5,r9,r10,r8",
- "01 25 0A A9", "smulwbeq r5,r9,r10",
- "01 25 0A E9", "smulwteq r5,r9,r10",
- "07 05 FA 59", "smusdeq r5,r9,r10",
- "07 05 FA 79", "smusdxeq r5,r9,r10",
- "F8 6D 05 13", "srsda sp!,#0x13",
- "F8 4D 05 13", "srsda sp,#0x13",
- "F9 6D 05 13", "srsdb sp!,#0x13",
- "F9 4D 05 13", "srsdb sp,#0x13",
- "F8 ED 05 13", "srsia sp!,#0x13",
- "F8 CD 05 13", "srsia sp,#0x13",
- "F9 ED 05 13", "srsib sp!,#0x13",
- "F9 CD 05 13", "srsib sp,#0x13",
- "06 BC 50 1A", "ssateq r5,#29,r10",
- "06 BC 50 DA", "ssateq r5,#29,r10,asr #1",
- "E6 BC 50 5A", "ssat r5,#29,r10,asr #32",
- "E6 BC 50 9A", "ssat r5,#29,r10,lsl #1",
- "E6 BC 5F 9A", "ssat r5,#29,r10,lsl #31",
- "06 AE 5F 3A", "ssat16eq r5,#15,r10",
- "06 19 5F 5A", "ssaxeq r5,r9,r10",
- "06 19 5F 7A", "ssub16eq r5,r9,r10",
- "06 19 5F FA", "ssub8eq r5,r9,r10",
- "0D 0A B9 21", "stceq p9,c11,[r10,#-0x84]",
- "ED 2A B9 21", "stc p9,c11,[r10,#-0x84]!",
- "ED 8A B9 21", "stc p9,c11,[r10,#0x84]",
- "ED AA B9 21", "stc p9,c11,[r10,#0x84]!",
- "0C 2A B9 21", "stceq p9,c11,[r10],#-0x84",
- "EC AA B9 21", "stc p9,c11,[r10],#0x84",
- "0C 8A B9 00", "stceq p9,c11,[r10],{0}",
- "EC 8A B9 FF", "stc p9,c11,[r10],{255}",
- "FD 0A B9 21", "stc2 p9,c11,[r10,#-0x84]",
- "FD 2A B9 21", "stc2 p9,c11,[r10,#-0x84]!",
- "FD 8A B9 21", "stc2 p9,c11,[r10,#0x84]",
- "FD AA B9 21", "stc2 p9,c11,[r10,#0x84]!",
- "FC 2A B9 21", "stc2 p9,c11,[r10],#-0x84",
- "FC AA B9 21", "stc2 p9,c11,[r10],#0x84",
- "FC 8A B9 00", "stc2 p9,c11,[r10],{0}",
- "FC 8A B9 FF", "stc2 p9,c11,[r10],{255}",
- "FD 4A B9 21", "stc2l p9,c11,[r10,#-0x84]",
- "FD 6A B9 21", "stc2l p9,c11,[r10,#-0x84]!",
- "FD CA B9 21", "stc2l p9,c11,[r10,#0x84]",
- "FD EA B9 21", "stc2l p9,c11,[r10,#0x84]!",
- "FC 6A B9 21", "stc2l p9,c11,[r10],#-0x84",
- "FC EA B9 21", "stc2l p9,c11,[r10],#0x84",
- "FC CA B9 00", "stc2l p9,c11,[r10],{0}",
- "FC CA B9 FF", "stc2l p9,c11,[r10],{255}",
- "0D 4A B9 21", "stcleq p9,c11,[r10,#-0x84]",
- "ED 6A B9 21", "stcl p9,c11,[r10,#-0x84]!",
- "ED CA B9 21", "stcl p9,c11,[r10,#0x84]",
- "ED EA B9 21", "stcl p9,c11,[r10,#0x84]!",
- "0C 6A B9 21", "stcleq p9,c11,[r10],#-0x84",
- "EC EA B9 21", "stcl p9,c11,[r10],#0x84",
- "0C CA B9 00", "stcleq p9,c11,[r10],{0}",
- "EC CA B9 FF", "stcl p9,c11,[r10],{255}",
- "08 AA 42 40", "stmeq r10!,{r6,r9,lr}",
- "E8 8A 42 40", "stm r10,{r6,r9,lr}",
- "08 2A 42 40", "stmdaeq r10!,{r6,r9,lr}",
- "E8 4A 64 20", "stmda r10,{r5,r10,sp,lr}^",
- "E8 0A 42 40", "stmda r10,{r6,r9,lr}",
- "09 2A 42 40", "stmdbeq r10!,{r6,r9,lr}",
- "E9 4A 64 20", "stmdb r10,{r5,r10,sp,lr}^",
- "E9 0A 42 40", "stmdb r10,{r6,r9,lr}",
- "08 CA 64 20", "stmiaeq r10,{r5,r10,sp,lr}^",
- "09 AA 42 40", "stmibeq r10!,{r6,r9,lr}",
- "E9 CA 64 20", "stmib r10,{r5,r10,sp,lr}^",
- "E9 8A 42 40", "stmib r10,{r6,r9,lr}",
- "05 0A 59 87", "streq r5,[r10,#-0x987]",
- "E5 2A 59 87", "str r5,[r10,#-0x987]!",
- "E5 8A 59 87", "str r5,[r10,#0x987]",
- "E5 AA 59 87", "str r5,[r10,#0x987]!",
- "E7 8A 50 C9", "str r5,[r10,r9,asr #1]",
- "E7 AA 50 C9", "str r5,[r10,r9,asr #1]!",
- "E7 8A 50 49", "str r5,[r10,r9,asr #32]",
- "E7 AA 50 49", "str r5,[r10,r9,asr #32]!",
- "E7 8A 50 89", "str r5,[r10,r9,lsl #1]",
- "E7 AA 50 89", "str r5,[r10,r9,lsl #1]!",
- "E7 8A 5F 89", "str r5,[r10,r9,lsl #31]",
- "E7 AA 5F 89", "str r5,[r10,r9,lsl #31]!",
- "E7 8A 50 A9", "str r5,[r10,r9,lsr #1]",
- "E7 AA 50 A9", "str r5,[r10,r9,lsr #1]!",
- "E7 8A 50 29", "str r5,[r10,r9,lsr #32]",
- "E7 AA 50 29", "str r5,[r10,r9,lsr #32]!",
- "E7 8A 50 E9", "str r5,[r10,r9,ror #1]",
- "E7 AA 50 E9", "str r5,[r10,r9,ror #1]!",
- "E7 8A 5F E9", "str r5,[r10,r9,ror #31]",
- "E7 AA 5F E9", "str r5,[r10,r9,ror #31]!",
- "E7 8A 50 69", "str r5,[r10,r9,rrx]",
- "E7 AA 50 69", "str r5,[r10,r9,rrx]!",
- "E7 8A 50 09", "str r5,[r10,r9]",
- "E7 AA 50 09", "str r5,[r10,r9]!",
- "E5 8A 50 00", "str r5,[r10]",
- "07 0A 50 C9", "streq r5,[r10,-r9,asr #1]",
- "E7 2A 50 C9", "str r5,[r10,-r9,asr #1]!",
- "E7 0A 50 49", "str r5,[r10,-r9,asr #32]",
- "E7 2A 50 49", "str r5,[r10,-r9,asr #32]!",
- "E7 0A 50 89", "str r5,[r10,-r9,lsl #1]",
- "E7 2A 50 89", "str r5,[r10,-r9,lsl #1]!",
- "E7 0A 5F 89", "str r5,[r10,-r9,lsl #31]",
- "E7 2A 5F 89", "str r5,[r10,-r9,lsl #31]!",
- "E7 0A 50 A9", "str r5,[r10,-r9,lsr #1]",
- "E7 2A 50 A9", "str r5,[r10,-r9,lsr #1]!",
- "E7 0A 50 29", "str r5,[r10,-r9,lsr #32]",
- "E7 2A 50 29", "str r5,[r10,-r9,lsr #32]!",
- "E7 0A 50 E9", "str r5,[r10,-r9,ror #1]",
- "E7 2A 50 E9", "str r5,[r10,-r9,ror #1]!",
- "E7 0A 5F E9", "str r5,[r10,-r9,ror #31]",
- "E7 2A 5F E9", "str r5,[r10,-r9,ror #31]!",
- "E7 0A 50 69", "str r5,[r10,-r9,rrx]",
- "E7 2A 50 69", "str r5,[r10,-r9,rrx]!",
- "07 0A 50 09", "streq r5,[r10,-r9]",
- "E7 2A 50 09", "str r5,[r10,-r9]!",
- "04 0A 59 87", "streq r5,[r10],#-0x987",
- "E4 8A 59 87", "str r5,[r10],#0x987",
- "E6 8A 50 09", "str r5,[r10],r9",
- "E6 8A 50 C9", "str r5,[r10],r9,asr #1",
- "E6 8A 50 49", "str r5,[r10],r9,asr #32",
- "E6 8A 50 89", "str r5,[r10],r9,lsl #1",
- "E6 8A 5F 89", "str r5,[r10],r9,lsl #31",
- "E6 8A 50 A9", "str r5,[r10],r9,lsr #1",
- "E6 8A 50 29", "str r5,[r10],r9,lsr #32",
- "E6 8A 50 E9", "str r5,[r10],r9,ror #1",
- "E6 8A 5F E9", "str r5,[r10],r9,ror #31",
- "E6 8A 50 69", "str r5,[r10],r9,rrx",
- "E6 0A 50 09", "str r5,[r10],-r9",
- "06 0A 50 C9", "streq r5,[r10],-r9,asr #1",
- "E6 0A 50 49", "str r5,[r10],-r9,asr #32",
- "E6 0A 50 89", "str r5,[r10],-r9,lsl #1",
- "E6 0A 5F 89", "str r5,[r10],-r9,lsl #31",
- "E6 0A 50 A9", "str r5,[r10],-r9,lsr #1",
- "E6 0A 50 29", "str r5,[r10],-r9,lsr #32",
- "E6 0A 50 E9", "str r5,[r10],-r9,ror #1",
- "E6 0A 5F E9", "str r5,[r10],-r9,ror #31",
- "E6 0A 50 69", "str r5,[r10],-r9,rrx",
- "05 4A 59 87", "strbeq r5,[r10,#-0x987]",
- "E5 6A 59 87", "strb r5,[r10,#-0x987]!",
- "E5 CA 59 87", "strb r5,[r10,#0x987]",
- "E5 EA 59 87", "strb r5,[r10,#0x987]!",
- "07 CA 50 C9", "strbeq r5,[r10,r9,asr #1]",
- "E7 EA 50 C9", "strb r5,[r10,r9,asr #1]!",
- "E7 CA 50 49", "strb r5,[r10,r9,asr #32]",
- "E7 EA 50 49", "strb r5,[r10,r9,asr #32]!",
- "E7 CA 50 89", "strb r5,[r10,r9,lsl #1]",
- "E7 EA 50 89", "strb r5,[r10,r9,lsl #1]!",
- "E7 CA 5F 89", "strb r5,[r10,r9,lsl #31]",
- "E7 EA 5F 89", "strb r5,[r10,r9,lsl #31]!",
- "E7 CA 50 A9", "strb r5,[r10,r9,lsr #1]",
- "E7 EA 50 A9", "strb r5,[r10,r9,lsr #1]!",
- "E7 CA 50 29", "strb r5,[r10,r9,lsr #32]",
- "E7 EA 50 29", "strb r5,[r10,r9,lsr #32]!",
- "E7 CA 50 E9", "strb r5,[r10,r9,ror #1]",
- "E7 EA 50 E9", "strb r5,[r10,r9,ror #1]!",
- "E7 CA 5F E9", "strb r5,[r10,r9,ror #31]",
- "E7 EA 5F E9", "strb r5,[r10,r9,ror #31]!",
- "E7 CA 50 69", "strb r5,[r10,r9,rrx]",
- "E7 EA 50 69", "strb r5,[r10,r9,rrx]!",
- "E7 CA 50 09", "strb r5,[r10,r9]",
- "E7 EA 50 09", "strb r5,[r10,r9]!",
- "E7 4A 50 C9", "strb r5,[r10,-r9,asr #1]",
- "E7 6A 50 C9", "strb r5,[r10,-r9,asr #1]!",
- "E7 4A 50 49", "strb r5,[r10,-r9,asr #32]",
- "E7 6A 50 49", "strb r5,[r10,-r9,asr #32]!",
- "E7 4A 50 89", "strb r5,[r10,-r9,lsl #1]",
- "E7 6A 50 89", "strb r5,[r10,-r9,lsl #1]!",
- "E7 4A 5F 89", "strb r5,[r10,-r9,lsl #31]",
- "E7 6A 5F 89", "strb r5,[r10,-r9,lsl #31]!",
- "E7 4A 50 A9", "strb r5,[r10,-r9,lsr #1]",
- "E7 6A 50 A9", "strb r5,[r10,-r9,lsr #1]!",
- "E7 4A 50 29", "strb r5,[r10,-r9,lsr #32]",
- "E7 6A 50 29", "strb r5,[r10,-r9,lsr #32]!",
- "E7 4A 50 E9", "strb r5,[r10,-r9,ror #1]",
- "E7 6A 50 E9", "strb r5,[r10,-r9,ror #1]!",
- "E7 4A 5F E9", "strb r5,[r10,-r9,ror #31]",
- "E7 6A 5F E9", "strb r5,[r10,-r9,ror #31]!",
- "E7 4A 50 69", "strb r5,[r10,-r9,rrx]",
- "E7 6A 50 69", "strb r5,[r10,-r9,rrx]!",
- "E7 4A 50 09", "strb r5,[r10,-r9]",
- "E7 6A 50 09", "strb r5,[r10,-r9]!",
- "05 CA 50 00", "strbeq r5,[r10]",
- "04 4A 59 87", "strbeq r5,[r10],#-0x987",
- "E4 CA 59 87", "strb r5,[r10],#0x987",
- "06 CA 50 09", "strbeq r5,[r10],r9",
- "06 CA 50 C9", "strbeq r5,[r10],r9,asr #1",
- "E6 CA 50 49", "strb r5,[r10],r9,asr #32",
- "E6 CA 50 89", "strb r5,[r10],r9,lsl #1",
- "E6 CA 5F 89", "strb r5,[r10],r9,lsl #31",
- "E6 CA 50 A9", "strb r5,[r10],r9,lsr #1",
- "E6 CA 50 29", "strb r5,[r10],r9,lsr #32",
- "E6 CA 50 E9", "strb r5,[r10],r9,ror #1",
- "E6 CA 5F E9", "strb r5,[r10],r9,ror #31",
- "E6 CA 50 69", "strb r5,[r10],r9,rrx",
- "E6 4A 50 09", "strb r5,[r10],-r9",
- "E6 4A 50 C9", "strb r5,[r10],-r9,asr #1",
- "E6 4A 50 49", "strb r5,[r10],-r9,asr #32",
- "E6 4A 50 89", "strb r5,[r10],-r9,lsl #1",
- "E6 4A 5F 89", "strb r5,[r10],-r9,lsl #31",
- "E6 4A 50 A9", "strb r5,[r10],-r9,lsr #1",
- "E6 4A 50 29", "strb r5,[r10],-r9,lsr #32",
- "E6 4A 50 E9", "strb r5,[r10],-r9,ror #1",
- "E6 4A 5F E9", "strb r5,[r10],-r9,ror #31",
- "E6 4A 50 69", "strb r5,[r10],-r9,rrx",
- "04 6A 59 87", "strbteq r5,[r10],#-0x987",
- "E4 EA 59 87", "strbt r5,[r10],#0x987",
- "06 EA 50 09", "strbteq r5,[r10],r9",
- "06 EA 50 C9", "strbteq r5,[r10],r9,asr #1",
- "E6 EA 50 49", "strbt r5,[r10],r9,asr #32",
- "E6 EA 50 89", "strbt r5,[r10],r9,lsl #1",
- "E6 EA 5F 89", "strbt r5,[r10],r9,lsl #31",
- "E6 EA 50 A9", "strbt r5,[r10],r9,lsr #1",
- "E6 EA 50 29", "strbt r5,[r10],r9,lsr #32",
- "E6 EA 50 E9", "strbt r5,[r10],r9,ror #1",
- "E6 EA 5F E9", "strbt r5,[r10],r9,ror #31",
- "E6 EA 50 69", "strbt r5,[r10],r9,rrx",
- "E6 6A 50 09", "strbt r5,[r10],-r9",
- "E6 6A 50 C9", "strbt r5,[r10],-r9,asr #1",
- "E6 6A 50 49", "strbt r5,[r10],-r9,asr #32",
- "E6 6A 50 89", "strbt r5,[r10],-r9,lsl #1",
- "E6 6A 5F 89", "strbt r5,[r10],-r9,lsl #31",
- "E6 6A 50 A9", "strbt r5,[r10],-r9,lsr #1",
- "E6 6A 50 29", "strbt r5,[r10],-r9,lsr #32",
- "E6 6A 50 E9", "strbt r5,[r10],-r9,ror #1",
- "E6 6A 5F E9", "strbt r5,[r10],-r9,ror #31",
- "E6 6A 50 69", "strbt r5,[r10],-r9,rrx",
- "01 4A 68 F7", "strdeq r6,r7,[r10,#-0x87]",
- "E1 6A 68 F7", "strd r6,r7,[r10,#-0x87]!",
- "E1 CA 68 F7", "strd r6,r7,[r10,#0x87]",
- "E1 EA 68 F7", "strd r6,r7,[r10,#0x87]!",
- "01 8A 60 F9", "strdeq r6,r7,[r10,r9]",
- "E1 AA 60 F9", "strd r6,r7,[r10,r9]!",
- "E1 0A 60 F9", "strd r6,r7,[r10,-r9]",
- "E1 2A 60 F9", "strd r6,r7,[r10,-r9]!",
- "01 CA 60 F0", "strdeq r6,r7,[r10]",
- "E1 CA 60 F0", "strd r6,r7,[r10]",
- "00 4A 68 F7", "strdeq r6,r7,[r10],#-0x87",
- "E0 CA 68 F7", "strd r6,r7,[r10],#0x87",
- "00 8A 60 F9", "strdeq r6,r7,[r10],r9",
- "E0 0A 60 F9", "strd r6,r7,[r10],-r9",
- "01 8A 5F 99", "strexeq r5,r9,[r10]",
- "01 CA 5F 99", "strexbeq r5,r9,[r10]",
- "01 AA 9F 96", "strexdeq r9,r6,r7,[r10]",
- "01 EA 5F 99", "strexheq r5,r9,[r10]",
- "01 4A 58 B7", "strheq r5,[r10,#-0x87]",
- "E1 6A 58 B7", "strh r5,[r10,#-0x87]!",
- "E1 CA 58 B7", "strh r5,[r10,#0x87]",
- "E1 EA 58 B7", "strh r5,[r10,#0x87]!",
- "01 8A 50 B9", "strheq r5,[r10,r9]",
- "E1 AA 50 B9", "strh r5,[r10,r9]!",
- "01 0A 50 B9", "strheq r5,[r10,-r9]",
- "E1 2A 50 B9", "strh r5,[r10,-r9]!",
- "01 CA 50 B0", "strheq r5,[r10]",
- "00 4A 58 B7", "strheq r5,[r10],#-0x87",
- "E0 CA 58 B7", "strh r5,[r10],#0x87",
- "00 8A 50 B9", "strheq r5,[r10],r9",
- "E0 0A 50 B9", "strh r5,[r10],-r9",
- "E0 EA 50 B0", "strht r5,[r10]",
- "00 6A 58 B7", "strhteq r5,[r10],#-0x87",
- "E0 EA 58 B7", "strht r5,[r10],#0x87",
- "00 AA 50 B9", "strhteq r5,[r10],r9",
- "E0 2A 50 B9", "strht r5,[r10],-r9",
- "04 AA 50 00", "strteq r5,[r10]",
- "04 2A 59 87", "strteq r5,[r10],#-0x987",
- "E4 AA 59 87", "strt r5,[r10],#0x987",
- "06 AA 50 09", "strteq r5,[r10],r9",
- "06 AA 50 C9", "strteq r5,[r10],r9,asr #1",
- "E6 AA 50 49", "strt r5,[r10],r9,asr #32",
- "E6 AA 50 89", "strt r5,[r10],r9,lsl #1",
- "E6 AA 5F 89", "strt r5,[r10],r9,lsl #31",
- "E6 AA 50 A9", "strt r5,[r10],r9,lsr #1",
- "E6 AA 50 29", "strt r5,[r10],r9,lsr #32",
- "E6 AA 50 E9", "strt r5,[r10],r9,ror #1",
- "E6 AA 5F E9", "strt r5,[r10],r9,ror #31",
- "E6 AA 50 69", "strt r5,[r10],r9,rrx",
- "E6 2A 50 09", "strt r5,[r10],-r9",
- "E6 2A 50 C9", "strt r5,[r10],-r9,asr #1",
- "E6 2A 50 49", "strt r5,[r10],-r9,asr #32",
- "E6 2A 50 89", "strt r5,[r10],-r9,lsl #1",
- "E6 2A 5F 89", "strt r5,[r10],-r9,lsl #31",
- "E6 2A 50 A9", "strt r5,[r10],-r9,lsr #1",
- "E6 2A 50 29", "strt r5,[r10],-r9,lsr #32",
- "E6 2A 50 E9", "strt r5,[r10],-r9,ror #1",
- "E6 2A 5F E9", "strt r5,[r10],-r9,ror #31",
- "E6 2A 50 69", "strt r5,[r10],-r9,rrx",
- "02 4F 50 00", "subeq r5,pc,#0x0",
- "E2 4F 50 87", "sub r5,pc,#0x87",
- "02 4A 50 71", "subeq r5,r10,#0x71",
- "00 49 50 CA", "subeq r5,r9,r10,asr #1",
- "00 49 56 5A", "subeq r5,r9,r10,asr r6",
- "E0 49 50 8A", "sub r5,r9,r10,lsl #1",
- "E0 49 56 1A", "sub r5,r9,r10,lsl r6",
- "E0 49 50 2A", "sub r5,r9,r10,lsr #32",
- "E0 49 5F EA", "sub r5,r9,r10,ror #31",
- "E0 49 50 6A", "sub r5,r9,r10,rrx",
- "02 5A 51 FE", "subseq r5,r10,#0x8000003f",
- "00 59 50 4A", "subseq r5,r9,r10,asr #32",
- "E0 59 5F 8A", "subs r5,r9,r10,lsl #31",
- "E0 59 50 AA", "subs r5,r9,r10,lsr #1",
- "00 59 56 3A", "subseq r5,r9,r10,lsr r6",
- "E0 59 50 EA", "subs r5,r9,r10,ror #1",
- "E0 59 56 7A", "subs r5,r9,r10,ror r6",
- "0F AB CE F9", "svceq #0xabcef9",
- "E1 0A 50 96", "swp r5,r6,[r10]",
- "E1 4A 50 96", "swpb r5,r6,[r10]",
- "06 A9 50 7A", "sxtabeq r5,r9,r10",
- "06 A9 58 7A", "sxtabeq r5,r9,r10,ror #16",
- "E6 A9 5C 7A", "sxtab r5,r9,r10,ror #24",
- "E6 A9 54 7A", "sxtab r5,r9,r10,ror #8",
- "06 89 50 7A", "sxtab16eq r5,r9,r10",
- "06 89 58 7A", "sxtab16eq r5,r9,r10,ror #16",
- "E6 89 5C 7A", "sxtab16 r5,r9,r10,ror #24",
- "E6 89 54 7A", "sxtab16 r5,r9,r10,ror #8",
- "06 B9 50 7A", "sxtaheq r5,r9,r10",
- "06 B9 58 7A", "sxtaheq r5,r9,r10,ror #16",
- "E6 B9 5C 7A", "sxtah r5,r9,r10,ror #24",
- "E6 B9 54 7A", "sxtah r5,r9,r10,ror #8",
- "06 AF 50 79", "sxtbeq r5,r9",
- "06 AF 58 79", "sxtbeq r5,r9,ror #16",
- "E6 AF 5C 79", "sxtb r5,r9,ror #24",
- "E6 AF 54 79", "sxtb r5,r9,ror #8",
- "06 8F 50 79", "sxtb16eq r5,r9",
- "06 8F 58 79", "sxtb16eq r5,r9,ror #16",
- "E6 8F 5C 79", "sxtb16 r5,r9,ror #24",
- "E6 8F 54 79", "sxtb16 r5,r9,ror #8",
- "06 BF 50 79", "sxtheq r5,r9",
- "06 BF 58 79", "sxtheq r5,r9,ror #16",
- "E6 BF 5C 79", "sxth r5,r9,ror #24",
- "E6 BF 54 79", "sxth r5,r9,ror #8",
- "03 3A 00 71", "teqeq r10,#0x71",
- "E3 3A 01 FE", "teq r10,#0x8000003f",
- "01 35 00 CA", "teqeq r5,r10,asr #1",
- "E1 35 00 4A", "teq r5,r10,asr #32",
- "01 35 06 5A", "teqeq r5,r10,asr r6",
- "E1 35 00 8A", "teq r5,r10,lsl #1",
- "E1 35 0F 8A", "teq r5,r10,lsl #31",
- "E1 35 06 1A", "teq r5,r10,lsl r6",
- "E1 35 00 AA", "teq r5,r10,lsr #1",
- "E1 35 00 2A", "teq r5,r10,lsr #32",
- "E1 35 06 3A", "teq r5,r10,lsr r6",
- "E1 35 00 EA", "teq r5,r10,ror #1",
- "E1 35 0F EA", "teq r5,r10,ror #31",
- "E1 35 06 7A", "teq r5,r10,ror r6",
- "E1 35 00 6A", "teq r5,r10,rrx",
- "03 1A 00 71", "tsteq r10,#0x71",
- "E3 1A 01 FE", "tst r10,#0x8000003f",
- "01 15 00 CA", "tsteq r5,r10,asr #1",
- "E1 15 00 4A", "tst r5,r10,asr #32",
- "01 15 06 5A", "tsteq r5,r10,asr r6",
- "E1 15 00 8A", "tst r5,r10,lsl #1",
- "E1 15 0F 8A", "tst r5,r10,lsl #31",
- "E1 15 06 1A", "tst r5,r10,lsl r6",
- "E1 15 00 AA", "tst r5,r10,lsr #1",
- "E1 15 00 2A", "tst r5,r10,lsr #32",
- "E1 15 06 3A", "tst r5,r10,lsr r6",
- "E1 15 00 EA", "tst r5,r10,ror #1",
- "E1 15 0F EA", "tst r5,r10,ror #31",
- "E1 15 06 7A", "tst r5,r10,ror r6",
- "E1 15 00 6A", "tst r5,r10,rrx",
- "06 59 5F 1A", "uadd16eq r5,r9,r10",
- "06 59 5F 9A", "uadd8eq r5,r9,r10",
- "06 59 5F 3A", "uasxeq r5,r9,r10",
- "07 FF 50 5A", "ubfxeq r5,r10,#0,#32",
- "E7 FF 50 5A", "ubfx r5,r10,#0,#32",
- "E7 E0 5F DA", "ubfx r5,r10,#31,#1",
- "06 79 5F 1A", "uhadd16eq r5,r9,r10",
- "06 79 5F 9A", "uhadd8eq r5,r9,r10",
- "06 79 5F 3A", "uhasxeq r5,r9,r10",
- "06 79 5F 5A", "uhsaxeq r5,r9,r10",
- "06 79 5F 7A", "uhsub16eq r5,r9,r10",
- "06 79 5F FA", "uhsub8eq r5,r9,r10",
- "00 49 58 9A", "umaaleq r5,r9,r10,r8",
- "00 A9 58 9A", "umlaleq r5,r9,r10,r8",
- "00 B9 58 9A", "umlalseq r5,r9,r10,r8",
- "00 89 58 9A", "umulleq r5,r9,r10,r8",
- "00 99 58 9A", "umullseq r5,r9,r10,r8",
- "06 69 5F 1A", "uqadd16eq r5,r9,r10",
- "06 69 5F 9A", "uqadd8eq r5,r9,r10",
- "06 69 5F 3A", "uqasxeq r5,r9,r10",
- "06 69 5F 5A", "uqsaxeq r5,r9,r10",
- "06 69 5F 7A", "uqsub16eq r5,r9,r10",
- "06 69 5F FA", "uqsub8eq r5,r9,r10",
- "07 85 FA 19", "usad8eq r5,r9,r10",
- "07 85 8A 19", "usada8eq r5,r9,r10,r8",
- "06 FE 50 1A", "usateq r5,#30,r10",
- "06 FE 50 DA", "usateq r5,#30,r10,asr #1",
- "E6 FE 50 5A", "usat r5,#30,r10,asr #32",
- "E6 FE 50 9A", "usat r5,#30,r10,lsl #1",
- "E6 FE 5F 9A", "usat r5,#30,r10,lsl #31",
- "06 EF 5F 3A", "usat16eq r5,#15,r10",
- "06 59 5F 5A", "usaxeq r5,r9,r10",
- "06 59 5F 7A", "usub16eq r5,r9,r10",
- "06 59 5F FA", "usub8eq r5,r9,r10",
- "06 E9 50 7A", "uxtabeq r5,r9,r10",
- "06 E9 58 7A", "uxtabeq r5,r9,r10,ror #16",
- "E6 E9 5C 7A", "uxtab r5,r9,r10,ror #24",
- "E6 E9 54 7A", "uxtab r5,r9,r10,ror #8",
- "06 C9 50 7A", "uxtab16eq r5,r9,r10",
- "06 C9 58 7A", "uxtab16eq r5,r9,r10,ror #16",
- "E6 C9 5C 7A", "uxtab16 r5,r9,r10,ror #24",
- "E6 C9 54 7A", "uxtab16 r5,r9,r10,ror #8",
- "06 F9 50 7A", "uxtaheq r5,r9,r10",
- "06 F9 58 7A", "uxtaheq r5,r9,r10,ror #16",
- "E6 F9 5C 7A", "uxtah r5,r9,r10,ror #24",
- "E6 F9 54 7A", "uxtah r5,r9,r10,ror #8",
- "06 EF 50 79", "uxtbeq r5,r9",
- "06 EF 58 79", "uxtbeq r5,r9,ror #16",
- "E6 EF 5C 79", "uxtb r5,r9,ror #24",
- "E6 EF 54 79", "uxtb r5,r9,ror #8",
- "06 CF 50 79", "uxtb16eq r5,r9",
- "06 CF 58 79", "uxtb16eq r5,r9,ror #16",
- "E6 CF 5C 79", "uxtb16 r5,r9,ror #24",
- "E6 CF 54 79", "uxtb16 r5,r9,ror #8",
- "06 FF 50 79", "uxtheq r5,r9",
- "06 FF 58 79", "uxtheq r5,r9,ror #16",
- "E6 FF 5C 79", "uxth r5,r9,ror #24",
- "E6 FF 54 79", "uxth r5,r9,ror #8",
- "03 20 F0 02", "wfeeq",
- "03 20 F0 03", "wfieq",
- "03 20 F0 01", "yieldeq",
- };
-
- disassembleInstArray(insts, armOptions);
- }
-
- @Test
- public void testArmVFPInstructions() {
-
- System.out.println("\n====================== ARM VFP ======================\n");
- String[] insts = {
- "F2 49 57 BA", "vaba.s8 d21,d25,d26",
- "F2 59 57 BA", "vaba.s16 d21,d25,d26",
- "F2 69 57 BA", "vaba.s32 d21,d25,d26",
- "F3 49 57 BA", "vaba.u8 d21,d25,d26",
- "F3 59 57 BA", "vaba.u16 d21,d25,d26",
- "F3 69 57 BA", "vaba.u32 d21,d25,d26",
- "F2 4C 67 FE", "vaba.s8 q11,q14,q15",
- "F2 5C 67 FE", "vaba.s16 q11,q14,q15",
- "F2 6C 67 FE", "vaba.s32 q11,q14,q15",
- "F3 4C 67 FE", "vaba.u8 q11,q14,q15",
- "F3 5C 67 FE", "vaba.u16 q11,q14,q15",
- "F3 6C 67 FE", "vaba.u32 q11,q14,q15",
- "F2 C9 65 AA", "vabal.s8 q11,d25,d26",
- "F2 D9 65 AA", "vabal.s16 q11,d25,d26",
- "F2 E9 65 AA", "vabal.s32 q11,d25,d26",
- "F3 C9 65 AA", "vabal.u8 q11,d25,d26",
- "F3 D9 65 AA", "vabal.u16 q11,d25,d26",
- "F3 E9 65 AA", "vabal.u32 q11,d25,d26",
- "F2 49 57 AA", "vabd.s8 d21,d25,d26",
- "F2 59 57 AA", "vabd.s16 d21,d25,d26",
- "F2 69 57 AA", "vabd.s32 d21,d25,d26",
- "F3 49 57 AA", "vabd.u8 d21,d25,d26",
- "F3 59 57 AA", "vabd.u16 d21,d25,d26",
- "F3 69 57 AA", "vabd.u32 d21,d25,d26",
- "F2 4C 67 EE", "vabd.s8 q11,q14,q15",
- "F2 5C 67 EE", "vabd.s16 q11,q14,q15",
- "F2 6C 67 EE", "vabd.s32 q11,q14,q15",
- "F3 4C 67 EE", "vabd.u8 q11,q14,q15",
- "F3 5C 67 EE", "vabd.u16 q11,q14,q15",
- "F3 6C 67 EE", "vabd.u32 q11,q14,q15",
- "F3 69 5D AA", "vabd.f32 d21,d25,d26",
- "F3 6C 6D EE", "vabd.f32 q11,q14,q15",
- "F2 C9 67 AA", "vabdl.s8 q11,d25,d26",
- "F2 D9 67 AA", "vabdl.s16 q11,d25,d26",
- "F2 E9 67 AA", "vabdl.s32 q11,d25,d26",
- "F3 C9 67 AA", "vabdl.u8 q11,d25,d26",
- "F3 D9 67 AA", "vabdl.u16 q11,d25,d26",
- "F3 E9 67 AA", "vabdl.u32 q11,d25,d26",
- "F3 F1 63 6E", "vabs.s8 q11,q15",
- "F3 F5 63 6E", "vabs.s16 q11,q15",
- "F3 F9 63 6E", "vabs.s32 q11,q15",
- "F3 F9 67 6E", "vabs.f32 q11,q15",
- "F3 F1 53 2A", "vabs.s8 d21,d26",
- "F3 F5 53 2A", "vabs.s16 d21,d26",
- "F3 F9 53 2A", "vabs.s32 d21,d26",
- "F3 F9 57 2A", "vabs.f32 d21,d26",
- "0E F0 5B EA", "vabseq.f64 d21,d26",
- "EE F0 AA CD", "vabs.f32 s21,s26",
- "EE F0 5B EA", "vabs.f64 d21,d26",
- "F3 49 5E BA", "vacge.f32 d21,d25,d26",
- "F3 4C 6E FE", "vacge.f32 q11,q14,q15",
- "F3 69 5E BA", "vacgt.f32 d21,d25,d26",
- "F3 6C 6E FE", "vacgt.f32 q11,q14,q15",
- "F2 49 58 AA", "vadd.i8 d21,d25,d26",
- "F2 59 58 AA", "vadd.i16 d21,d25,d26",
- "F2 69 58 AA", "vadd.i32 d21,d25,d26",
- "F2 79 58 AA", "vadd.i64 d21,d25,d26",
- "F2 4C 68 EE", "vadd.i8 q11,q14,q15",
- "F2 5C 68 EE", "vadd.i16 q11,q14,q15",
- "F2 6C 68 EE", "vadd.i32 q11,q14,q15",
- "F2 7C 68 EE", "vadd.i64 q11,q14,q15",
- "F2 49 5D AA", "vadd.f32 d21,d25,d26",
- "F2 4C 6D EE", "vadd.f32 q11,q14,q15",
- "EE 7C AA 8D", "vadd.f32 s21,s25,s26",
- "0E 79 5B AA", "vaddeq.f64 d21,d25,d26",
- "F2 CC 54 AE", "vaddhn.i16 d21,q14,q15",
- "F2 DC 54 AE", "vaddhn.i32 d21,q14,q15",
- "F2 EC 54 AE", "vaddhn.i64 d21,q14,q15",
- "F2 C9 60 AA", "vaddl.s8 q11,d25,d26",
- "F2 D9 60 AA", "vaddl.s16 q11,d25,d26",
- "F2 E9 60 AA", "vaddl.s32 q11,d25,d26",
- "F3 C9 60 AA", "vaddl.u8 q11,d25,d26",
- "F3 D9 60 AA", "vaddl.u16 q11,d25,d26",
- "F3 E9 60 AA", "vaddl.u32 q11,d25,d26",
- "F2 CC 61 AA", "vaddw.s8 q11,q14,d26",
- "F2 DC 61 AA", "vaddw.s16 q11,q14,d26",
- "F2 EC 61 AA", "vaddw.s32 q11,q14,d26",
- "F3 CC 61 AA", "vaddw.u8 q11,q14,d26",
- "F3 DC 61 AA", "vaddw.u16 q11,q14,d26",
- "F3 EC 61 AA", "vaddw.u32 q11,q14,d26",
- "F2 49 51 BA", "vand d21,d25,d26",
- "F2 4C 61 FE", "vand q11,q14,q15",
- "F2 59 51 BA", "vbic d21,d25,d26",
- "F2 5C 61 FE", "vbic q11,q14,q15",
- "F3 C0 59 39", "vbic.i16 d21,#0x89",
- "F3 C0 51 39", "vbic.i32 d21,#0x89",
- "F3 C0 69 79", "vbic.i16 q11,#0x89",
- "F3 C0 61 79", "vbic.i32 q11,#0x89",
- "F3 79 51 BA", "vbif d21,d25,d26",
- "F3 7C 61 FE", "vbif q11,q14,q15",
- "F3 69 51 BA", "vbit d21,d25,d26",
- "F3 6C 61 FE", "vbit q11,q14,q15",
- "F3 59 51 BA", "vbsl d21,d25,d26",
- "F3 5C 61 FE", "vbsl q11,q14,q15",
- "F3 49 58 BA", "vceq.i8 d21,d25,d26",
- "F3 59 58 BA", "vceq.i16 d21,d25,d26",
- "F3 69 58 BA", "vceq.i32 d21,d25,d26",
- "F3 F1 51 2A", "vceq.i8 d21,d26,#0",
- "F3 F5 51 2A", "vceq.i16 d21,d26,#0",
- "F3 F9 51 2A", "vceq.i32 d21,d26,#0",
- "F3 F9 55 2A", "vceq.f32 d21,d26,#0",
- "F3 4C 68 FE", "vceq.i8 q11,q14,q15",
- "F3 5C 68 FE", "vceq.i16 q11,q14,q15",
- "F3 6C 68 FE", "vceq.i32 q11,q14,q15",
- "F3 F1 61 6E", "vceq.i8 q11,q15,#0",
- "F3 F5 61 6E", "vceq.i16 q11,q15,#0",
- "F3 F9 61 6E", "vceq.i32 q11,q15,#0",
- "F3 F9 65 6E", "vceq.f32 q11,q15,#0",
- "F2 49 5E AA", "vceq.f32 d21,d25,d26",
- "F2 4C 6E EE", "vceq.f32 q11,q14,q15",
- "F2 49 53 BA", "vcge.s8 d21,d25,d26",
- "F2 59 53 BA", "vcge.s16 d21,d25,d26",
- "F2 69 53 BA", "vcge.s32 d21,d25,d26",
- "F3 49 53 BA", "vcge.u8 d21,d25,d26",
- "F3 59 53 BA", "vcge.u16 d21,d25,d26",
- "F3 69 53 BA", "vcge.u32 d21,d25,d26",
- "F3 F1 50 AA", "vcge.s8 d21,d26,#0",
- "F3 F5 50 AA", "vcge.s16 d21,d26,#0",
- "F3 F9 50 AA", "vcge.s32 d21,d26,#0",
- "F3 F9 54 AA", "vcge.f32 d21,d26,#0",
- "F2 4C 63 FE", "vcge.s8 q11,q14,q15",
- "F2 5C 63 FE", "vcge.s16 q11,q14,q15",
- "F2 6C 63 FE", "vcge.s32 q11,q14,q15",
- "F3 4C 63 FE", "vcge.u8 q11,q14,q15",
- "F3 5C 63 FE", "vcge.u16 q11,q14,q15",
- "F3 6C 63 FE", "vcge.u32 q11,q14,q15",
- "F3 F1 60 EE", "vcge.s8 q11,q15,#0",
- "F3 F5 60 EE", "vcge.s16 q11,q15,#0",
- "F3 F9 60 EE", "vcge.s32 q11,q15,#0",
- "F3 F9 64 EE", "vcge.f32 q11,q15,#0",
- "F3 49 5E AA", "vcge.f32 d21,d25,d26",
- "F3 4C 6E EE", "vcge.f32 q11,q14,q15",
- "F2 49 53 AA", "vcgt.s8 d21,d25,d26",
- "F2 59 53 AA", "vcgt.s16 d21,d25,d26",
- "F2 69 53 AA", "vcgt.s32 d21,d25,d26",
- "F3 49 53 AA", "vcgt.u8 d21,d25,d26",
- "F3 59 53 AA", "vcgt.u16 d21,d25,d26",
- "F3 69 53 AA", "vcgt.u32 d21,d25,d26",
- "F3 F1 50 2A", "vcgt.s8 d21,d26,#0",
- "F3 F5 50 2A", "vcgt.s16 d21,d26,#0",
- "F3 F9 50 2A", "vcgt.s32 d21,d26,#0",
- "F3 F9 54 2A", "vcgt.f32 d21,d26,#0",
- "F2 4C 63 EE", "vcgt.s8 q11,q14,q15",
- "F2 5C 63 EE", "vcgt.s16 q11,q14,q15",
- "F2 6C 63 EE", "vcgt.s32 q11,q14,q15",
- "F3 4C 63 EE", "vcgt.u8 q11,q14,q15",
- "F3 5C 63 EE", "vcgt.u16 q11,q14,q15",
- "F3 6C 63 EE", "vcgt.u32 q11,q14,q15",
- "F3 F1 60 6E", "vcgt.s8 q11,q15,#0",
- "F3 F5 60 6E", "vcgt.s16 q11,q15,#0",
- "F3 F9 60 6E", "vcgt.s32 q11,q15,#0",
- "F3 F9 64 6E", "vcgt.f32 q11,q15,#0",
- "F3 69 5E AA", "vcgt.f32 d21,d25,d26",
- "F3 6C 6E EE", "vcgt.f32 q11,q14,q15",
- "F3 F1 51 AA", "vcle.s8 d21,d26,#0",
- "F3 F5 51 AA", "vcle.s16 d21,d26,#0",
- "F3 F9 51 AA", "vcle.s32 d21,d26,#0",
- "F3 F9 55 AA", "vcle.f32 d21,d26,#0",
- "F3 F1 61 EE", "vcle.s8 q11,q15,#0",
- "F3 F5 61 EE", "vcle.s16 q11,q15,#0",
- "F3 F9 61 EE", "vcle.s32 q11,q15,#0",
- "F3 F9 65 EE", "vcle.f32 q11,q15,#0",
- "F3 F0 54 2A", "vcls.s8 d21,d26",
- "F3 F4 54 2A", "vcls.s16 d21,d26",
- "F3 F8 54 2A", "vcls.s32 d21,d26",
- "F3 F0 64 6E", "vcls.s8 q11,q15",
- "F3 F4 64 6E", "vcls.s16 q11,q15",
- "F3 F8 64 6E", "vcls.s32 q11,q15",
- "F3 F1 52 2A", "vclt.s8 d21,d26,#0",
- "F3 F5 52 2A", "vclt.s16 d21,d26,#0",
- "F3 F9 52 2A", "vclt.s32 d21,d26,#0",
- "F3 F9 56 2A", "vclt.f32 d21,d26,#0",
- "F3 F1 62 6E", "vclt.s8 q11,q15,#0",
- "F3 F5 62 6E", "vclt.s16 q11,q15,#0",
- "F3 F9 62 6E", "vclt.s32 q11,q15,#0",
- "F3 F9 66 6E", "vclt.f32 q11,q15,#0",
- "F3 F0 54 AA", "vclz.i8 d21,d26",
- "F3 F4 54 AA", "vclz.i16 d21,d26",
- "F3 F8 54 AA", "vclz.i32 d21,d26",
- "F3 F0 64 EE", "vclz.i8 q11,q15",
- "F3 F4 64 EE", "vclz.i16 q11,q15",
- "F3 F8 64 EE", "vclz.i32 q11,q15",
- "0E F5 AA 40", "vcmpeq.f32 s21,#0.0",
- "0E F4 AA 4D", "vcmpeq.f32 s21,s26",
- "EE F5 5B 40", "vcmp.f64 d21,#0.0",
- "EE F4 5B 6A", "vcmp.f64 d21,d26",
- "EE F5 AA C0", "vcmpe.f32 s21,#0.0",
- "EE F4 AA CD", "vcmpe.f32 s21,s26",
- "EE F5 5B C0", "vcmpe.f64 d21,#0.0",
- "EE F4 5B EA", "vcmpe.f64 d21,d26",
- "F3 F0 55 2A", "vcnt.8 d21,d26",
- "F3 F0 65 6E", "vcnt.8 q11,q15",
- "F3 FB 57 2A", "vcvt.s32.f32 d21,d26",
- "F3 FB 57 AA", "vcvt.u32.f32 d21,d26",
- "F3 FB 56 2A", "vcvt.f32.s32 d21,d26",
- "F3 FB 56 AA", "vcvt.f32.u32 d21,d26",
- "F2 E0 5F 3A", "vcvt.s32.f32 d21,d26,#32",
- "F3 E0 5F 3A", "vcvt.u32.f32 d21,d26,#32",
- "F2 E0 5E 3A", "vcvt.f32.s32 d21,d26,#32",
- "F3 E0 5E 3A", "vcvt.f32.u32 d21,d26,#32",
- "F3 FB 67 6E", "vcvt.s32.f32 q11,q15",
- "F3 FB 67 EE", "vcvt.u32.f32 q11,q15",
- "F3 FB 66 6E", "vcvt.f32.s32 q11,q15",
- "F3 FB 66 EE", "vcvt.f32.u32 q11,q15",
- "F2 E0 6F 7E", "vcvt.s32.f32 q11,q15,#32",
- "F3 E0 6F 7E", "vcvt.u32.f32 q11,q15,#32",
- "F2 E0 6E 7E", "vcvt.f32.s32 q11,q15,#32",
- "F3 E0 6E 7E", "vcvt.f32.u32 q11,q15,#32",
- "EE FA AA E8", "vcvt.f32.s32 s21,s21,#15",
- "EE FF AA 60", "vcvt.u16.f32 s21,s21,#15",
- "EE FE AA E2", "vcvt.s32.f32 s21,s21,#27",
- "EE FF AA E2", "vcvt.u32.f32 s21,s21,#27",
- "EE FE 5B 60", "vcvt.s16.f64 d21,d21,#15",
- "EE FF 5B 60", "vcvt.u16.f64 d21,d21,#15",
- "EE FE 5B E2", "vcvt.s32.f64 d21,d21,#27",
- "EE FF 5B E2", "vcvt.u32.f64 d21,d21,#27",
- "F3 F6 56 2E", "vcvt.f16.f32 d21,q15",
- "EE FA AA 60", "vcvt.f32.s16 s21,s21,#15",
- "EE FB AA 60", "vcvt.f32.u16 s21,s21,#15",
- "EE FA AA E2", "vcvt.f32.s32 s21,s21,#27",
- "EE FB AA E2", "vcvt.f32.u32 s21,s21,#27",
- "EE F8 AA CD", "vcvt.f32.s32 s21,s26",
- "EE F8 AA 4D", "vcvt.f32.u32 s21,s26",
- "F3 F6 67 2A", "vcvt.f32.f16 q11,d26",
- "EE F7 AB EA", "vcvt.f32.f64 s21,d26",
- "EE FA 5B 60", "vcvt.f64.s16 d21,d21,#15",
- "EE FB 5B 60", "vcvt.f64.u16 d21,d21,#15",
- "EE FA 5B E2", "vcvt.f64.s32 d21,d21,#27",
- "0E FB 5B E2", "vcvteq.f64.u32 d21,d21,#27",
- "EE F8 5B CD", "vcvt.f64.s32 d21,s26",
- "EE F8 5B 4D", "vcvt.f64.u32 d21,s26",
- "0E F7 5A CD", "vcvteq.f64.f32 d21,s26",
- "EE FD AA CD", "vcvt.s32.f32 s21,s26",
- "EE FD AB EA", "vcvt.s32.f64 s21,d26",
- "EE FC AA CD", "vcvt.u32.f32 s21,s26",
- "EE FC AB EA", "vcvt.u32.f64 s21,d26",
- "0E F3 AA 4D", "vcvtbeq.f16.f32 s21,s26",
- "EE F2 AA 4D", "vcvtb.f32.f16 s21,s26",
- "EE F3 AA CD", "vcvtt.f16.f32 s21,s26",
- "EE F2 AA CD", "vcvtt.f32.f16 s21,s26",
- "0E FD AA 4D", "vcvtreq.s32.f32 s21,s26",
- "EE FD AB 6A", "vcvtr.s32.f64 s21,d26",
- "EE FC AA 4D", "vcvtr.u32.f32 s21,s26",
- "EE FC AB 6A", "vcvtr.u32.f64 s21,d26",
- "0E CC AA 8D", "vdiveq.f32 s21,s25,s26",
- "EE C9 5B AA", "vdiv.f64 d21,d25,d26",
- "F3 F5 5C 26", "vdup.8 d21,d22[2]",
- "F3 FA 5C 26", "vdup.16 d21,d22[2]",
- "F3 FC 5C 26", "vdup.32 d21,d22[1]",
- "0E C5 5B 90", "vdupeq.8 d21,r5",
- "EE 85 5B B0", "vdup.16 d21,r5",
- "EE 85 5B 90", "vdup.32 d21,r5",
- "F3 F5 6C 66", "vdup.8 q11,d22[2]",
- "F3 FA 6C 66", "vdup.16 q11,d22[2]",
- "F3 FC 6C 66", "vdup.32 q11,d22[1]",
- "EE E6 5B 90", "vdup.8 q11,r5",
- "EE A6 5B B0", "vdup.16 q11,r5",
- "EE A6 5B 90", "vdup.32 q11,r5",
- "F3 49 51 BA", "veor d21,d25,d26",
- "F3 4C 61 FE", "veor q11,q14,q15",
- "F2 F9 55 AA", "vext.8 d21,d25,d26,#5",
- "F2 FC 6D EE", "vext.8 q11,q14,q15,#13",
- "F2 49 50 AA", "vhadd.s8 d21,d25,d26",
- "F2 59 50 AA", "vhadd.s16 d21,d25,d26",
- "F2 69 50 AA", "vhadd.s32 d21,d25,d26",
- "F3 49 50 AA", "vhadd.u8 d21,d25,d26",
- "F3 59 50 AA", "vhadd.u16 d21,d25,d26",
- "F3 69 50 AA", "vhadd.u32 d21,d25,d26",
- "F2 4C 60 EE", "vhadd.s8 q11,q14,q15",
- "F2 5C 60 EE", "vhadd.s16 q11,q14,q15",
- "F2 6C 60 EE", "vhadd.s32 q11,q14,q15",
- "F3 4C 60 EE", "vhadd.u8 q11,q14,q15",
- "F3 5C 60 EE", "vhadd.u16 q11,q14,q15",
- "F3 6C 60 EE", "vhadd.u32 q11,q14,q15",
- "F2 49 52 AA", "vhsub.s8 d21,d25,d26",
- "F2 59 52 AA", "vhsub.s16 d21,d25,d26",
- "F2 69 52 AA", "vhsub.s32 d21,d25,d26",
- "F3 49 52 AA", "vhsub.u8 d21,d25,d26",
- "F3 59 52 AA", "vhsub.u16 d21,d25,d26",
- "F3 69 52 AA", "vhsub.u32 d21,d25,d26",
- "F2 4C 62 EE", "vhsub.s8 q11,q14,q15",
- "F2 5C 62 EE", "vhsub.s16 q11,q14,q15",
- "F2 6C 62 EE", "vhsub.s32 q11,q14,q15",
- "F3 4C 62 EE", "vhsub.u8 q11,q14,q15",
- "F3 5C 62 EE", "vhsub.u16 q11,q14,q15",
- "F3 6C 62 EE", "vhsub.u32 q11,q14,q15",
- "F4 6A B7 0F", "vld1.8 {d27},[r10]",
- "F4 6A BA 0F", "vld1.8 {d27,d28},[r10]",
- "F4 6A B6 0F", "vld1.8 {d27,d28,d29},[r10]",
- "F4 6A B2 0F", "vld1.8 {d27,d28,d29,d30},[r10]",
- "F4 6A B7 4F", "vld1.16 {d27},[r10]",
- "F4 6A BA 4F", "vld1.16 {d27,d28},[r10]",
- "F4 6A B6 4F", "vld1.16 {d27,d28,d29},[r10]",
- "F4 6A B2 4F", "vld1.16 {d27,d28,d29,d30},[r10]",
- "F4 6A B7 8F", "vld1.32 {d27},[r10]",
- "F4 6A BA 8F", "vld1.32 {d27,d28},[r10]",
- "F4 6A B6 8F", "vld1.32 {d27,d28,d29},[r10]",
- "F4 6A B2 8F", "vld1.32 {d27,d28,d29,d30},[r10]",
- "F4 6A B7 CF", "vld1.64 {d27},[r10]",
- "F4 6A BA CF", "vld1.64 {d27,d28},[r10]",
- "F4 6A B6 CF", "vld1.64 {d27,d28,d29},[r10]",
- "F4 6A B2 CF", "vld1.64 {d27,d28,d29,d30},[r10]",
- "F4 6A B7 1F", "vld1.8 {d27},[r10@64]",
- "F4 6A BA 1F", "vld1.8 {d27,d28},[r10@64]",
- "F4 6A BA 2F", "vld1.8 {d27,d28},[r10@128]",
- "F4 6A B6 1F", "vld1.8 {d27,d28,d29},[r10@64]",
- "F4 6A B2 1F", "vld1.8 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B2 2F", "vld1.8 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B2 3F", "vld1.8 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B7 5F", "vld1.16 {d27},[r10@64]",
- "F4 6A BA 5F", "vld1.16 {d27,d28},[r10@64]",
- "F4 6A BA 6F", "vld1.16 {d27,d28},[r10@128]",
- "F4 6A B6 5F", "vld1.16 {d27,d28,d29},[r10@64]",
- "F4 6A B2 5F", "vld1.16 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B2 6F", "vld1.16 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B2 7F", "vld1.16 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B7 9F", "vld1.32 {d27},[r10@64]",
- "F4 6A BA 9F", "vld1.32 {d27,d28},[r10@64]",
- "F4 6A BA AF", "vld1.32 {d27,d28},[r10@128]",
- "F4 6A B6 9F", "vld1.32 {d27,d28,d29},[r10@64]",
- "F4 6A B2 9F", "vld1.32 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B2 AF", "vld1.32 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B2 BF", "vld1.32 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B7 DF", "vld1.64 {d27},[r10@64]",
- "F4 6A BA DF", "vld1.64 {d27,d28},[r10@64]",
- "F4 6A BA EF", "vld1.64 {d27,d28},[r10@128]",
- "F4 6A B6 DF", "vld1.64 {d27,d28,d29},[r10@64]",
- "F4 6A B2 DF", "vld1.64 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B2 EF", "vld1.64 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B2 FF", "vld1.64 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B7 0D", "vld1.8 {d27},[r10]!",
- "F4 6A BA 0D", "vld1.8 {d27,d28},[r10]!",
- "F4 6A B6 0D", "vld1.8 {d27,d28,d29},[r10]!",
- "F4 6A B2 0D", "vld1.8 {d27,d28,d29,d30},[r10]!",
- "F4 6A B7 4D", "vld1.16 {d27},[r10]!",
- "F4 6A BA 4D", "vld1.16 {d27,d28},[r10]!",
- "F4 6A B6 4D", "vld1.16 {d27,d28,d29},[r10]!",
- "F4 6A B2 4D", "vld1.16 {d27,d28,d29,d30},[r10]!",
- "F4 6A B7 8D", "vld1.32 {d27},[r10]!",
- "F4 6A BA 8D", "vld1.32 {d27,d28},[r10]!",
- "F4 6A B6 8D", "vld1.32 {d27,d28,d29},[r10]!",
- "F4 6A B2 8D", "vld1.32 {d27,d28,d29,d30},[r10]!",
- "F4 6A B7 CD", "vld1.64 {d27},[r10]!",
- "F4 6A BA CD", "vld1.64 {d27,d28},[r10]!",
- "F4 6A B6 CD", "vld1.64 {d27,d28,d29},[r10]!",
- "F4 6A B2 CD", "vld1.64 {d27,d28,d29,d30},[r10]!",
- "F4 6A B7 1D", "vld1.8 {d27},[r10@64]!",
- "F4 6A BA 1D", "vld1.8 {d27,d28},[r10@64]!",
- "F4 6A BA 2D", "vld1.8 {d27,d28},[r10@128]!",
- "F4 6A B6 1D", "vld1.8 {d27,d28,d29},[r10@64]!",
- "F4 6A B2 1D", "vld1.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B2 2D", "vld1.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B2 3D", "vld1.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B7 5D", "vld1.16 {d27},[r10@64]!",
- "F4 6A BA 5D", "vld1.16 {d27,d28},[r10@64]!",
- "F4 6A BA 6D", "vld1.16 {d27,d28},[r10@128]!",
- "F4 6A B6 5D", "vld1.16 {d27,d28,d29},[r10@64]!",
- "F4 6A B2 5D", "vld1.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B2 6D", "vld1.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B2 7D", "vld1.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B7 9D", "vld1.32 {d27},[r10@64]!",
- "F4 6A BA 9D", "vld1.32 {d27,d28},[r10@64]!",
- "F4 6A BA AD", "vld1.32 {d27,d28},[r10@128]!",
- "F4 6A B6 9D", "vld1.32 {d27,d28,d29},[r10@64]!",
- "F4 6A B2 9D", "vld1.32 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B2 AD", "vld1.32 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B2 BD", "vld1.32 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B7 DD", "vld1.64 {d27},[r10@64]!",
- "F4 6A BA DD", "vld1.64 {d27,d28},[r10@64]!",
- "F4 6A BA ED", "vld1.64 {d27,d28},[r10@128]!",
- "F4 6A B6 DD", "vld1.64 {d27,d28,d29},[r10@64]!",
- "F4 6A B2 DD", "vld1.64 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B2 ED", "vld1.64 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B2 FD", "vld1.64 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B7 09", "vld1.8 {d27},[r10],r9",
- "F4 6A BA 09", "vld1.8 {d27,d28},[r10],r9",
- "F4 6A B6 09", "vld1.8 {d27,d28,d29},[r10],r9",
- "F4 6A B2 09", "vld1.8 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B7 49", "vld1.16 {d27},[r10],r9",
- "F4 6A BA 49", "vld1.16 {d27,d28},[r10],r9",
- "F4 6A B6 49", "vld1.16 {d27,d28,d29},[r10],r9",
- "F4 6A B2 49", "vld1.16 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B7 89", "vld1.32 {d27},[r10],r9",
- "F4 6A BA 89", "vld1.32 {d27,d28},[r10],r9",
- "F4 6A B6 89", "vld1.32 {d27,d28,d29},[r10],r9",
- "F4 6A B2 89", "vld1.32 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B7 C9", "vld1.64 {d27},[r10],r9",
- "F4 6A BA C9", "vld1.64 {d27,d28},[r10],r9",
- "F4 6A B6 C9", "vld1.64 {d27,d28,d29},[r10],r9",
- "F4 6A B2 C9", "vld1.64 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B7 19", "vld1.8 {d27},[r10@64],r9",
- "F4 6A BA 19", "vld1.8 {d27,d28},[r10@64],r9",
- "F4 6A BA 29", "vld1.8 {d27,d28},[r10@128],r9",
- "F4 6A B6 19", "vld1.8 {d27,d28,d29},[r10@64],r9",
- "F4 6A B2 19", "vld1.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B2 29", "vld1.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B2 39", "vld1.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A B7 59", "vld1.16 {d27},[r10@64],r9",
- "F4 6A BA 59", "vld1.16 {d27,d28},[r10@64],r9",
- "F4 6A BA 69", "vld1.16 {d27,d28},[r10@128],r9",
- "F4 6A B6 59", "vld1.16 {d27,d28,d29},[r10@64],r9",
- "F4 6A B2 59", "vld1.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B2 69", "vld1.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B2 79", "vld1.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A B7 99", "vld1.32 {d27},[r10@64],r9",
- "F4 6A BA 99", "vld1.32 {d27,d28},[r10@64],r9",
- "F4 6A BA A9", "vld1.32 {d27,d28},[r10@128],r9",
- "F4 6A B6 99", "vld1.32 {d27,d28,d29},[r10@64],r9",
- "F4 6A B2 99", "vld1.32 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B2 A9", "vld1.32 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B2 B9", "vld1.32 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A B7 D9", "vld1.64 {d27},[r10@64],r9",
- "F4 6A BA D9", "vld1.64 {d27,d28},[r10@64],r9",
- "F4 6A BA E9", "vld1.64 {d27,d28},[r10@128],r9",
- "F4 6A B6 D9", "vld1.64 {d27,d28,d29},[r10@64],r9",
- "F4 6A B2 D9", "vld1.64 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B2 E9", "vld1.64 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B2 F9", "vld1.64 {d27,d28,d29,d30},[r10@256],r9",
- "F4 EA B0 2F", "vld1.8 {d27[1]},[r10]",
- "F4 EA B4 4F", "vld1.16 {d27[1]},[r10]",
- "F4 EA B8 8F", "vld1.32 {d27[1]},[r10]",
- "F4 EA B4 5F", "vld1.16 {d27[1]},[r10@16]",
- "F4 EA B8 BF", "vld1.32 {d27[1]},[r10@32]",
- "F4 EA B0 2D", "vld1.8 {d27[1]},[r10]!",
- "F4 EA B4 4D", "vld1.16 {d27[1]},[r10]!",
- "F4 EA B8 8D", "vld1.32 {d27[1]},[r10]!",
- "F4 EA B4 5D", "vld1.16 {d27[1]},[r10@16]!",
- "F4 EA B8 BD", "vld1.32 {d27[1]},[r10@32]!",
- "F4 EA B0 29", "vld1.8 {d27[1]},[r10],r9",
- "F4 EA B4 49", "vld1.16 {d27[1]},[r10],r9",
- "F4 EA B8 89", "vld1.32 {d27[1]},[r10],r9",
- "F4 EA B4 59", "vld1.16 {d27[1]},[r10@16],r9",
- "F4 EA B8 B9", "vld1.32 {d27[1]},[r10@32],r9",
- "F4 EA BC 0F", "vld1.8 {d27[]},[r10]",
- "F4 EA BC 2F", "vld1.8 {d27[],d28[]},[r10]",
- "F4 EA BC 4F", "vld1.16 {d27[]},[r10]",
- "F4 EA BC 6F", "vld1.16 {d27[],d28[]},[r10]",
- "F4 EA BC 8F", "vld1.32 {d27[]},[r10]",
- "F4 EA BC AF", "vld1.32 {d27[],d28[]},[r10]",
- "F4 EA BC 5F", "vld1.16 {d27[]},[r10@16]",
- "F4 EA BC 7F", "vld1.16 {d27[],d28[]},[r10@16]",
- "F4 EA BC 9F", "vld1.32 {d27[]},[r10@32]",
- "F4 EA BC BF", "vld1.32 {d27[],d28[]},[r10@32]",
- "F4 EA BC 0D", "vld1.8 {d27[]},[r10]!",
- "F4 EA BC 2D", "vld1.8 {d27[],d28[]},[r10]!",
- "F4 EA BC 4D", "vld1.16 {d27[]},[r10]!",
- "F4 EA BC 6D", "vld1.16 {d27[],d28[]},[r10]!",
- "F4 EA BC 8D", "vld1.32 {d27[]},[r10]!",
- "F4 EA BC AD", "vld1.32 {d27[],d28[]},[r10]!",
- "F4 EA BC 5D", "vld1.16 {d27[]},[r10@16]!",
- "F4 EA BC 7D", "vld1.16 {d27[],d28[]},[r10@16]!",
- "F4 EA BC 9D", "vld1.32 {d27[]},[r10@32]!",
- "F4 EA BC BD", "vld1.32 {d27[],d28[]},[r10@32]!",
- "F4 EA BC 09", "vld1.8 {d27[]},[r10],r9",
- "F4 EA BC 29", "vld1.8 {d27[],d28[]},[r10],r9",
- "F4 EA BC 49", "vld1.16 {d27[]},[r10],r9",
- "F4 EA BC 69", "vld1.16 {d27[],d28[]},[r10],r9",
- "F4 EA BC 89", "vld1.32 {d27[]},[r10],r9",
- "F4 EA BC A9", "vld1.32 {d27[],d28[]},[r10],r9",
- "F4 EA BC 59", "vld1.16 {d27[]},[r10@16],r9",
- "F4 EA BC 79", "vld1.16 {d27[],d28[]},[r10@16],r9",
- "F4 EA BC 99", "vld1.32 {d27[]},[r10@32],r9",
- "F4 EA BC B9", "vld1.32 {d27[],d28[]},[r10@32],r9",
- "F4 6A B8 0F", "vld2.8 {d27,d28},[r10]",
- "F4 6A B9 0F", "vld2.8 {d27,d29},[r10]",
- "F4 6A B3 0F", "vld2.8 {d27,d28,d29,d30},[r10]",
- "F4 6A B8 4F", "vld2.16 {d27,d28},[r10]",
- "F4 6A B9 4F", "vld2.16 {d27,d29},[r10]",
- "F4 6A B3 4F", "vld2.16 {d27,d28,d29,d30},[r10]",
- "F4 6A B8 8F", "vld2.32 {d27,d28},[r10]",
- "F4 6A B9 8F", "vld2.32 {d27,d29},[r10]",
- "F4 6A B3 8F", "vld2.32 {d27,d28,d29,d30},[r10]",
- "F4 6A B8 1F", "vld2.8 {d27,d28},[r10@64]",
- "F4 6A B8 2F", "vld2.8 {d27,d28},[r10@128]",
- "F4 6A B9 1F", "vld2.8 {d27,d29},[r10@64]",
- "F4 6A B9 2F", "vld2.8 {d27,d29},[r10@128]",
- "F4 6A B3 1F", "vld2.8 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B3 2F", "vld2.8 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B3 3F", "vld2.8 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B8 5F", "vld2.16 {d27,d28},[r10@64]",
- "F4 6A B8 6F", "vld2.16 {d27,d28},[r10@128]",
- "F4 6A B9 5F", "vld2.16 {d27,d29},[r10@64]",
- "F4 6A B9 6F", "vld2.16 {d27,d29},[r10@128]",
- "F4 6A B3 5F", "vld2.16 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B3 6F", "vld2.16 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B3 7F", "vld2.16 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B8 9F", "vld2.32 {d27,d28},[r10@64]",
- "F4 6A B8 AF", "vld2.32 {d27,d28},[r10@128]",
- "F4 6A B9 9F", "vld2.32 {d27,d29},[r10@64]",
- "F4 6A B9 AF", "vld2.32 {d27,d29},[r10@128]",
- "F4 6A B3 9F", "vld2.32 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B3 AF", "vld2.32 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B3 BF", "vld2.32 {d27,d28,d29,d30},[r10@256]",
- "F4 6A B8 0D", "vld2.8 {d27,d28},[r10]!",
- "F4 6A B9 0D", "vld2.8 {d27,d29},[r10]!",
- "F4 6A B3 0D", "vld2.8 {d27,d28,d29,d30},[r10]!",
- "F4 6A B8 4D", "vld2.16 {d27,d28},[r10]!",
- "F4 6A B9 4D", "vld2.16 {d27,d29},[r10]!",
- "F4 6A B3 4D", "vld2.16 {d27,d28,d29,d30},[r10]!",
- "F4 6A B8 8D", "vld2.32 {d27,d28},[r10]!",
- "F4 6A B9 8D", "vld2.32 {d27,d29},[r10]!",
- "F4 6A B3 8D", "vld2.32 {d27,d28,d29,d30},[r10]!",
- "F4 6A B8 1D", "vld2.8 {d27,d28},[r10@64]!",
- "F4 6A B8 2D", "vld2.8 {d27,d28},[r10@128]!",
- "F4 6A B9 1D", "vld2.8 {d27,d29},[r10@64]!",
- "F4 6A B9 2D", "vld2.8 {d27,d29},[r10@128]!",
- "F4 6A B3 1D", "vld2.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B3 2D", "vld2.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B3 3D", "vld2.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B8 5D", "vld2.16 {d27,d28},[r10@64]!",
- "F4 6A B8 6D", "vld2.16 {d27,d28},[r10@128]!",
- "F4 6A B9 5D", "vld2.16 {d27,d29},[r10@64]!",
- "F4 6A B9 6D", "vld2.16 {d27,d29},[r10@128]!",
- "F4 6A B3 5D", "vld2.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B3 6D", "vld2.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B3 7D", "vld2.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B8 9D", "vld2.32 {d27,d28},[r10@64]!",
- "F4 6A B8 AD", "vld2.32 {d27,d28},[r10@128]!",
- "F4 6A B9 9D", "vld2.32 {d27,d29},[r10@64]!",
- "F4 6A B9 AD", "vld2.32 {d27,d29},[r10@128]!",
- "F4 6A B3 9D", "vld2.32 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B3 AD", "vld2.32 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B3 BD", "vld2.32 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A B8 09", "vld2.8 {d27,d28},[r10],r9",
- "F4 6A B9 09", "vld2.8 {d27,d29},[r10],r9",
- "F4 6A B3 09", "vld2.8 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B8 49", "vld2.16 {d27,d28},[r10],r9",
- "F4 6A B9 49", "vld2.16 {d27,d29},[r10],r9",
- "F4 6A B3 49", "vld2.16 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B8 89", "vld2.32 {d27,d28},[r10],r9",
- "F4 6A B9 89", "vld2.32 {d27,d29},[r10],r9",
- "F4 6A B3 89", "vld2.32 {d27,d28,d29,d30},[r10],r9",
- "F4 6A B8 19", "vld2.8 {d27,d28},[r10@64],r9",
- "F4 6A B8 29", "vld2.8 {d27,d28},[r10@128],r9",
- "F4 6A B9 19", "vld2.8 {d27,d29},[r10@64],r9",
- "F4 6A B9 29", "vld2.8 {d27,d29},[r10@128],r9",
- "F4 6A B3 19", "vld2.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B3 29", "vld2.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B3 39", "vld2.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A B8 59", "vld2.16 {d27,d28},[r10@64],r9",
- "F4 6A B8 69", "vld2.16 {d27,d28},[r10@128],r9",
- "F4 6A B9 59", "vld2.16 {d27,d29},[r10@64],r9",
- "F4 6A B9 69", "vld2.16 {d27,d29},[r10@128],r9",
- "F4 6A B3 59", "vld2.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B3 69", "vld2.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B3 79", "vld2.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A B8 99", "vld2.32 {d27,d28},[r10@64],r9",
- "F4 6A B8 A9", "vld2.32 {d27,d28},[r10@128],r9",
- "F4 6A B9 99", "vld2.32 {d27,d29},[r10@64],r9",
- "F4 6A B9 A9", "vld2.32 {d27,d29},[r10@128],r9",
- "F4 6A B3 99", "vld2.32 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B3 A9", "vld2.32 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B3 B9", "vld2.32 {d27,d28,d29,d30},[r10@256],r9",
- "F4 EA B1 2F", "vld2.8 {d27[1],d28[1]},[r10]",
- "F4 EA B5 4F", "vld2.16 {d27[1],d28[1]},[r10]",
- "F4 EA B5 6F", "vld2.16 {d27[1],d29[1]},[r10]",
- "F4 EA B9 8F", "vld2.32 {d27[1],d28[1]},[r10]",
- "F4 EA B9 CF", "vld2.32 {d27[1],d29[1]},[r10]",
- "F4 EA B1 3F", "vld2.8 {d27[1],d28[1]},[r10@16]",
- "F4 EA B5 5F", "vld2.16 {d27[1],d28[1]},[r10@32]",
- "F4 EA B5 7F", "vld2.16 {d27[1],d29[1]},[r10@32]",
- "F4 EA B9 9F", "vld2.32 {d27[1],d28[1]},[r10@64]",
- "F4 EA B9 DF", "vld2.32 {d27[1],d29[1]},[r10@64]",
- "F4 EA B1 2D", "vld2.8 {d27[1],d28[1]},[r10]!",
- "F4 EA B5 4D", "vld2.16 {d27[1],d28[1]},[r10]!",
- "F4 EA B5 6D", "vld2.16 {d27[1],d29[1]},[r10]!",
- "F4 EA B9 8D", "vld2.32 {d27[1],d28[1]},[r10]!",
- "F4 EA B9 CD", "vld2.32 {d27[1],d29[1]},[r10]!",
- "F4 EA B1 3D", "vld2.8 {d27[1],d28[1]},[r10@16]!",
- "F4 EA B5 5D", "vld2.16 {d27[1],d28[1]},[r10@32]!",
- "F4 EA B5 7D", "vld2.16 {d27[1],d29[1]},[r10@32]!",
- "F4 EA B9 9D", "vld2.32 {d27[1],d28[1]},[r10@64]!",
- "F4 EA B9 DD", "vld2.32 {d27[1],d29[1]},[r10@64]!",
- "F4 EA B1 29", "vld2.8 {d27[1],d28[1]},[r10],r9",
- "F4 EA B5 49", "vld2.16 {d27[1],d28[1]},[r10],r9",
- "F4 EA B5 69", "vld2.16 {d27[1],d29[1]},[r10],r9",
- "F4 EA B9 89", "vld2.32 {d27[1],d28[1]},[r10],r9",
- "F4 EA B9 C9", "vld2.32 {d27[1],d29[1]},[r10],r9",
- "F4 EA B1 39", "vld2.8 {d27[1],d28[1]},[r10@16],r9",
- "F4 EA B5 59", "vld2.16 {d27[1],d28[1]},[r10@32],r9",
- "F4 EA B5 79", "vld2.16 {d27[1],d29[1]},[r10@32],r9",
- "F4 EA B9 99", "vld2.32 {d27[1],d28[1]},[r10@64],r9",
- "F4 EA B9 D9", "vld2.32 {d27[1],d29[1]},[r10@64],r9",
- "F4 EA BD 0F", "vld2.8 {d27[],d28[]},[r10]",
- "F4 EA BD 2F", "vld2.8 {d27[],d29[]},[r10]",
- "F4 EA BD 4F", "vld2.16 {d27[],d28[]},[r10]",
- "F4 EA BD 6F", "vld2.16 {d27[],d29[]},[r10]",
- "F4 EA BD 8F", "vld2.32 {d27[],d28[]},[r10]",
- "F4 EA BD AF", "vld2.32 {d27[],d29[]},[r10]",
- "F4 EA BD 1F", "vld2.8 {d27[],d28[]},[r10@16]",
- "F4 EA BD 3F", "vld2.8 {d27[],d29[]},[r10@16]",
- "F4 EA BD 5F", "vld2.16 {d27[],d28[]},[r10@32]",
- "F4 EA BD 7F", "vld2.16 {d27[],d29[]},[r10@32]",
- "F4 EA BD 9F", "vld2.32 {d27[],d28[]},[r10@64]",
- "F4 EA BD BF", "vld2.32 {d27[],d29[]},[r10@64]",
- "F4 EA BD 0D", "vld2.8 {d27[],d28[]},[r10]!",
- "F4 EA BD 2D", "vld2.8 {d27[],d29[]},[r10]!",
- "F4 EA BD 4D", "vld2.16 {d27[],d28[]},[r10]!",
- "F4 EA BD 6D", "vld2.16 {d27[],d29[]},[r10]!",
- "F4 EA BD 8D", "vld2.32 {d27[],d28[]},[r10]!",
- "F4 EA BD AD", "vld2.32 {d27[],d29[]},[r10]!",
- "F4 EA BD 1D", "vld2.8 {d27[],d28[]},[r10@16]!",
- "F4 EA BD 3D", "vld2.8 {d27[],d29[]},[r10@16]!",
- "F4 EA BD 5D", "vld2.16 {d27[],d28[]},[r10@32]!",
- "F4 EA BD 7D", "vld2.16 {d27[],d29[]},[r10@32]!",
- "F4 EA BD 9D", "vld2.32 {d27[],d28[]},[r10@64]!",
- "F4 EA BD BD", "vld2.32 {d27[],d29[]},[r10@64]!",
- "F4 EA BD 09", "vld2.8 {d27[],d28[]},[r10],r9",
- "F4 EA BD 29", "vld2.8 {d27[],d29[]},[r10],r9",
- "F4 EA BD 49", "vld2.16 {d27[],d28[]},[r10],r9",
- "F4 EA BD 69", "vld2.16 {d27[],d29[]},[r10],r9",
- "F4 EA BD 89", "vld2.32 {d27[],d28[]},[r10],r9",
- "F4 EA BD A9", "vld2.32 {d27[],d29[]},[r10],r9",
- "F4 EA BD 19", "vld2.8 {d27[],d28[]},[r10@16],r9",
- "F4 EA BD 39", "vld2.8 {d27[],d29[]},[r10@16],r9",
- "F4 EA BD 59", "vld2.16 {d27[],d28[]},[r10@32],r9",
- "F4 EA BD 79", "vld2.16 {d27[],d29[]},[r10@32],r9",
- "F4 EA BD 99", "vld2.32 {d27[],d28[]},[r10@64],r9",
- "F4 EA BD B9", "vld2.32 {d27[],d29[]},[r10@64],r9",
- "F4 6A B4 0F", "vld3.8 {d27,d28,d29},[r10]",
- "F4 6A B5 0F", "vld3.8 {d27,d29,d31},[r10]",
- "F4 6A B4 4F", "vld3.16 {d27,d28,d29},[r10]",
- "F4 6A B5 4F", "vld3.16 {d27,d29,d31},[r10]",
- "F4 6A B4 8F", "vld3.32 {d27,d28,d29},[r10]",
- "F4 6A B5 8F", "vld3.32 {d27,d29,d31},[r10]",
- "F4 6A B4 1F", "vld3.8 {d27,d28,d29},[r10@64]",
- "F4 6A B5 1F", "vld3.8 {d27,d29,d31},[r10@64]",
- "F4 6A B4 5F", "vld3.16 {d27,d28,d29},[r10@64]",
- "F4 6A B5 5F", "vld3.16 {d27,d29,d31},[r10@64]",
- "F4 6A B4 9F", "vld3.32 {d27,d28,d29},[r10@64]",
- "F4 6A B5 9F", "vld3.32 {d27,d29,d31},[r10@64]",
- "F4 6A B4 0D", "vld3.8 {d27,d28,d29},[r10]!",
- "F4 6A B5 0D", "vld3.8 {d27,d29,d31},[r10]!",
- "F4 6A B4 4D", "vld3.16 {d27,d28,d29},[r10]!",
- "F4 6A B5 4D", "vld3.16 {d27,d29,d31},[r10]!",
- "F4 6A B4 8D", "vld3.32 {d27,d28,d29},[r10]!",
- "F4 6A B5 8D", "vld3.32 {d27,d29,d31},[r10]!",
- "F4 6A B4 1D", "vld3.8 {d27,d28,d29},[r10@64]!",
- "F4 6A B5 1D", "vld3.8 {d27,d29,d31},[r10@64]!",
- "F4 6A B4 5D", "vld3.16 {d27,d28,d29},[r10@64]!",
- "F4 6A B5 5D", "vld3.16 {d27,d29,d31},[r10@64]!",
- "F4 6A B4 9D", "vld3.32 {d27,d28,d29},[r10@64]!",
- "F4 6A B5 9D", "vld3.32 {d27,d29,d31},[r10@64]!",
- "F4 6A B4 09", "vld3.8 {d27,d28,d29},[r10],r9",
- "F4 6A B5 09", "vld3.8 {d27,d29,d31},[r10],r9",
- "F4 6A B4 49", "vld3.16 {d27,d28,d29},[r10],r9",
- "F4 6A B5 49", "vld3.16 {d27,d29,d31},[r10],r9",
- "F4 6A B4 89", "vld3.32 {d27,d28,d29},[r10],r9",
- "F4 6A B5 89", "vld3.32 {d27,d29,d31},[r10],r9",
- "F4 6A B4 19", "vld3.8 {d27,d28,d29},[r10@64],r9",
- "F4 6A B5 19", "vld3.8 {d27,d29,d31},[r10@64],r9",
- "F4 6A B4 59", "vld3.16 {d27,d28,d29},[r10@64],r9",
- "F4 6A B5 59", "vld3.16 {d27,d29,d31},[r10@64],r9",
- "F4 6A B4 99", "vld3.32 {d27,d28,d29},[r10@64],r9",
- "F4 6A B5 99", "vld3.32 {d27,d29,d31},[r10@64],r9",
- "F4 EA B2 2F", "vld3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F4 EA B6 4F", "vld3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F4 EA B6 6F", "vld3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F4 EA BA 8F", "vld3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F4 EA BA CF", "vld3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F4 EA B2 2D", "vld3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 EA B6 4D", "vld3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 EA B6 6D", "vld3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 EA BA 8D", "vld3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 EA BA CD", "vld3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 EA B2 29", "vld3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 EA B6 49", "vld3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 EA B6 69", "vld3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 EA BA 89", "vld3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 EA BA C9", "vld3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 EA BE 0F", "vld3.8 {d27[],d28[],d29[]},[r10]",
- "F4 EA BE 2F", "vld3.8 {d27[],d29[],d31[]},[r10]",
- "F4 EA BE 4F", "vld3.16 {d27[],d28[],d29[]},[r10]",
- "F4 EA BE 6F", "vld3.16 {d27[],d29[],d31[]},[r10]",
- "F4 EA BE 8F", "vld3.32 {d27[],d28[],d29[]},[r10]",
- "F4 EA BE AF", "vld3.32 {d27[],d29[],d31[]},[r10]",
- "F4 EA BE 0D", "vld3.8 {d27[],d28[],d29[]},[r10]!",
- "F4 EA BE 2D", "vld3.8 {d27[],d29[],d31[]},[r10]!",
- "F4 EA BE 4D", "vld3.16 {d27[],d28[],d29[]},[r10]!",
- "F4 EA BE 6D", "vld3.16 {d27[],d29[],d31[]},[r10]!",
- "F4 EA BE 8D", "vld3.32 {d27[],d28[],d29[]},[r10]!",
- "F4 EA BE AD", "vld3.32 {d27[],d29[],d31[]},[r10]!",
- "F4 EA BE 09", "vld3.8 {d27[],d28[],d29[]},[r10],r9",
- "F4 EA BE 29", "vld3.8 {d27[],d29[],d31[]},[r10],r9",
- "F4 EA BE 49", "vld3.16 {d27[],d28[],d29[]},[r10],r9",
- "F4 EA BE 69", "vld3.16 {d27[],d29[],d31[]},[r10],r9",
- "F4 EA BE 89", "vld3.32 {d27[],d28[],d29[]},[r10],r9",
- "F4 EA BE A9", "vld3.32 {d27[],d29[],d31[]},[r10],r9",
- "F4 6A B0 0F", "vld4.8 {d27,d28,d29,d30},[r10]",
- "F4 6A 91 0F", "vld4.8 {d25,d27,d29,d31},[r10]",
- "F4 6A B0 4F", "vld4.16 {d27,d28,d29,d30},[r10]",
- "F4 6A 91 4F", "vld4.16 {d25,d27,d29,d31},[r10]",
- "F4 6A B0 8F", "vld4.32 {d27,d28,d29,d30},[r10]",
- "F4 6A 91 8F", "vld4.32 {d25,d27,d29,d31},[r10]",
- "F4 6A B0 1F", "vld4.8 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B0 2F", "vld4.8 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B0 3F", "vld4.8 {d27,d28,d29,d30},[r10@256]",
- "F4 6A 91 1F", "vld4.8 {d25,d27,d29,d31},[r10@64]",
- "F4 6A 91 2F", "vld4.8 {d25,d27,d29,d31},[r10@128]",
- "F4 6A 91 3F", "vld4.8 {d25,d27,d29,d31},[r10@256]",
- "F4 6A B0 5F", "vld4.16 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B0 6F", "vld4.16 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B0 7F", "vld4.16 {d27,d28,d29,d30},[r10@256]",
- "F4 6A 91 5F", "vld4.16 {d25,d27,d29,d31},[r10@64]",
- "F4 6A 91 6F", "vld4.16 {d25,d27,d29,d31},[r10@128]",
- "F4 6A 91 7F", "vld4.16 {d25,d27,d29,d31},[r10@256]",
- "F4 6A B0 9F", "vld4.32 {d27,d28,d29,d30},[r10@64]",
- "F4 6A B0 AF", "vld4.32 {d27,d28,d29,d30},[r10@128]",
- "F4 6A B0 BF", "vld4.32 {d27,d28,d29,d30},[r10@256]",
- "F4 6A 91 9F", "vld4.32 {d25,d27,d29,d31},[r10@64]",
- "F4 6A 91 AF", "vld4.32 {d25,d27,d29,d31},[r10@128]",
- "F4 6A 91 BF", "vld4.32 {d25,d27,d29,d31},[r10@256]",
- "F4 6A B0 0D", "vld4.8 {d27,d28,d29,d30},[r10]!",
- "F4 6A 91 0D", "vld4.8 {d25,d27,d29,d31},[r10]!",
- "F4 6A B0 4D", "vld4.16 {d27,d28,d29,d30},[r10]!",
- "F4 6A 91 4D", "vld4.16 {d25,d27,d29,d31},[r10]!",
- "F4 6A B0 8D", "vld4.32 {d27,d28,d29,d30},[r10]!",
- "F4 6A 91 8D", "vld4.32 {d25,d27,d29,d31},[r10]!",
- "F4 6A B0 1D", "vld4.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B0 2D", "vld4.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B0 3D", "vld4.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A 91 1D", "vld4.8 {d25,d27,d29,d31},[r10@64]!",
- "F4 6A 91 2D", "vld4.8 {d25,d27,d29,d31},[r10@128]!",
- "F4 6A 91 3D", "vld4.8 {d25,d27,d29,d31},[r10@256]!",
- "F4 6A B0 5D", "vld4.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B0 6D", "vld4.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B0 7D", "vld4.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A 91 5D", "vld4.16 {d25,d27,d29,d31},[r10@64]!",
- "F4 6A 91 6D", "vld4.16 {d25,d27,d29,d31},[r10@128]!",
- "F4 6A 91 7D", "vld4.16 {d25,d27,d29,d31},[r10@256]!",
- "F4 6A B0 9D", "vld4.32 {d27,d28,d29,d30},[r10@64]!",
- "F4 6A B0 AD", "vld4.32 {d27,d28,d29,d30},[r10@128]!",
- "F4 6A B0 BD", "vld4.32 {d27,d28,d29,d30},[r10@256]!",
- "F4 6A 91 9D", "vld4.32 {d25,d27,d29,d31},[r10@64]!",
- "F4 6A 91 AD", "vld4.32 {d25,d27,d29,d31},[r10@128]!",
- "F4 6A 91 BD", "vld4.32 {d25,d27,d29,d31},[r10@256]!",
- "F4 6A B0 09", "vld4.8 {d27,d28,d29,d30},[r10],r9",
- "F4 6A 91 09", "vld4.8 {d25,d27,d29,d31},[r10],r9",
- "F4 6A B0 49", "vld4.16 {d27,d28,d29,d30},[r10],r9",
- "F4 6A 91 49", "vld4.16 {d25,d27,d29,d31},[r10],r9",
- "F4 6A B0 89", "vld4.32 {d27,d28,d29,d30},[r10],r9",
- "F4 6A 91 89", "vld4.32 {d25,d27,d29,d31},[r10],r9",
- "F4 6A B0 19", "vld4.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B0 29", "vld4.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B0 39", "vld4.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A 91 19", "vld4.8 {d25,d27,d29,d31},[r10@64],r9",
- "F4 6A 91 29", "vld4.8 {d25,d27,d29,d31},[r10@128],r9",
- "F4 6A 91 39", "vld4.8 {d25,d27,d29,d31},[r10@256],r9",
- "F4 6A B0 59", "vld4.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B0 69", "vld4.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B0 79", "vld4.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A 91 59", "vld4.16 {d25,d27,d29,d31},[r10@64],r9",
- "F4 6A 91 69", "vld4.16 {d25,d27,d29,d31},[r10@128],r9",
- "F4 6A 91 79", "vld4.16 {d25,d27,d29,d31},[r10@256],r9",
- "F4 6A B0 99", "vld4.32 {d27,d28,d29,d30},[r10@64],r9",
- "F4 6A B0 A9", "vld4.32 {d27,d28,d29,d30},[r10@128],r9",
- "F4 6A B0 B9", "vld4.32 {d27,d28,d29,d30},[r10@256],r9",
- "F4 6A 91 99", "vld4.32 {d25,d27,d29,d31},[r10@64],r9",
- "F4 6A 91 A9", "vld4.32 {d25,d27,d29,d31},[r10@128],r9",
- "F4 6A 91 B9", "vld4.32 {d25,d27,d29,d31},[r10@256],r9",
- "F4 EA B3 2F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 EA B7 4F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 EA 97 6F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F4 EA BB 8F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 EA 9B CF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F4 EA B3 3F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
- "F4 EA B7 5F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F4 EA 97 7F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F4 EA BB 9F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F4 EA BB AF", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
- "F4 EA 9B DF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F4 EA 9B EF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
- "F4 EA B3 2D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 EA B7 4D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 EA 97 6D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F4 EA BB 8D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 EA 9B CD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F4 EA B3 3D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
- "F4 EA B7 5D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F4 EA 97 7D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F4 EA BB 9D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F4 EA BB AD", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
- "F4 EA 9B DD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F4 EA 9B ED", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
- "F4 EA B3 29", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 EA B7 49", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 EA 97 69", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F4 EA BB 89", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 EA 9B C9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F4 EA B3 39", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
- "F4 EA B7 59", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F4 EA 97 79", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F4 EA BB 99", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F4 EA BB A9", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
- "F4 EA 9B D9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F4 EA 9B E9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
- "F4 EA BF 0F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]",
- "F4 EA 9F 2F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]",
- "F4 EA BF 4F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]",
- "F4 EA 9F 6F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]",
- "F4 EA BF 8F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]",
- "F4 EA 9F AF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]",
- "F4 EA BF 1F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]",
- "F4 EA 9F 3F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]",
- "F4 EA BF 5F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]",
- "F4 EA 9F 7F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]",
- "F4 EA BF 9F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]",
- "F4 EA BF DF", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]",
- "F4 EA 9F BF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]",
- "F4 EA 9F FF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]",
- "F4 EA BF 0D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]!",
- "F4 EA 9F 2D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]!",
- "F4 EA BF 4D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]!",
- "F4 EA 9F 6D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]!",
- "F4 EA BF 8D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]!",
- "F4 EA 9F AD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]!",
- "F4 EA BF 1D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]!",
- "F4 EA 9F 3D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]!",
- "F4 EA BF 5D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]!",
- "F4 EA 9F 7D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]!",
- "F4 EA BF 9D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]!",
- "F4 EA BF DD", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]!",
- "F4 EA 9F BD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]!",
- "F4 EA 9F FD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]!",
- "F4 EA BF 09", "vld4.8 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F4 EA 9F 29", "vld4.8 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F4 EA BF 49", "vld4.16 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F4 EA 9F 69", "vld4.16 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F4 EA BF 89", "vld4.32 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F4 EA 9F A9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F4 EA BF 19", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32],r9",
- "F4 EA 9F 39", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32],r9",
- "F4 EA BF 59", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64],r9",
- "F4 EA 9F 79", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64],r9",
- "F4 EA BF 99", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64],r9",
- "F4 EA BF D9", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128],r9",
- "F4 EA 9F B9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64],r9",
- "F4 EA 9F F9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128],r9",
- "0C BA AA 03", "vldmiaeq r10!,{s20-s22}",
- "ED 3A AA 03", "vldmdb r10!,{s20-s22}",
- "EC FA 4B 06", "vldmia r10!,{d20-d22}",
- "ED 7A 4B 06", "vldmdb r10!,{d20-d22}",
- "EC 9A AA 03", "vldmia r10,{s20-s22}",
- "0C DA 4B 06", "vldmiaeq r10,{d20-d22}",
- "0D 5F 5B 21", "vldreq.64 d21,[pc,#-0x84]",
- "ED DF 5B 21", "vldr.64 d21,[pc,#0x84]",
- "ED DA 5B 00", "vldr.64 d21,[r10]",
- "ED 5A 5B 21", "vldr.64 d21,[r10,#-0x84]",
- "ED DA 5B 00", "vldr.64 d21,[r10]",
- "ED DA 5B 21", "vldr.64 d21,[r10,#0x84]",
- "0D 5F AA 21", "vldreq.32 s21,[pc,#-0x84]",
- "ED DF AA 21", "vldr.32 s21,[pc,#0x84]",
- "ED DA AA 00", "vldr.32 s21,[r10]",
- "ED 5A AA 21", "vldr.32 s21,[r10,#-0x84]",
- "ED DA AA 00", "vldr.32 s21,[r10]",
- "ED DA AA 21", "vldr.32 s21,[r10,#0x84]",
- "F2 49 56 AA", "vmax.s8 d21,d25,d26",
- "F2 59 56 AA", "vmax.s16 d21,d25,d26",
- "F2 69 56 AA", "vmax.s32 d21,d25,d26",
- "F3 49 56 AA", "vmax.u8 d21,d25,d26",
- "F3 59 56 AA", "vmax.u16 d21,d25,d26",
- "F3 69 56 AA", "vmax.u32 d21,d25,d26",
- "F2 4C 66 EE", "vmax.s8 q11,q14,q15",
- "F2 5C 66 EE", "vmax.s16 q11,q14,q15",
- "F2 6C 66 EE", "vmax.s32 q11,q14,q15",
- "F3 4C 66 EE", "vmax.u8 q11,q14,q15",
- "F3 5C 66 EE", "vmax.u16 q11,q14,q15",
- "F3 6C 66 EE", "vmax.u32 q11,q14,q15",
- "F2 49 5F AA", "vmax.f32 d21,d25,d26",
- "F2 4C 6F EE", "vmax.f32 q11,q14,q15",
- "F2 49 56 BA", "vmin.s8 d21,d25,d26",
- "F2 59 56 BA", "vmin.s16 d21,d25,d26",
- "F2 69 56 BA", "vmin.s32 d21,d25,d26",
- "F3 49 56 BA", "vmin.u8 d21,d25,d26",
- "F3 59 56 BA", "vmin.u16 d21,d25,d26",
- "F3 69 56 BA", "vmin.u32 d21,d25,d26",
- "F2 4C 66 FE", "vmin.s8 q11,q14,q15",
- "F2 5C 66 FE", "vmin.s16 q11,q14,q15",
- "F2 6C 66 FE", "vmin.s32 q11,q14,q15",
- "F3 4C 66 FE", "vmin.u8 q11,q14,q15",
- "F3 5C 66 FE", "vmin.u16 q11,q14,q15",
- "F3 6C 66 FE", "vmin.u32 q11,q14,q15",
- "F2 69 5F AA", "vmin.f32 d21,d25,d26",
- "F2 6C 6F EE", "vmin.f32 q11,q14,q15",
- "F2 D9 50 CF", "vmla.i16 d21,d25,d7[1]",
- "F2 E9 50 EF", "vmla.i32 d21,d25,d15[1]",
- "F2 E9 51 EF", "vmla.f32 d21,d25,d15[1]",
- "F2 49 59 AA", "vmla.i8 d21,d25,d26",
- "F2 59 59 AA", "vmla.i16 d21,d25,d26",
- "F2 69 59 AA", "vmla.i32 d21,d25,d26",
- "F3 DC 60 CF", "vmla.i16 q11,q14,d7[1]",
- "F3 EC 60 EF", "vmla.i32 q11,q14,d15[1]",
- "F2 4C 69 EE", "vmla.i8 q11,q14,q15",
- "F2 5C 69 EE", "vmla.i16 q11,q14,q15",
- "F2 6C 69 EE", "vmla.i32 q11,q14,q15",
- "F2 49 5D BA", "vmla.f32 d21,d25,d26",
- "F2 4C 6D FE", "vmla.f32 q11,q14,q15",
- "EE 4C AA 8D", "vmla.f32 s21,s25,s26",
- "0E 49 5B AA", "vmlaeq.f64 d21,d25,d26",
- "F2 D9 62 CF", "vmlal.s16 q11,d25,d7[1]",
- "F2 E9 62 EF", "vmlal.s32 q11,d25,d15[1]",
- "F3 D9 62 CF", "vmlal.u16 q11,d25,d7[1]",
- "F3 E9 62 EF", "vmlal.u32 q11,d25,d15[1]",
- "F2 C9 68 AA", "vmlal.s8 q11,d25,d26",
- "F2 D9 68 AA", "vmlal.s16 q11,d25,d26",
- "F2 E9 68 AA", "vmlal.s32 q11,d25,d26",
- "F3 C9 68 AA", "vmlal.u8 q11,d25,d26",
- "F3 D9 68 AA", "vmlal.u16 q11,d25,d26",
- "F3 E9 68 AA", "vmlal.u32 q11,d25,d26",
- "F2 D9 54 CF", "vmls.i16 d21,d25,d7[1]",
- "F2 E9 54 EF", "vmls.i32 d21,d25,d15[1]",
- "F2 E9 55 EF", "vmls.f32 d21,d25,d15[1]",
- "F3 49 59 AA", "vmls.i8 d21,d25,d26",
- "F3 59 59 AA", "vmls.i16 d21,d25,d26",
- "F3 69 59 AA", "vmls.i32 d21,d25,d26",
- "F3 DC 64 CF", "vmls.i16 q11,q14,d7[1]",
- "F3 EC 64 EF", "vmls.i32 q11,q14,d15[1]",
- "F3 EC 65 EF", "vmls.f32 q11,q14,d15[1]",
- "F3 4C 69 EE", "vmls.i8 q11,q14,q15",
- "F3 5C 69 EE", "vmls.i16 q11,q14,q15",
- "F3 6C 69 EE", "vmls.i32 q11,q14,q15",
- "F2 69 5D BA", "vmls.f32 d21,d25,d26",
- "F2 6C 6D FE", "vmls.f32 q11,q14,q15",
- "EE 4C AA CD", "vmls.f32 s21,s25,s26",
- "EE 49 5B EA", "vmls.f64 d21,d25,d26",
- "F2 D9 66 CF", "vmlsl.s16 q11,d25,d7[1]",
- "F2 E9 66 EF", "vmlsl.s32 q11,d25,d15[1]",
- "F3 D9 66 CF", "vmlsl.u16 q11,d25,d7[1]",
- "F3 E9 66 EF", "vmlsl.u32 q11,d25,d15[1]",
- "F2 C9 6A AA", "vmlsl.s8 q11,d25,d26",
- "F2 D9 6A AA", "vmlsl.s16 q11,d25,d26",
- "F2 E9 6A AA", "vmlsl.s32 q11,d25,d26",
- "F3 C9 6A AA", "vmlsl.u8 q11,d25,d26",
- "F3 D9 6A AA", "vmlsl.u16 q11,d25,d26",
- "F3 E9 6A AA", "vmlsl.u32 q11,d25,d26",
- "F2 6A 51 BA", "vmov d21,d26",
- "F2 6E 61 FE", "vmov q11,q15",
- "0C 46 5B 3A", "vmoveq d26,r5,r6",
- "EC 56 5B 3A", "vmov r5,r6,d26",
- "0C 56 5A 1D", "vmoveq r5,r6,s26,s27",
- "0E 1C 5A 90", "vmoveq r5,s25",
- "EE 0C 5A 90", "vmov s25,r5",
- "EE 0C 5A 90", "vmov s25,r5",
- "EC 46 5A 1D", "vmov s26,s27,r5,r6",
- "F3 C0 5E 19", "vmov.i8 d21,#0x89",
- "F3 C0 58 19", "vmov.i16 d21,#0x89",
- "F3 C0 50 19", "vmov.i32 d21,#0x89",
- "F2 C0 5E 30", "vmov.i64 d21,#0x0",
- "F3 C0 6E 59", "vmov.i8 q11,#0x89",
- "F3 C0 68 59", "vmov.i16 q11,#0x89",
- "F3 C0 60 59", "vmov.i32 q11,#0x89",
- "F2 C0 6E 70", "vmov.i64 q11,#0x0",
- "0E 5B 5B B0", "vmoveq.s8 r5,d27[1]",
- "EE 1B 5B F0", "vmov.s16 r5,d27[1]",
- "EE DB 5B B0", "vmov.u8 r5,d27[1]",
- "EE 9B 5B F0", "vmov.u16 r5,d27[1]",
- "EE 3B 5B 90", "vmov.32 r5,d27[1]",
- "0E 4B 5B B0", "vmoveq.8 d27[1],r5",
- "EE 0B 5B F0", "vmov.16 d27[1],r5",
- "EE 2B 5B 90", "vmov.32 d27[1],r5",
- "EE B7 BA 00", "vmov.f32 s22,#0x70", // originally "vmov.f32 s22,#1.0"
- "EE F0 AA 4D", "vmov.f32 s21,s26",
- "0E F7 6B 00", "vmoveq.f64 d22,#0x70", // originally "vmov.f64 d22,#1.0"
- "0E F0 5B 6A", "vmoveq.f64 d21,d26",
- "F2 C8 6A 3A", "vmovl.s8 q11,d26",
- "F2 D0 6A 3A", "vmovl.s16 q11,d26",
- "F2 E0 6A 3A", "vmovl.s32 q11,d26",
- "F3 C8 6A 3A", "vmovl.u8 q11,d26",
- "F3 D0 6A 3A", "vmovl.u16 q11,d26",
- "F3 E0 6A 3A", "vmovl.u32 q11,d26",
- "F3 F2 52 2E", "vmovn.i16 d21,q15",
- "F3 F6 52 2E", "vmovn.i32 d21,q15",
- "F3 FA 52 2E", "vmovn.i64 d21,q15",
- "0E F0 5A 10", "vmrseq r5,fpsid",
- "0E F1 5A 10", "vmrseq r5,fpscr",
- "EE F6 5A 10", "vmrs r5,mvfr1",
- "EE F7 5A 10", "vmrs r5,mvfr0",
- "EE F8 5A 10", "vmrs r5,fpexc",
- "EE F9 5A 10", "vmrs r5,fpinst",
- "EE FA 5A 10", "vmrs r5,fpinst2",
- "0E E0 5A 10", "vmsreq fpsid,r5",
- "0E E1 5A 10", "vmsreq fpscr,r5",
- "EE E8 5A 10", "vmsr fpexc,r5",
- "EE E9 5A 10", "vmsr fpinst,r5",
- "EE EA 5A 10", "vmsr fpinst2,r5",
- "F2 D9 58 CF", "vmul.i16 d21,d25,d7[1]",
- "F2 E9 58 EF", "vmul.i32 d21,d25,d15[1]",
- "F2 E9 59 EF", "vmul.f32 d21,d25,d15[1]",
- "F2 49 59 BA", "vmul.i8 d21,d25,d26",
- "F2 49 59 BA", "vmul.i8 d21,d25,d26",
- "F2 59 59 BA", "vmul.i16 d21,d25,d26",
- "F2 69 59 BA", "vmul.i32 d21,d25,d26",
- "F3 49 59 BA", "vmul.p8 d21,d25,d26",
- "F3 DC 68 CF", "vmul.i16 q11,q14,d7[1]",
- "F3 EC 68 EF", "vmul.i32 q11,q14,d15[1]",
- "F3 EC 69 EF", "vmul.f32 q11,q14,d15[1]",
- "F2 4C 69 FE", "vmul.i8 q11,q14,q15",
- "F2 5C 69 FE", "vmul.i16 q11,q14,q15",
- "F2 6C 69 FE", "vmul.i32 q11,q14,q15",
- "F3 4C 69 FE", "vmul.p8 q11,q14,q15",
- "F3 49 5D BA", "vmul.f32 d21,d25,d26",
- "F3 4C 6D FE", "vmul.f32 q11,q14,q15",
- "EE 6C AA 8D", "vmul.f32 s21,s25,s26",
- "0E 69 5B AA", "vmuleq.f64 d21,d25,d26",
- "F2 D9 6A CF", "vmull.s16 q11,d25,d7[1]",
- "F2 E9 6A EF", "vmull.s32 q11,d25,d15[1]",
- "F3 D9 6A CF", "vmull.u16 q11,d25,d7[1]",
- "F3 E9 6A EF", "vmull.u32 q11,d25,d15[1]",
- "F2 C9 6C AA", "vmull.s8 q11,d25,d26",
- "F2 D9 6C AA", "vmull.s16 q11,d25,d26",
- "F2 E9 6C AA", "vmull.s32 q11,d25,d26",
- "F3 C9 6C AA", "vmull.u8 q11,d25,d26",
- "F3 D9 6C AA", "vmull.u16 q11,d25,d26",
- "F3 E9 6C AA", "vmull.u32 q11,d25,d26",
- "F2 C9 6E AA", "vmull.p8 q11,d25,d26",
- "F3 F0 55 AA", "vmvn d21,d26",
- "F3 F0 65 EE", "vmvn q11,q15",
- "F3 C0 58 37", "vmvn.i16 d21,#0x87",
- "F3 C0 50 37", "vmvn.i32 d21,#0x87",
- "F3 C0 68 77", "vmvn.i16 q11,#0x87",
- "F3 C0 60 77", "vmvn.i32 q11,#0x87",
- "F3 F1 53 AA", "vneg.s8 d21,d26",
- "F3 F5 53 AA", "vneg.s16 d21,d26",
- "F3 F9 53 AA", "vneg.s32 d21,d26",
- "F3 F9 57 AA", "vneg.f32 d21,d26",
- "EE F1 5B 6A", "vneg.f64 d21,d26",
- "F3 F1 63 EE", "vneg.s8 q11,q15",
- "F3 F5 63 EE", "vneg.s16 q11,q15",
- "F3 F9 63 EE", "vneg.s32 q11,q15",
- "F3 F9 67 EE", "vneg.f32 q11,q15",
- "0E F1 AA 4D", "vnegeq.f32 s21,s26",
- "0E 5C AA CD", "vnmlaeq.f32 s21,s25,s26",
- "EE 59 5B EA", "vnmla.f64 d21,d25,d26",
- "EE 5C AA 8D", "vnmls.f32 s21,s25,s26",
- "EE 59 5B AA", "vnmls.f64 d21,d25,d26",
- "0E 6C AA CD", "vnmuleq.f32 s21,s25,s26",
- "EE 69 5B EA", "vnmul.f64 d21,d25,d26",
- "F2 79 51 BA", "vorn d21,d25,d26",
- "F2 7C 61 FE", "vorn q11,q14,q15",
- "F2 69 51 BA", "vorr d21,d25,d26",
- "F2 6C 61 FE", "vorr q11,q14,q15",
- "F3 C0 59 17", "vorr.i16 d21,#0x87",
- "F3 C0 51 17", "vorr.i32 d21,#0x87",
- "F3 C0 69 57", "vorr.i16 q11,#0x87",
- "F3 C0 61 57", "vorr.i32 q11,#0x87",
- "F3 F0 56 2A", "vpadal.s8 d21,d26",
- "F3 F4 56 2A", "vpadal.s16 d21,d26",
- "F3 F8 56 2A", "vpadal.s32 d21,d26",
- "F3 F0 56 AA", "vpadal.u8 d21,d26",
- "F3 F4 56 AA", "vpadal.u16 d21,d26",
- "F3 F8 56 AA", "vpadal.u32 d21,d26",
- "F3 F0 66 6E", "vpadal.s8 q11,q15",
- "F3 F4 66 6E", "vpadal.s16 q11,q15",
- "F3 F8 66 6E", "vpadal.s32 q11,q15",
- "F3 F0 66 EE", "vpadal.u8 q11,q15",
- "F3 F4 66 EE", "vpadal.u16 q11,q15",
- "F3 F8 66 EE", "vpadal.u32 q11,q15",
- "F2 49 5B BA", "vpadd.i8 d21,d25,d26",
- "F2 59 5B BA", "vpadd.i16 d21,d25,d26",
- "F2 69 5B BA", "vpadd.i32 d21,d25,d26",
- "F3 49 5D AA", "vpadd.f32 d21,d25,d26",
- "F3 F0 52 2A", "vpaddl.s8 d21,d26",
- "F3 F4 52 2A", "vpaddl.s16 d21,d26",
- "F3 F8 52 2A", "vpaddl.s32 d21,d26",
- "F3 F0 52 AA", "vpaddl.u8 d21,d26",
- "F3 F4 52 AA", "vpaddl.u16 d21,d26",
- "F3 F8 52 AA", "vpaddl.u32 d21,d26",
- "F3 F0 62 6E", "vpaddl.s8 q11,q15",
- "F3 F4 62 6E", "vpaddl.s16 q11,q15",
- "F3 F8 62 6E", "vpaddl.s32 q11,q15",
- "F3 F0 62 EE", "vpaddl.u8 q11,q15",
- "F3 F4 62 EE", "vpaddl.u16 q11,q15",
- "F3 F8 62 EE", "vpaddl.u32 q11,q15",
- "F2 49 5A AA", "vpmax.s8 d21,d25,d26",
- "F2 59 5A AA", "vpmax.s16 d21,d25,d26",
- "F2 69 5A AA", "vpmax.s32 d21,d25,d26",
- "F3 49 5A AA", "vpmax.u8 d21,d25,d26",
- "F3 59 5A AA", "vpmax.u16 d21,d25,d26",
- "F3 69 5A AA", "vpmax.u32 d21,d25,d26",
- "F3 49 5F AA", "vpmax.f32 d21,d25,d26",
- "F2 49 5A BA", "vpmin.s8 d21,d25,d26",
- "F2 59 5A BA", "vpmin.s16 d21,d25,d26",
- "F2 69 5A BA", "vpmin.s32 d21,d25,d26",
- "F3 49 5A BA", "vpmin.u8 d21,d25,d26",
- "F3 59 5A BA", "vpmin.u16 d21,d25,d26",
- "F3 69 5A BA", "vpmin.u32 d21,d25,d26",
- "F3 69 5F AA", "vpmin.f32 d21,d25,d26",
- "0C FD DA 02", "vpopeq {s27-s28}",
- "0C FD BB 04", "vpopeq {d27-d28}",
- "0D 6D DA 02", "vpusheq {s27-s28}",
- "0D 6D BB 04", "vpusheq {d27-d28}",
- "F3 F0 57 2A", "vqabs.s8 d21,d26",
- "F3 F4 57 2A", "vqabs.s16 d21,d26",
- "F3 F8 57 2A", "vqabs.s32 d21,d26",
- "F3 F0 67 6E", "vqabs.s8 q11,q15",
- "F3 F4 67 6E", "vqabs.s16 q11,q15",
- "F3 F8 67 6E", "vqabs.s32 q11,q15",
- "F2 49 50 BA", "vqadd.s8 d21,d25,d26",
- "F2 59 50 BA", "vqadd.s16 d21,d25,d26",
- "F2 69 50 BA", "vqadd.s32 d21,d25,d26",
- "F2 79 50 BA", "vqadd.s64 d21,d25,d26",
- "F3 49 50 BA", "vqadd.u8 d21,d25,d26",
- "F3 59 50 BA", "vqadd.u16 d21,d25,d26",
- "F3 69 50 BA", "vqadd.u32 d21,d25,d26",
- "F3 79 50 BA", "vqadd.u64 d21,d25,d26",
- "F2 4C 60 FE", "vqadd.s8 q11,q14,q15",
- "F2 5C 60 FE", "vqadd.s16 q11,q14,q15",
- "F2 6C 60 FE", "vqadd.s32 q11,q14,q15",
- "F2 7C 60 FE", "vqadd.s64 q11,q14,q15",
- "F3 4C 60 FE", "vqadd.u8 q11,q14,q15",
- "F3 5C 60 FE", "vqadd.u16 q11,q14,q15",
- "F3 6C 60 FE", "vqadd.u32 q11,q14,q15",
- "F3 7C 60 FE", "vqadd.u64 q11,q14,q15",
- "F2 D9 63 CF", "vqdmlal.s16 q11,d25,d7[1]",
- "F2 E9 63 EF", "vqdmlal.s32 q11,d25,d15[1]",
- "F2 D9 69 AA", "vqdmlal.s16 q11,d25,d26",
- "F2 E9 69 AA", "vqdmlal.s32 q11,d25,d26",
- "F2 D9 67 CF", "vqdmlsl.s16 q11,d25,d7[1]",
- "F2 E9 67 EF", "vqdmlsl.s32 q11,d25,d15[1]",
- "F2 D9 6B AA", "vqdmlsl.s16 q11,d25,d26",
- "F2 E9 6B AA", "vqdmlsl.s32 q11,d25,d26",
- "F2 D9 5C CA", "vqdmulh.s16 d21,d25,d2[1]",
- "F2 E9 5C EF", "vqdmulh.s32 d21,d25,d15[1]",
- "F2 59 5B AA", "vqdmulh.s16 d21,d25,d26",
- "F2 69 5B AA", "vqdmulh.s32 d21,d25,d26",
- "F3 DC 6C CA", "vqdmulh.s16 q11,q14,d2[1]",
- "F3 EC 6C EF", "vqdmulh.s32 q11,q14,d15[1]",
- "F2 5C 6B EE", "vqdmulh.s16 q11,q14,q15",
- "F2 6C 6B EE", "vqdmulh.s32 q11,q14,q15",
- "F2 D9 6B CA", "vqdmull.s16 q11,d25,d2[1]",
- "F2 E9 6B EF", "vqdmull.s32 q11,d25,d15[1]",
- "F2 D9 6D AA", "vqdmull.s16 q11,d25,d26",
- "F2 E9 6D AA", "vqdmull.s32 q11,d25,d26",
- "F2 D9 6D AA", "vqdmull.s16 q11,d25,d26",
- "F2 E9 6D AA", "vqdmull.s32 q11,d25,d26",
- "F3 F2 52 AE", "vqmovn.s16 d21,q15",
- "F3 F6 52 AE", "vqmovn.s32 d21,q15",
- "F3 FA 52 AE", "vqmovn.s64 d21,q15",
- "F3 F2 52 EE", "vqmovn.u16 d21,q15",
- "F3 F6 52 EE", "vqmovn.u32 d21,q15",
- "F3 FA 52 EE", "vqmovn.u64 d21,q15",
- "F3 F2 52 6E", "vqmovun.s16 d21,q15",
- "F3 F6 52 6E", "vqmovun.s32 d21,q15",
- "F3 FA 52 6E", "vqmovun.s64 d21,q15",
- "F3 F0 57 AA", "vqneg.s8 d21,d26",
- "F3 F4 57 AA", "vqneg.s16 d21,d26",
- "F3 F8 57 AA", "vqneg.s32 d21,d26",
- "F3 F0 67 EE", "vqneg.s8 q11,q15",
- "F3 F4 67 EE", "vqneg.s16 q11,q15",
- "F3 F8 67 EE", "vqneg.s32 q11,q15",
- "F2 D9 5D CF", "vqrdmulh.s16 d21,d25,d7[1]",
- "F2 E9 5D EF", "vqrdmulh.s32 d21,d25,d15[1]",
- "F3 59 5B AA", "vqrdmulh.s16 d21,d25,d26",
- "F3 69 5B AA", "vqrdmulh.s32 d21,d25,d26",
- "F3 DC 6D CF", "vqrdmulh.s16 q11,q14,d7[1]",
- "F3 EC 6D EF", "vqrdmulh.s32 q11,q14,d15[1]",
- "F3 5C 6B EE", "vqrdmulh.s16 q11,q14,q15",
- "F3 6C 6B EE", "vqrdmulh.s32 q11,q14,q15",
- "F2 49 55 BA", "vqrshl.s8 d21,d26,d25",
- "F2 59 55 BA", "vqrshl.s16 d21,d26,d25",
- "F2 69 55 BA", "vqrshl.s32 d21,d26,d25",
- "F2 79 55 BA", "vqrshl.s64 d21,d26,d25",
- "F3 49 55 BA", "vqrshl.u8 d21,d26,d25",
- "F3 59 55 BA", "vqrshl.u16 d21,d26,d25",
- "F3 69 55 BA", "vqrshl.u32 d21,d26,d25",
- "F3 79 55 BA", "vqrshl.u64 d21,d26,d25",
- "F2 4C 65 FE", "vqrshl.s8 q11,q15,q14",
- "F2 5C 65 FE", "vqrshl.s16 q11,q15,q14",
- "F2 6C 65 FE", "vqrshl.s32 q11,q15,q14",
- "F2 7C 65 FE", "vqrshl.s64 q11,q15,q14",
- "F3 4C 65 FE", "vqrshl.u8 q11,q15,q14",
- "F3 5C 65 FE", "vqrshl.u16 q11,q15,q14",
- "F3 6C 65 FE", "vqrshl.u32 q11,q15,q14",
- "F3 7C 65 FE", "vqrshl.u64 q11,q15,q14",
- "F2 CF 59 7E", "vqrshrn.s16 d21,q15,#1",
- "F3 CF 59 7E", "vqrshrn.u16 d21,q15,#1",
- "F2 CF 59 7E", "vqrshrn.s16 d21,q15,#1",
- "F2 C8 59 7E", "vqrshrn.s16 d21,q15,#8",
- "F3 CF 59 7E", "vqrshrn.u16 d21,q15,#1",
- "F3 C8 59 7E", "vqrshrn.u16 d21,q15,#8",
- "F2 DF 59 7E", "vqrshrn.s32 d21,q15,#1",
- "F2 D0 59 7E", "vqrshrn.s32 d21,q15,#16",
- "F3 DF 59 7E", "vqrshrn.u32 d21,q15,#1",
- "F3 D0 59 7E", "vqrshrn.u32 d21,q15,#16",
- "F2 FF 59 7E", "vqrshrn.s64 d21,q15,#1",
- "F2 E0 59 7E", "vqrshrn.s64 d21,q15,#32",
- "F3 FF 59 7E", "vqrshrn.u64 d21,q15,#1",
- "F3 E0 59 7E", "vqrshrn.u64 d21,q15,#32",
- "F3 CF 58 7E", "vqrshrun.s16 d21,q15,#1",
- "F3 C8 58 7E", "vqrshrun.s16 d21,q15,#8",
- "F3 DF 58 7E", "vqrshrun.s32 d21,q15,#1",
- "F3 D0 58 7E", "vqrshrun.s32 d21,q15,#16",
- "F3 FF 58 7E", "vqrshrun.s64 d21,q15,#1",
- "F3 E0 58 7E", "vqrshrun.s64 d21,q15,#32",
- "F2 C8 57 3A", "vqshl.s8 d21,d26,#0",
- "F2 CF 57 3A", "vqshl.s8 d21,d26,#7",
- "F3 C8 57 3A", "vqshl.u8 d21,d26,#0",
- "F3 CF 57 3A", "vqshl.u8 d21,d26,#7",
- "F2 D0 57 3A", "vqshl.s16 d21,d26,#0",
- "F2 DF 57 3A", "vqshl.s16 d21,d26,#15",
- "F3 D0 57 3A", "vqshl.u16 d21,d26,#0",
- "F3 DF 57 3A", "vqshl.u16 d21,d26,#15",
- "F2 E0 57 3A", "vqshl.s32 d21,d26,#0",
- "F2 FF 57 3A", "vqshl.s32 d21,d26,#31",
- "F3 E0 57 3A", "vqshl.u32 d21,d26,#0",
- "F3 FF 57 3A", "vqshl.u32 d21,d26,#31",
- "F2 C0 57 BA", "vqshl.s64 d21,d26,#0",
- "F2 FF 57 BA", "vqshl.s64 d21,d26,#63",
- "F3 C0 57 BA", "vqshl.u64 d21,d26,#0",
- "F3 FF 57 BA", "vqshl.u64 d21,d26,#63",
- "F2 49 54 BA", "vqshl.s8 d21,d26,d25",
- "F2 59 54 BA", "vqshl.s16 d21,d26,d25",
- "F2 69 54 BA", "vqshl.s32 d21,d26,d25",
- "F2 79 54 BA", "vqshl.s64 d21,d26,d25",
- "F3 49 54 BA", "vqshl.u8 d21,d26,d25",
- "F3 59 54 BA", "vqshl.u16 d21,d26,d25",
- "F3 69 54 BA", "vqshl.u32 d21,d26,d25",
- "F3 79 54 BA", "vqshl.u64 d21,d26,d25",
- "F2 C8 67 7E", "vqshl.s8 q11,q15,#0",
- "F2 CF 67 7E", "vqshl.s8 q11,q15,#7",
- "F3 C8 67 7E", "vqshl.u8 q11,q15,#0",
- "F3 CF 67 7E", "vqshl.u8 q11,q15,#7",
- "F2 D0 67 7E", "vqshl.s16 q11,q15,#0",
- "F2 DF 67 7E", "vqshl.s16 q11,q15,#15",
- "F3 D0 67 7E", "vqshl.u16 q11,q15,#0",
- "F3 DF 67 7E", "vqshl.u16 q11,q15,#15",
- "F2 E0 67 7E", "vqshl.s32 q11,q15,#0",
- "F2 FF 67 7E", "vqshl.s32 q11,q15,#31",
- "F3 E0 67 7E", "vqshl.u32 q11,q15,#0",
- "F3 FF 67 7E", "vqshl.u32 q11,q15,#31",
- "F2 C0 67 FE", "vqshl.s64 q11,q15,#0",
- "F2 FF 67 FE", "vqshl.s64 q11,q15,#63",
- "F3 C0 67 FE", "vqshl.u64 q11,q15,#0",
- "F3 FF 67 FE", "vqshl.u64 q11,q15,#63",
- "F2 4C 64 FE", "vqshl.s8 q11,q15,q14",
- "F2 5C 64 FE", "vqshl.s16 q11,q15,q14",
- "F2 6C 64 FE", "vqshl.s32 q11,q15,q14",
- "F2 7C 64 FE", "vqshl.s64 q11,q15,q14",
- "F3 4C 64 FE", "vqshl.u8 q11,q15,q14",
- "F3 5C 64 FE", "vqshl.u16 q11,q15,q14",
- "F3 6C 64 FE", "vqshl.u32 q11,q15,q14",
- "F3 7C 64 FE", "vqshl.u64 q11,q15,q14",
- "F3 C8 56 3A", "vqshlu.s8 d21,d26,#0",
- "F3 CF 56 3A", "vqshlu.s8 d21,d26,#7",
- "F3 D0 56 3A", "vqshlu.s16 d21,d26,#0",
- "F3 DF 56 3A", "vqshlu.s16 d21,d26,#15",
- "F3 E0 56 3A", "vqshlu.s32 d21,d26,#0",
- "F3 FF 56 3A", "vqshlu.s32 d21,d26,#31",
- "F3 C0 56 BA", "vqshlu.s64 d21,d26,#0",
- "F3 FF 56 BA", "vqshlu.s64 d21,d26,#63",
- "F3 C8 66 7E", "vqshlu.s8 q11,q15,#0",
- "F3 CF 66 7E", "vqshlu.s8 q11,q15,#7",
- "F3 D0 66 7E", "vqshlu.s16 q11,q15,#0",
- "F3 DF 66 7E", "vqshlu.s16 q11,q15,#15",
- "F3 E0 66 7E", "vqshlu.s32 q11,q15,#0",
- "F3 FF 66 7E", "vqshlu.s32 q11,q15,#31",
- "F3 C0 66 FE", "vqshlu.s64 q11,q15,#0",
- "F3 FF 66 FE", "vqshlu.s64 q11,q15,#63",
- "F2 CF 59 3E", "vqshrn.s16 d21,q15,#1",
- "F2 C8 59 3E", "vqshrn.s16 d21,q15,#8",
- "F3 CF 59 3E", "vqshrn.u16 d21,q15,#1",
- "F3 C8 59 3E", "vqshrn.u16 d21,q15,#8",
- "F2 DF 59 3E", "vqshrn.s32 d21,q15,#1",
- "F2 D0 59 3E", "vqshrn.s32 d21,q15,#16",
- "F3 DF 59 3E", "vqshrn.u32 d21,q15,#1",
- "F3 D0 59 3E", "vqshrn.u32 d21,q15,#16",
- "F2 FF 59 3E", "vqshrn.s64 d21,q15,#1",
- "F2 E0 59 3E", "vqshrn.s64 d21,q15,#32",
- "F3 FF 59 3E", "vqshrn.u64 d21,q15,#1",
- "F3 E0 59 3E", "vqshrn.u64 d21,q15,#32",
- "F3 CF 58 3E", "vqshrun.s16 d21,q15,#1",
- "F3 C8 58 3E", "vqshrun.s16 d21,q15,#8",
- "F3 DF 58 3E", "vqshrun.s32 d21,q15,#1",
- "F3 D0 58 3E", "vqshrun.s32 d21,q15,#16",
- "F3 FF 58 3E", "vqshrun.s64 d21,q15,#1",
- "F3 E0 58 3E", "vqshrun.s64 d21,q15,#32",
- "F2 49 52 BA", "vqsub.s8 d21,d25,d26",
- "F2 59 52 BA", "vqsub.s16 d21,d25,d26",
- "F2 69 52 BA", "vqsub.s32 d21,d25,d26",
- "F2 79 52 BA", "vqsub.s64 d21,d25,d26",
- "F3 49 52 BA", "vqsub.u8 d21,d25,d26",
- "F3 59 52 BA", "vqsub.u16 d21,d25,d26",
- "F3 69 52 BA", "vqsub.u32 d21,d25,d26",
- "F3 79 52 BA", "vqsub.u64 d21,d25,d26",
- "F2 4C 62 FE", "vqsub.s8 q11,q14,q15",
- "F2 5C 62 FE", "vqsub.s16 q11,q14,q15",
- "F2 6C 62 FE", "vqsub.s32 q11,q14,q15",
- "F2 7C 62 FE", "vqsub.s64 q11,q14,q15",
- "F3 4C 62 FE", "vqsub.u8 q11,q14,q15",
- "F3 5C 62 FE", "vqsub.u16 q11,q14,q15",
- "F3 6C 62 FE", "vqsub.u32 q11,q14,q15",
- "F3 7C 62 FE", "vqsub.u64 q11,q14,q15",
- "F3 CC 54 AE", "vraddhn.i16 d21,q14,q15",
- "F3 DC 54 AE", "vraddhn.i32 d21,q14,q15",
- "F3 EC 54 AE", "vraddhn.i64 d21,q14,q15",
- "F3 FB 54 2A", "vrecpe.u32 d21,d26",
- "F3 FB 55 2A", "vrecpe.f32 d21,d26",
- "F3 FB 64 6E", "vrecpe.u32 q11,q15",
- "F3 FB 65 6E", "vrecpe.f32 q11,q15",
- "F2 49 5F BA", "vrecps.f32 d21,d25,d26",
- "F2 4C 6F FE", "vrecps.f32 q11,q14,q15",
- "F3 F0 51 2A", "vrev16.8 d21,d26",
- "F3 F0 61 6E", "vrev16.8 q11,q15",
- "F3 F0 50 AA", "vrev32.8 d21,d26",
- "F3 F4 50 AA", "vrev32.16 d21,d26",
- "F3 F0 60 EE", "vrev32.8 q11,q15",
- "F3 F4 60 EE", "vrev32.16 q11,q15",
- "F3 F0 50 2A", "vrev64.8 d21,d26",
- "F3 F4 50 2A", "vrev64.16 d21,d26",
- "F3 F8 50 2A", "vrev64.32 d21,d26",
- "F3 F0 60 6E", "vrev64.8 q11,q15",
- "F3 F4 60 6E", "vrev64.16 q11,q15",
- "F3 F8 60 6E", "vrev64.32 q11,q15",
- "F2 49 51 AA", "vrhadd.s8 d21,d25,d26",
- "F2 59 51 AA", "vrhadd.s16 d21,d25,d26",
- "F2 69 51 AA", "vrhadd.s32 d21,d25,d26",
- "F3 49 51 AA", "vrhadd.u8 d21,d25,d26",
- "F3 59 51 AA", "vrhadd.u16 d21,d25,d26",
- "F3 69 51 AA", "vrhadd.u32 d21,d25,d26",
- "F2 4C 61 EE", "vrhadd.s8 q11,q14,q15",
- "F2 5C 61 EE", "vrhadd.s16 q11,q14,q15",
- "F2 6C 61 EE", "vrhadd.s32 q11,q14,q15",
- "F3 4C 61 EE", "vrhadd.u8 q11,q14,q15",
- "F3 5C 61 EE", "vrhadd.u16 q11,q14,q15",
- "F3 6C 61 EE", "vrhadd.u32 q11,q14,q15",
- "F2 49 55 AA", "vrshl.s8 d21,d26,d25",
- "F2 59 55 AA", "vrshl.s16 d21,d26,d25",
- "F2 69 55 AA", "vrshl.s32 d21,d26,d25",
- "F2 79 55 AA", "vrshl.s64 d21,d26,d25",
- "F3 49 55 AA", "vrshl.u8 d21,d26,d25",
- "F3 59 55 AA", "vrshl.u16 d21,d26,d25",
- "F3 69 55 AA", "vrshl.u32 d21,d26,d25",
- "F3 79 55 AA", "vrshl.u64 d21,d26,d25",
- "F2 4C 65 EE", "vrshl.s8 q11,q15,q14",
- "F2 5C 65 EE", "vrshl.s16 q11,q15,q14",
- "F2 6C 65 EE", "vrshl.s32 q11,q15,q14",
- "F2 7C 65 EE", "vrshl.s64 q11,q15,q14",
- "F3 4C 65 EE", "vrshl.u8 q11,q15,q14",
- "F3 5C 65 EE", "vrshl.u16 q11,q15,q14",
- "F3 6C 65 EE", "vrshl.u32 q11,q15,q14",
- "F3 7C 65 EE", "vrshl.u64 q11,q15,q14",
- "F2 CF 52 3A", "vrshr.s8 d21,d26,#1",
- "F2 C8 52 3A", "vrshr.s8 d21,d26,#8",
- "F3 CF 52 3A", "vrshr.u8 d21,d26,#1",
- "F3 C8 52 3A", "vrshr.u8 d21,d26,#8",
- "F2 DF 52 3A", "vrshr.s16 d21,d26,#1",
- "F2 D0 52 3A", "vrshr.s16 d21,d26,#16",
- "F3 DF 52 3A", "vrshr.u16 d21,d26,#1",
- "F3 D0 52 3A", "vrshr.u16 d21,d26,#16",
- "F2 FF 52 3A", "vrshr.s32 d21,d26,#1",
- "F2 E0 52 3A", "vrshr.s32 d21,d26,#32",
- "F3 FF 52 3A", "vrshr.u32 d21,d26,#1",
- "F3 E0 52 3A", "vrshr.u32 d21,d26,#32",
- "F2 FF 52 BA", "vrshr.s64 d21,d26,#1",
- "F2 C0 52 BA", "vrshr.s64 d21,d26,#64",
- "F3 FF 52 BA", "vrshr.u64 d21,d26,#1",
- "F3 C0 52 BA", "vrshr.u64 d21,d26,#64",
- "F2 CF 62 7E", "vrshr.s8 q11,q15,#1",
- "F2 C8 62 7E", "vrshr.s8 q11,q15,#8",
- "F3 CF 62 7E", "vrshr.u8 q11,q15,#1",
- "F3 C8 62 7E", "vrshr.u8 q11,q15,#8",
- "F2 DF 62 7E", "vrshr.s16 q11,q15,#1",
- "F2 D0 62 7E", "vrshr.s16 q11,q15,#16",
- "F3 DF 62 7E", "vrshr.u16 q11,q15,#1",
- "F3 D0 62 7E", "vrshr.u16 q11,q15,#16",
- "F2 FF 62 7E", "vrshr.s32 q11,q15,#1",
- "F2 E0 62 7E", "vrshr.s32 q11,q15,#32",
- "F3 FF 62 7E", "vrshr.u32 q11,q15,#1",
- "F3 E0 62 7E", "vrshr.u32 q11,q15,#32",
- "F2 FF 62 FE", "vrshr.s64 q11,q15,#1",
- "F2 C0 62 FE", "vrshr.s64 q11,q15,#64",
- "F3 FF 62 FE", "vrshr.u64 q11,q15,#1",
- "F3 C0 62 FE", "vrshr.u64 q11,q15,#64",
- "F2 CF 58 7E", "vrshrn.i16 d21,q15,#1",
- "F2 C8 58 7E", "vrshrn.i16 d21,q15,#8",
- "F2 DF 58 7E", "vrshrn.i32 d21,q15,#1",
- "F2 D0 58 7E", "vrshrn.i32 d21,q15,#16",
- "F2 FF 58 7E", "vrshrn.i64 d21,q15,#1",
- "F2 E0 58 7E", "vrshrn.i64 d21,q15,#32",
- "F3 FB 54 AA", "vrsqrte.u32 d21,d26",
- "F3 FB 55 AA", "vrsqrte.f32 d21,d26",
- "F3 FB 64 EE", "vrsqrte.u32 q11,q15",
- "F3 FB 65 EE", "vrsqrte.f32 q11,q15",
- "F2 69 5F BA", "vrsqrts.f32 d21,d25,d26",
- "F2 6C 6F FE", "vrsqrts.f32 q11,q14,q15",
- "F2 CF 53 3A", "vrsra.s8 d21,d26,#1",
- "F2 C8 53 3A", "vrsra.s8 d21,d26,#8",
- "F3 CF 53 3A", "vrsra.u8 d21,d26,#1",
- "F3 C8 53 3A", "vrsra.u8 d21,d26,#8",
- "F2 DF 53 3A", "vrsra.s16 d21,d26,#1",
- "F2 D0 53 3A", "vrsra.s16 d21,d26,#16",
- "F3 DF 53 3A", "vrsra.u16 d21,d26,#1",
- "F3 D0 53 3A", "vrsra.u16 d21,d26,#16",
- "F2 FF 53 3A", "vrsra.s32 d21,d26,#1",
- "F2 E0 53 3A", "vrsra.s32 d21,d26,#32",
- "F3 FF 53 3A", "vrsra.u32 d21,d26,#1",
- "F3 E0 53 3A", "vrsra.u32 d21,d26,#32",
- "F2 FF 53 BA", "vrsra.s64 d21,d26,#1",
- "F2 C0 53 BA", "vrsra.s64 d21,d26,#64",
- "F3 FF 53 BA", "vrsra.u64 d21,d26,#1",
- "F3 C0 53 BA", "vrsra.u64 d21,d26,#64",
- "F2 CF 63 7E", "vrsra.s8 q11,q15,#1",
- "F2 C8 63 7E", "vrsra.s8 q11,q15,#8",
- "F3 CF 63 7E", "vrsra.u8 q11,q15,#1",
- "F3 C8 63 7E", "vrsra.u8 q11,q15,#8",
- "F2 DF 63 7E", "vrsra.s16 q11,q15,#1",
- "F2 D0 63 7E", "vrsra.s16 q11,q15,#16",
- "F3 DF 63 7E", "vrsra.u16 q11,q15,#1",
- "F3 D0 63 7E", "vrsra.u16 q11,q15,#16",
- "F2 FF 63 7E", "vrsra.s32 q11,q15,#1",
- "F2 E0 63 7E", "vrsra.s32 q11,q15,#32",
- "F3 FF 63 7E", "vrsra.u32 q11,q15,#1",
- "F3 E0 63 7E", "vrsra.u32 q11,q15,#32",
- "F2 FF 63 FE", "vrsra.s64 q11,q15,#1",
- "F2 C0 63 FE", "vrsra.s64 q11,q15,#64",
- "F3 FF 63 FE", "vrsra.u64 q11,q15,#1",
- "F3 C0 63 FE", "vrsra.u64 q11,q15,#64",
- "F3 CC 56 AE", "vrsubhn.i16 d21,q14,q15",
- "F3 DC 56 AE", "vrsubhn.i32 d21,q14,q15",
- "F3 EC 56 AE", "vrsubhn.i64 d21,q14,q15",
- "F2 C8 55 3A", "vshl.i8 d21,d26,#0",
- "F2 CF 55 3A", "vshl.i8 d21,d26,#7",
- "F2 D0 55 3A", "vshl.i16 d21,d26,#0",
- "F2 DF 55 3A", "vshl.i16 d21,d26,#15",
- "F2 E0 55 3A", "vshl.i32 d21,d26,#0",
- "F2 FF 55 3A", "vshl.i32 d21,d26,#31",
- "F2 C0 55 BA", "vshl.i64 d21,d26,#0",
- "F2 FF 55 BA", "vshl.i64 d21,d26,#63",
- "F2 C8 65 7E", "vshl.i8 q11,q15,#0",
- "F2 CF 65 7E", "vshl.i8 q11,q15,#7",
- "F2 D0 65 7E", "vshl.i16 q11,q15,#0",
- "F2 DF 65 7E", "vshl.i16 q11,q15,#15",
- "F2 E0 65 7E", "vshl.i32 q11,q15,#0",
- "F2 FF 65 7E", "vshl.i32 q11,q15,#31",
- "F2 C0 65 FE", "vshl.i64 q11,q15,#0",
- "F2 FF 65 FE", "vshl.i64 q11,q15,#63",
- "F2 49 54 AA", "vshl.s8 d21,d26,d25",
- "F2 59 54 AA", "vshl.s16 d21,d26,d25",
- "F2 69 54 AA", "vshl.s32 d21,d26,d25",
- "F2 79 54 AA", "vshl.s64 d21,d26,d25",
- "F3 49 54 AA", "vshl.u8 d21,d26,d25",
- "F3 59 54 AA", "vshl.u16 d21,d26,d25",
- "F3 69 54 AA", "vshl.u32 d21,d26,d25",
- "F3 79 54 AA", "vshl.u64 d21,d26,d25",
- "F2 4C 64 EE", "vshl.s8 q11,q15,q14",
- "F2 5C 64 EE", "vshl.s16 q11,q15,q14",
- "F2 6C 64 EE", "vshl.s32 q11,q15,q14",
- "F2 7C 64 EE", "vshl.s64 q11,q15,q14",
- "F3 4C 64 EE", "vshl.u8 q11,q15,q14",
- "F3 5C 64 EE", "vshl.u16 q11,q15,q14",
- "F3 6C 64 EE", "vshl.u32 q11,q15,q14",
- "F3 7C 64 EE", "vshl.u64 q11,q15,q14",
- "F2 C9 6A 3A", "vshll.s8 q11,d26,#1",
- "F2 CF 6A 3A", "vshll.s8 q11,d26,#7",
- "F3 C9 6A 3A", "vshll.u8 q11,d26,#1",
- "F3 CF 6A 3A", "vshll.u8 q11,d26,#7",
- "F2 D1 6A 3A", "vshll.s16 q11,d26,#1",
- "F2 DF 6A 3A", "vshll.s16 q11,d26,#15",
- "F3 D1 6A 3A", "vshll.u16 q11,d26,#1",
- "F3 DF 6A 3A", "vshll.u16 q11,d26,#15",
- "F2 E1 6A 3A", "vshll.s32 q11,d26,#1",
- "F2 FF 6A 3A", "vshll.s32 q11,d26,#31",
- "F3 E1 6A 3A", "vshll.u32 q11,d26,#1",
- "F3 FF 6A 3A", "vshll.u32 q11,d26,#31",
- "F3 F2 63 2A", "vshll.i8 q11,d26,#8",
- "F3 F6 63 2A", "vshll.i16 q11,d26,#16",
- "F3 FA 63 2A", "vshll.i32 q11,d26,#32",
- "F2 CF 50 3A", "vshr.s8 d21,d26,#1",
- "F2 C8 50 3A", "vshr.s8 d21,d26,#8",
- "F3 CF 50 3A", "vshr.u8 d21,d26,#1",
- "F3 C8 50 3A", "vshr.u8 d21,d26,#8",
- "F2 DF 50 3A", "vshr.s16 d21,d26,#1",
- "F2 D0 50 3A", "vshr.s16 d21,d26,#16",
- "F3 DF 50 3A", "vshr.u16 d21,d26,#1",
- "F3 D0 50 3A", "vshr.u16 d21,d26,#16",
- "F2 FF 50 3A", "vshr.s32 d21,d26,#1",
- "F2 E0 50 3A", "vshr.s32 d21,d26,#32",
- "F3 FF 50 3A", "vshr.u32 d21,d26,#1",
- "F3 E0 50 3A", "vshr.u32 d21,d26,#32",
- "F2 FF 50 BA", "vshr.s64 d21,d26,#1",
- "F2 C0 50 BA", "vshr.s64 d21,d26,#64",
- "F3 FF 50 BA", "vshr.u64 d21,d26,#1",
- "F3 C0 50 BA", "vshr.u64 d21,d26,#64",
- "F2 CF 60 7E", "vshr.s8 q11,q15,#1",
- "F2 C8 60 7E", "vshr.s8 q11,q15,#8",
- "F3 CF 60 7E", "vshr.u8 q11,q15,#1",
- "F3 C8 60 7E", "vshr.u8 q11,q15,#8",
- "F2 DF 60 7E", "vshr.s16 q11,q15,#1",
- "F2 D0 60 7E", "vshr.s16 q11,q15,#16",
- "F3 DF 60 7E", "vshr.u16 q11,q15,#1",
- "F3 D0 60 7E", "vshr.u16 q11,q15,#16",
- "F2 FF 60 7E", "vshr.s32 q11,q15,#1",
- "F2 E0 60 7E", "vshr.s32 q11,q15,#32",
- "F3 FF 60 7E", "vshr.u32 q11,q15,#1",
- "F3 E0 60 7E", "vshr.u32 q11,q15,#32",
- "F2 FF 60 FE", "vshr.s64 q11,q15,#1",
- "F2 C0 60 FE", "vshr.s64 q11,q15,#64",
- "F3 FF 60 FE", "vshr.u64 q11,q15,#1",
- "F3 C0 60 FE", "vshr.u64 q11,q15,#64",
- "F2 CF 58 3E", "vshrn.i16 d21,q15,#1",
- "F2 C8 58 3E", "vshrn.i16 d21,q15,#8",
- "F2 DF 58 3E", "vshrn.i32 d21,q15,#1",
- "F2 D0 58 3E", "vshrn.i32 d21,q15,#16",
- "F2 FF 58 3E", "vshrn.i64 d21,q15,#1",
- "F2 E0 58 3E", "vshrn.i64 d21,q15,#32",
- "F3 C8 55 3A", "vsli.8 d21,d26,#0",
- "F3 CF 55 3A", "vsli.8 d21,d26,#7",
- "F3 D0 55 3A", "vsli.16 d21,d26,#0",
- "F3 DF 55 3A", "vsli.16 d21,d26,#15",
- "F3 E0 55 3A", "vsli.32 d21,d26,#0",
- "F3 FF 55 3A", "vsli.32 d21,d26,#31",
- "F3 C0 55 BA", "vsli.64 d21,d26,#0",
- "F3 FF 55 BA", "vsli.64 d21,d26,#63",
- "F3 C8 65 7E", "vsli.8 q11,q15,#0",
- "F3 CF 65 7E", "vsli.8 q11,q15,#7",
- "F3 D0 65 7E", "vsli.16 q11,q15,#0",
- "F3 DF 65 7E", "vsli.16 q11,q15,#15",
- "F3 E0 65 7E", "vsli.32 q11,q15,#0",
- "F3 FF 65 7E", "vsli.32 q11,q15,#31",
- "F3 C0 65 FE", "vsli.64 q11,q15,#0",
- "F3 FF 65 FE", "vsli.64 q11,q15,#63",
- "0E F1 AA CD", "vsqrteq.f32 s21,s26",
- "EE F1 5B EA", "vsqrt.f64 d21,d26",
- "F2 CF 51 3A", "vsra.s8 d21,d26,#1",
- "F2 C8 51 3A", "vsra.s8 d21,d26,#8",
- "F3 CF 51 3A", "vsra.u8 d21,d26,#1",
- "F3 C8 51 3A", "vsra.u8 d21,d26,#8",
- "F2 DF 51 3A", "vsra.s16 d21,d26,#1",
- "F2 D0 51 3A", "vsra.s16 d21,d26,#16",
- "F3 DF 51 3A", "vsra.u16 d21,d26,#1",
- "F3 D0 51 3A", "vsra.u16 d21,d26,#16",
- "F2 FF 51 3A", "vsra.s32 d21,d26,#1",
- "F2 E0 51 3A", "vsra.s32 d21,d26,#32",
- "F3 FF 51 3A", "vsra.u32 d21,d26,#1",
- "F3 E0 51 3A", "vsra.u32 d21,d26,#32",
- "F2 FF 51 BA", "vsra.s64 d21,d26,#1",
- "F2 C0 51 BA", "vsra.s64 d21,d26,#64",
- "F3 FF 51 BA", "vsra.u64 d21,d26,#1",
- "F3 C0 51 BA", "vsra.u64 d21,d26,#64",
- "F2 CF 61 7E", "vsra.s8 q11,q15,#1",
- "F2 C8 61 7E", "vsra.s8 q11,q15,#8",
- "F3 CF 61 7E", "vsra.u8 q11,q15,#1",
- "F3 C8 61 7E", "vsra.u8 q11,q15,#8",
- "F2 DF 61 7E", "vsra.s16 q11,q15,#1",
- "F2 D0 61 7E", "vsra.s16 q11,q15,#16",
- "F3 DF 61 7E", "vsra.u16 q11,q15,#1",
- "F3 D0 61 7E", "vsra.u16 q11,q15,#16",
- "F2 FF 61 7E", "vsra.s32 q11,q15,#1",
- "F2 E0 61 7E", "vsra.s32 q11,q15,#32",
- "F3 FF 61 7E", "vsra.u32 q11,q15,#1",
- "F3 E0 61 7E", "vsra.u32 q11,q15,#32",
- "F2 FF 61 FE", "vsra.s64 q11,q15,#1",
- "F2 C0 61 FE", "vsra.s64 q11,q15,#64",
- "F3 FF 61 FE", "vsra.u64 q11,q15,#1",
- "F3 C0 61 FE", "vsra.u64 q11,q15,#64",
- "F3 CF 54 3A", "vsri.8 d21,d26,#1",
- "F3 C8 54 3A", "vsri.8 d21,d26,#8",
- "F3 DF 54 3A", "vsri.16 d21,d26,#1",
- "F3 D0 54 3A", "vsri.16 d21,d26,#16",
- "F3 FF 54 3A", "vsri.32 d21,d26,#1",
- "F3 E0 54 3A", "vsri.32 d21,d26,#32",
- "F3 FF 54 BA", "vsri.64 d21,d26,#1",
- "F3 C0 54 BA", "vsri.64 d21,d26,#64",
- "F3 CF 64 7E", "vsri.8 q11,q15,#1",
- "F3 C8 64 7E", "vsri.8 q11,q15,#8",
- "F3 DF 64 7E", "vsri.16 q11,q15,#1",
- "F3 D0 64 7E", "vsri.16 q11,q15,#16",
- "F3 FF 64 7E", "vsri.32 q11,q15,#1",
- "F3 E0 64 7E", "vsri.32 q11,q15,#32",
- "F3 FF 64 FE", "vsri.64 q11,q15,#1",
- "F3 C0 64 FE", "vsri.64 q11,q15,#64",
- "F4 4A B7 0F", "vst1.8 {d27},[r10]",
- "F4 4A BA 0F", "vst1.8 {d27,d28},[r10]",
- "F4 4A B6 0F", "vst1.8 {d27,d28,d29},[r10]",
- "F4 4A B2 0F", "vst1.8 {d27,d28,d29,d30},[r10]",
- "F4 4A B7 4F", "vst1.16 {d27},[r10]",
- "F4 4A BA 4F", "vst1.16 {d27,d28},[r10]",
- "F4 4A B6 4F", "vst1.16 {d27,d28,d29},[r10]",
- "F4 4A B2 4F", "vst1.16 {d27,d28,d29,d30},[r10]",
- "F4 4A B7 8F", "vst1.32 {d27},[r10]",
- "F4 4A BA 8F", "vst1.32 {d27,d28},[r10]",
- "F4 4A B6 8F", "vst1.32 {d27,d28,d29},[r10]",
- "F4 4A B2 8F", "vst1.32 {d27,d28,d29,d30},[r10]",
- "F4 4A B7 CF", "vst1.64 {d27},[r10]",
- "F4 4A BA CF", "vst1.64 {d27,d28},[r10]",
- "F4 4A B6 CF", "vst1.64 {d27,d28,d29},[r10]",
- "F4 4A B2 CF", "vst1.64 {d27,d28,d29,d30},[r10]",
- "F4 4A B7 1F", "vst1.8 {d27},[r10@64]",
- "F4 4A BA 1F", "vst1.8 {d27,d28},[r10@64]",
- "F4 4A BA 2F", "vst1.8 {d27,d28},[r10@128]",
- "F4 4A B6 1F", "vst1.8 {d27,d28,d29},[r10@64]",
- "F4 4A B2 1F", "vst1.8 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B2 2F", "vst1.8 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B2 3F", "vst1.8 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B7 5F", "vst1.16 {d27},[r10@64]",
- "F4 4A BA 5F", "vst1.16 {d27,d28},[r10@64]",
- "F4 4A BA 6F", "vst1.16 {d27,d28},[r10@128]",
- "F4 4A B6 5F", "vst1.16 {d27,d28,d29},[r10@64]",
- "F4 4A B2 5F", "vst1.16 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B2 6F", "vst1.16 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B2 7F", "vst1.16 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B7 9F", "vst1.32 {d27},[r10@64]",
- "F4 4A BA 9F", "vst1.32 {d27,d28},[r10@64]",
- "F4 4A BA AF", "vst1.32 {d27,d28},[r10@128]",
- "F4 4A B6 9F", "vst1.32 {d27,d28,d29},[r10@64]",
- "F4 4A B2 9F", "vst1.32 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B2 AF", "vst1.32 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B2 BF", "vst1.32 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B7 DF", "vst1.64 {d27},[r10@64]",
- "F4 4A BA DF", "vst1.64 {d27,d28},[r10@64]",
- "F4 4A BA EF", "vst1.64 {d27,d28},[r10@128]",
- "F4 4A B6 DF", "vst1.64 {d27,d28,d29},[r10@64]",
- "F4 4A B2 DF", "vst1.64 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B2 EF", "vst1.64 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B2 FF", "vst1.64 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B7 0D", "vst1.8 {d27},[r10]!",
- "F4 4A BA 0D", "vst1.8 {d27,d28},[r10]!",
- "F4 4A B6 0D", "vst1.8 {d27,d28,d29},[r10]!",
- "F4 4A B2 0D", "vst1.8 {d27,d28,d29,d30},[r10]!",
- "F4 4A B7 4D", "vst1.16 {d27},[r10]!",
- "F4 4A BA 4D", "vst1.16 {d27,d28},[r10]!",
- "F4 4A B6 4D", "vst1.16 {d27,d28,d29},[r10]!",
- "F4 4A B2 4D", "vst1.16 {d27,d28,d29,d30},[r10]!",
- "F4 4A B7 8D", "vst1.32 {d27},[r10]!",
- "F4 4A BA 8D", "vst1.32 {d27,d28},[r10]!",
- "F4 4A B6 8D", "vst1.32 {d27,d28,d29},[r10]!",
- "F4 4A B2 8D", "vst1.32 {d27,d28,d29,d30},[r10]!",
- "F4 4A B7 CD", "vst1.64 {d27},[r10]!",
- "F4 4A BA CD", "vst1.64 {d27,d28},[r10]!",
- "F4 4A B6 CD", "vst1.64 {d27,d28,d29},[r10]!",
- "F4 4A B2 CD", "vst1.64 {d27,d28,d29,d30},[r10]!",
- "F4 4A B7 1D", "vst1.8 {d27},[r10@64]!",
- "F4 4A BA 1D", "vst1.8 {d27,d28},[r10@64]!",
- "F4 4A BA 2D", "vst1.8 {d27,d28},[r10@128]!",
- "F4 4A B6 1D", "vst1.8 {d27,d28,d29},[r10@64]!",
- "F4 4A B2 1D", "vst1.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B2 2D", "vst1.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B2 3D", "vst1.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B7 5D", "vst1.16 {d27},[r10@64]!",
- "F4 4A BA 5D", "vst1.16 {d27,d28},[r10@64]!",
- "F4 4A BA 6D", "vst1.16 {d27,d28},[r10@128]!",
- "F4 4A B6 5D", "vst1.16 {d27,d28,d29},[r10@64]!",
- "F4 4A B2 5D", "vst1.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B2 6D", "vst1.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B2 7D", "vst1.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B7 9D", "vst1.32 {d27},[r10@64]!",
- "F4 4A BA 9D", "vst1.32 {d27,d28},[r10@64]!",
- "F4 4A BA AD", "vst1.32 {d27,d28},[r10@128]!",
- "F4 4A B6 9D", "vst1.32 {d27,d28,d29},[r10@64]!",
- "F4 4A B2 9D", "vst1.32 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B2 AD", "vst1.32 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B2 BD", "vst1.32 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B7 DD", "vst1.64 {d27},[r10@64]!",
- "F4 4A BA DD", "vst1.64 {d27,d28},[r10@64]!",
- "F4 4A BA ED", "vst1.64 {d27,d28},[r10@128]!",
- "F4 4A B6 DD", "vst1.64 {d27,d28,d29},[r10@64]!",
- "F4 4A B2 DD", "vst1.64 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B2 ED", "vst1.64 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B2 FD", "vst1.64 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B7 09", "vst1.8 {d27},[r10],r9",
- "F4 4A BA 09", "vst1.8 {d27,d28},[r10],r9",
- "F4 4A B6 09", "vst1.8 {d27,d28,d29},[r10],r9",
- "F4 4A B2 09", "vst1.8 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B7 49", "vst1.16 {d27},[r10],r9",
- "F4 4A BA 49", "vst1.16 {d27,d28},[r10],r9",
- "F4 4A B6 49", "vst1.16 {d27,d28,d29},[r10],r9",
- "F4 4A B2 49", "vst1.16 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B7 89", "vst1.32 {d27},[r10],r9",
- "F4 4A BA 89", "vst1.32 {d27,d28},[r10],r9",
- "F4 4A B6 89", "vst1.32 {d27,d28,d29},[r10],r9",
- "F4 4A B2 89", "vst1.32 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B7 C9", "vst1.64 {d27},[r10],r9",
- "F4 4A BA C9", "vst1.64 {d27,d28},[r10],r9",
- "F4 4A B6 C9", "vst1.64 {d27,d28,d29},[r10],r9",
- "F4 4A B2 C9", "vst1.64 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B7 19", "vst1.8 {d27},[r10@64],r9",
- "F4 4A BA 19", "vst1.8 {d27,d28},[r10@64],r9",
- "F4 4A BA 29", "vst1.8 {d27,d28},[r10@128],r9",
- "F4 4A B6 19", "vst1.8 {d27,d28,d29},[r10@64],r9",
- "F4 4A B2 19", "vst1.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B2 29", "vst1.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B2 39", "vst1.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A B7 59", "vst1.16 {d27},[r10@64],r9",
- "F4 4A BA 59", "vst1.16 {d27,d28},[r10@64],r9",
- "F4 4A BA 69", "vst1.16 {d27,d28},[r10@128],r9",
- "F4 4A B6 59", "vst1.16 {d27,d28,d29},[r10@64],r9",
- "F4 4A B2 59", "vst1.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B2 69", "vst1.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B2 79", "vst1.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A B7 99", "vst1.32 {d27},[r10@64],r9",
- "F4 4A BA 99", "vst1.32 {d27,d28},[r10@64],r9",
- "F4 4A BA A9", "vst1.32 {d27,d28},[r10@128],r9",
- "F4 4A B6 99", "vst1.32 {d27,d28,d29},[r10@64],r9",
- "F4 4A B2 99", "vst1.32 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B2 A9", "vst1.32 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B2 B9", "vst1.32 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A B7 D9", "vst1.64 {d27},[r10@64],r9",
- "F4 4A BA D9", "vst1.64 {d27,d28},[r10@64],r9",
- "F4 4A BA E9", "vst1.64 {d27,d28},[r10@128],r9",
- "F4 4A B6 D9", "vst1.64 {d27,d28,d29},[r10@64],r9",
- "F4 4A B2 D9", "vst1.64 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B2 E9", "vst1.64 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B2 F9", "vst1.64 {d27,d28,d29,d30},[r10@256],r9",
- "F4 CA B0 2F", "vst1.8 {d27[1]},[r10]",
- "F4 CA B4 4F", "vst1.16 {d27[1]},[r10]",
- "F4 CA B8 8F", "vst1.32 {d27[1]},[r10]",
- "F4 CA B4 5F", "vst1.16 {d27[1]},[r10@16]",
- "F4 CA B8 BF", "vst1.32 {d27[1]},[r10@32]",
- "F4 CA B0 2D", "vst1.8 {d27[1]},[r10]!",
- "F4 CA B4 4D", "vst1.16 {d27[1]},[r10]!",
- "F4 CA B8 8D", "vst1.32 {d27[1]},[r10]!",
- "F4 CA B4 5D", "vst1.16 {d27[1]},[r10@16]!",
- "F4 CA B8 BD", "vst1.32 {d27[1]},[r10@32]!",
- "F4 CA B0 29", "vst1.8 {d27[1]},[r10],r9",
- "F4 CA B4 49", "vst1.16 {d27[1]},[r10],r9",
- "F4 CA B8 89", "vst1.32 {d27[1]},[r10],r9",
- "F4 CA B4 59", "vst1.16 {d27[1]},[r10@16],r9",
- "F4 CA B8 B9", "vst1.32 {d27[1]},[r10@32],r9",
- "F4 4A B8 0F", "vst2.8 {d27,d28},[r10]",
- "F4 4A B9 0F", "vst2.8 {d27,d29},[r10]",
- "F4 4A B3 0F", "vst2.8 {d27,d28,d29,d30},[r10]",
- "F4 4A B8 4F", "vst2.16 {d27,d28},[r10]",
- "F4 4A B9 4F", "vst2.16 {d27,d29},[r10]",
- "F4 4A B3 4F", "vst2.16 {d27,d28,d29,d30},[r10]",
- "F4 4A B8 1F", "vst2.8 {d27,d28},[r10@64]",
- "F4 4A B8 2F", "vst2.8 {d27,d28},[r10@128]",
- "F4 4A B9 1F", "vst2.8 {d27,d29},[r10@64]",
- "F4 4A B9 2F", "vst2.8 {d27,d29},[r10@128]",
- "F4 4A B3 1F", "vst2.8 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B3 2F", "vst2.8 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B3 3F", "vst2.8 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B8 5F", "vst2.16 {d27,d28},[r10@64]",
- "F4 4A B8 6F", "vst2.16 {d27,d28},[r10@128]",
- "F4 4A B9 5F", "vst2.16 {d27,d29},[r10@64]",
- "F4 4A B9 6F", "vst2.16 {d27,d29},[r10@128]",
- "F4 4A B3 5F", "vst2.16 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B3 6F", "vst2.16 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B3 7F", "vst2.16 {d27,d28,d29,d30},[r10@256]",
- "F4 4A B8 0D", "vst2.8 {d27,d28},[r10]!",
- "F4 4A B9 0D", "vst2.8 {d27,d29},[r10]!",
- "F4 4A B3 0D", "vst2.8 {d27,d28,d29,d30},[r10]!",
- "F4 4A B8 4D", "vst2.16 {d27,d28},[r10]!",
- "F4 4A B9 4D", "vst2.16 {d27,d29},[r10]!",
- "F4 4A B3 4D", "vst2.16 {d27,d28,d29,d30},[r10]!",
- "F4 4A B8 1D", "vst2.8 {d27,d28},[r10@64]!",
- "F4 4A B8 2D", "vst2.8 {d27,d28},[r10@128]!",
- "F4 4A B9 1D", "vst2.8 {d27,d29},[r10@64]!",
- "F4 4A B9 2D", "vst2.8 {d27,d29},[r10@128]!",
- "F4 4A B3 1D", "vst2.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B3 2D", "vst2.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B3 3D", "vst2.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B8 5D", "vst2.16 {d27,d28},[r10@64]!",
- "F4 4A B8 6D", "vst2.16 {d27,d28},[r10@128]!",
- "F4 4A B9 5D", "vst2.16 {d27,d29},[r10@64]!",
- "F4 4A B9 6D", "vst2.16 {d27,d29},[r10@128]!",
- "F4 4A B3 5D", "vst2.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B3 6D", "vst2.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B3 7D", "vst2.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A B8 09", "vst2.8 {d27,d28},[r10],r9",
- "F4 4A B9 09", "vst2.8 {d27,d29},[r10],r9",
- "F4 4A B3 09", "vst2.8 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B8 49", "vst2.16 {d27,d28},[r10],r9",
- "F4 4A B9 49", "vst2.16 {d27,d29},[r10],r9",
- "F4 4A B3 49", "vst2.16 {d27,d28,d29,d30},[r10],r9",
- "F4 4A B8 19", "vst2.8 {d27,d28},[r10@64],r9",
- "F4 4A B8 29", "vst2.8 {d27,d28},[r10@128],r9",
- "F4 4A B9 19", "vst2.8 {d27,d29},[r10@64],r9",
- "F4 4A B9 29", "vst2.8 {d27,d29},[r10@128],r9",
- "F4 4A B3 19", "vst2.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B3 29", "vst2.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B3 39", "vst2.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A B8 59", "vst2.16 {d27,d28},[r10@64],r9",
- "F4 4A B8 69", "vst2.16 {d27,d28},[r10@128],r9",
- "F4 4A B9 59", "vst2.16 {d27,d29},[r10@64],r9",
- "F4 4A B9 69", "vst2.16 {d27,d29},[r10@128],r9",
- "F4 4A B3 59", "vst2.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B3 69", "vst2.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B3 79", "vst2.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 CA B1 2F", "vst2.8 {d27[1],d28[1]},[r10]",
- "F4 CA B5 4F", "vst2.16 {d27[1],d28[1]},[r10]",
- "F4 CA B5 6F", "vst2.16 {d27[1],d29[1]},[r10]",
- "F4 CA B9 8F", "vst2.32 {d27[1],d28[1]},[r10]",
- "F4 CA B9 CF", "vst2.32 {d27[1],d29[1]},[r10]",
- "F4 CA B1 3F", "vst2.8 {d27[1],d28[1]},[r10@16]",
- "F4 CA B5 5F", "vst2.16 {d27[1],d28[1]},[r10@32]",
- "F4 CA B5 7F", "vst2.16 {d27[1],d29[1]},[r10@32]",
- "F4 CA B9 9F", "vst2.32 {d27[1],d28[1]},[r10@64]",
- "F4 CA B9 DF", "vst2.32 {d27[1],d29[1]},[r10@64]",
- "F4 CA B1 2D", "vst2.8 {d27[1],d28[1]},[r10]!",
- "F4 CA B5 4D", "vst2.16 {d27[1],d28[1]},[r10]!",
- "F4 CA B5 6D", "vst2.16 {d27[1],d29[1]},[r10]!",
- "F4 CA B9 8D", "vst2.32 {d27[1],d28[1]},[r10]!",
- "F4 CA B9 CD", "vst2.32 {d27[1],d29[1]},[r10]!",
- "F4 CA B1 3D", "vst2.8 {d27[1],d28[1]},[r10@16]!",
- "F4 CA B5 5D", "vst2.16 {d27[1],d28[1]},[r10@32]!",
- "F4 CA B5 7D", "vst2.16 {d27[1],d29[1]},[r10@32]!",
- "F4 CA B9 9D", "vst2.32 {d27[1],d28[1]},[r10@64]!",
- "F4 CA B9 DD", "vst2.32 {d27[1],d29[1]},[r10@64]!",
- "F4 CA B1 29", "vst2.8 {d27[1],d28[1]},[r10],r9",
- "F4 CA B5 49", "vst2.16 {d27[1],d28[1]},[r10],r9",
- "F4 CA B5 69", "vst2.16 {d27[1],d29[1]},[r10],r9",
- "F4 CA B9 89", "vst2.32 {d27[1],d28[1]},[r10],r9",
- "F4 CA B9 C9", "vst2.32 {d27[1],d29[1]},[r10],r9",
- "F4 CA B1 39", "vst2.8 {d27[1],d28[1]},[r10@16],r9",
- "F4 CA B5 59", "vst2.16 {d27[1],d28[1]},[r10@32],r9",
- "F4 CA B5 79", "vst2.16 {d27[1],d29[1]},[r10@32],r9",
- "F4 CA B9 99", "vst2.32 {d27[1],d28[1]},[r10@64],r9",
- "F4 CA B9 D9", "vst2.32 {d27[1],d29[1]},[r10@64],r9",
- "F4 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F4 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F4 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F4 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F4 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F4 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F4 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F4 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F4 4A B0 0F", "vst4.8 {d27,d28,d29,d30},[r10]",
- "F4 4A 91 0F", "vst4.8 {d25,d27,d29,d31},[r10]",
- "F4 4A B0 4F", "vst4.16 {d27,d28,d29,d30},[r10]",
- "F4 4A 91 4F", "vst4.16 {d25,d27,d29,d31},[r10]",
- "F4 4A B0 8F", "vst4.32 {d27,d28,d29,d30},[r10]",
- "F4 4A 91 8F", "vst4.32 {d25,d27,d29,d31},[r10]",
- "F4 4A B0 1F", "vst4.8 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B0 2F", "vst4.8 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B0 3F", "vst4.8 {d27,d28,d29,d30},[r10@256]",
- "F4 4A 91 1F", "vst4.8 {d25,d27,d29,d31},[r10@64]",
- "F4 4A 91 2F", "vst4.8 {d25,d27,d29,d31},[r10@128]",
- "F4 4A 91 3F", "vst4.8 {d25,d27,d29,d31},[r10@256]",
- "F4 4A B0 5F", "vst4.16 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B0 6F", "vst4.16 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B0 7F", "vst4.16 {d27,d28,d29,d30},[r10@256]",
- "F4 4A 91 5F", "vst4.16 {d25,d27,d29,d31},[r10@64]",
- "F4 4A 91 6F", "vst4.16 {d25,d27,d29,d31},[r10@128]",
- "F4 4A 91 7F", "vst4.16 {d25,d27,d29,d31},[r10@256]",
- "F4 4A B0 9F", "vst4.32 {d27,d28,d29,d30},[r10@64]",
- "F4 4A B0 AF", "vst4.32 {d27,d28,d29,d30},[r10@128]",
- "F4 4A B0 BF", "vst4.32 {d27,d28,d29,d30},[r10@256]",
- "F4 4A 91 9F", "vst4.32 {d25,d27,d29,d31},[r10@64]",
- "F4 4A 91 AF", "vst4.32 {d25,d27,d29,d31},[r10@128]",
- "F4 4A 91 BF", "vst4.32 {d25,d27,d29,d31},[r10@256]",
- "F4 4A B0 0D", "vst4.8 {d27,d28,d29,d30},[r10]!",
- "F4 4A 91 0D", "vst4.8 {d25,d27,d29,d31},[r10]!",
- "F4 4A B0 4D", "vst4.16 {d27,d28,d29,d30},[r10]!",
- "F4 4A 91 4D", "vst4.16 {d25,d27,d29,d31},[r10]!",
- "F4 4A B0 8D", "vst4.32 {d27,d28,d29,d30},[r10]!",
- "F4 4A 91 8D", "vst4.32 {d25,d27,d29,d31},[r10]!",
- "F4 4A B0 1D", "vst4.8 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B0 2D", "vst4.8 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B0 3D", "vst4.8 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A 91 1D", "vst4.8 {d25,d27,d29,d31},[r10@64]!",
- "F4 4A 91 2D", "vst4.8 {d25,d27,d29,d31},[r10@128]!",
- "F4 4A 91 3D", "vst4.8 {d25,d27,d29,d31},[r10@256]!",
- "F4 4A B0 5D", "vst4.16 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B0 6D", "vst4.16 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B0 7D", "vst4.16 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A 91 5D", "vst4.16 {d25,d27,d29,d31},[r10@64]!",
- "F4 4A 91 6D", "vst4.16 {d25,d27,d29,d31},[r10@128]!",
- "F4 4A 91 7D", "vst4.16 {d25,d27,d29,d31},[r10@256]!",
- "F4 4A B0 9D", "vst4.32 {d27,d28,d29,d30},[r10@64]!",
- "F4 4A B0 AD", "vst4.32 {d27,d28,d29,d30},[r10@128]!",
- "F4 4A B0 BD", "vst4.32 {d27,d28,d29,d30},[r10@256]!",
- "F4 4A 91 9D", "vst4.32 {d25,d27,d29,d31},[r10@64]!",
- "F4 4A 91 AD", "vst4.32 {d25,d27,d29,d31},[r10@128]!",
- "F4 4A 91 BD", "vst4.32 {d25,d27,d29,d31},[r10@256]!",
- "F4 4A B0 09", "vst4.8 {d27,d28,d29,d30},[r10],r9",
- "F4 4A 91 09", "vst4.8 {d25,d27,d29,d31},[r10],r9",
- "F4 4A B0 49", "vst4.16 {d27,d28,d29,d30},[r10],r9",
- "F4 4A 91 49", "vst4.16 {d25,d27,d29,d31},[r10],r9",
- "F4 4A B0 89", "vst4.32 {d27,d28,d29,d30},[r10],r9",
- "F4 4A 91 89", "vst4.32 {d25,d27,d29,d31},[r10],r9",
- "F4 4A B0 19", "vst4.8 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B0 29", "vst4.8 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B0 39", "vst4.8 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A 91 19", "vst4.8 {d25,d27,d29,d31},[r10@64],r9",
- "F4 4A 91 29", "vst4.8 {d25,d27,d29,d31},[r10@128],r9",
- "F4 4A 91 39", "vst4.8 {d25,d27,d29,d31},[r10@256],r9",
- "F4 4A B0 59", "vst4.16 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B0 69", "vst4.16 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B0 79", "vst4.16 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A 91 59", "vst4.16 {d25,d27,d29,d31},[r10@64],r9",
- "F4 4A 91 69", "vst4.16 {d25,d27,d29,d31},[r10@128],r9",
- "F4 4A 91 79", "vst4.16 {d25,d27,d29,d31},[r10@256],r9",
- "F4 4A B0 99", "vst4.32 {d27,d28,d29,d30},[r10@64],r9",
- "F4 4A B0 A9", "vst4.32 {d27,d28,d29,d30},[r10@128],r9",
- "F4 4A B0 B9", "vst4.32 {d27,d28,d29,d30},[r10@256],r9",
- "F4 4A 91 99", "vst4.32 {d25,d27,d29,d31},[r10@64],r9",
- "F4 4A 91 A9", "vst4.32 {d25,d27,d29,d31},[r10@128],r9",
- "F4 4A 91 B9", "vst4.32 {d25,d27,d29,d31},[r10@256],r9",
- "F4 CA B3 2F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 CA B7 4F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 CA 97 6F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F4 CA BB 8F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F4 CA 9B CF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F4 CA B3 3F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
- "F4 CA B7 5F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F4 CA 97 7F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F4 CA BB 9F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F4 CA BB AF", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
- "F4 CA 9B DF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F4 CA 9B EF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
- "F4 CA B3 2D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 CA B7 4D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 CA 97 6D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA BB 8D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F4 CA 9B CD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F4 CA B3 3D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
- "F4 CA B7 5D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F4 CA 97 7D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F4 CA BB 9D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F4 CA BB AD", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
- "F4 CA 9B DD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F4 CA 9B ED", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
- "F4 CA B3 29", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 CA B7 49", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 CA 97 69", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F4 CA BB 89", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F4 CA 9B C9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F4 CA B3 39", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
- "F4 CA B7 59", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F4 CA 97 79", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F4 CA BB 99", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F4 CA BB A9", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
- "F4 CA 9B D9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F4 CA 9B E9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
- "0C CA BB 04", "vstmiaeq r10,{d27-d28}",
- "0C CA DA 02", "vstmiaeq r10,{s27-s28}",
- "EC EA BB 04", "vstmia r10!,{d27-d28}",
- "ED 6A BB 04", "vstmdb r10!,{d27-d28}",
- "EC EA DA 02", "vstmia r10!,{s27-s28}",
- "ED 6A DA 02", "vstmdb r10!,{s27-s28}",
- "0D 4A 5B FF", "vstreq.64 d21,[r10,#-0x3fc]",
- "ED CA 5B FF", "vstr.64 d21,[r10,#0x3fc]",
- "ED CA 5B 00", "vstr.64 d21,[r10]",
- "0D 4A AA FF", "vstreq.32 s21,[r10,#-0x3fc]",
- "ED CA AA FF", "vstr.32 s21,[r10,#0x3fc]",
- "ED CA AA 00", "vstr.32 s21,[r10]",
- "F3 49 58 AA", "vsub.i8 d21,d25,d26",
- "F3 59 58 AA", "vsub.i16 d21,d25,d26",
- "F3 69 58 AA", "vsub.i32 d21,d25,d26",
- "F3 79 58 AA", "vsub.i64 d21,d25,d26",
- "F3 4C 68 EE", "vsub.i8 q11,q14,q15",
- "F3 5C 68 EE", "vsub.i16 q11,q14,q15",
- "F3 6C 68 EE", "vsub.i32 q11,q14,q15",
- "F3 7C 68 EE", "vsub.i64 q11,q14,q15",
- "F2 69 5D AA", "vsub.f32 d21,d25,d26",
- "F2 6C 6D EE", "vsub.f32 q11,q14,q15",
- "0E 7C AA CD", "vsubeq.f32 s21,s25,s26",
- "EE 79 5B EA", "vsub.f64 d21,d25,d26",
- "F2 CC 56 AE", "vsubhn.i16 d21,q14,q15",
- "F2 DC 56 AE", "vsubhn.i32 d21,q14,q15",
- "F2 EC 56 AE", "vsubhn.i64 d21,q14,q15",
- "F2 C9 62 AA", "vsubl.s8 q11,d25,d26",
- "F2 D9 62 AA", "vsubl.s16 q11,d25,d26",
- "F2 E9 62 AA", "vsubl.s32 q11,d25,d26",
- "F3 C9 62 AA", "vsubl.u8 q11,d25,d26",
- "F3 D9 62 AA", "vsubl.u16 q11,d25,d26",
- "F3 E9 62 AA", "vsubl.u32 q11,d25,d26",
- "F2 CC 63 AA", "vsubw.s8 q11,q14,d26",
- "F2 DC 63 AA", "vsubw.s16 q11,q14,d26",
- "F2 EC 63 AA", "vsubw.s32 q11,q14,d26",
- "F3 CC 63 AA", "vsubw.u8 q11,q14,d26",
- "F3 DC 63 AA", "vsubw.u16 q11,q14,d26",
- "F3 EC 63 AA", "vsubw.u32 q11,q14,d26",
- "F3 F2 50 2A", "vswp d21,d26",
- "F3 F2 60 6E", "vswp q11,q15",
- "F3 FB 58 AA", "vtbl.8 d21,{d27},d26",
- "F3 FB 59 AA", "vtbl.8 d21,{d27,d28},d26",
- "F3 FB 5A AA", "vtbl.8 d21,{d27,d28,d29},d26",
- "F3 FB 5B AA", "vtbl.8 d21,{d27,d28,d29,d30},d26",
- "F3 FB 58 EA", "vtbx.8 d21,{d27},d26",
- "F3 FB 59 EA", "vtbx.8 d21,{d27,d28},d26",
- "F3 FB 5A EA", "vtbx.8 d21,{d27,d28,d29},d26",
- "F3 FB 5B EA", "vtbx.8 d21,{d27,d28,d29,d30},d26",
- "F3 F2 50 AA", "vtrn.8 d21,d26",
- "F3 F6 50 AA", "vtrn.16 d21,d26",
- "F3 FA 50 AA", "vtrn.32 d21,d26",
- "F3 F2 60 EE", "vtrn.8 q11,q15",
- "F3 F6 60 EE", "vtrn.16 q11,q15",
- "F3 FA 60 EE", "vtrn.32 q11,q15",
- "F2 49 58 BA", "vtst.8 d21,d25,d26",
- "F2 59 58 BA", "vtst.16 d21,d25,d26",
- "F2 69 58 BA", "vtst.32 d21,d25,d26",
- "F2 4C 68 FE", "vtst.8 q11,q14,q15",
- "F2 5C 68 FE", "vtst.16 q11,q14,q15",
- "F2 6C 68 FE", "vtst.32 q11,q14,q15",
- "F3 F2 51 2A", "vuzp.8 d21,d26",
- "F3 F6 51 2A", "vuzp.16 d21,d26",
- "F3 F2 61 6E", "vuzp.8 q11,q15",
- "F3 F6 61 6E", "vuzp.16 q11,q15",
- "F3 FA 61 6E", "vuzp.32 q11,q15",
- "F3 F2 51 AA", "vzip.8 d21,d26",
- "F3 F6 51 AA", "vzip.16 d21,d26",
- "F3 F2 61 EE", "vzip.8 q11,q15",
- "F3 F6 61 EE", "vzip.16 q11,q15",
- "F3 FA 61 EE", "vzip.32 q11,q15",
- };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM condition code.
- */
- @Test
- public void testArmConditionCode() {
-
- System.out.println("\n================ ARM Condition Code ================\n");
- String[] insts = {
- "00 A1 00 02", "adceq r0,r1,r2",
- "10 A1 00 02", "adcne r0,r1,r2",
- "20 A1 00 02", "adccs r0,r1,r2",
- "30 A1 00 02", "adccc r0,r1,r2",
- "40 A1 00 02", "adcmi r0,r1,r2",
- "50 A1 00 02", "adcpl r0,r1,r2",
- "60 A1 00 02", "adcvs r0,r1,r2",
- "70 A1 00 02", "adcvc r0,r1,r2",
- "80 A1 00 02", "adchi r0,r1,r2",
- "90 A1 00 02", "adcls r0,r1,r2",
- "A0 A1 00 02", "adcge r0,r1,r2",
- "B0 A1 00 02", "adclt r0,r1,r2",
- "C0 A1 00 02", "adcgt r0,r1,r2",
- "D0 A1 00 02", "adcle r0,r1,r2",
- "E0 A1 00 02", "adc r0,r1,r2", };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM addressing mode 1 (shifter operand).
- */
- @Test
- public void testArmAddrMode1() {
-
- System.out.println("\n================== ARM Addr Mode 1 ==================\n");
- String[] insts = {
- "E2 81 00 11", "add r0,r1,#0x11",
- "E0 81 00 02", "add r0,r1,r2",
- "E0 81 08 82", "add r0,r1,r2,lsl #17",
- "E0 81 03 12", "add r0,r1,r2,lsl r3",
- "E0 81 08 A2", "add r0,r1,r2,lsr #17",
- "E0 81 03 32", "add r0,r1,r2,lsr r3",
- "E0 81 08 C2", "add r0,r1,r2,asr #17",
- "E0 81 03 52", "add r0,r1,r2,asr r3",
- "E0 81 08 E2", "add r0,r1,r2,ror #17",
- "E0 81 03 72", "add r0,r1,r2,ror r3",
- "E0 81 00 62", "add r0,r1,r2,rrx",
- };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM addressing mode 2.
- */
- @Test
- public void testArmAddrMode2() {
-
- System.out.println("\n================== ARM Addr Mode 2 ==================\n");
- String[] insts = {
- "E5 91 00 11", "ldr r0,[r1,#0x11]",
- "E5 11 00 11", "ldr r0,[r1,#-0x11]",
- "E7 91 00 02", "ldr r0,[r1,r2]",
- "E7 11 00 02", "ldr r0,[r1,-r2]",
- "E7 91 08 82", "ldr r0,[r1,r2,lsl #17]",
- "E7 91 08 A2", "ldr r0,[r1,r2,lsr #17]",
- "E7 91 08 C2", "ldr r0,[r1,r2,asr #17]",
- "E7 91 08 E2", "ldr r0,[r1,r2,ror #17]",
- "E7 91 00 62", "ldr r0,[r1,r2,rrx]",
- "E7 11 08 82", "ldr r0,[r1,-r2,lsl #17]",
- "E7 11 08 A2", "ldr r0,[r1,-r2,lsr #17]",
- "E7 11 08 C2", "ldr r0,[r1,-r2,asr #17]",
- "E7 11 08 E2", "ldr r0,[r1,-r2,ror #17]",
- "E7 11 00 62", "ldr r0,[r1,-r2,rrx]",
- "E5 B1 00 11", "ldr r0,[r1,#0x11]!",
- "E5 31 00 11", "ldr r0,[r1,#-0x11]!",
- "E7 B1 00 02", "ldr r0,[r1,r2]!",
- "E7 31 00 02", "ldr r0,[r1,-r2]!",
- "E7 B1 08 82", "ldr r0,[r1,r2,lsl #17]!",
- "E7 B1 08 A2", "ldr r0,[r1,r2,lsr #17]!",
- "E7 B1 08 C2", "ldr r0,[r1,r2,asr #17]!",
- "E7 B1 08 E2", "ldr r0,[r1,r2,ror #17]!",
- "E7 B1 00 62", "ldr r0,[r1,r2,rrx]!",
- "E7 31 08 82", "ldr r0,[r1,-r2,lsl #17]!",
- "E7 31 08 A2", "ldr r0,[r1,-r2,lsr #17]!",
- "E7 31 08 C2", "ldr r0,[r1,-r2,asr #17]!",
- "E7 31 08 E2", "ldr r0,[r1,-r2,ror #17]!",
- "E7 31 00 62", "ldr r0,[r1,-r2,rrx]!",
- "E4 91 00 11", "ldr r0,[r1],#0x11",
- "E4 11 00 11", "ldr r0,[r1],#-0x11",
- "E6 91 00 02", "ldr r0,[r1],r2",
- "E6 11 00 02", "ldr r0,[r1],-r2",
- "E6 91 08 82", "ldr r0,[r1],r2,lsl #17",
- "E6 91 08 A2", "ldr r0,[r1],r2,lsr #17",
- "E6 91 08 C2", "ldr r0,[r1],r2,asr #17",
- "E6 91 08 E2", "ldr r0,[r1],r2,ror #17",
- "E6 91 00 62", "ldr r0,[r1],r2,rrx",
- "E6 11 08 82", "ldr r0,[r1],-r2,lsl #17",
- "E6 11 08 A2", "ldr r0,[r1],-r2,lsr #17",
- "E6 11 08 C2", "ldr r0,[r1],-r2,asr #17",
- "E6 11 08 E2", "ldr r0,[r1],-r2,ror #17",
- "E6 11 00 62", "ldr r0,[r1],-r2,rrx",
- };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM addressing mode 3.
- */
- @Test
- public void testArmAddrMode3() {
-
- System.out.println("\n================== ARM Addr Mode 3 ==================\n");
- String[] insts = {
- "E1 C1 01 B0", "strh r0,[r1,#0x10]",
- "E1 41 01 B0", "strh r0,[r1,#-0x10]",
- "E1 81 00 B2", "strh r0,[r1,r2]",
- "E1 01 00 B2", "strh r0,[r1,-r2]",
- "E1 E1 01 B0", "strh r0,[r1,#0x10]!",
- "E1 61 01 B0", "strh r0,[r1,#-0x10]!",
- "E1 A1 00 B2", "strh r0,[r1,r2]!",
- "E1 21 00 B2", "strh r0,[r1,-r2]!",
- "E0 C1 01 B0", "strh r0,[r1],#0x10",
- "E0 41 01 B0", "strh r0,[r1],#-0x10",
- "E0 81 00 B2", "strh r0,[r1],r2",
- "E0 01 00 B2", "strh r0,[r1],-r2",
- };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM addressing mode 4.
- */
- @Test
- public void testArmAddrMode4() {
-
- System.out.println("\n================== ARM Addr Mode 4 ==================\n");
- String[] insts = {
- "E8 90 00 06", "ldm r0,{r1,r2}",
- "E9 90 00 06", "ldmib r0,{r1,r2}",
- "E8 10 00 06", "ldmda r0,{r1,r2}",
- "E9 10 00 06", "ldmdb r0,{r1,r2}", };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM addressing mode 5.
- */
- @Test
- public void testArmAddrMode5() {
-
- System.out.println("\n================== ARM Addr Mode 5 ==================\n");
- String[] insts = {
- "ED 92 10 04", "ldc p0,c1,[r2,#0x10]",
- "ED 12 10 04", "ldc p0,c1,[r2,#-0x10]",
- "ED B2 10 04", "ldc p0,c1,[r2,#0x10]!",
- "ED 32 10 04", "ldc p0,c1,[r2,#-0x10]!",
- "EC B2 10 04", "ldc p0,c1,[r2],#0x10",
- "EC 32 10 04", "ldc p0,c1,[r2],#-0x10",
- "EC 92 10 00", "ldc p0,c1,[r2],{0}", };
-
- disassembleInstArray(insts, armOptions);
- }
-
- /**
- * Test for ARM branching instructions.
- */
- @Test
- public void testArmBranches() {
-
- armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
- armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
- System.out.println("\n=================== ARM Branches ====================\n");
- disassembleInst(0x00000000, "0a ff ff fe", new JumpToAddress(0x00000000, false, false),
- "0: 0a ff ff fe beq 0x00000000", armOptions);
- disassembleInst(0x00000000, "ea ff ff fe", new JumpToAddress(0x00000000, true, false),
- "0: ea ff ff fe b 0x00000000", armOptions);
- disassembleInst(0x00000000, "eb ff ff fe", new JumpToAddress(0x00000000, true, true),
- "0: eb ff ff fe bl 0x00000000", armOptions);
- disassembleInst(0x00000000, "fa ff ff fe", new JumpToAddress(0x00000000, true, true),
- "0: fa ff ff fe blx 0x00000000", armOptions);
- disassembleInst(0x00000000, "e1 2f ff 30", new JumpToAddress("r0", true, true),
- "0: e1 2f ff 30 blx r0", armOptions);
- disassembleInst(0x00000000, "e1 2f ff 10", new JumpToAddress("r0", true, false),
- "0: e1 2f ff 10 bx r0", armOptions);
- disassembleInst(0x00000000, "e1 a0 f0 0e", new JumpToAddress("lr", true, false),
- "0: e1 a0 f0 0e mov pc,lr", armOptions);
- }
-
- /**
- * Test if ARM instruction parser raises CodeBufferUnderflow
- */
- @Test
- public void testArmBufferUnderflow() {
- System.out.println("\n============= ARM CodeBufferUnderflow ===============\n");
- catchCodeBufferUnderflowException(0x0, "ea ff", armOptions);
- }
-
- /**
- * Test for Thumb instructions.
- */
- @Test
- public void testThumbInstructions() {
-
- System.out.println("\n======================= Thumb =======================\n");
- String[] insts = {
- "41 75", "adcs r5,r6",
- "44 35", "add r5,r6",
- "AD 1E", "add r5,sp,#0x78",
- "B0 0E", "add sp,sp,#0x38",
- "35 87", "adds r5,#0x87",
- "1D F5", "adds r5,r6,#7",
- "18 B5", "adds r5,r6,r2",
- "A5 E1", "add r5,pc,#0x384",
- "40 35", "ands r5,r6",
- "41 35", "asrs r5,r6",
- "17 F5", "asrs r5,r6,#0x1f",
- "D1 FA", "bne 0xfffffff8",
- "E7 F9", "b 0xfffffff6",
- "43 B5", "bics r5,r6",
- "BE 87", "bkpt #0x87",
- "47 A8", "blx r5",
- "47 28", "bx r5",
- "B1 D5", "cbz r5,0x00000034",
- "B9 CD", "cbnz r5,0x00000032",
- "42 F5", "cmn r5,r6",
- "2D 87", "cmp r5,#0x87",
- "42 B5", "cmp r5,r6",
- "42 B5", "cmp r5,r6",
- "45 B1", "cmp r9,r6",
- "B6 66", "cpsie ai",
- "B6 73", "cpsid if",
- "40 75", "eors r5,r6",
- "BF 18", "it ne",
- "BF 1C", "itt ne",
- "BF 14", "ite ne",
- "BF 1E", "ittt ne",
- "BF 1A", "itte ne",
- "BF 16", "itet ne",
- "BF 12", "itee ne",
- "BF 1F", "itttt ne",
- "BF 1D", "ittte ne",
- "BF 1B", "ittet ne",
- "BF 19", "ittee ne",
- "BF 17", "itett ne",
- "BF 15", "itete ne",
- "BF 13", "iteet ne",
- "BF 11", "iteee ne",
- "CD 81", "ldm r5!,{r0,r7}",
- "CD A1", "ldm r5,{r0,r5,r7}",
- "68 35", "ldr r5,[r6]",
- "69 B5", "ldr r5,[r6,#0x18]",
- "58 B5", "ldr r5,[r6,r2]",
- "9D 00", "ldr r5,[sp]",
- "9D 06", "ldr r5,[sp,#0x18]",
- "4D 03", "ldr r5,[pc,#0xc] ; 0xc",
- "5C B5", "ldrb r5,[r6,r2]",
- "78 35", "ldrb r5,[r6]",
- "7F F5", "ldrb r5,[r6,#0x1f]",
- "5A B5", "ldrh r5,[r6,r2]",
- "88 35", "ldrh r5,[r6]",
- "8F 35", "ldrh r5,[r6,#0x38]",
- "56 B5", "ldrsb r5,[r6,r2]",
- "5E B5", "ldrsh r5,[r6,r2]",
- "40 B5", "lsls r5,r6",
- "06 F5", "lsls r5,r6,#27",
- "40 F5", "lsrs r5,r6",
- "0E F5", "lsrs r5,r6,#27",
- "46 35", "mov r5,r6",
- "25 87", "movs r5,#0x87",
- "00 35", "movs r5,r6",
- "43 7D", "muls r5,r7,r5",
- "43 F5", "mvns r5,r6",
- "BF 00", "nop",
- "43 35", "orrs r5,r6",
- "BD 81", "pop {r0,r7,pc}",
- "B4 81", "push {r0,r7}",
- "BA 35", "rev r5,r6",
- "BA 75", "rev16 r5,r6",
- "BA F5", "revsh r5,r6",
- "41 F5", "rors r5,r6",
- "42 75", "rsbs r5,r6,#0",
- "41 B5", "sbcs r5,r6",
- "B6 58", "setend be",
- "B6 50", "setend le",
- "BF 40", "sev",
- "C5 81", "stm r5!,{r0,r7}",
- "60 35", "str r5,[r6]",
- "67 B5", "str r5,[r6,#0x78]",
- "50 B5", "str r5,[r6,r2]",
- "95 60", "str r5,[sp,#0x180]",
- "75 F5", "strb r5,[r6,#0x17]",
- "54 B5", "strb r5,[r6,r2]",
- "52 B5", "strh r5,[r6,r2]",
- "80 35", "strh r5,[r6]",
- "87 75", "strh r5,[r6,#0x3a]",
- "B0 AE", "sub sp,sp,#0xb8",
- "3D 87", "subs r5,#0x87",
- "1F F5", "subs r5,r6,#7",
- "1A B5", "subs r5,r6,r2",
- "DF 87", "svc #0x87",
- "B2 75", "sxtb r5,r6",
- "B2 35", "sxth r5,r6",
- "42 35", "tst r5,r6",
- "B2 F5", "uxtb r5,r6",
- "B2 B5", "uxth r5,r6",
- "BF 20", "wfe",
- "BF 30", "wfi",
- "BF 10", "yield",
- "DE 80", "undefined",
- };
-
- disassembleInstArray(insts, thumbOptions);
- }
-
- /**
- * Test for Thumb branching instructions.
- */
- @Test
- public void testThumbBranches() {
-
- thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
- thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
- System.out.println("\n=================== Thumb Branches ==================\n");
- disassembleInst(0x00000000, "d0 fe", new JumpToAddress(0x00000000, false, false),
- "0: d0 fe beq 0x00000000", thumbOptions);
- disassembleInst(0x00000000, "e7 fe", new JumpToAddress(0x00000000, true, false),
- "0: e7 fe b 0x00000000", thumbOptions);
-// disassembleInst(0x00000000, "f7 ff ff fe", new JumpToAddress(0x00000000, true, true),
-// "0: f7 ff ff fe bl 0x00000000", thumbOptions);
-// disassembleInst(0x00000000, "f7 ff ef fe", new JumpToAddress(0x00000000, true, true),
-// "0: f7 ff ef fe blx 0x0000000000000000", thumbOptions);
- disassembleInst(0x00000000, "47 80", new JumpToAddress("r0", true, true),
- "0: 47 80 blx r0", thumbOptions);
- disassembleInst(0x00000000, "46 f7", new JumpToAddress("lr", true, false),
- "0: 46 f7 mov pc,lr", thumbOptions);
- }
-
- /**
- * Test if thumb instruction parser raises CodeBufferUnderflow
- */
- @Test
- public void testThumbBufferUnderflow() {
- System.out.println("\n============ Thumb CodeBufferUnderflow ==============\n");
- catchCodeBufferUnderflowException(0x0, "f7", thumbOptions);
- }
-
-
- /**
- */
- @Test
- public void test32BitArmV6KInstructions() {
-
- System.out.println("\n================== ARMv6K Instructions ==================\n");
-
- String[] insts = {
- "F5 7F F0 1F", "clrex",
- "E3 20 F0 FD", "nop", // dbg #13
- "03 20 F0 FD", "nopeq", // dbgeq #13
- "E3 20 F0 00", "nop", // nop
- "03 20 F0 00", "nopeq", // nopeq
- "E3 20 F0 04", "sev",
- "03 20 F0 04", "seveq",
- "E3 20 F0 02", "wfe",
- "03 20 F0 02", "wfeeq",
- "E3 20 F0 03", "wfi",
- "03 20 F0 03", "wfieq",
- "E3 20 F0 01", "yield",
- "03 20 F0 01", "yieldeq",
- };
-
- Map<String, Object> options = new HashMap<String, Object>();
- for (Map.Entry<String, Object> entry : armOptions.entrySet())
- options.put(entry.getKey(), entry.getValue());
- options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6K);
- disassembleInstArray(insts, options);
- }
-
- /**
- */
- @Test
- public void test32BitArmV6T2Instructions() {
- System.out.println("\n================== ARMv6T2 Hint Instructions ==================\n");
-
- String[] insts = {
- "F5 7F F0 1F", "invalid opcode", // clrex
- "E3 20 F0 FD", "nop", // dbg #13
- "03 20 F0 FD", "nopeq", // dbgeq #13
- "E3 20 F0 00", "nop", // nop
- "03 20 F0 00", "nopeq", // nopeq
- "E3 20 F0 04", "nop", // sev
- "03 20 F0 04", "nopeq", // seveq
- "E3 20 F0 02", "nop", // wfe
- "03 20 F0 02", "nopeq", // wfeeq
- "E3 20 F0 03", "nop", // wfi
- "03 20 F0 03", "nopeq", // wfieq
- "E3 20 F0 01", "nop", // yield
- "03 20 F0 01", "nopeq", // yieldeq
- };
-
- Map<String, Object> options = new HashMap<String, Object>();
- for (Map.Entry<String, Object> entry : armOptions.entrySet())
- options.put(entry.getKey(), entry.getValue());
- options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6T2);
- disassembleInstArray(insts, options);
- }
-
- /**
- */
- @Test
- public void test32BitArmV5Instructions() {
-
- System.out.println("\n================== ARMv5 Instructions (Invalid) ==================\n");
-
- String[] insts = {
- "F5 7F F0 1F", "invalid opcode", // clrex
- "E3 20 F0 FD", "invalid opcode", // dbg #13
- "03 20 F0 FD", "invalid opcode", // dbgeq #13
- "E3 20 F0 00", "invalid opcode", // nop
- "03 20 F0 00", "invalid opcode", // nopeq
- "E3 20 F0 04", "invalid opcode", // sev
- "03 20 F0 04", "invalid opcode", // seveq
- "E3 20 F0 02", "invalid opcode", // wfe
- "03 20 F0 02", "invalid opcode", // wfeeq
- "E3 20 F0 03", "invalid opcode", // wfi
- "03 20 F0 03", "invalid opcode", // wfieq
- "E3 20 F0 01", "invalid opcode", // yield
- "03 20 F0 01", "invalid opcode", // yieldeq
- };
-
- Map<String, Object> options = new HashMap<String, Object>();
- for (Map.Entry<String, Object> entry : armOptions.entrySet())
- options.put(entry.getKey(), entry.getValue());
- options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv5);
- disassembleInstArray(insts, options);
- }
-
- /**
- * Test for non-VFP, 32-bit THumb2 v6*, v7 instructions.
- */
- @Test
- public void test32BitThumb2Instructions() {
-
- System.out.println("\n===================== Thumb2 ========================\n");
- String[] insts = {
-/// "E7 F1 23 F4", "undefined",
-/// "E7 F0 00 10", "undefined",
- "F1 4A 05 71", "adc r5,r10,#0x71", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 4B 06 F7", "adc r6,r11,#0xf7", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 49 14 78", "adc r4,r9,#0x780078", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 48 13 FC", "adc r3,r8,#0xfc00fc", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 47 25 64", "adc r5,r7,#0x64006400", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 46 25 E3", "adc r5,r6,#0xe300e300", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 47 46 60", "adc r6,r7,#0xe0000000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 48 47 E0", "adc r7,r8,#0x70000000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 4A 05 60", "adc r5,r10,#0xe00000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 4A 45 60", "adc r5,r10,#0xe000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 4A 65 60", "adc r5,r10,#0xe00", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "EB 49 05 0A", "adc.w r5,r9,r10", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 48 14 A9", "adc.w r4,r8,r9,asr #6", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 47 03 48", "adc.w r3,r7,r8,lsl #1", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 46 02 17", "adc.w r2,r6,r7,lsr #32", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 49 75 F8", "adc.w r5,r9,r8,ror #31", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 48 05 39", "adc.w r5,r8,r9,rrx", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "F1 5A 05 71", "adcs r5,r10,#0x71", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 5B 06 F7", "adcs r6,r11,#0xf7", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 59 14 78", "adcs r4,r9,#0x780078", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 58 13 FC", "adcs r3,r8,#0xfc00fc", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 57 25 64", "adcs r5,r7,#0x64006400", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 56 25 E3", "adcs r5,r6,#0xe300e300", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 57 46 60", "adcs r6,r7,#0xe0000000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F1 58 47 E0", "adcs r7,r8,#0x70000000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 5A 05 60", "adcs r5,r10,#0xe00000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 5A 45 60", "adcs r5,r10,#0xe000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "F5 5A 65 60", "adcs r5,r10,#0xe00", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
- "EB 59 05 0A", "adcs.w r5,r9,r10", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 58 14 A9", "adcs.w r4,r8,r9,asr #6", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 57 03 48", "adcs.w r3,r7,r8,lsl #1", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 56 02 17", "adcs.w r2,r6,r7,lsr #32", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 59 75 F8", "adcs.w r5,r9,r8,ror #31", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "EB 58 05 39", "adcs.w r5,r8,r9,rrx", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
- "F2 0F 05 71", "add r5,pc,#0x71", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
- "F2 0F 36 72", "add r6,pc,#0x372", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
- "F6 0F 47 78", "add r7,pc,#0xc78", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
- "F1 0A 05 71", "add.w r5,r10,#0x71", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 0B 06 F7", "add.w r6,r11,#0xf7", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 09 14 78", "add.w r4,r9,#0x780078", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 08 13 FC", "add.w r3,r8,#0xfc00fc", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 07 25 64", "add.w r5,r7,#0x64006400", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 06 25 E3", "add.w r5,r6,#0xe300e300", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 07 46 60", "add.w r6,r7,#0xe0000000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 08 47 E0", "add.w r7,r8,#0x70000000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 0A 05 60", "add.w r5,r10,#0xe00000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 0A 45 60", "add.w r5,r10,#0xe000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 0A 65 60", "add.w r5,r10,#0xe00", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "EB 09 05 0A", "add.w r5,r9,r10", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 08 14 A9", "add.w r4,r8,r9,asr #6", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 07 03 48", "add.w r3,r7,r8,lsl #1", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 06 02 17", "add.w r2,r6,r7,lsr #32", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 09 75 F8", "add.w r5,r9,r8,ror #31", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 08 05 39", "add.w r5,r8,r9,rrx", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
- "F1 0D 05 71", "add.w r5,sp,#0x71", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 06 F7", "add.w r6,sp,#0xf7", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 14 78", "add.w r4,sp,#0x780078", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 13 FC", "add.w r3,sp,#0xfc00fc", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 25 64", "add.w r5,sp,#0x64006400", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 25 E3", "add.w r5,sp,#0xe300e300", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 46 60", "add.w r6,sp,#0xe0000000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 0D 47 E0", "add.w r7,sp,#0x70000000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 0D 05 60", "add.w r5,sp,#0xe00000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 0D 45 60", "add.w r5,sp,#0xe000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 0D 65 60", "add.w r5,sp,#0xe00", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "EB 0D 05 0A", "add.w r5,sp,r10", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 0D 14 A9", "add.w r4,sp,r9,asr #6", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 0D 03 48", "add.w r3,sp,r8,lsl #1", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 0D 02 17", "add.w r2,sp,r7,lsr #32", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 0D 75 F8", "add.w r5,sp,r8,ror #31", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 0D 05 39", "add.w r5,sp,r9,rrx", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "F1 1A 05 71", "adds.w r5,r10,#0x71", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 1B 06 F7", "adds.w r6,r11,#0xf7", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 19 14 78", "adds.w r4,r9,#0x780078", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 18 13 FC", "adds.w r3,r8,#0xfc00fc", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 17 25 64", "adds.w r5,r7,#0x64006400", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 16 25 E3", "adds.w r5,r6,#0xe300e300", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 17 46 60", "adds.w r6,r7,#0xe0000000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F1 18 47 E0", "adds.w r7,r8,#0x70000000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 1A 05 60", "adds.w r5,r10,#0xe00000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 1A 45 60", "adds.w r5,r10,#0xe000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "F5 1A 65 60", "adds.w r5,r10,#0xe00", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
- "EB 19 05 0A", "adds.w r5,r9,r10", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 18 14 A9", "adds.w r4,r8,r9,asr #6", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 17 03 48", "adds.w r3,r7,r8,lsl #1", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 16 02 17", "adds.w r2,r6,r7,lsr #32", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 19 75 F8", "adds.w r5,r9,r8,ror #31", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "EB 18 05 39", "adds.w r5,r8,r9,rrx", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
- "F1 1D 05 71", "adds.w r5,sp,#0x71", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 06 F7", "adds.w r6,sp,#0xf7", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 14 78", "adds.w r4,sp,#0x780078", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 13 FC", "adds.w r3,sp,#0xfc00fc", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 25 64", "adds.w r5,sp,#0x64006400", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 25 E3", "adds.w r5,sp,#0xe300e300", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 46 60", "adds.w r6,sp,#0xe0000000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F1 1D 47 E0", "adds.w r7,sp,#0x70000000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 1D 05 60", "adds.w r5,sp,#0xe00000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 1D 45 60", "adds.w r5,sp,#0xe000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "F5 1D 65 60", "adds.w r5,sp,#0xe00", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
- "EB 1D 05 0A", "adds.w r5,sp,r10", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 1D 14 A9", "adds.w r4,sp,r9,asr #6", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 1D 03 48", "adds.w r3,sp,r8,lsl #1", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 1D 02 17", "adds.w r2,sp,r7,lsr #32", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 1D 75 F8", "adds.w r5,sp,r8,ror #31", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "EB 1D 05 39", "adds.w r5,sp,r9,rrx", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
- "F2 0D 05 71", "addw r5,sp,#0x71", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
- "F2 0D 36 72", "addw r6,sp,#0x372", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
- "F6 0D 47 78", "addw r7,sp,#0xc78", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
- "F0 0A 05 71", "and r5,r10,#0x71", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 0B 06 F7", "and r6,r11,#0xf7", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 09 14 78", "and r4,r9,#0x780078", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 08 13 FC", "and r3,r8,#0xfc00fc", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 07 25 64", "and r5,r7,#0x64006400", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 06 25 E3", "and r5,r6,#0xe300e300", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 07 46 60", "and r6,r7,#0xe0000000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 08 47 E0", "and r7,r8,#0x70000000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 0A 05 60", "and r5,r10,#0xe00000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 0A 45 60", "and r5,r10,#0xe000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 0A 65 60", "and r5,r10,#0xe00", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "EA 09 05 0A", "and.w r5,r9,r10", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 08 14 A9", "and.w r4,r8,r9,asr #6", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 07 03 48", "and.w r3,r7,r8,lsl #1", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 06 02 17", "and.w r2,r6,r7,lsr #32", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 09 75 F8", "and.w r5,r9,r8,ror #31", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 08 05 39", "and.w r5,r8,r9,rrx", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "F0 1A 05 71", "ands r5,r10,#0x71", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 1B 06 F7", "ands r6,r11,#0xf7", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 19 14 78", "ands r4,r9,#0x780078", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 18 13 FC", "ands r3,r8,#0xfc00fc", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 17 25 64", "ands r5,r7,#0x64006400", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 16 25 E3", "ands r5,r6,#0xe300e300", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 17 46 60", "ands r6,r7,#0xe0000000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F0 18 47 E0", "ands r7,r8,#0x70000000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 1A 05 60", "ands r5,r10,#0xe00000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 1A 45 60", "ands r5,r10,#0xe000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "F4 1A 65 60", "ands r5,r10,#0xe00", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
- "EA 19 05 0A", "ands.w r5,r9,r10", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 18 14 A9", "ands.w r4,r8,r9,asr #6", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 17 03 48", "ands.w r3,r7,r8,lsl #1", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 16 02 17", "ands.w r2,r6,r7,lsr #32", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 19 75 F8", "ands.w r5,r9,r8,ror #31", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 18 05 39", "ands.w r5,r8,r9,rrx", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
- "EA 4F 45 69", "asr.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
- "EA 4F 06 28", "asr.w r6,r8,#32", // 1110 1010 0100 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
- "FA 49 F5 0A", "asr.w r5,r9,r10", // 1111 1010 0100 xxxx 1111 xxxx 0000 xxxx // A8.6.15 T2
- "EA 5F 45 69", "asrs.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
- "EA 5F 06 28", "asrs.w r6,r8,#32", // 1110 1010 0101 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
- "FA 59 F5 0A", "asrs.w r5,r9,r10", // 1111 1010 0101 xxxx 1111 xxxx 0000 xxxx // A8.6.15 T2
- "F7 FF BF FE", "b.w 0x003ffffc", // 1111 0xxx xxxx xxxx 10x1 xxxx xxxx xxxx // A8.6.16 T4
- "F4 3F AF FE", "beq.w 0x000ffffc", // 1111 0xxx xxxx xxxx 10x0 xxxx xxxx xxxx // A8.6.16 T3
- "F3 6F 05 1F", "bfc r5,#0,#32", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
- "F3 6F 06 59", "bfc r6,#1,#25", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
- "F3 6F 77 DF", "bfc r7,#31,#1", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
- "F3 67 05 1F", "bfi r5,r7,#0,#32", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
- "F3 68 06 59", "bfi r6,r8,#1,#25", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
- "F3 69 77 DF", "bfi r7,r9,#31,#1", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
- "F0 2A 05 71", "bic r5,r10,#0x71", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 2B 06 F7", "bic r6,r11,#0xf7", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 29 14 78", "bic r4,r9,#0x780078", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 28 13 FC", "bic r3,r8,#0xfc00fc", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 27 25 64", "bic r5,r7,#0x64006400", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 26 25 E3", "bic r5,r6,#0xe300e300", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 27 46 60", "bic r6,r7,#0xe0000000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 28 47 E0", "bic r7,r8,#0x70000000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 2A 05 60", "bic r5,r10,#0xe00000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 2A 45 60", "bic r5,r10,#0xe000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 2A 65 60", "bic r5,r10,#0xe00", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "EA 29 05 0A", "bic.w r5,r9,r10", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 28 14 A9", "bic.w r4,r8,r9,asr #6", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 27 03 48", "bic.w r3,r7,r8,lsl #1", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 26 02 17", "bic.w r2,r6,r7,lsr #32", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 29 75 F8", "bic.w r5,r9,r8,ror #31", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 28 05 39", "bic.w r5,r8,r9,rrx", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
- "F0 3A 05 71", "bics r5,r10,#0x71", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 3B 06 F7", "bics r6,r11,#0xf7", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 39 14 78", "bics r4,r9,#0x780078", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 38 13 FC", "bics r3,r8,#0xfc00fc", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 37 25 64", "bics r5,r7,#0x64006400", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 36 25 E3", "bics r5,r6,#0xe300e300", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 37 46 60", "bics r6,r7,#0xe0000000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F0 38 47 E0", "bics r7,r8,#0x70000000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 3A 05 60", "bics r5,r10,#0xe00000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 3A 45 60", "bics r5,r10,#0xe000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "F4 3A 65 60", "bics r5,r10,#0xe00", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
- "EA 39 05 0A", "bics.w r5,r9,r10", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 38 14 A9", "bics.w r4,r8,r9,asr #6", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 37 03 48", "bics.w r3,r7,r8,lsl #1", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 36 02 17", "bics.w r2,r6,r7,lsr #32", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 39 75 F8", "bics.w r5,r9,r8,ror #31", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "EA 38 05 39", "bics.w r5,r8,r9,rrx", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
- "F7 FF FF FE", "bl 0x003ffffc", // 1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx // A8.6.23 T1
- "F7 FF EF FE", "blx 0x003ffffc", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
- "F4 00 C0 3C", "blx 0x00c00078", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
- "F3 C9 AF 00", "bxj r9", // 1111 0011 1100 xxxx 10.0 :::: .... .... // A8.6.26 T1
- "EE C9 59 EA", "cdp p9,0xc,c5,c9,c10,0x7", // 1110 1110 xxxx xxxx xxxx xxxx xxx0 xxxx // A8.6.28 T1/A1
- "FE 19 57 6A", "cdp2 p7,0x1,c5,c9,c10,0x3", // 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx // A8.6.28 T2/A2
- "F3 BF 8F 2F", "clrex", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
- "FA B9 F5 89", "clz r5,r9", // 1111 1010 1011 xxxx 1111 xxxx 1000 xxxx // A8.6.31 T1
- "F1 15 0F 71", "cmn r5,#0x71", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 16 0F F7", "cmn r6,#0xf7", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 14 1F 78", "cmn r4,#0x780078", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 13 1F FC", "cmn r3,#0xfc00fc", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 15 2F 64", "cmn r5,#0x64006400", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 15 2F E3", "cmn r5,#0xe300e300", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 16 4F 60", "cmn r6,#0xe0000000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F1 17 4F E0", "cmn r7,#0x70000000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F5 15 0F 60", "cmn r5,#0xe00000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F5 15 4F 60", "cmn r5,#0xe000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "F5 15 6F 60", "cmn r5,#0xe00", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
- "EB 15 0F 09", "cmn.w r5,r9", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "EB 14 1F A8", "cmn.w r4,r8,asr #6", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "EB 13 0F 47", "cmn.w r3,r7,lsl #1", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "EB 12 0F 16", "cmn.w r2,r6,lsr #32", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "EB 15 7F F9", "cmn.w r5,r9,ror #31", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "EB 15 0F 38", "cmn.w r5,r8,rrx", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
- "F1 B5 0F 71", "cmp.w r5,#0x71", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B6 0F F7", "cmp.w r6,#0xf7", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B4 1F 78", "cmp.w r4,#0x780078", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B3 1F FC", "cmp.w r3,#0xfc00fc", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B5 2F 64", "cmp.w r5,#0x64006400", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B5 2F E3", "cmp.w r5,#0xe300e300", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B6 4F 60", "cmp.w r6,#0xe0000000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F1 B7 4F E0", "cmp.w r7,#0x70000000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F5 B5 0F 60", "cmp.w r5,#0xe00000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F5 B5 4F 60", "cmp.w r5,#0xe000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "F5 B5 6F 60", "cmp.w r5,#0xe00", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
- "EB B5 0F 09", "cmp.w r5,r9", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "EB B4 1F A8", "cmp.w r4,r8,asr #6", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "EB B3 0F 47", "cmp.w r3,r7,lsl #1", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "EB B2 0F 16", "cmp.w r2,r6,lsr #32", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "EB B5 7F F9", "cmp.w r5,r9,ror #31", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "EB B5 0F 38", "cmp.w r5,r8,rrx", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
- "F3 AF 81 00", "cps #0",
- "F3 AF 81 1F", "cps #31",
- "F3 AF 86 A0", "cpsid af", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 87 FF", "cpsid aif,#31", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 87 61", "cpsid if,#1", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 84 A0", "cpsie af", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 85 FF", "cpsie aif,#31", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 85 61", "cpsie if,#1", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F3 AF 80 F0", "dbg #0", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 AF 80 FD", "dbg #13", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 BF 8F 50", "dmb #0", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 52", "dmb oshst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 53", "dmb osh", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 56", "dmb nshst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 57", "dmb nsh", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5A", "dmb ishst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5B", "dmb ish", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5E", "dmb st", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5F", "dmb sy", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 42", "dsb oshst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 43", "dsb osh", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 46", "dsb nshst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 47", "dsb nsh", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4A", "dsb ishst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4B", "dsb ish", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4D", "dsb #13", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4E", "dsb st", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4F", "dsb sy", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
-/// "F3 BF 8F 1F", "enterx", // 1111 0011 1011 :::: 10.0 :::: 0001 :::: // A9.3.1 T1
- "F0 8A 05 71", "eor r5,r10,#0x71", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 8B 06 F7", "eor r6,r11,#0xf7", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 89 14 78", "eor r4,r9,#0x780078", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 88 13 FC", "eor r3,r8,#0xfc00fc", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 87 25 64", "eor r5,r7,#0x64006400", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 86 25 E3", "eor r5,r6,#0xe300e300", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 87 46 60", "eor r6,r7,#0xe0000000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 88 47 E0", "eor r7,r8,#0x70000000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 8A 05 60", "eor r5,r10,#0xe00000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 8A 45 60", "eor r5,r10,#0xe000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 8A 65 60", "eor r5,r10,#0xe00", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "EA 89 05 0A", "eor.w r5,r9,r10", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 88 14 A9", "eor.w r4,r8,r9,asr #6", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 87 03 48", "eor.w r3,r7,r8,lsl #1", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 86 02 17", "eor.w r2,r6,r7,lsr #32", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 89 75 F8", "eor.w r5,r9,r8,ror #31", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 88 05 39", "eor.w r5,r8,r9,rrx", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "F0 9A 05 71", "eors r5,r10,#0x71", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 9B 06 F7", "eors r6,r11,#0xf7", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 99 14 78", "eors r4,r9,#0x780078", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 98 13 FC", "eors r3,r8,#0xfc00fc", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 97 25 64", "eors r5,r7,#0x64006400", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 96 25 E3", "eors r5,r6,#0xe300e300", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 97 46 60", "eors r6,r7,#0xe0000000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F0 98 47 E0", "eors r7,r8,#0x70000000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 9A 05 60", "eors r5,r10,#0xe00000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 9A 45 60", "eors r5,r10,#0xe000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "F4 9A 65 60", "eors r5,r10,#0xe00", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
- "EA 99 05 0A", "eors.w r5,r9,r10", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 98 14 A9", "eors.w r4,r8,r9,asr #6", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 97 03 48", "eors.w r3,r7,r8,lsl #1", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 96 02 17", "eors.w r2,r6,r7,lsr #32", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 99 75 F8", "eors.w r5,r9,r8,ror #31", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "EA 98 05 39", "eors.w r5,r8,r9,rrx", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
- "F3 BF 8F 60", "isb #0", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
- "F3 BF 8F 6d", "isb #13", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
- "F3 BF 8F 6F", "isb sy", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
- "ED 1A B9 00", "ldc p9,c11,[r10,#-0x0]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 3A B9 00", "ldc p9,c11,[r10,#-0x0]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 1A B9 21", "ldc p9,c11,[r10,#-0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 3A B9 21", "ldc p9,c11,[r10,#-0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 9A B9 21", "ldc p9,c11,[r10,#0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED BA B9 21", "ldc p9,c11,[r10,#0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC 3A B9 00", "ldc p9,c11,[r10],#-0x0", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC 3A B9 21", "ldc p9,c11,[r10],#-0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC BA B9 21", "ldc p9,c11,[r10],#0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 1F B9 00", "ldc p9,c11,[pc,#-0x0]", // 1110 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T1
- "FD 1A B9 21", "ldc2 p9,c11,[r10,#-0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD 3A B9 21", "ldc2 p9,c11,[r10,#-0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD 9A B9 21", "ldc2 p9,c11,[r10,#0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD BA B9 21", "ldc2 p9,c11,[r10,#0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FC 3A B9 21", "ldc2 p9,c11,[r10],#-0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FC BA B9 21", "ldc2 p9,c11,[r10],#0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD 1F B9 00", "ldc2 p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
- "FD 5A B9 21", "ldc2l p9,c11,[r10,#-0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD 7A B9 21", "ldc2l p9,c11,[r10,#-0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD DA B9 21", "ldc2l p9,c11,[r10,#0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD FA B9 21", "ldc2l p9,c11,[r10,#0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FC 7A B9 21", "ldc2l p9,c11,[r10],#-0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FC FA B9 21", "ldc2l p9,c11,[r10],#0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
- "FD 5F B9 00", "ldc2l p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
- "ED 5A B9 00", "ldcl p9,c11,[r10,#-0x0]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 7A B9 00", "ldcl p9,c11,[r10,#-0x0]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 5A B9 21", "ldcl p9,c11,[r10,#-0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 7A B9 21", "ldcl p9,c11,[r10,#-0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED DA B9 21", "ldcl p9,c11,[r10,#0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED FA B9 21", "ldcl p9,c11,[r10,#0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC 7A B9 00", "ldcl p9,c11,[r10],#-0x0", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC 7A B9 21", "ldcl p9,c11,[r10],#-0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "EC FA B9 21", "ldcl p9,c11,[r10],#0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
- "ED 5F B9 00", "ldcl p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
- "E8 BA 42 40", "ldm.w r10!,{r6,r9,lr}", // 1110 1000 10x1 xxxx xx.x xxxx xxxx xxxx // A8.6.53 T2
- "E8 9A 82 40", "ldm.w r10,{r6,r9,pc}", // 1110 1000 10x1 xxxx xx.x xxxx xxxx xxxx // A8.6.53 T2
- "E9 3A 42 40", "ldmdb r10!,{r6,r9,lr}", // 1110 1001 00x1 xxxx xx.x xxxx xxxx xxxx // A8.6.55 T1
- "E9 1A 82 40", "ldmdb r10,{r6,r9,pc}", // 1110 1001 00x1 xxxx xx.x xxxx xxxx xxxx // A8.6.55 T1
- "F8 DA 50 00", "ldr.w r5,[r10]", // 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx // A8.6.57 T3
- "F8 D6 47 89", "ldr.w r4,[r6,#0x789]", // 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx // A8.6.57 T3
- "F8 5A 5C 80", "ldr r5,[r10,#-0x80]", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
- "F8 5A 5A 82", "ldr r5,[r10],#0x82", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
- "F8 5A 58 84", "ldr r5,[r10],#-0x84", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
- "F8 5A 5F 86", "ldr r5,[r10,#0x86]!", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
- "F8 5A 5D 88", "ldr r5,[r10,#-0x88]!", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
- "F8 DF 57 89", "ldr.w r5,[pc,#0x789] ; 0x789", // 1111 1000 x101 1111 xxxx xxxx xxxx xxxx // A8.6.59 T2
- "F8 5F 69 87", "ldr.w r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x101 1111 xxxx xxxx xxxx xxxx // A8.6.59 T2
- "F8 5A 50 08", "ldr.w r5,[r10,r8]", // 1111 1000 0101 xxxx xxxx 0000 00xx xxxx // A8.6.60 T2
- "F8 59 60 37", "ldr.w r6,[r9,r7,lsl #3]", // 1111 1000 0101 xxxx xxxx 0000 00xx xxxx // A8.6.60 T2
- "F8 9A 50 00", "ldrb.w r5,[r10]", // 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.61 T3
- "F8 96 47 89", "ldrb.w r4,[r6,#0x789]", // 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.61 T3
- "F8 1A 5C 80", "ldrb r5,[r10,#-0x80]", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
- "F8 1A 5A 82", "ldrb r5,[r10],#0x82", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
- "F8 1A 58 84", "ldrb r5,[r10],#-0x84", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
- "F8 1A 5F 86", "ldrb r5,[r10,#0x86]!", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
- "F8 1A 5D 88", "ldrb r5,[r10,#-0x88]!", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
- "F8 9F 57 89", "ldrb r5,[pc,#0x789] ; 0x789", // 1111 1000 0001 1111 xxxx xxxx xxxx xxxx // A8.6.63 T1
- "F8 1F 69 87", "ldrb r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x001 1111 xxxx xxxx xxxx xxxx // A8.6.63 T1
- "F8 1A 50 08", "ldrb.w r5,[r10,r8]", // 1111 1000 0001 xxxx xxxx 0000 00xx xxxx // A8.6.64 T2
- "F8 19 60 37", "ldrb.w r6,[r9,r7,lsl #3]", // 1111 1000 0001 xxxx xxxx 0000 00xx xxxx // A8.6.64 T2
- "F8 1A 5E 00", "ldrbt r5,[r10]", // 1111 1000 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.65 T1
- "F8 19 6E 84", "ldrbt r6,[r9,#0x84]", // 1111 1000 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.65 T1
- "E9 5A 67 84", "ldrd r6,r7,[r10,#-0x210]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E9 7A 67 85", "ldrd r6,r7,[r10,#-0x214]!", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E9 DA 67 84", "ldrd r6,r7,[r10,#0x210]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E9 FA 67 85", "ldrd r6,r7,[r10,#0x214]!", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E9 5A 67 00", "ldrd r6,r7,[r10]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E8 7A 67 84", "ldrd r6,r7,[r10],#-0x210", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E8 FA 67 85", "ldrd r6,r7,[r10],#0x214", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
- "E9 5F 67 00", "ldrd r6,r7,[pc,#-0x0]", // 1110 100p u1w1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
- "E9 5F 67 84", "ldrd r6,r7,[pc,#-0x210]", // 1110 100x x1x1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
- "E9 DF 67 85", "ldrd r6,r7,[pc,#0x214]", // 1110 100x x1x1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
- "E8 5A 5F 00", "ldrex r5,[r10]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.69 T1
- "E8 59 6F 87", "ldrex r6,[r9,#0x21c]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.69 T1
- "E8 DA 5F 4F", "ldrexb r5,[r10]", // 1110 1000 1101 xxxx xxxx :::: 0100 :::: // A8.6.70 T1
- "E8 DA 56 7F", "ldrexd r5,r6,[r10]", // 1110 1000 1101 xxxx xxxx xxxx 0111 :::: // A8.6.71 T1
- "E8 DA 5F 5F", "ldrexh r5,[r10]", // 1110 1000 1101 xxxx xxxx :::: 0101 :::: // A8.6.72 T1
- "F8 BA 50 00", "ldrh.w r5,[r10]", // 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.73 T3
- "F8 B6 47 89", "ldrh.w r4,[r6,#0x789]", // 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.73 T3
- "F8 3A 5C 80", "ldrh r5,[r10,#-0x80]", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
- "F8 3A 5A 82", "ldrh r5,[r10],#0x82", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
- "F8 3A 58 84", "ldrh r5,[r10],#-0x84", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
- "F8 3A 5F 86", "ldrh r5,[r10,#0x86]!", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
- "F8 3A 5D 88", "ldrh r5,[r10,#-0x88]!", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
- "F8 BF 57 89", "ldrh r5,[pc,#0x789] ; 0x789", // 1111 1000 x011 1111 xxxx xxxx xxxx xxxx // A8.6.75 T1
- "F8 3F 69 87", "ldrh r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x011 1111 xxxx xxxx xxxx xxxx // A8.6.75 T1
- "F8 3A 50 08", "ldrh.w r5,[r10,r8]", // 1111 1000 0011 xxxx xxxx 0000 00xx xxxx // A8.6.76 T2
- "F8 39 60 37", "ldrh.w r6,[r9,r7,lsl #3]", // 1111 1000 0011 xxxx xxxx 0000 00xx xxxx // A8.6.76 T2
- "F8 3A 5E 00", "ldrht r5,[r10]", // 1111 1000 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.77 T1
- "F8 39 6E 84", "ldrht r6,[r9,#0x84]", // 1111 1000 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.77 T1
- "F9 9A 50 00", "ldrsb r5,[r10]", // 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.78 T1
- "F9 96 47 89", "ldrsb r4,[r6,#0x789]", // 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.78 T1
- "F9 1A 5C 80", "ldrsb r5,[r10,#-0x80]", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
- "F9 1A 5A 82", "ldrsb r5,[r10],#0x82", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
- "F9 1A 58 84", "ldrsb r5,[r10],#-0x84", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
- "F9 1A 5F 86", "ldrsb r5,[r10,#0x86]!", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
- "F9 1A 5D 88", "ldrsb r5,[r10,#-0x88]!", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
- "F9 9F 57 89", "ldrsb r5,[pc,#0x789] ; 0x789", // 1111 1001 x001 1111 xxxx xxxx xxxx xxxx // A8.6.79 T1
- "F9 1F 69 87", "ldrsb r6,[pc,#-0x987] ; 0xfffff679", // 1111 1001 x001 1111 xxxx xxxx xxxx xxxx // A8.6.79 T1
- "F9 1A 50 08", "ldrsb.w r5,[r10,r8]", // 1111 1001 0001 xxxx xxxx 0000 00xx xxxx // A8.6.80 T2
- "F9 19 60 37", "ldrsb.w r6,[r9,r7,lsl #3]", // 1111 1001 0001 xxxx xxxx 0000 00xx xxxx // A8.6.80 T2
- "F9 1A 5E 00", "ldrsbt r5,[r10]", // 1111 1001 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.81 T1
- "F9 19 6E 84", "ldrsbt r6,[r9,#0x84]", // 1111 1001 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.81 T1
- "F9 BA 50 00", "ldrsh r5,[r10]", // 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.82 T1
- "F9 B6 47 89", "ldrsh r4,[r6,#0x789]", // 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.82 T1
- "F9 3A 5C 80", "ldrsh r5,[r10,#-0x80]", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
- "F9 3A 5A 82", "ldrsh r5,[r10],#0x82", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
- "F9 3A 58 84", "ldrsh r5,[r10],#-0x84", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
- "F9 3A 5F 86", "ldrsh r5,[r10,#0x86]!", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
- "F9 3A 5D 88", "ldrsh r5,[r10,#-0x88]!", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
- "F9 BF 57 89", "ldrsh r5,[pc,#0x789] ; 0x789", // 1111 1001 x011 1111 xxxx xxxx xxxx xxxx // A8.6.83 T1
- "F9 3F 69 87", "ldrsh r6,[pc,#-0x987] ; 0xfffff679", // 1111 1001 x011 1111 xxxx xxxx xxxx xxxx // A8.6.83 T1
- "F9 3A 50 08", "ldrsh.w r5,[r10,r8]", // 1111 1001 0011 xxxx xxxx 0000 00xx xxxx // A8.6.84 T2
- "F9 39 60 37", "ldrsh.w r6,[r9,r7,lsl #3]", // 1111 1001 0011 xxxx xxxx 0000 00xx xxxx // A8.6.84 T2
- "F9 3A 5E 00", "ldrsht r5,[r10]", // 1111 1001 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.85 T1
- "F9 36 4E 89", "ldrsht r4,[r6,#0x89]", // 1111 1001 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.85 T1
- "F8 5A 5E 00", "ldrt r5,[r10]", // 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx // A8.6.86 T3
- "F8 56 4E 89", "ldrt r4,[r6,#0x89]", // 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx // A8.6.86 T3
-/// "F3 BF 8F 0F", "leavex", // 1111 0011 1011 :::: 10.0 :::: 0000 :::: // A9.3.1 T1
- "EA 4F 45 49", "lsl.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx00 xxxx // A8.6.88 T2
- "EA 4F 06 48", "lsl.w r6,r8,#1", // 1110 1010 0100 1111 .xxx xxxx xx00 xxxx // A8.6.88 T2
- "FA 09 F5 0A", "lsl.w r5,r9,r10", // 1111 1010 0000 xxxx 1111 xxxx 0000 xxxx // A8.6.89 T2
- "EA 5F 45 49", "lsls.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx00 xxxx // A8.6.89 T2
- "EA 5F 06 48", "lsls.w r6,r8,#1", // 1110 1010 0101 1111 .xxx xxxx xx00 xxxx // A8.6.89 T2
- "FA 19 F5 0A", "lsls.w r5,r9,r10", // 1111 1010 0001 xxxx 1111 xxxx 0000 xxxx // A8.6.89 T2
- "EA 4F 45 59", "lsr.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
- "EA 4F 06 18", "lsr.w r6,r8,#32", // 1110 1010 0100 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
- "FA 29 F5 0A", "lsr.w r5,r9,r10", // 1111 1010 0010 xxxx 1111 xxxx 0000 xxxx // A8.6.91 T2
- "EA 5F 45 59", "lsrs.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
- "EA 5F 06 18", "lsrs.w r6,r8,#32", // 1110 1010 0101 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
- "FA 39 F5 0A", "lsrs.w r5,r9,r10", // 1111 1010 0011 xxxx 1111 xxxx 0000 xxxx // A8.6.91 T2
- "EE C9 59 FA", "mcr p9,0x6,r5,c9,c10,0x7", // 1110 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx // A8.6.92 T1/A1
- "FE C9 59 FA", "mcr2 p9,0x6,r5,c9,c10,0x7", // 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx // A8.6.92 T2/A2
- "EC 46 59 C9", "mcrr p9,0xc,r5,r6,c9", // 1110 1100 0100 xxxx xxxx xxxx xxxx xxxx // A8.6.93 T1/A1
- "FC 46 59 C9", "mcrr2 p9,0xc,r5,r6,c9", // 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx // A8.6.93 T2/A2
- "FB 09 85 0A", "mla r5,r9,r10,r8", // 1111 1011 0000 xxxx xxxx xxxx 0000 xxxx // A8.6.94 T1
- "FB 09 85 1A", "mls r5,r9,r10,r8", // 1111 1011 0000 xxxx xxxx xxxx 0001 xxxx // A8.6.95 T1
- "F0 4F 05 71", "mov.w r5,#0x71", // 1111 0x00 010x 1111 0xxx xxxx xxxx xxxx // A8.6.96 T2
- "EA 4F 05 0A", "mov.w r5,r10", // 1110 1010 010x 1111 .000 xxxx 0000 xxxx // A8.6.97 T3
- "F0 5F 05 73", "movs.w r5,#0x73", // 1111 0x00 010x 1111 0xxx xxxx xxxx xxxx // A8.6.96 T2
- "EA 5F 05 0A", "movs.w r5,r10", // 1110 1010 010x 1111 .000 xxxx 0000 xxxx // A8.6.97 T3
- "F2 C0 25 87", "movt r5,#0x287", // 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.99 T1
- "F6 C6 35 89", "movt r5,#0x6b89", // 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.99 T1
- "F2 40 25 87", "movw r5,#0x287", // 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.96 T3
- "F6 46 35 89", "movw r5,#0x6b89", // 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.96 T3
- "EE D5 F9 B9", "mrc p9,0x6,apsr_nzcv,c5,c9,0x5", // 1110 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T1/A1
- "EE F5 59 99", "mrc p9,0x7,r5,c5,c9,0x4", // 1110 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T1/A1
- "FE 95 F9 F9", "mrc2 p9,0x4,apsr_nzcv,c5,c9,0x7", // 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T2/A2
- "FE B5 59 D9", "mrc2 p9,0x5,r5,c5,c9,0x6", // 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T2/A2
- "EC 56 59 F9", "mrrc p9,0xf,r5,r6,c9", // 1110 1100 0101 xxxx xxxx xxxx xxxx xxxx // A8.6.101 T1/A1
- "FC 56 59 39", "mrrc2 p9,0x3,r5,r6,c9", // 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx // A8.6.101 T2/A2
- "F3 EF 85 00", "mrs r5,cpsr", // 1111 0011 1110 :::: 10.0 xxxx .... .... // A8.6.102 T1
- "F3 FF 85 00", "mrs r5,spsr", // 1111 0011 1110 :::: 10.0 xxxx .... .... // B6.1.5 T1
- "F3 8A 88 00", "msr cpsr_f,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
- "F3 8A 84 00", "msr cpsr_s,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
- "F3 8A 8C 00", "msr cpsr_fs,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
- "F3 8A 8F 00", "msr cpsr_cxfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
- "F3 8A 8E 00", "msr cpsr_xfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
- "F3 8A 8D 00", "msr cpsr_cfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
- "F3 9A 8F 00", "msr spsr_cxfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
- "FB 09 F5 0A", "mul r5,r9,r10", // 1111 1011 0000 xxxx 1111 xxxx 0000 xxxx // A8.6.105 T2
- "F0 6F 05 71", "mvn r5,#0x71", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 05 F7", "mvn r5,#0xf7", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 15 78", "mvn r5,#0x780078", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 15 FC", "mvn r5,#0xfc00fc", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 25 64", "mvn r5,#0x64006400", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 25 E3", "mvn r5,#0xe300e300", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 45 60", "mvn r5,#0xe0000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 6F 45 E0", "mvn r5,#0x70000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 6F 05 60", "mvn r5,#0xe00000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 6F 45 60", "mvn r5,#0xe000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 6F 65 60", "mvn r5,#0xe00", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "EA 6F 05 09", "mvn.w r5,r9", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 6F 14 A8", "mvn.w r4,r8,asr #6", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 6F 03 47", "mvn.w r3,r7,lsl #1", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 6F 02 16", "mvn.w r2,r6,lsr #32", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 6F 75 F9", "mvn.w r5,r9,ror #31", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 6F 05 38", "mvn.w r5,r8,rrx", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "F0 7F 05 71", "mvns r5,#0x71", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 05 F7", "mvns r5,#0xf7", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 15 78", "mvns r5,#0x780078", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 15 FC", "mvns r5,#0xfc00fc", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 25 64", "mvns r5,#0x64006400", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 25 E3", "mvns r5,#0xe300e300", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 45 60", "mvns r5,#0xe0000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F0 7F 45 E0", "mvns r5,#0x70000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 7F 05 60", "mvns r5,#0xe00000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 7F 45 60", "mvns r5,#0xe000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "F4 7F 65 60", "mvns r5,#0xe00", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
- "EA 7F 05 09", "mvns.w r5,r9", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 7F 14 A8", "mvns.w r4,r8,asr #6", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 7F 03 47", "mvns.w r3,r7,lsl #1", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 7F 02 16", "mvns.w r2,r6,lsr #32", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 7F 75 F9", "mvns.w r5,r9,ror #31", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "EA 7F 05 38", "mvns.w r5,r8,rrx", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
- "F3 AF 80 00", "nop.w", // 1111 0011 0110 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
- "F0 6A 05 71", "orn r5,r10,#0x71", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 6B 06 F7", "orn r6,r11,#0xf7", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 69 14 78", "orn r4,r9,#0x780078", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 68 13 FC", "orn r3,r8,#0xfc00fc", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 67 25 64", "orn r5,r7,#0x64006400", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 66 25 E3", "orn r5,r6,#0xe300e300", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 67 46 60", "orn r6,r7,#0xe0000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 68 47 E0", "orn r7,r8,#0x70000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 6A 05 60", "orn r5,r10,#0xe00000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 6A 45 60", "orn r5,r10,#0xe000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 6A 65 60", "orn r5,r10,#0xe00", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "EA 69 05 0A", "orn r5,r9,r10", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 68 14 A9", "orn r4,r8,r9,asr #6", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 67 03 48", "orn r3,r7,r8,lsl #1", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 66 02 17", "orn r2,r6,r7,lsr #32", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 69 75 F8", "orn r5,r9,r8,ror #31", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 68 05 39", "orn r5,r8,r9,rrx", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "F0 7A 05 71", "orns r5,r10,#0x71", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 7B 06 F7", "orns r6,r11,#0xf7", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 79 14 78", "orns r4,r9,#0x780078", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 78 13 FC", "orns r3,r8,#0xfc00fc", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 77 25 64", "orns r5,r7,#0x64006400", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 76 25 E3", "orns r5,r6,#0xe300e300", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 77 46 60", "orns r6,r7,#0xe0000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F0 78 47 E0", "orns r7,r8,#0x70000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 7A 05 60", "orns r5,r10,#0xe00000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 7A 45 60", "orns r5,r10,#0xe000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "F4 7A 65 60", "orns r5,r10,#0xe00", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
- "EA 79 05 0A", "orns r5,r9,r10", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 78 14 A9", "orns r4,r8,r9,asr #6", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 77 03 48", "orns r3,r7,r8,lsl #1", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 76 02 17", "orns r2,r6,r7,lsr #32", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 79 75 F8", "orns r5,r9,r8,ror #31", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "EA 78 05 39", "orns r5,r8,r9,rrx", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
- "F0 4A 05 71", "orr r5,r10,#0x71", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 4B 06 F7", "orr r6,r11,#0xf7", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 49 14 78", "orr r4,r9,#0x780078", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 48 13 FC", "orr r3,r8,#0xfc00fc", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 47 25 64", "orr r5,r7,#0x64006400", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 46 25 E3", "orr r5,r6,#0xe300e300", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 47 46 60", "orr r6,r7,#0xe0000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 48 47 E0", "orr r7,r8,#0x70000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 4A 05 60", "orr r5,r10,#0xe00000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 4A 45 60", "orr r5,r10,#0xe000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 4A 65 60", "orr r5,r10,#0xe00", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "EA 49 05 0A", "orr.w r5,r9,r10", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 48 14 A9", "orr.w r4,r8,r9,asr #6", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 47 03 48", "orr.w r3,r7,r8,lsl #1", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 46 02 17", "orr.w r2,r6,r7,lsr #32", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 49 75 F8", "orr.w r5,r9,r8,ror #31", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 48 05 39", "orr.w r5,r8,r9,rrx", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "F0 5A 05 71", "orrs r5,r10,#0x71", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 5B 06 F7", "orrs r6,r11,#0xf7", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 59 14 78", "orrs r4,r9,#0x780078", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 58 13 FC", "orrs r3,r8,#0xfc00fc", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 57 25 64", "orrs r5,r7,#0x64006400", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 56 25 E3", "orrs r5,r6,#0xe300e300", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 57 46 60", "orrs r6,r7,#0xe0000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F0 58 47 E0", "orrs r7,r8,#0x70000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 5A 05 60", "orrs r5,r10,#0xe00000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 5A 45 60", "orrs r5,r10,#0xe000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "F4 5A 65 60", "orrs r5,r10,#0xe00", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
- "EA 59 05 0A", "orrs.w r5,r9,r10", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 58 14 A9", "orrs.w r4,r8,r9,asr #6", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 57 03 48", "orrs.w r3,r7,r8,lsl #1", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 56 02 17", "orrs.w r2,r6,r7,lsr #32", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 59 75 F8", "orrs.w r5,r9,r8,ror #31", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA 58 05 39", "orrs.w r5,r8,r9,rrx", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
- "EA C9 05 0A", "pkhbt r5,r9,r10", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
- "EA C7 03 48", "pkhbt r3,r7,r8,lsl #1", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
- "EA C8 64 A9", "pkhtb r4,r8,r9,asr #26", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
- "F8 9A F9 87", "pld [r10,#0x987]", // 1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx // A8.6.117 T1
- "F8 1A FC 71", "pld [r10,#-0x71]", // 1111 1000 00x1 xxxx 1111 1100 xxxx xxxx // A8.6.117 T2
- "F8 1F F9 87", "pld [pc,#-0x987] ; 0xfffff679", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
- "F8 9F F9 87", "pld [pc,#0x987] ; 0x987", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
- "F8 1A F0 19", "pld [r10,r9,lsl #1]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F8 1A F0 39", "pld [r10,r9,lsl #3]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F8 1A F0 09", "pld [r10,r9]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F8 BA F9 87", "pldw [r10,#0x987]", // 1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx // A8.6.117 T1
- "F8 3A FC 71", "pldw [r10,#-0x71]", // 1111 1000 00x1 xxxx 1111 1100 xxxx xxxx // A8.6.117 T2
- "F8 3F F9 87", "pld [pc,#-0x987] ; 0xfffff679", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
- "F8 BF F9 87", "pld [pc,#0x987] ; 0x987", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
- "F8 3A F0 19", "pldw [r10,r9,lsl #1]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F8 3A F0 39", "pldw [r10,r9,lsl #3]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F8 3A F0 09", "pldw [r10,r9]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
- "F9 9A F9 87", "pli [r10,#0x987]", // 1111 1000 1001 xxxx 1111 xxxx xxxx xxxx // A8.6.120 T1
- "F9 1A FC 71", "pli [r10,#-0x71]", // 1111 1001 0001 xxxx 1111 1100 xxxx xxxx // A8.6.120 T2
- "F9 1F F9 87", "pli [pc,#-0x987] ; 0xfffff679", // 1111 1001 x001 1111 1111 xxxx xxxx xxxx // A8.6.120 T3
- "F9 9F F9 87", "pli [pc,#0x987] ; 0x987", // 1111 1001 x001 1111 1111 xxxx xxxx xxxx // A8.6.120 T3
- "F9 1A F0 19", "pli [r10,r9,lsl #1]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
- "F9 1A F0 39", "pli [r10,r9,lsl #3]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
- "F9 1A F0 09", "pli [r10,r9]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
- "E8 BD 82 40", "pop.w {r6,r9,pc}", // 1110 1000 1011 1101 xx.x xxxx xxxx xxxx // A8.6.122 T2
- "F8 5D EB 04", "pop.w {lr}", // 1111 1000 0101 1101 xxxx 1011 0000 0100 // A8.6.122 T3
- "E8 AD 12 40", "push.w {r6,r9,r12}", // 1110 1000 1010 1101 .x.x xxxx xxxx xxxx // A8.6.123 T2
- "F8 4D ED 04", "push.w {lr}", // 1111 1000 0100 1101 xxxx 1101 0000 0100 // A8.6.123 T3
- "FA 89 F5 8A", "qadd r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1000 xxxx // A8.6.124 T1
- "FA 99 F5 1A", "qadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0001 xxxx // A8.6.125 T1
- "FA 89 F5 1A", "qadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0001 xxxx // A8.6.126 T1
- "FA A9 F5 1A", "qasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0001 xxxx // A8.6.127 T1
- "FA 89 F5 9A", "qdadd r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1001 xxxx // A8.6.128 T1
- "FA 89 F5 BA", "qdsub r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1011 xxxx // A8.6.129 T1
- "FA E9 F5 1A", "qsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0001 xxxx // A8.6.130 T1
- "FA 89 F5 AA", "qsub r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 101A xxxx // A8.6.131 T1
- "FA D9 F5 1A", "qsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0001 xxxx // A8.6.132 T1
- "FA C9 F5 1A", "qsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0001 xxxx // A8.6.133 T1
- "FA 99 F5 A9", "rbit r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1010 xxxx // A8.6.134 T1
- "FA 99 F5 89", "rev.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1000 xxxx // A8.6.135 T1
- "FA 99 F5 99", "rev16.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1001 xxxx // A8.6.136 T2
- "FA 99 F5 B9", "revsh.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1011 xxxx // A8.6.137 T2
- "E8 1A C0 00", "rfedb r10", // 1110 1000 00x1 xxxx ::.. .... .... .... // B6.1.8 T1
- "E8 3A C0 00", "rfedb r10!", // 1110 1000 00x1 xxxx ::.. .... .... .... // B6.1.8 T1
- "E9 9A C0 00", "rfeia r10", // 1110 1001 10x1 xxxx ::.. .... .... .... // B6.1.8 T1
- "E9 BA C0 00", "rfeia r10!", // 1110 1001 10x1 xxxx ::.. .... .... .... // B6.1.8 T1
- "EA 4F 45 79", "ror r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
- "EA 4F 06 B8", "ror r6,r8,#2", // 1110 1010 0100 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
- "FA 69 F5 0A", "ror.w r5,r9,r10", // 1111 1010 0110 xxxx 1111 xxxx 0000 xxxx // A8.6.140 T2
- "EA 5F 45 79", "rors r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
- "EA 5F 06 B8", "rors r6,r8,#2", // 1110 1010 0101 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
- "FA 79 F5 0A", "rors.w r5,r9,r10", // 1111 1010 0111 xxxx 1111 xxxx 0000 xxxx // A8.6.140 T2
- "EA 4F 06 38", "rrx r6,r8", // 1110 1010 0100 1111 .000 xxxx 0011 xxxx // A8.6.141 T1
- "EA 5F 06 38", "rrxs r6,r8", // 1110 1010 0100 1111 .000 xxxx 0011 xxxx // A8.6.141 T1
- "F1 CA 05 71", "rsb.w r5,r10,#0x71", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 CB 06 F7", "rsb.w r6,r11,#0xf7", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C9 14 78", "rsb.w r4,r9,#0x780078", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C8 13 FC", "rsb.w r3,r8,#0xfc00fc", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C7 25 64", "rsb.w r5,r7,#0x64006400", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C6 25 E3", "rsb.w r5,r6,#0xe300e300", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C7 46 60", "rsb.w r6,r7,#0xe0000000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 C8 47 E0", "rsb.w r7,r8,#0x70000000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 CA 05 60", "rsb.w r5,r10,#0xe00000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 CA 45 60", "rsb.w r5,r10,#0xe000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 CA 65 60", "rsb.w r5,r10,#0xe00", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "EB C9 05 0A", "rsb r5,r9,r10", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB C8 14 A9", "rsb r4,r8,r9,asr #6", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB C7 03 48", "rsb r3,r7,r8,lsl #1", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB C6 02 17", "rsb r2,r6,r7,lsr #32", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB C9 75 F8", "rsb r5,r9,r8,ror #31", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB C8 05 39", "rsb r5,r8,r9,rrx", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
- "F1 DA 05 71", "rsbs.w r5,r10,#0x71", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 DB 06 F7", "rsbs.w r6,r11,#0xf7", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D9 14 78", "rsbs.w r4,r9,#0x780078", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D8 13 FC", "rsbs.w r3,r8,#0xfc00fc", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D7 25 64", "rsbs.w r5,r7,#0x64006400", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D6 25 E3", "rsbs.w r5,r6,#0xe300e300", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D7 46 60", "rsbs.w r6,r7,#0xe0000000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F1 D8 47 E0", "rsbs.w r7,r8,#0x70000000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 DA 05 60", "rsbs.w r5,r10,#0xe00000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 DA 45 60", "rsbs.w r5,r10,#0xe000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "F5 DA 65 60", "rsbs.w r5,r10,#0xe00", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
- "EB D9 05 0A", "rsbs r5,r9,r10", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB D8 14 A9", "rsbs r4,r8,r9,asr #6", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB D7 03 48", "rsbs r3,r7,r8,lsl #1", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB D6 02 17", "rsbs r2,r6,r7,lsr #32", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB D9 75 F8", "rsbs r5,r9,r8,ror #31", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "EB D8 05 39", "rsbs r5,r8,r9,rrx", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
- "FA 99 F5 0A", "sadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0000 xxxx // A8.6.148 T1
- "FA 89 F5 0A", "sadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0000 xxxx // A8.6.149 T1
- "FA A9 F5 0A", "sasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0000 xxxx // A8.6.150 T1
- "F1 6A 05 71", "sbc r5,r10,#0x71", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 6B 06 F7", "sbc r6,r11,#0xf7", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 69 14 78", "sbc r4,r9,#0x780078", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 68 13 FC", "sbc r3,r8,#0xfc00fc", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 67 25 64", "sbc r5,r7,#0x64006400", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 66 25 E3", "sbc r5,r6,#0xe300e300", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 67 46 60", "sbc r6,r7,#0xe0000000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 68 47 E0", "sbc r7,r8,#0x70000000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 6A 05 60", "sbc r5,r10,#0xe00000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 6A 45 60", "sbc r5,r10,#0xe000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 6A 65 60", "sbc r5,r10,#0xe00", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "EB 69 05 0A", "sbc.w r5,r9,r10", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 68 14 A9", "sbc.w r4,r8,r9,asr #6", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 67 03 48", "sbc.w r3,r7,r8,lsl #1", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 66 02 17", "sbc.w r2,r6,r7,lsr #32", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 69 75 F8", "sbc.w r5,r9,r8,ror #31", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 68 05 39", "sbc.w r5,r8,r9,rrx", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "F1 7A 05 71", "sbcs r5,r10,#0x71", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 7B 06 F7", "sbcs r6,r11,#0xf7", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 79 14 78", "sbcs r4,r9,#0x780078", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 78 13 FC", "sbcs r3,r8,#0xfc00fc", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 77 25 64", "sbcs r5,r7,#0x64006400", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 76 25 E3", "sbcs r5,r6,#0xe300e300", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 77 46 60", "sbcs r6,r7,#0xe0000000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F1 78 47 E0", "sbcs r7,r8,#0x70000000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 7A 05 60", "sbcs r5,r10,#0xe00000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 7A 45 60", "sbcs r5,r10,#0xe000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "F5 7A 65 60", "sbcs r5,r10,#0xe00", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
- "EB 79 05 0A", "sbcs.w r5,r9,r10", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 78 14 A9", "sbcs.w r4,r8,r9,asr #6", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 77 03 48", "sbcs.w r3,r7,r8,lsl #1", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 76 02 17", "sbcs.w r2,r6,r7,lsr #32", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 79 75 F8", "sbcs.w r5,r9,r8,ror #31", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "EB 78 05 39", "sbcs.w r5,r8,r9,rrx", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
- "F3 47 05 1F", "sbfx r5,r7,#0,#32", // 1111 0.11 0100 xxxx 0xxx xxxx xx.x xxxx // A8.6.154 T1
- "F3 48 06 59", "sbfx r6,r8,#1,#26", // 1111 0.11 0100 xxxx 0xxx xxxx xx.x xxxx // A8.6.154 T1
- "FB 99 F5 FA", "sdiv r5,r9,r10", // 1111 1011 1001 xxxx :::: xxxx 1111 xxxx // A8.6.155 T1
- "FA A9 F5 8A", "sel r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 1000 xxxx // A8.6.156 T1
- "F3 AF 80 04", "sev.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
- "FA 99 F5 2A", "shadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0010 xxxx // A8.6.159 T1
- "FA 89 F5 2A", "shadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0010 xxxx // A8.6.160 T1
- "FA A9 F5 2A", "shasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0010 xxxx // A8.6.161 T1
- "FA E9 F5 2A", "shsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0010 xxxx // A8.6.162 T1
- "FA D9 F5 2A", "shsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0010 xxxx // A8.6.163 T1
- "FA C9 F5 2A", "shsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0010 xxxx // A8.6.164 T1
- "F7 FE 80 00", "smc #0xe", // 1111 0111 1111 xxxx 1000 .... .... .... // B6.1.9 T1
- "FB 19 85 0A", "smlabb r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
- "FB 19 85 1A", "smlabt r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
- "FB 19 85 2A", "smlatb r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
- "FB 19 85 3A", "smlatt r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
- "FB 29 85 0A", "smlad r5,r9,r10,r8", // 1111 1011 0010 xxxx xxxx xxxx 00xx xxxx // A8.6.167 T1
- "FB 29 85 1A", "smladx r5,r9,r10,r8", // 1111 1011 0010 xxxx xxxx xxxx 00xx xxxx // A8.6.167 T1
- "FB CA 56 09", "smlal r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 0000 xxxx // A8.6.168 T1
- "FB CA 56 89", "smlalbb r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
- "FB CA 56 99", "smlalbt r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
- "FB CA 56 A9", "smlaltb r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
- "FB CA 56 B9", "smlaltt r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
- "FB CA 56 C9", "smlald r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 110x xxxx // A8.6.170 T1
- "FB CA 56 D9", "smlaldx r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 110x xxxx // A8.6.170 T1
- "FB 39 85 0A", "smlawb r5,r9,r10,r8", // 1111 1011 0011 xxxx xxxx xxxx 000x xxxx // A8.6.171 T1
- "FB 39 85 1A", "smlawt r5,r9,r10,r8", // 1111 1011 0011 xxxx xxxx xxxx 000x xxxx // A8.6.171 T1
- "FB 49 85 0A", "smlsd r5,r9,r10,r8", // 1111 1011 0100 xxxx xxxx xxxx 000x xxxx // A8.6.172 T1
- "FB 49 85 1A", "smlsdx r5,r9,r10,r8", // 1111 1011 0100 xxxx xxxx xxxx 000x xxxx // A8.6.172 T1
- "FB DA 56 C9", "smlsld r5,r6,r10,r9", // 1111 1011 1101 xxxx xxxx xxxx 110x xxxx // A8.6.173 T1
- "FB DA 56 D9", "smlsldx r5,r6,r10,r9", // 1111 1011 1101 xxxx xxxx xxxx 110x xxxx // A8.6.173 T1
- "FB 59 85 0A", "smmla r5,r9,r10,r8", // 1111 1011 0101 xxxx xxxx xxxx 000x xxxx // A8.6.174 T1
- "FB 59 85 1A", "smmlar r5,r9,r10,r8", // 1111 1011 0101 xxxx xxxx xxxx 000x xxxx // A8.6.174 T1
- "FB 69 85 0A", "smmls r5,r9,r10,r8", // 1111 1011 0110 xxxx xxxx xxxx 000x xxxx // A8.6.175 T1
- "FB 69 85 1A", "smmlsr r5,r9,r10,r8", // 1111 1011 0110 xxxx xxxx xxxx 000x xxxx // A8.6.175 T1
- "FB 59 F5 0A", "smmul r5,r9,r10", // 1111 1011 0101 xxxx 1111 xxxx 000x xxxx // A8.6.176 T1
- "FB 59 F5 1A", "smmulr r5,r9,r10", // 1111 1011 0101 xxxx 1111 xxxx 000x xxxx // A8.6.176 T1
- "FB 29 F5 0A", "smuad r5,r9,r10", // 1111 1011 0010 xxxx 1111 xxxx 000x xxxx // A8.6.177 T1
- "FB 29 F5 1A", "smuadx r5,r9,r10", // 1111 1011 0010 xxxx 1111 xxxx 000x xxxx // A8.6.177 T1
- "FB 19 F5 0A", "smulbb r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
- "FB 19 F5 1A", "smulbt r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
- "FB 19 F5 2A", "smultb r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
- "FB 19 F5 3A", "smultt r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
- "FB 8A 56 09", "smull r5,r6,r10,r9", // 1111 1011 1000 xxxx xxxx xxxx 0000 xxxx // A8.6.179 T1
- "FB 39 F5 0A", "smulwb r5,r9,r10", // 1111 1011 0011 xxxx 1111 xxxx 000x xxxx // A8.6.180 T1
- "FB 39 F5 1A", "smulwt r5,r9,r10", // 1111 1011 0011 xxxx 1111 xxxx 000x xxxx // A8.6.180 T1
- "FB 49 F5 0A", "smusd r5,r9,r10", // 1111 1011 0100 xxxx 1111 xxxx 000x xxxx // A8.6.181 T1
- "FB 49 F5 1A", "smusdx r5,r9,r10", // 1111 1011 0100 xxxx 1111 xxxx 000x xxxx // A8.6.181 T1
- "E8 2D C0 13", "srsdb sp!,#0x13", // 1110 1000 00x0 ::.: ::.. .... ...x xxxx // B6.1.10 T1
- "E8 0D C0 13", "srsdb sp,#0x13", // 1110 1000 00x0 ::.: ::.. .... ...x xxxx // B6.1.10 T1
- "E9 AD C0 13", "srsia sp!,#0x13", // 1110 1001 10x0 ::.: ::.. .... ...x xxxx // B6.1.10 T2
- "E9 8D C0 13", "srsia sp,#0x13", // 1110 1001 10x0 ::.: ::.. .... ...x xxxx // B6.1.10 T2
- "F3 0A 05 1C", "ssat r5,#29,r10", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
- "F3 2A 05 5C", "ssat r5,#29,r10,asr #1", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
- "F3 2A 75 9C", "ssat r5,#29,r10,asr #30", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
- "F3 0A 05 5C", "ssat r5,#29,r10,lsl #1", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
- "F3 0A 75 DC", "ssat r5,#29,r10,lsl #31", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
- "F3 2A 05 0C", "ssat16 r5,#13,r10", // 1111 0.11 0010 xxxx 0000 xxxx 00.. xxxx // A8.6.184 T1
- "FA E9 F5 0A", "ssax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0000 xxxx // A8.6.185 T1
- "FA D9 F5 0A", "ssub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0000 xxxx // A8.6.186 T1
- "FA C9 F5 0A", "ssub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0000 xxxx // A8.6.187 T1
- "ED 0A B9 21", "stc p9,c11,[r10,#-0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED 2A B9 21", "stc p9,c11,[r10,#-0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED 8A B9 21", "stc p9,c11,[r10,#0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED AA B9 21", "stc p9,c11,[r10,#0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC 2A B9 21", "stc p9,c11,[r10],#-0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC AA B9 21", "stc p9,c11,[r10],#0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC 8A B9 00", "stc p9,c11,[r10],{0}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC 8A B9 FF", "stc p9,c11,[r10],{255}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "FD 0A B9 21", "stc2 p9,c11,[r10,#-0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD 2A B9 21", "stc2 p9,c11,[r10,#-0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD 8A B9 21", "stc2 p9,c11,[r10,#0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD AA B9 21", "stc2 p9,c11,[r10,#0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC 2A B9 21", "stc2 p9,c11,[r10],#-0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC AA B9 21", "stc2 p9,c11,[r10],#0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC 8A B9 00", "stc2 p9,c11,[r10],{0}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC 8A B9 FF", "stc2 p9,c11,[r10],{255}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD 4A B9 21", "stc2l p9,c11,[r10,#-0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD 6A B9 21", "stc2l p9,c11,[r10,#-0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD CA B9 21", "stc2l p9,c11,[r10,#0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FD EA B9 21", "stc2l p9,c11,[r10,#0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC 6A B9 21", "stc2l p9,c11,[r10],#-0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC EA B9 21", "stc2l p9,c11,[r10],#0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC CA B9 00", "stc2l p9,c11,[r10],{0}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "FC CA B9 FF", "stc2l p9,c11,[r10],{255}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
- "ED 4A B9 21", "stcl p9,c11,[r10,#-0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED 6A B9 21", "stcl p9,c11,[r10,#-0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED CA B9 21", "stcl p9,c11,[r10,#0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "ED EA B9 21", "stcl p9,c11,[r10,#0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC 6A B9 21", "stcl p9,c11,[r10],#-0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC EA B9 21", "stcl p9,c11,[r10],#0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC CA B9 00", "stcl p9,c11,[r10],{0}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "EC CA B9 FF", "stcl p9,c11,[r10],{255}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
- "E8 AA 42 40", "stm.w r10!,{r6,r9,lr}", // 1110 1000 10x0 xxxx xx.x xxxx xxxx xxxx // A8.6.189 T2
- "E8 8A 42 40", "stm.w r10,{r6,r9,lr}", // 1110 1000 10x0 xxxx xx.x xxxx xxxx xxxx // A8.6.189 T2
- "E9 2A 42 40", "stmdb r10!,{r6,r9,lr}", // 1110 1001 00x0 xxxx xx.x xxxx xxxx xxxx // A8.6.191 T1
- "E9 0A 42 40", "stmdb r10,{r6,r9,lr}", // 1110 1001 00x0 xxxx xx.x xxxx xxxx xxxx // A8.6.191 T1
- "F8 CA 50 00", "str.w r5,[r10]", // 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx // A8.6.193 T3
- "F8 C6 47 89", "str.w r4,[r6,#0x789]", // 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx // A8.6.193 T3
- "F8 4A 5C 80", "str r5,[r10,#-0x80]", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
- "F8 4A 5A 82", "str r5,[r10],#0x82", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
- "F8 4A 58 84", "str r5,[r10],#-0x84", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
- "F8 4A 5F 86", "str r5,[r10,#0x86]!", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
- "F8 4A 5D 88", "str r5,[r10,#-0x88]!", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
- "F8 4A 50 08", "str.w r5,[r10,r8]", // 1111 1000 0100 xxxx xxxx 0000 00xx xxxx // A8.6.195 T2
- "F8 49 60 37", "str.w r6,[r9,r7,lsl #3]", // 1111 1000 0100 xxxx xxxx 0000 00xx xxxx // A8.6.195 T2
- "F8 8A 50 00", "strb.w r5,[r10]", // 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx // A8.6.196 T2
- "F8 86 47 89", "strb.w r4,[r6,#0x789]", // 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx // A8.6.196 T2
- "F8 0A 5C 80", "strb r5,[r10,#-0x80]", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
- "F8 0A 5A 82", "strb r5,[r10],#0x82", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
- "F8 0A 58 84", "strb r5,[r10],#-0x84", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
- "F8 0A 5F 86", "strb r5,[r10,#0x86]!", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
- "F8 0A 5D 88", "strb r5,[r10,#-0x88]!", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
- "F8 0A 50 08", "strb.w r5,[r10,r8]", // 1111 1000 0000 xxxx xxxx 0000 00xx xxxx // A8.6.198 T2
- "F8 09 60 37", "strb.w r6,[r9,r7,lsl #3]", // 1111 1000 0000 xxxx xxxx 0000 00xx xxxx // A8.6.198 T2
- "F8 0A 5E 00", "strbt r5,[r10]", // 1111 1000 0000 xxxx xxxx 1110 xxxx xxxx // A8.6.199 T1
- "F8 09 6E 84", "strbt r6,[r9,#0x84]", // 1111 1000 0000 xxxx xxxx 1110 xxxx xxxx // A8.6.199 T1
- "E9 4A 67 84", "strd r6,r7,[r10,#-0x210]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E9 6A 67 85", "strd r6,r7,[r10,#-0x214]!", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E9 CA 67 84", "strd r6,r7,[r10,#0x210]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E9 EA 67 85", "strd r6,r7,[r10,#0x214]!", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E9 4A 67 00", "strd r6,r7,[r10]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E8 6A 67 84", "strd r6,r7,[r10],#-0x210", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E8 EA 67 85", "strd r6,r7,[r10],#0x214", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
- "E8 4A 95 00", "strex r5,r9,[r10]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.202 T1
- "E8 49 86 87", "strex r6,r8,[r9,#0x21c]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.202 T1
- "E8 CA 9F 45", "strexb r5,r9,[r10]", // 1110 1000 1100 xxxx xxxx :::: 0100 :::: // A8.6.203 T1
- "E8 C8 67 74", "strexd r4,r6,r7,[r8]", // 1110 1000 1100 xxxx xxxx xxxx 0111 :::: // A8.6.204 T1
- "E8 C9 8F 53", "strexh r3,r8,[r9]", // 1110 1000 1100 xxxx xxxx :::: 0101 :::: // A8.6.205 T1
- "F8 AA 50 00", "strh.w r5,[r10]", // 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx // A8.6.206 T2
- "F8 A6 47 89", "strh.w r4,[r6,#0x789]", // 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx // A8.6.206 T2
- "F8 2A 5C 80", "strh r5,[r10,#-0x80]", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
- "F8 2A 5A 82", "strh r5,[r10],#0x82", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
- "F8 2A 58 84", "strh r5,[r10],#-0x84", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
- "F8 2A 5F 86", "strh r5,[r10,#0x86]!", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
- "F8 2A 5D 88", "strh r5,[r10,#-0x88]!", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
- "F8 2A 50 08", "strh.w r5,[r10,r8]", // 1111 1000 0010 xxxx xxxx 0000 00xx xxxx // A8.6.208 T2
- "F8 29 60 37", "strh.w r6,[r9,r7,lsl #3]", // 1111 1000 0010 xxxx xxxx 0000 00xx xxxx // A8.6.208 T2
- "F8 2A 5E 00", "strht r5,[r10]", // 1111 1000 0010 xxxx xxxx 1110 xxxx xxxx // A8.6.209 T1
- "F8 29 6E 84", "strht r6,[r9,#0x84]", // 1111 1000 0010 xxxx xxxx 1110 xxxx xxxx // A8.6.209 T1
- "F8 4A 5E 00", "strt r5,[r10]", // 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx // A8.6.210 T1
- "F8 46 4E 89", "strt r4,[r6,#0x89]", // 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx // A8.6.210 T1
- "F2 AF 05 71", "sub r5,pc,#0x71", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
- "F2 AF 36 72", "sub r6,pc,#0x372", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
- "F6 AF 47 78", "sub r7,pc,#0xc78", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
- "F1 AA 05 71", "sub.w r5,r10,#0x71", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 AB 06 F7", "sub.w r6,r11,#0xf7", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A9 14 78", "sub.w r4,r9,#0x780078", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A8 13 FC", "sub.w r3,r8,#0xfc00fc", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A7 25 64", "sub.w r5,r7,#0x64006400", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A6 25 E3", "sub.w r5,r6,#0xe300e300", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A7 46 60", "sub.w r6,r7,#0xe0000000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 A8 47 E0", "sub.w r7,r8,#0x70000000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 AA 05 60", "sub.w r5,r10,#0xe00000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 AA 45 60", "sub.w r5,r10,#0xe000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 AA 65 60", "sub.w r5,r10,#0xe00", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "EB A9 05 0A", "sub.w r5,r9,r10", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB A8 14 A9", "sub.w r4,r8,r9,asr #6", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB A7 03 48", "sub.w r3,r7,r8,lsl #1", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB A6 02 17", "sub.w r2,r6,r7,lsr #32", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB A9 75 F8", "sub.w r5,r9,r8,ror #31", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB A8 05 39", "sub.w r5,r8,r9,rrx", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 05 71", "sub.w r5,sp,#0x71", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 06 F7", "sub.w r6,sp,#0xf7", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 14 78", "sub.w r4,sp,#0x780078", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 13 FC", "sub.w r3,sp,#0xfc00fc", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 25 64", "sub.w r5,sp,#0x64006400", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 25 E3", "sub.w r5,sp,#0xe300e300", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 46 60", "sub.w r6,sp,#0xe0000000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 AD 47 E0", "sub.w r7,sp,#0x70000000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F5 AD 05 60", "sub.w r5,sp,#0xe00000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F5 AD 45 60", "sub.w r5,sp,#0xe000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F5 AD 65 60", "sub.w r5,sp,#0xe00", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 05 0A", "sub.w r5,sp,r10", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 14 A9", "sub.w r4,sp,r9,asr #6", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 03 48", "sub.w r3,sp,r8,lsl #1", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 02 17", "sub.w r2,sp,r7,lsr #32", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 75 F8", "sub.w r5,sp,r8,ror #31", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "EB AD 05 39", "sub.w r5,sp,r9,rrx", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
- "F1 BA 05 71", "subs.w r5,r10,#0x71", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 BB 06 F7", "subs.w r6,r11,#0xf7", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B9 14 78", "subs.w r4,r9,#0x780078", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B8 13 FC", "subs.w r3,r8,#0xfc00fc", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B7 25 64", "subs.w r5,r7,#0x64006400", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B6 25 E3", "subs.w r5,r6,#0xe300e300", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B7 46 60", "subs.w r6,r7,#0xe0000000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F1 B8 47 E0", "subs.w r7,r8,#0x70000000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 BA 05 60", "subs.w r5,r10,#0xe00000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 BA 45 60", "subs.w r5,r10,#0xe000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "F5 BA 65 60", "subs.w r5,r10,#0xe00", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
- "EB B9 05 0A", "subs.w r5,r9,r10", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "EB B8 14 A9", "subs.w r4,r8,r9,asr #6", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "EB B7 03 48", "subs.w r3,r7,r8,lsl #1", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "EB B6 02 17", "subs.w r2,r6,r7,lsr #32", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "EB B9 75 F8", "subs.w r5,r9,r8,ror #31", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "EB B8 05 39", "subs.w r5,r8,r9,rrx", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
- "F1 BD 05 71", "subs.w r5,sp,#0x71", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 06 F7", "subs.w r6,sp,#0xf7", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 14 78", "subs.w r4,sp,#0x780078", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 13 FC", "subs.w r3,sp,#0xfc00fc", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 25 64", "subs.w r5,sp,#0x64006400", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 25 E3", "subs.w r5,sp,#0xe300e300", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 46 60", "subs.w r6,sp,#0xe0000000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F1 BD 47 E0", "subs.w r7,sp,#0x70000000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F5 BD 05 60", "subs.w r5,sp,#0xe00000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F5 BD 45 60", "subs.w r5,sp,#0xe000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "F5 BD 65 60", "subs.w r5,sp,#0xe00", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
- "EB BD 05 0A", "subs.w r5,sp,r10", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "EB BD 14 A9", "subs.w r4,sp,r9,asr #6", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "EB BD 03 48", "subs.w r3,sp,r8,lsl #1", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "EB BD 02 17", "subs.w r2,sp,r7,lsr #32", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "EB BD 75 F8", "subs.w r5,sp,r8,ror #31", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "EB BD 05 39", "subs.w r5,sp,r9,rrx", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
- "F2 AD 05 71", "subw r5,sp,#0x71", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
- "F2 AD 36 72", "subw r6,sp,#0x372", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
- "F6 AD 47 78", "subw r7,sp,#0xc78", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
- "FA 49 F5 8A", "sxtab r5,r9,r10", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 49 F5 9A", "sxtab r5,r9,r10,ror #8", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 49 F5 AA", "sxtab r5,r9,r10,ror #16", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 49 F5 BA", "sxtab r5,r9,r10,ror #24", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 29 F5 8A", "sxtab16 r5,r9,r10", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 29 F5 9A", "sxtab16 r5,r9,r10,ror #8", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 29 F5 AA", "sxtab16 r5,r9,r10,ror #16", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 29 F5 BA", "sxtab16 r5,r9,r10,ror #24", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 09 F5 8A", "sxtah r5,r9,r10", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 09 F5 9A", "sxtah r5,r9,r10,ror #8", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 09 F5 AA", "sxtah r5,r9,r10,ror #16", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 09 F5 BA", "sxtah r5,r9,r10,ror #24", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 4F F5 89", "sxtb.w r5,r9", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 4F F5 99", "sxtb.w r5,r9,ror #8", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 4F F5 A9", "sxtb.w r5,r9,ror #16", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 4F F5 B9", "sxtb.w r5,r9,ror #24", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 2F F5 89", "sxtb16 r5,r9", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 2F F5 99", "sxtb16 r5,r9,ror #8", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 2F F5 A9", "sxtb16 r5,r9,ror #16", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 2F F5 B9", "sxtb16 r5,r9,ror #24", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 0F F5 8A", "sxth.w r5,r10", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 0F F5 9A", "sxth.w r5,r10,ror #8", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 0F F5 AA", "sxth.w r5,r10,ror #16", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 0F F5 BA", "sxth.w r5,r10,ror #24", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "E8 D5 F0 0A", "tbb [r5,r10]", // 1110 1000 1101 xxxx :::: .... 000x xxxx // A8.6.226 T1
- "E8 D5 F0 1A", "tbh [r5,r10,lsl #1]", // 1110 1000 1101 xxxx :::: .... 000x xxxx // A8.6.226 T1
- "F0 95 0F 71", "teq r5,#0x71", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 0F F7", "teq r5,#0xf7", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 1F 78", "teq r5,#0x780078", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 1F FC", "teq r5,#0xfc00fc", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 2F 64", "teq r5,#0x64006400", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 2F E3", "teq r5,#0xe300e300", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 4F 60", "teq r5,#0xe0000000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F0 95 4F E0", "teq r5,#0x70000000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F4 95 0F 60", "teq r5,#0xe00000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F4 95 4F 60", "teq r5,#0xe000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "F4 95 6F 60", "teq r5,#0xe00", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
- "EA 95 0F 09", "teq r5,r9", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
- "EA 94 1F A8", "teq r4,r8,asr #6", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
- "EA 93 0F 47", "teq r3,r7,lsl #1", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
- "EA 92 0F 16", "teq r2,r6,lsr #32", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
- "EA 95 7F F9", "teq r5,r9,ror #31", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
- "EA 95 0F 38", "teq r5,r8,rrx", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 0F 71", "tst r5,#0x71", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 0F F7", "tst r5,#0xf7", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 1F 78", "tst r5,#0x780078", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 1F FC", "tst r5,#0xfc00fc", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 2F 64", "tst r5,#0x64006400", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 2F E3", "tst r5,#0xe300e300", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 4F 60", "tst r5,#0xe0000000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F0 15 4F E0", "tst r5,#0x70000000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F4 15 0F 60", "tst r5,#0xe00000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F4 15 4F 60", "tst r5,#0xe000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "F4 15 6F 60", "tst r5,#0xe00", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
- "EA 15 0F 09", "tst.w r5,r9", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T1
- "EA 14 1F A8", "tst.w r4,r8,asr #6", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
- "EA 13 0F 47", "tst.w r3,r7,lsl #1", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
- "EA 12 0F 16", "tst.w r2,r6,lsr #32", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
- "EA 15 7F F9", "tst.w r5,r9,ror #31", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
- "EA 15 0F 38", "tst.w r5,r8,rrx", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
- "FA 99 F5 4A", "uadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0100 xxxx // A8.6.233 T1
- "FA 89 F5 4A", "uadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0100 xxxx // A8.6.234 T1
- "FA A9 F5 4A", "uasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0100 xxxx // A8.6.235 T1
- "F3 C7 05 1F", "ubfx r5,r7,#0,#32", // 1111 0.11 1100 xxxx 0xxx xxxx xx.x xxxx // A8.6.236 T1
- "F3 C8 06 59", "ubfx r6,r8,#1,#26", // 1111 0.11 1100 xxxx 0xxx xxxx xx.x xxxx // A8.6.236 T1
- "FB B9 F5 FA", "udiv r5,r9,r10", // 1111 1011 1011 xxxx :::: xxxx 1111 xxxx // A8.6.237 T1
- "FA 99 F5 6A", "uhadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0110 xxxx // A8.6.238 T1
- "FA 89 F5 6A", "uhadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0110 xxxx // A8.6.239 T1
- "FA A9 F5 6A", "uhasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0110 xxxx // A8.6.240 T1
- "FA E9 F5 6A", "uhsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0110 xxxx // A8.6.241 T1
- "FA D9 F5 6A", "uhsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0110 xxxx // A8.6.242 T1
- "FA C9 F5 6A", "uhsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0110 xxxx // A8.6.243 T1
- "FB EA 56 69", "umaal r5,r6,r10,r9", // 1111 1E10 1100 xxxx xxxx xxxx 0110 xxxx // A8.6.244 T1
- "FB EA 56 09", "umlal r5,r6,r10,r9", // 1111 1E10 1100 xxxx xxxx xxxx 0000 xxxx // A8.6.245 T1
- "FB AA 56 09", "umull r5,r6,r10,r9", // 1111 1011 1010 xxxx xxxx xxxx 0000 xxxx // A8.6.246 T1
- "FA 99 F5 5A", "uqadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0101 xxxx // A8.6.247 T1
- "FA 89 F5 5A", "uqadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0101 xxxx // A8.6.248 T1
- "FA A9 F5 5A", "uqasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0101 xxxx // A8.6.249 T1
- "FA E9 F5 5A", "uqsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0101 xxxx // A8.6.250 T1
- "FA D9 F5 5A", "uqsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0101 xxxx // A8.6.251 T1
- "FA C9 F5 5A", "uqsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0101 xxxx // A8.6.252 T1
- "FB 79 F5 0A", "usad8 r5,r9,r10", // 1111 1011 0111 xxxx 1111 xxxx 0000 xxxx // A8.6.253 T1
- "FB 79 85 0A", "usada8 r5,r9,r10,r8", // 1111 1011 0111 xxxx xxxx xxxx 0000 xxxx // A8.6.253 T1
- "F3 8A 05 1C", "usat r5,#28,r10", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
- "F3 AA 05 5C", "usat r5,#28,r10,asr #1", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
- "F3 AA 75 9C", "usat r5,#28,r10,asr #30", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
- "F3 8A 05 5C", "usat r5,#28,r10,lsl #1", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
- "F3 8A 75 DC", "usat r5,#28,r10,lsl #31", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
- "F3 AA 05 0C", "usat16 r5,#12,r10", // 1111 0.11 1010 xxxx 0000 xxxx 00.. xxxx // A8.6.256 T1
- "FA E9 F5 4A", "usax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0100 xxxx // A8.6.257 T1
- "FA D9 F5 4A", "usub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0100 xxxx // A8.6.258 T1
- "FA C9 F5 4A", "usub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0100 xxxx // A8.6.259 T1
- "FA 59 F5 8A", "uxtab r5,r9,r10", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 59 F5 9A", "uxtab r5,r9,r10,ror #8", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 59 F5 AA", "uxtab r5,r9,r10,ror #16", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 59 F5 BA", "uxtab r5,r9,r10,ror #24", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
- "FA 39 F5 8A", "uxtab16 r5,r9,r10", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 39 F5 9A", "uxtab16 r5,r9,r10,ror #8", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 39 F5 AA", "uxtab16 r5,r9,r10,ror #16", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 39 F5 BA", "uxtab16 r5,r9,r10,ror #24", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
- "FA 19 F5 8A", "uxtah r5,r9,r10", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 19 F5 9A", "uxtah r5,r9,r10,ror #8", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 19 F5 AA", "uxtah r5,r9,r10,ror #16", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 19 F5 BA", "uxtah r5,r9,r10,ror #24", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
- "FA 5F F5 89", "uxtb.w r5,r9", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 5F F5 99", "uxtb.w r5,r9,ror #8", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 5F F5 A9", "uxtb.w r5,r9,ror #16", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 5F F5 B9", "uxtb.w r5,r9,ror #24", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
- "FA 3F F5 89", "uxtb16 r5,r9", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 3F F5 99", "uxtb16 r5,r9,ror #8", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 3F F5 A9", "uxtb16 r5,r9,ror #16", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 3F F5 B9", "uxtb16 r5,r9,ror #24", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
- "FA 1F F5 8A", "uxth.w r5,r10", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 1F F5 9A", "uxth.w r5,r10,ror #8", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 1F F5 AA", "uxth.w r5,r10,ror #16", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "FA 1F F5 BA", "uxth.w r5,r10,ror #24", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
- "F3 AF 80 02", "wfe.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411
- "F3 AF 80 03", "wfi.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412
- "F3 AF 80 01", "yield.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413
- };
-
- disassembleInstArray(insts, thumbOptions);
- }
-
- @Test
- public void test32BitThumbVFPInstructions() {
-
- System.out.println("\n====================== ARM VFP ======================\n");
- String[] insts = {
- "EF 49 57 BA", "vaba.s8 d21,d25,d26",
- "EF 59 57 BA", "vaba.s16 d21,d25,d26",
- "EF 69 57 BA", "vaba.s32 d21,d25,d26",
- "FF 49 57 BA", "vaba.u8 d21,d25,d26",
- "FF 59 57 BA", "vaba.u16 d21,d25,d26",
- "FF 69 57 BA", "vaba.u32 d21,d25,d26",
- "EF 4C 67 FE", "vaba.s8 q11,q14,q15",
- "EF 5C 67 FE", "vaba.s16 q11,q14,q15",
- "EF 6C 67 FE", "vaba.s32 q11,q14,q15",
- "FF 4C 67 FE", "vaba.u8 q11,q14,q15",
- "FF 5C 67 FE", "vaba.u16 q11,q14,q15",
- "FF 6C 67 FE", "vaba.u32 q11,q14,q15",
- "EF C9 65 AA", "vabal.s8 q11,d25,d26",
- "EF D9 65 AA", "vabal.s16 q11,d25,d26",
- "EF E9 65 AA", "vabal.s32 q11,d25,d26",
- "FF C9 65 AA", "vabal.u8 q11,d25,d26",
- "FF D9 65 AA", "vabal.u16 q11,d25,d26",
- "FF E9 65 AA", "vabal.u32 q11,d25,d26",
- "EF 49 57 AA", "vabd.s8 d21,d25,d26",
- "EF 59 57 AA", "vabd.s16 d21,d25,d26",
- "EF 69 57 AA", "vabd.s32 d21,d25,d26",
- "FF 49 57 AA", "vabd.u8 d21,d25,d26",
- "FF 59 57 AA", "vabd.u16 d21,d25,d26",
- "FF 69 57 AA", "vabd.u32 d21,d25,d26",
- "EF 4C 67 EE", "vabd.s8 q11,q14,q15",
- "EF 5C 67 EE", "vabd.s16 q11,q14,q15",
- "EF 6C 67 EE", "vabd.s32 q11,q14,q15",
- "FF 4C 67 EE", "vabd.u8 q11,q14,q15",
- "FF 5C 67 EE", "vabd.u16 q11,q14,q15",
- "FF 6C 67 EE", "vabd.u32 q11,q14,q15",
- "FF 69 5D AA", "vabd.f32 d21,d25,d26",
- "FF 6C 6D EE", "vabd.f32 q11,q14,q15",
- "EF C9 67 AA", "vabdl.s8 q11,d25,d26",
- "EF D9 67 AA", "vabdl.s16 q11,d25,d26",
- "EF E9 67 AA", "vabdl.s32 q11,d25,d26",
- "FF C9 67 AA", "vabdl.u8 q11,d25,d26",
- "FF D9 67 AA", "vabdl.u16 q11,d25,d26",
- "FF E9 67 AA", "vabdl.u32 q11,d25,d26",
- "FF F1 63 6E", "vabs.s8 q11,q15",
- "FF F5 63 6E", "vabs.s16 q11,q15",
- "FF F9 63 6E", "vabs.s32 q11,q15",
- "FF F9 67 6E", "vabs.f32 q11,q15",
- "FF F1 53 2A", "vabs.s8 d21,d26",
- "FF F5 53 2A", "vabs.s16 d21,d26",
- "FF F9 53 2A", "vabs.s32 d21,d26",
- "FF F9 57 2A", "vabs.f32 d21,d26",
- "EE F0 5B EA", "vabs.f64 d21,d26",
- "EE F0 AA CD", "vabs.f32 s21,s26",
- "EE F0 5B EA", "vabs.f64 d21,d26",
- "FF 49 5E BA", "vacge.f32 d21,d25,d26",
- "FF 4C 6E FE", "vacge.f32 q11,q14,q15",
- "FF 69 5E BA", "vacgt.f32 d21,d25,d26",
- "FF 6C 6E FE", "vacgt.f32 q11,q14,q15",
- "EF 49 58 AA", "vadd.i8 d21,d25,d26",
- "EF 59 58 AA", "vadd.i16 d21,d25,d26",
- "EF 69 58 AA", "vadd.i32 d21,d25,d26",
- "EF 79 58 AA", "vadd.i64 d21,d25,d26",
- "EF 4C 68 EE", "vadd.i8 q11,q14,q15",
- "EF 5C 68 EE", "vadd.i16 q11,q14,q15",
- "EF 6C 68 EE", "vadd.i32 q11,q14,q15",
- "EF 7C 68 EE", "vadd.i64 q11,q14,q15",
- "EF 49 5D AA", "vadd.f32 d21,d25,d26",
- "EF 4C 6D EE", "vadd.f32 q11,q14,q15",
- "EE 7C AA 8D", "vadd.f32 s21,s25,s26",
- "EE 79 5B AA", "vadd.f64 d21,d25,d26",
- "EF CC 54 AE", "vaddhn.i16 d21,q14,q15",
- "EF DC 54 AE", "vaddhn.i32 d21,q14,q15",
- "EF EC 54 AE", "vaddhn.i64 d21,q14,q15",
- "EF C9 60 AA", "vaddl.s8 q11,d25,d26",
- "EF D9 60 AA", "vaddl.s16 q11,d25,d26",
- "EF E9 60 AA", "vaddl.s32 q11,d25,d26",
- "FF C9 60 AA", "vaddl.u8 q11,d25,d26",
- "FF D9 60 AA", "vaddl.u16 q11,d25,d26",
- "FF E9 60 AA", "vaddl.u32 q11,d25,d26",
- "EF CC 61 AA", "vaddw.s8 q11,q14,d26",
- "EF DC 61 AA", "vaddw.s16 q11,q14,d26",
- "EF EC 61 AA", "vaddw.s32 q11,q14,d26",
- "FF CC 61 AA", "vaddw.u8 q11,q14,d26",
- "FF DC 61 AA", "vaddw.u16 q11,q14,d26",
- "FF EC 61 AA", "vaddw.u32 q11,q14,d26",
- "EF 49 51 BA", "vand d21,d25,d26",
- "EF 4C 61 FE", "vand q11,q14,q15",
- "EF 59 51 BA", "vbic d21,d25,d26",
- "EF 5C 61 FE", "vbic q11,q14,q15",
- "FF C0 59 39", "vbic.i16 d21,#0x89",
- "FF C0 51 39", "vbic.i32 d21,#0x89",
- "FF C0 69 79", "vbic.i16 q11,#0x89",
- "FF C0 61 79", "vbic.i32 q11,#0x89",
- "FF 79 51 BA", "vbif d21,d25,d26",
- "FF 7C 61 FE", "vbif q11,q14,q15",
- "FF 69 51 BA", "vbit d21,d25,d26",
- "FF 6C 61 FE", "vbit q11,q14,q15",
- "FF 59 51 BA", "vbsl d21,d25,d26",
- "FF 5C 61 FE", "vbsl q11,q14,q15",
- "FF 49 58 BA", "vceq.i8 d21,d25,d26",
- "FF 59 58 BA", "vceq.i16 d21,d25,d26",
- "FF 69 58 BA", "vceq.i32 d21,d25,d26",
- "FF F1 51 2A", "vceq.i8 d21,d26,#0",
- "FF F5 51 2A", "vceq.i16 d21,d26,#0",
- "FF F9 51 2A", "vceq.i32 d21,d26,#0",
- "FF F9 55 2A", "vceq.f32 d21,d26,#0",
- "FF 4C 68 FE", "vceq.i8 q11,q14,q15",
- "FF 5C 68 FE", "vceq.i16 q11,q14,q15",
- "FF 6C 68 FE", "vceq.i32 q11,q14,q15",
- "FF F1 61 6E", "vceq.i8 q11,q15,#0",
- "FF F5 61 6E", "vceq.i16 q11,q15,#0",
- "FF F9 61 6E", "vceq.i32 q11,q15,#0",
- "FF F9 65 6E", "vceq.f32 q11,q15,#0",
- "EF 49 5E AA", "vceq.f32 d21,d25,d26",
- "EF 4C 6E EE", "vceq.f32 q11,q14,q15",
- "EF 49 53 BA", "vcge.s8 d21,d25,d26",
- "EF 59 53 BA", "vcge.s16 d21,d25,d26",
- "EF 69 53 BA", "vcge.s32 d21,d25,d26",
- "FF 49 53 BA", "vcge.u8 d21,d25,d26",
- "FF 59 53 BA", "vcge.u16 d21,d25,d26",
- "FF 69 53 BA", "vcge.u32 d21,d25,d26",
- "FF F1 50 AA", "vcge.s8 d21,d26,#0",
- "FF F5 50 AA", "vcge.s16 d21,d26,#0",
- "FF F9 50 AA", "vcge.s32 d21,d26,#0",
- "FF F9 54 AA", "vcge.f32 d21,d26,#0",
- "EF 4C 63 FE", "vcge.s8 q11,q14,q15",
- "EF 5C 63 FE", "vcge.s16 q11,q14,q15",
- "EF 6C 63 FE", "vcge.s32 q11,q14,q15",
- "FF 4C 63 FE", "vcge.u8 q11,q14,q15",
- "FF 5C 63 FE", "vcge.u16 q11,q14,q15",
- "FF 6C 63 FE", "vcge.u32 q11,q14,q15",
- "FF F1 60 EE", "vcge.s8 q11,q15,#0",
- "FF F5 60 EE", "vcge.s16 q11,q15,#0",
- "FF F9 60 EE", "vcge.s32 q11,q15,#0",
- "FF F9 64 EE", "vcge.f32 q11,q15,#0",
- "FF 49 5E AA", "vcge.f32 d21,d25,d26",
- "FF 4C 6E EE", "vcge.f32 q11,q14,q15",
- "EF 49 53 AA", "vcgt.s8 d21,d25,d26",
- "EF 59 53 AA", "vcgt.s16 d21,d25,d26",
- "EF 69 53 AA", "vcgt.s32 d21,d25,d26",
- "FF 49 53 AA", "vcgt.u8 d21,d25,d26",
- "FF 59 53 AA", "vcgt.u16 d21,d25,d26",
- "FF 69 53 AA", "vcgt.u32 d21,d25,d26",
- "FF F1 50 2A", "vcgt.s8 d21,d26,#0",
- "FF F5 50 2A", "vcgt.s16 d21,d26,#0",
- "FF F9 50 2A", "vcgt.s32 d21,d26,#0",
- "FF F9 54 2A", "vcgt.f32 d21,d26,#0",
- "EF 4C 63 EE", "vcgt.s8 q11,q14,q15",
- "EF 5C 63 EE", "vcgt.s16 q11,q14,q15",
- "EF 6C 63 EE", "vcgt.s32 q11,q14,q15",
- "FF 4C 63 EE", "vcgt.u8 q11,q14,q15",
- "FF 5C 63 EE", "vcgt.u16 q11,q14,q15",
- "FF 6C 63 EE", "vcgt.u32 q11,q14,q15",
- "FF F1 60 6E", "vcgt.s8 q11,q15,#0",
- "FF F5 60 6E", "vcgt.s16 q11,q15,#0",
- "FF F9 60 6E", "vcgt.s32 q11,q15,#0",
- "FF F9 64 6E", "vcgt.f32 q11,q15,#0",
- "FF 69 5E AA", "vcgt.f32 d21,d25,d26",
- "FF 6C 6E EE", "vcgt.f32 q11,q14,q15",
- "FF F1 51 AA", "vcle.s8 d21,d26,#0",
- "FF F5 51 AA", "vcle.s16 d21,d26,#0",
- "FF F9 51 AA", "vcle.s32 d21,d26,#0",
- "FF F9 55 AA", "vcle.f32 d21,d26,#0",
- "FF F1 61 EE", "vcle.s8 q11,q15,#0",
- "FF F5 61 EE", "vcle.s16 q11,q15,#0",
- "FF F9 61 EE", "vcle.s32 q11,q15,#0",
- "FF F9 65 EE", "vcle.f32 q11,q15,#0",
- "FF F0 54 2A", "vcls.s8 d21,d26",
- "FF F4 54 2A", "vcls.s16 d21,d26",
- "FF F8 54 2A", "vcls.s32 d21,d26",
- "FF F0 64 6E", "vcls.s8 q11,q15",
- "FF F4 64 6E", "vcls.s16 q11,q15",
- "FF F8 64 6E", "vcls.s32 q11,q15",
- "FF F1 52 2A", "vclt.s8 d21,d26,#0",
- "FF F5 52 2A", "vclt.s16 d21,d26,#0",
- "FF F9 52 2A", "vclt.s32 d21,d26,#0",
- "FF F9 56 2A", "vclt.f32 d21,d26,#0",
- "FF F1 62 6E", "vclt.s8 q11,q15,#0",
- "FF F5 62 6E", "vclt.s16 q11,q15,#0",
- "FF F9 62 6E", "vclt.s32 q11,q15,#0",
- "FF F9 66 6E", "vclt.f32 q11,q15,#0",
- "FF F0 54 AA", "vclz.i8 d21,d26",
- "FF F4 54 AA", "vclz.i16 d21,d26",
- "FF F8 54 AA", "vclz.i32 d21,d26",
- "FF F0 64 EE", "vclz.i8 q11,q15",
- "FF F4 64 EE", "vclz.i16 q11,q15",
- "FF F8 64 EE", "vclz.i32 q11,q15",
- "EE F5 AA 40", "vcmp.f32 s21,#0.0",
- "EE F4 AA 4D", "vcmp.f32 s21,s26",
- "EE F5 5B 40", "vcmp.f64 d21,#0.0",
- "EE F4 5B 6A", "vcmp.f64 d21,d26",
- "EE F5 AA C0", "vcmpe.f32 s21,#0.0",
- "EE F4 AA CD", "vcmpe.f32 s21,s26",
- "EE F5 5B C0", "vcmpe.f64 d21,#0.0",
- "EE F4 5B EA", "vcmpe.f64 d21,d26",
- "FF F0 55 2A", "vcnt.8 d21,d26",
- "FF F0 65 6E", "vcnt.8 q11,q15",
- "FF FB 57 2A", "vcvt.s32.f32 d21,d26",
- "FF FB 57 AA", "vcvt.u32.f32 d21,d26",
- "FF FB 56 2A", "vcvt.f32.s32 d21,d26",
- "FF FB 56 AA", "vcvt.f32.u32 d21,d26",
- "EF E0 5F 3A", "vcvt.s32.f32 d21,d26,#32",
- "FF E0 5F 3A", "vcvt.u32.f32 d21,d26,#32",
- "EF E0 5E 3A", "vcvt.f32.s32 d21,d26,#32",
- "FF E0 5E 3A", "vcvt.f32.u32 d21,d26,#32",
- "FF FB 67 6E", "vcvt.s32.f32 q11,q15",
- "FF FB 67 EE", "vcvt.u32.f32 q11,q15",
- "FF FB 66 6E", "vcvt.f32.s32 q11,q15",
- "FF FB 66 EE", "vcvt.f32.u32 q11,q15",
- "EF E0 6F 7E", "vcvt.s32.f32 q11,q15,#32",
- "FF E0 6F 7E", "vcvt.u32.f32 q11,q15,#32",
- "EF E0 6E 7E", "vcvt.f32.s32 q11,q15,#32",
- "FF E0 6E 7E", "vcvt.f32.u32 q11,q15,#32",
- "EE FA AA E8", "vcvt.f32.s32 s21,s21,#15",
- "EE FF AA 60", "vcvt.u16.f32 s21,s21,#15",
- "EE FE AA E2", "vcvt.s32.f32 s21,s21,#27",
- "EE FF AA E2", "vcvt.u32.f32 s21,s21,#27",
- "EE FE 5B 60", "vcvt.s16.f64 d21,d21,#15",
- "EE FF 5B 60", "vcvt.u16.f64 d21,d21,#15",
- "EE FE 5B E2", "vcvt.s32.f64 d21,d21,#27",
- "EE FF 5B E2", "vcvt.u32.f64 d21,d21,#27",
- "FF F6 56 2E", "vcvt.f16.f32 d21,q15",
- "EE FA AA 60", "vcvt.f32.s16 s21,s21,#15",
- "EE FB AA 60", "vcvt.f32.u16 s21,s21,#15",
- "EE FA AA E2", "vcvt.f32.s32 s21,s21,#27",
- "EE FB AA E2", "vcvt.f32.u32 s21,s21,#27",
- "EE F8 AA CD", "vcvt.f32.s32 s21,s26",
- "EE F8 AA 4D", "vcvt.f32.u32 s21,s26",
- "FF F6 67 2A", "vcvt.f32.f16 q11,d26",
- "EE F7 AB EA", "vcvt.f32.f64 s21,d26",
- "EE FA 5B 60", "vcvt.f64.s16 d21,d21,#15",
- "EE FB 5B 60", "vcvt.f64.u16 d21,d21,#15",
- "EE FA 5B E2", "vcvt.f64.s32 d21,d21,#27",
- "EE FB 5B E2", "vcvt.f64.u32 d21,d21,#27",
- "EE F8 5B CD", "vcvt.f64.s32 d21,s26",
- "EE F8 5B 4D", "vcvt.f64.u32 d21,s26",
- "EE F7 5A CD", "vcvt.f64.f32 d21,s26",
- "EE FD AA CD", "vcvt.s32.f32 s21,s26",
- "EE FD AB EA", "vcvt.s32.f64 s21,d26",
- "EE FC AA CD", "vcvt.u32.f32 s21,s26",
- "EE FC AB EA", "vcvt.u32.f64 s21,d26",
- "EE F3 AA 4D", "vcvtb.f16.f32 s21,s26",
- "EE F2 AA 4D", "vcvtb.f32.f16 s21,s26",
- "EE F3 AA CD", "vcvtt.f16.f32 s21,s26",
- "EE F2 AA CD", "vcvtt.f32.f16 s21,s26",
- "EE FD AA 4D", "vcvtr.s32.f32 s21,s26",
- "EE FD AB 6A", "vcvtr.s32.f64 s21,d26",
- "EE FC AA 4D", "vcvtr.u32.f32 s21,s26",
- "EE FC AB 6A", "vcvtr.u32.f64 s21,d26",
- "EE CC AA 8D", "vdiv.f32 s21,s25,s26",
- "EE C9 5B AA", "vdiv.f64 d21,d25,d26",
- "FF F5 5C 26", "vdup.8 d21,d22[2]",
- "FF FA 5C 26", "vdup.16 d21,d22[2]",
- "FF FC 5C 26", "vdup.32 d21,d22[1]",
- "EE C5 5B 90", "vdup.8 d21,r5",
- "EE 85 5B B0", "vdup.16 d21,r5",
- "EE 85 5B 90", "vdup.32 d21,r5",
- "FF F5 6C 66", "vdup.8 q11,d22[2]",
- "FF FA 6C 66", "vdup.16 q11,d22[2]",
- "FF FC 6C 66", "vdup.32 q11,d22[1]",
- "EE E6 5B 90", "vdup.8 q11,r5",
- "EE A6 5B B0", "vdup.16 q11,r5",
- "EE A6 5B 90", "vdup.32 q11,r5",
- "FF 49 51 BA", "veor d21,d25,d26",
- "FF 4C 61 FE", "veor q11,q14,q15",
- "EF F9 55 AA", "vext.8 d21,d25,d26,#5",
- "EF FC 6D EE", "vext.8 q11,q14,q15,#13",
- "EF 49 50 AA", "vhadd.s8 d21,d25,d26",
- "EF 59 50 AA", "vhadd.s16 d21,d25,d26",
- "EF 69 50 AA", "vhadd.s32 d21,d25,d26",
- "FF 49 50 AA", "vhadd.u8 d21,d25,d26",
- "FF 59 50 AA", "vhadd.u16 d21,d25,d26",
- "FF 69 50 AA", "vhadd.u32 d21,d25,d26",
- "EF 4C 60 EE", "vhadd.s8 q11,q14,q15",
- "EF 5C 60 EE", "vhadd.s16 q11,q14,q15",
- "EF 6C 60 EE", "vhadd.s32 q11,q14,q15",
- "FF 4C 60 EE", "vhadd.u8 q11,q14,q15",
- "FF 5C 60 EE", "vhadd.u16 q11,q14,q15",
- "FF 6C 60 EE", "vhadd.u32 q11,q14,q15",
- "EF 49 52 AA", "vhsub.s8 d21,d25,d26",
- "EF 59 52 AA", "vhsub.s16 d21,d25,d26",
- "EF 69 52 AA", "vhsub.s32 d21,d25,d26",
- "FF 49 52 AA", "vhsub.u8 d21,d25,d26",
- "FF 59 52 AA", "vhsub.u16 d21,d25,d26",
- "FF 69 52 AA", "vhsub.u32 d21,d25,d26",
- "EF 4C 62 EE", "vhsub.s8 q11,q14,q15",
- "EF 5C 62 EE", "vhsub.s16 q11,q14,q15",
- "EF 6C 62 EE", "vhsub.s32 q11,q14,q15",
- "FF 4C 62 EE", "vhsub.u8 q11,q14,q15",
- "FF 5C 62 EE", "vhsub.u16 q11,q14,q15",
- "FF 6C 62 EE", "vhsub.u32 q11,q14,q15",
- "F9 6A B7 0F", "vld1.8 {d27},[r10]",
- "F9 6A BA 0F", "vld1.8 {d27,d28},[r10]",
- "F9 6A B6 0F", "vld1.8 {d27,d28,d29},[r10]",
- "F9 6A B2 0F", "vld1.8 {d27,d28,d29,d30},[r10]",
- "F9 6A B7 4F", "vld1.16 {d27},[r10]",
- "F9 6A BA 4F", "vld1.16 {d27,d28},[r10]",
- "F9 6A B6 4F", "vld1.16 {d27,d28,d29},[r10]",
- "F9 6A B2 4F", "vld1.16 {d27,d28,d29,d30},[r10]",
- "F9 6A B7 8F", "vld1.32 {d27},[r10]",
- "F9 6A BA 8F", "vld1.32 {d27,d28},[r10]",
- "F9 6A B6 8F", "vld1.32 {d27,d28,d29},[r10]",
- "F9 6A B2 8F", "vld1.32 {d27,d28,d29,d30},[r10]",
- "F9 6A B7 CF", "vld1.64 {d27},[r10]",
- "F9 6A BA CF", "vld1.64 {d27,d28},[r10]",
- "F9 6A B6 CF", "vld1.64 {d27,d28,d29},[r10]",
- "F9 6A B2 CF", "vld1.64 {d27,d28,d29,d30},[r10]",
- "F9 6A B7 1F", "vld1.8 {d27},[r10@64]",
- "F9 6A BA 1F", "vld1.8 {d27,d28},[r10@64]",
- "F9 6A BA 2F", "vld1.8 {d27,d28},[r10@128]",
- "F9 6A B6 1F", "vld1.8 {d27,d28,d29},[r10@64]",
- "F9 6A B2 1F", "vld1.8 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B2 2F", "vld1.8 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B2 3F", "vld1.8 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B7 5F", "vld1.16 {d27},[r10@64]",
- "F9 6A BA 5F", "vld1.16 {d27,d28},[r10@64]",
- "F9 6A BA 6F", "vld1.16 {d27,d28},[r10@128]",
- "F9 6A B6 5F", "vld1.16 {d27,d28,d29},[r10@64]",
- "F9 6A B2 5F", "vld1.16 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B2 6F", "vld1.16 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B2 7F", "vld1.16 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B7 9F", "vld1.32 {d27},[r10@64]",
- "F9 6A BA 9F", "vld1.32 {d27,d28},[r10@64]",
- "F9 6A BA AF", "vld1.32 {d27,d28},[r10@128]",
- "F9 6A B6 9F", "vld1.32 {d27,d28,d29},[r10@64]",
- "F9 6A B2 9F", "vld1.32 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B2 AF", "vld1.32 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B2 BF", "vld1.32 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B7 DF", "vld1.64 {d27},[r10@64]",
- "F9 6A BA DF", "vld1.64 {d27,d28},[r10@64]",
- "F9 6A BA EF", "vld1.64 {d27,d28},[r10@128]",
- "F9 6A B6 DF", "vld1.64 {d27,d28,d29},[r10@64]",
- "F9 6A B2 DF", "vld1.64 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B2 EF", "vld1.64 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B2 FF", "vld1.64 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B7 0D", "vld1.8 {d27},[r10]!",
- "F9 6A BA 0D", "vld1.8 {d27,d28},[r10]!",
- "F9 6A B6 0D", "vld1.8 {d27,d28,d29},[r10]!",
- "F9 6A B2 0D", "vld1.8 {d27,d28,d29,d30},[r10]!",
- "F9 6A B7 4D", "vld1.16 {d27},[r10]!",
- "F9 6A BA 4D", "vld1.16 {d27,d28},[r10]!",
- "F9 6A B6 4D", "vld1.16 {d27,d28,d29},[r10]!",
- "F9 6A B2 4D", "vld1.16 {d27,d28,d29,d30},[r10]!",
- "F9 6A B7 8D", "vld1.32 {d27},[r10]!",
- "F9 6A BA 8D", "vld1.32 {d27,d28},[r10]!",
- "F9 6A B6 8D", "vld1.32 {d27,d28,d29},[r10]!",
- "F9 6A B2 8D", "vld1.32 {d27,d28,d29,d30},[r10]!",
- "F9 6A B7 CD", "vld1.64 {d27},[r10]!",
- "F9 6A BA CD", "vld1.64 {d27,d28},[r10]!",
- "F9 6A B6 CD", "vld1.64 {d27,d28,d29},[r10]!",
- "F9 6A B2 CD", "vld1.64 {d27,d28,d29,d30},[r10]!",
- "F9 6A B7 1D", "vld1.8 {d27},[r10@64]!",
- "F9 6A BA 1D", "vld1.8 {d27,d28},[r10@64]!",
- "F9 6A BA 2D", "vld1.8 {d27,d28},[r10@128]!",
- "F9 6A B6 1D", "vld1.8 {d27,d28,d29},[r10@64]!",
- "F9 6A B2 1D", "vld1.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B2 2D", "vld1.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B2 3D", "vld1.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B7 5D", "vld1.16 {d27},[r10@64]!",
- "F9 6A BA 5D", "vld1.16 {d27,d28},[r10@64]!",
- "F9 6A BA 6D", "vld1.16 {d27,d28},[r10@128]!",
- "F9 6A B6 5D", "vld1.16 {d27,d28,d29},[r10@64]!",
- "F9 6A B2 5D", "vld1.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B2 6D", "vld1.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B2 7D", "vld1.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B7 9D", "vld1.32 {d27},[r10@64]!",
- "F9 6A BA 9D", "vld1.32 {d27,d28},[r10@64]!",
- "F9 6A BA AD", "vld1.32 {d27,d28},[r10@128]!",
- "F9 6A B6 9D", "vld1.32 {d27,d28,d29},[r10@64]!",
- "F9 6A B2 9D", "vld1.32 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B2 AD", "vld1.32 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B2 BD", "vld1.32 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B7 DD", "vld1.64 {d27},[r10@64]!",
- "F9 6A BA DD", "vld1.64 {d27,d28},[r10@64]!",
- "F9 6A BA ED", "vld1.64 {d27,d28},[r10@128]!",
- "F9 6A B6 DD", "vld1.64 {d27,d28,d29},[r10@64]!",
- "F9 6A B2 DD", "vld1.64 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B2 ED", "vld1.64 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B2 FD", "vld1.64 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B7 09", "vld1.8 {d27},[r10],r9",
- "F9 6A BA 09", "vld1.8 {d27,d28},[r10],r9",
- "F9 6A B6 09", "vld1.8 {d27,d28,d29},[r10],r9",
- "F9 6A B2 09", "vld1.8 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B7 49", "vld1.16 {d27},[r10],r9",
- "F9 6A BA 49", "vld1.16 {d27,d28},[r10],r9",
- "F9 6A B6 49", "vld1.16 {d27,d28,d29},[r10],r9",
- "F9 6A B2 49", "vld1.16 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B7 89", "vld1.32 {d27},[r10],r9",
- "F9 6A BA 89", "vld1.32 {d27,d28},[r10],r9",
- "F9 6A B6 89", "vld1.32 {d27,d28,d29},[r10],r9",
- "F9 6A B2 89", "vld1.32 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B7 C9", "vld1.64 {d27},[r10],r9",
- "F9 6A BA C9", "vld1.64 {d27,d28},[r10],r9",
- "F9 6A B6 C9", "vld1.64 {d27,d28,d29},[r10],r9",
- "F9 6A B2 C9", "vld1.64 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B7 19", "vld1.8 {d27},[r10@64],r9",
- "F9 6A BA 19", "vld1.8 {d27,d28},[r10@64],r9",
- "F9 6A BA 29", "vld1.8 {d27,d28},[r10@128],r9",
- "F9 6A B6 19", "vld1.8 {d27,d28,d29},[r10@64],r9",
- "F9 6A B2 19", "vld1.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B2 29", "vld1.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B2 39", "vld1.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A B7 59", "vld1.16 {d27},[r10@64],r9",
- "F9 6A BA 59", "vld1.16 {d27,d28},[r10@64],r9",
- "F9 6A BA 69", "vld1.16 {d27,d28},[r10@128],r9",
- "F9 6A B6 59", "vld1.16 {d27,d28,d29},[r10@64],r9",
- "F9 6A B2 59", "vld1.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B2 69", "vld1.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B2 79", "vld1.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A B7 99", "vld1.32 {d27},[r10@64],r9",
- "F9 6A BA 99", "vld1.32 {d27,d28},[r10@64],r9",
- "F9 6A BA A9", "vld1.32 {d27,d28},[r10@128],r9",
- "F9 6A B6 99", "vld1.32 {d27,d28,d29},[r10@64],r9",
- "F9 6A B2 99", "vld1.32 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B2 A9", "vld1.32 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B2 B9", "vld1.32 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A B7 D9", "vld1.64 {d27},[r10@64],r9",
- "F9 6A BA D9", "vld1.64 {d27,d28},[r10@64],r9",
- "F9 6A BA E9", "vld1.64 {d27,d28},[r10@128],r9",
- "F9 6A B6 D9", "vld1.64 {d27,d28,d29},[r10@64],r9",
- "F9 6A B2 D9", "vld1.64 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B2 E9", "vld1.64 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B2 F9", "vld1.64 {d27,d28,d29,d30},[r10@256],r9",
- "F9 EA B0 2F", "vld1.8 {d27[1]},[r10]",
- "F9 EA B4 4F", "vld1.16 {d27[1]},[r10]",
- "F9 EA B8 8F", "vld1.32 {d27[1]},[r10]",
- "F9 EA B4 5F", "vld1.16 {d27[1]},[r10@16]",
- "F9 EA B8 BF", "vld1.32 {d27[1]},[r10@32]",
- "F9 EA B0 2D", "vld1.8 {d27[1]},[r10]!",
- "F9 EA B4 4D", "vld1.16 {d27[1]},[r10]!",
- "F9 EA B8 8D", "vld1.32 {d27[1]},[r10]!",
- "F9 EA B4 5D", "vld1.16 {d27[1]},[r10@16]!",
- "F9 EA B8 BD", "vld1.32 {d27[1]},[r10@32]!",
- "F9 EA B0 29", "vld1.8 {d27[1]},[r10],r9",
- "F9 EA B4 49", "vld1.16 {d27[1]},[r10],r9",
- "F9 EA B8 89", "vld1.32 {d27[1]},[r10],r9",
- "F9 EA B4 59", "vld1.16 {d27[1]},[r10@16],r9",
- "F9 EA B8 B9", "vld1.32 {d27[1]},[r10@32],r9",
- "F9 EA BC 0F", "vld1.8 {d27[]},[r10]",
- "F9 EA BC 2F", "vld1.8 {d27[],d28[]},[r10]",
- "F9 EA BC 4F", "vld1.16 {d27[]},[r10]",
- "F9 EA BC 6F", "vld1.16 {d27[],d28[]},[r10]",
- "F9 EA BC 8F", "vld1.32 {d27[]},[r10]",
- "F9 EA BC AF", "vld1.32 {d27[],d28[]},[r10]",
- "F9 EA BC 5F", "vld1.16 {d27[]},[r10@16]",
- "F9 EA BC 7F", "vld1.16 {d27[],d28[]},[r10@16]",
- "F9 EA BC 9F", "vld1.32 {d27[]},[r10@32]",
- "F9 EA BC BF", "vld1.32 {d27[],d28[]},[r10@32]",
- "F9 EA BC 0D", "vld1.8 {d27[]},[r10]!",
- "F9 EA BC 2D", "vld1.8 {d27[],d28[]},[r10]!",
- "F9 EA BC 4D", "vld1.16 {d27[]},[r10]!",
- "F9 EA BC 6D", "vld1.16 {d27[],d28[]},[r10]!",
- "F9 EA BC 8D", "vld1.32 {d27[]},[r10]!",
- "F9 EA BC AD", "vld1.32 {d27[],d28[]},[r10]!",
- "F9 EA BC 5D", "vld1.16 {d27[]},[r10@16]!",
- "F9 EA BC 7D", "vld1.16 {d27[],d28[]},[r10@16]!",
- "F9 EA BC 9D", "vld1.32 {d27[]},[r10@32]!",
- "F9 EA BC BD", "vld1.32 {d27[],d28[]},[r10@32]!",
- "F9 EA BC 09", "vld1.8 {d27[]},[r10],r9",
- "F9 EA BC 29", "vld1.8 {d27[],d28[]},[r10],r9",
- "F9 EA BC 49", "vld1.16 {d27[]},[r10],r9",
- "F9 EA BC 69", "vld1.16 {d27[],d28[]},[r10],r9",
- "F9 EA BC 89", "vld1.32 {d27[]},[r10],r9",
- "F9 EA BC A9", "vld1.32 {d27[],d28[]},[r10],r9",
- "F9 EA BC 59", "vld1.16 {d27[]},[r10@16],r9",
- "F9 EA BC 79", "vld1.16 {d27[],d28[]},[r10@16],r9",
- "F9 EA BC 99", "vld1.32 {d27[]},[r10@32],r9",
- "F9 EA BC B9", "vld1.32 {d27[],d28[]},[r10@32],r9",
- "F9 6A B8 0F", "vld2.8 {d27,d28},[r10]",
- "F9 6A B9 0F", "vld2.8 {d27,d29},[r10]",
- "F9 6A B3 0F", "vld2.8 {d27,d28,d29,d30},[r10]",
- "F9 6A B8 4F", "vld2.16 {d27,d28},[r10]",
- "F9 6A B9 4F", "vld2.16 {d27,d29},[r10]",
- "F9 6A B3 4F", "vld2.16 {d27,d28,d29,d30},[r10]",
- "F9 6A B8 8F", "vld2.32 {d27,d28},[r10]",
- "F9 6A B9 8F", "vld2.32 {d27,d29},[r10]",
- "F9 6A B3 8F", "vld2.32 {d27,d28,d29,d30},[r10]",
- "F9 6A B8 1F", "vld2.8 {d27,d28},[r10@64]",
- "F9 6A B8 2F", "vld2.8 {d27,d28},[r10@128]",
- "F9 6A B9 1F", "vld2.8 {d27,d29},[r10@64]",
- "F9 6A B9 2F", "vld2.8 {d27,d29},[r10@128]",
- "F9 6A B3 1F", "vld2.8 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B3 2F", "vld2.8 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B3 3F", "vld2.8 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B8 5F", "vld2.16 {d27,d28},[r10@64]",
- "F9 6A B8 6F", "vld2.16 {d27,d28},[r10@128]",
- "F9 6A B9 5F", "vld2.16 {d27,d29},[r10@64]",
- "F9 6A B9 6F", "vld2.16 {d27,d29},[r10@128]",
- "F9 6A B3 5F", "vld2.16 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B3 6F", "vld2.16 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B3 7F", "vld2.16 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B8 9F", "vld2.32 {d27,d28},[r10@64]",
- "F9 6A B8 AF", "vld2.32 {d27,d28},[r10@128]",
- "F9 6A B9 9F", "vld2.32 {d27,d29},[r10@64]",
- "F9 6A B9 AF", "vld2.32 {d27,d29},[r10@128]",
- "F9 6A B3 9F", "vld2.32 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B3 AF", "vld2.32 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B3 BF", "vld2.32 {d27,d28,d29,d30},[r10@256]",
- "F9 6A B8 0D", "vld2.8 {d27,d28},[r10]!",
- "F9 6A B9 0D", "vld2.8 {d27,d29},[r10]!",
- "F9 6A B3 0D", "vld2.8 {d27,d28,d29,d30},[r10]!",
- "F9 6A B8 4D", "vld2.16 {d27,d28},[r10]!",
- "F9 6A B9 4D", "vld2.16 {d27,d29},[r10]!",
- "F9 6A B3 4D", "vld2.16 {d27,d28,d29,d30},[r10]!",
- "F9 6A B8 8D", "vld2.32 {d27,d28},[r10]!",
- "F9 6A B9 8D", "vld2.32 {d27,d29},[r10]!",
- "F9 6A B3 8D", "vld2.32 {d27,d28,d29,d30},[r10]!",
- "F9 6A B8 1D", "vld2.8 {d27,d28},[r10@64]!",
- "F9 6A B8 2D", "vld2.8 {d27,d28},[r10@128]!",
- "F9 6A B9 1D", "vld2.8 {d27,d29},[r10@64]!",
- "F9 6A B9 2D", "vld2.8 {d27,d29},[r10@128]!",
- "F9 6A B3 1D", "vld2.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B3 2D", "vld2.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B3 3D", "vld2.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B8 5D", "vld2.16 {d27,d28},[r10@64]!",
- "F9 6A B8 6D", "vld2.16 {d27,d28},[r10@128]!",
- "F9 6A B9 5D", "vld2.16 {d27,d29},[r10@64]!",
- "F9 6A B9 6D", "vld2.16 {d27,d29},[r10@128]!",
- "F9 6A B3 5D", "vld2.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B3 6D", "vld2.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B3 7D", "vld2.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B8 9D", "vld2.32 {d27,d28},[r10@64]!",
- "F9 6A B8 AD", "vld2.32 {d27,d28},[r10@128]!",
- "F9 6A B9 9D", "vld2.32 {d27,d29},[r10@64]!",
- "F9 6A B9 AD", "vld2.32 {d27,d29},[r10@128]!",
- "F9 6A B3 9D", "vld2.32 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B3 AD", "vld2.32 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B3 BD", "vld2.32 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A B8 09", "vld2.8 {d27,d28},[r10],r9",
- "F9 6A B9 09", "vld2.8 {d27,d29},[r10],r9",
- "F9 6A B3 09", "vld2.8 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B8 49", "vld2.16 {d27,d28},[r10],r9",
- "F9 6A B9 49", "vld2.16 {d27,d29},[r10],r9",
- "F9 6A B3 49", "vld2.16 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B8 89", "vld2.32 {d27,d28},[r10],r9",
- "F9 6A B9 89", "vld2.32 {d27,d29},[r10],r9",
- "F9 6A B3 89", "vld2.32 {d27,d28,d29,d30},[r10],r9",
- "F9 6A B8 19", "vld2.8 {d27,d28},[r10@64],r9",
- "F9 6A B8 29", "vld2.8 {d27,d28},[r10@128],r9",
- "F9 6A B9 19", "vld2.8 {d27,d29},[r10@64],r9",
- "F9 6A B9 29", "vld2.8 {d27,d29},[r10@128],r9",
- "F9 6A B3 19", "vld2.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B3 29", "vld2.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B3 39", "vld2.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A B8 59", "vld2.16 {d27,d28},[r10@64],r9",
- "F9 6A B8 69", "vld2.16 {d27,d28},[r10@128],r9",
- "F9 6A B9 59", "vld2.16 {d27,d29},[r10@64],r9",
- "F9 6A B9 69", "vld2.16 {d27,d29},[r10@128],r9",
- "F9 6A B3 59", "vld2.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B3 69", "vld2.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B3 79", "vld2.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A B8 99", "vld2.32 {d27,d28},[r10@64],r9",
- "F9 6A B8 A9", "vld2.32 {d27,d28},[r10@128],r9",
- "F9 6A B9 99", "vld2.32 {d27,d29},[r10@64],r9",
- "F9 6A B9 A9", "vld2.32 {d27,d29},[r10@128],r9",
- "F9 6A B3 99", "vld2.32 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B3 A9", "vld2.32 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B3 B9", "vld2.32 {d27,d28,d29,d30},[r10@256],r9",
- "F9 EA B1 2F", "vld2.8 {d27[1],d28[1]},[r10]",
- "F9 EA B5 4F", "vld2.16 {d27[1],d28[1]},[r10]",
- "F9 EA B5 6F", "vld2.16 {d27[1],d29[1]},[r10]",
- "F9 EA B9 8F", "vld2.32 {d27[1],d28[1]},[r10]",
- "F9 EA B9 CF", "vld2.32 {d27[1],d29[1]},[r10]",
- "F9 EA B1 3F", "vld2.8 {d27[1],d28[1]},[r10@16]",
- "F9 EA B5 5F", "vld2.16 {d27[1],d28[1]},[r10@32]",
- "F9 EA B5 7F", "vld2.16 {d27[1],d29[1]},[r10@32]",
- "F9 EA B9 9F", "vld2.32 {d27[1],d28[1]},[r10@64]",
- "F9 EA B9 DF", "vld2.32 {d27[1],d29[1]},[r10@64]",
- "F9 EA B1 2D", "vld2.8 {d27[1],d28[1]},[r10]!",
- "F9 EA B5 4D", "vld2.16 {d27[1],d28[1]},[r10]!",
- "F9 EA B5 6D", "vld2.16 {d27[1],d29[1]},[r10]!",
- "F9 EA B9 8D", "vld2.32 {d27[1],d28[1]},[r10]!",
- "F9 EA B9 CD", "vld2.32 {d27[1],d29[1]},[r10]!",
- "F9 EA B1 3D", "vld2.8 {d27[1],d28[1]},[r10@16]!",
- "F9 EA B5 5D", "vld2.16 {d27[1],d28[1]},[r10@32]!",
- "F9 EA B5 7D", "vld2.16 {d27[1],d29[1]},[r10@32]!",
- "F9 EA B9 9D", "vld2.32 {d27[1],d28[1]},[r10@64]!",
- "F9 EA B9 DD", "vld2.32 {d27[1],d29[1]},[r10@64]!",
- "F9 EA B1 29", "vld2.8 {d27[1],d28[1]},[r10],r9",
- "F9 EA B5 49", "vld2.16 {d27[1],d28[1]},[r10],r9",
- "F9 EA B5 69", "vld2.16 {d27[1],d29[1]},[r10],r9",
- "F9 EA B9 89", "vld2.32 {d27[1],d28[1]},[r10],r9",
- "F9 EA B9 C9", "vld2.32 {d27[1],d29[1]},[r10],r9",
- "F9 EA B1 39", "vld2.8 {d27[1],d28[1]},[r10@16],r9",
- "F9 EA B5 59", "vld2.16 {d27[1],d28[1]},[r10@32],r9",
- "F9 EA B5 79", "vld2.16 {d27[1],d29[1]},[r10@32],r9",
- "F9 EA B9 99", "vld2.32 {d27[1],d28[1]},[r10@64],r9",
- "F9 EA B9 D9", "vld2.32 {d27[1],d29[1]},[r10@64],r9",
- "F9 EA BD 0F", "vld2.8 {d27[],d28[]},[r10]",
- "F9 EA BD 2F", "vld2.8 {d27[],d29[]},[r10]",
- "F9 EA BD 4F", "vld2.16 {d27[],d28[]},[r10]",
- "F9 EA BD 6F", "vld2.16 {d27[],d29[]},[r10]",
- "F9 EA BD 8F", "vld2.32 {d27[],d28[]},[r10]",
- "F9 EA BD AF", "vld2.32 {d27[],d29[]},[r10]",
- "F9 EA BD 1F", "vld2.8 {d27[],d28[]},[r10@16]",
- "F9 EA BD 3F", "vld2.8 {d27[],d29[]},[r10@16]",
- "F9 EA BD 5F", "vld2.16 {d27[],d28[]},[r10@32]",
- "F9 EA BD 7F", "vld2.16 {d27[],d29[]},[r10@32]",
- "F9 EA BD 9F", "vld2.32 {d27[],d28[]},[r10@64]",
- "F9 EA BD BF", "vld2.32 {d27[],d29[]},[r10@64]",
- "F9 EA BD 0D", "vld2.8 {d27[],d28[]},[r10]!",
- "F9 EA BD 2D", "vld2.8 {d27[],d29[]},[r10]!",
- "F9 EA BD 4D", "vld2.16 {d27[],d28[]},[r10]!",
- "F9 EA BD 6D", "vld2.16 {d27[],d29[]},[r10]!",
- "F9 EA BD 8D", "vld2.32 {d27[],d28[]},[r10]!",
- "F9 EA BD AD", "vld2.32 {d27[],d29[]},[r10]!",
- "F9 EA BD 1D", "vld2.8 {d27[],d28[]},[r10@16]!",
- "F9 EA BD 3D", "vld2.8 {d27[],d29[]},[r10@16]!",
- "F9 EA BD 5D", "vld2.16 {d27[],d28[]},[r10@32]!",
- "F9 EA BD 7D", "vld2.16 {d27[],d29[]},[r10@32]!",
- "F9 EA BD 9D", "vld2.32 {d27[],d28[]},[r10@64]!",
- "F9 EA BD BD", "vld2.32 {d27[],d29[]},[r10@64]!",
- "F9 EA BD 09", "vld2.8 {d27[],d28[]},[r10],r9",
- "F9 EA BD 29", "vld2.8 {d27[],d29[]},[r10],r9",
- "F9 EA BD 49", "vld2.16 {d27[],d28[]},[r10],r9",
- "F9 EA BD 69", "vld2.16 {d27[],d29[]},[r10],r9",
- "F9 EA BD 89", "vld2.32 {d27[],d28[]},[r10],r9",
- "F9 EA BD A9", "vld2.32 {d27[],d29[]},[r10],r9",
- "F9 EA BD 19", "vld2.8 {d27[],d28[]},[r10@16],r9",
- "F9 EA BD 39", "vld2.8 {d27[],d29[]},[r10@16],r9",
- "F9 EA BD 59", "vld2.16 {d27[],d28[]},[r10@32],r9",
- "F9 EA BD 79", "vld2.16 {d27[],d29[]},[r10@32],r9",
- "F9 EA BD 99", "vld2.32 {d27[],d28[]},[r10@64],r9",
- "F9 EA BD B9", "vld2.32 {d27[],d29[]},[r10@64],r9",
- "F9 6A B4 0F", "vld3.8 {d27,d28,d29},[r10]",
- "F9 6A B5 0F", "vld3.8 {d27,d29,d31},[r10]",
- "F9 6A B4 4F", "vld3.16 {d27,d28,d29},[r10]",
- "F9 6A B5 4F", "vld3.16 {d27,d29,d31},[r10]",
- "F9 6A B4 8F", "vld3.32 {d27,d28,d29},[r10]",
- "F9 6A B5 8F", "vld3.32 {d27,d29,d31},[r10]",
- "F9 6A B4 1F", "vld3.8 {d27,d28,d29},[r10@64]",
- "F9 6A B5 1F", "vld3.8 {d27,d29,d31},[r10@64]",
- "F9 6A B4 5F", "vld3.16 {d27,d28,d29},[r10@64]",
- "F9 6A B5 5F", "vld3.16 {d27,d29,d31},[r10@64]",
- "F9 6A B4 9F", "vld3.32 {d27,d28,d29},[r10@64]",
- "F9 6A B5 9F", "vld3.32 {d27,d29,d31},[r10@64]",
- "F9 6A B4 0D", "vld3.8 {d27,d28,d29},[r10]!",
- "F9 6A B5 0D", "vld3.8 {d27,d29,d31},[r10]!",
- "F9 6A B4 4D", "vld3.16 {d27,d28,d29},[r10]!",
- "F9 6A B5 4D", "vld3.16 {d27,d29,d31},[r10]!",
- "F9 6A B4 8D", "vld3.32 {d27,d28,d29},[r10]!",
- "F9 6A B5 8D", "vld3.32 {d27,d29,d31},[r10]!",
- "F9 6A B4 1D", "vld3.8 {d27,d28,d29},[r10@64]!",
- "F9 6A B5 1D", "vld3.8 {d27,d29,d31},[r10@64]!",
- "F9 6A B4 5D", "vld3.16 {d27,d28,d29},[r10@64]!",
- "F9 6A B5 5D", "vld3.16 {d27,d29,d31},[r10@64]!",
- "F9 6A B4 9D", "vld3.32 {d27,d28,d29},[r10@64]!",
- "F9 6A B5 9D", "vld3.32 {d27,d29,d31},[r10@64]!",
- "F9 6A B4 09", "vld3.8 {d27,d28,d29},[r10],r9",
- "F9 6A B5 09", "vld3.8 {d27,d29,d31},[r10],r9",
- "F9 6A B4 49", "vld3.16 {d27,d28,d29},[r10],r9",
- "F9 6A B5 49", "vld3.16 {d27,d29,d31},[r10],r9",
- "F9 6A B4 89", "vld3.32 {d27,d28,d29},[r10],r9",
- "F9 6A B5 89", "vld3.32 {d27,d29,d31},[r10],r9",
- "F9 6A B4 19", "vld3.8 {d27,d28,d29},[r10@64],r9",
- "F9 6A B5 19", "vld3.8 {d27,d29,d31},[r10@64],r9",
- "F9 6A B4 59", "vld3.16 {d27,d28,d29},[r10@64],r9",
- "F9 6A B5 59", "vld3.16 {d27,d29,d31},[r10@64],r9",
- "F9 6A B4 99", "vld3.32 {d27,d28,d29},[r10@64],r9",
- "F9 6A B5 99", "vld3.32 {d27,d29,d31},[r10@64],r9",
- "F9 EA B2 2F", "vld3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F9 EA B6 4F", "vld3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F9 EA B6 6F", "vld3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F9 EA BA 8F", "vld3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F9 EA BA CF", "vld3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F9 EA B2 2D", "vld3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 EA B6 4D", "vld3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 EA B6 6D", "vld3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 EA BA 8D", "vld3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 EA BA CD", "vld3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 EA B2 29", "vld3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 EA B6 49", "vld3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 EA B6 69", "vld3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 EA BA 89", "vld3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 EA BA C9", "vld3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 EA BE 0F", "vld3.8 {d27[],d28[],d29[]},[r10]",
- "F9 EA BE 2F", "vld3.8 {d27[],d29[],d31[]},[r10]",
- "F9 EA BE 4F", "vld3.16 {d27[],d28[],d29[]},[r10]",
- "F9 EA BE 6F", "vld3.16 {d27[],d29[],d31[]},[r10]",
- "F9 EA BE 8F", "vld3.32 {d27[],d28[],d29[]},[r10]",
- "F9 EA BE AF", "vld3.32 {d27[],d29[],d31[]},[r10]",
- "F9 EA BE 0D", "vld3.8 {d27[],d28[],d29[]},[r10]!",
- "F9 EA BE 2D", "vld3.8 {d27[],d29[],d31[]},[r10]!",
- "F9 EA BE 4D", "vld3.16 {d27[],d28[],d29[]},[r10]!",
- "F9 EA BE 6D", "vld3.16 {d27[],d29[],d31[]},[r10]!",
- "F9 EA BE 8D", "vld3.32 {d27[],d28[],d29[]},[r10]!",
- "F9 EA BE AD", "vld3.32 {d27[],d29[],d31[]},[r10]!",
- "F9 EA BE 09", "vld3.8 {d27[],d28[],d29[]},[r10],r9",
- "F9 EA BE 29", "vld3.8 {d27[],d29[],d31[]},[r10],r9",
- "F9 EA BE 49", "vld3.16 {d27[],d28[],d29[]},[r10],r9",
- "F9 EA BE 69", "vld3.16 {d27[],d29[],d31[]},[r10],r9",
- "F9 EA BE 89", "vld3.32 {d27[],d28[],d29[]},[r10],r9",
- "F9 EA BE A9", "vld3.32 {d27[],d29[],d31[]},[r10],r9",
- "F9 6A B0 0F", "vld4.8 {d27,d28,d29,d30},[r10]",
- "F9 6A 91 0F", "vld4.8 {d25,d27,d29,d31},[r10]",
- "F9 6A B0 4F", "vld4.16 {d27,d28,d29,d30},[r10]",
- "F9 6A 91 4F", "vld4.16 {d25,d27,d29,d31},[r10]",
- "F9 6A B0 8F", "vld4.32 {d27,d28,d29,d30},[r10]",
- "F9 6A 91 8F", "vld4.32 {d25,d27,d29,d31},[r10]",
- "F9 6A B0 1F", "vld4.8 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B0 2F", "vld4.8 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B0 3F", "vld4.8 {d27,d28,d29,d30},[r10@256]",
- "F9 6A 91 1F", "vld4.8 {d25,d27,d29,d31},[r10@64]",
- "F9 6A 91 2F", "vld4.8 {d25,d27,d29,d31},[r10@128]",
- "F9 6A 91 3F", "vld4.8 {d25,d27,d29,d31},[r10@256]",
- "F9 6A B0 5F", "vld4.16 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B0 6F", "vld4.16 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B0 7F", "vld4.16 {d27,d28,d29,d30},[r10@256]",
- "F9 6A 91 5F", "vld4.16 {d25,d27,d29,d31},[r10@64]",
- "F9 6A 91 6F", "vld4.16 {d25,d27,d29,d31},[r10@128]",
- "F9 6A 91 7F", "vld4.16 {d25,d27,d29,d31},[r10@256]",
- "F9 6A B0 9F", "vld4.32 {d27,d28,d29,d30},[r10@64]",
- "F9 6A B0 AF", "vld4.32 {d27,d28,d29,d30},[r10@128]",
- "F9 6A B0 BF", "vld4.32 {d27,d28,d29,d30},[r10@256]",
- "F9 6A 91 9F", "vld4.32 {d25,d27,d29,d31},[r10@64]",
- "F9 6A 91 AF", "vld4.32 {d25,d27,d29,d31},[r10@128]",
- "F9 6A 91 BF", "vld4.32 {d25,d27,d29,d31},[r10@256]",
- "F9 6A B0 0D", "vld4.8 {d27,d28,d29,d30},[r10]!",
- "F9 6A 91 0D", "vld4.8 {d25,d27,d29,d31},[r10]!",
- "F9 6A B0 4D", "vld4.16 {d27,d28,d29,d30},[r10]!",
- "F9 6A 91 4D", "vld4.16 {d25,d27,d29,d31},[r10]!",
- "F9 6A B0 8D", "vld4.32 {d27,d28,d29,d30},[r10]!",
- "F9 6A 91 8D", "vld4.32 {d25,d27,d29,d31},[r10]!",
- "F9 6A B0 1D", "vld4.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B0 2D", "vld4.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B0 3D", "vld4.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A 91 1D", "vld4.8 {d25,d27,d29,d31},[r10@64]!",
- "F9 6A 91 2D", "vld4.8 {d25,d27,d29,d31},[r10@128]!",
- "F9 6A 91 3D", "vld4.8 {d25,d27,d29,d31},[r10@256]!",
- "F9 6A B0 5D", "vld4.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B0 6D", "vld4.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B0 7D", "vld4.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A 91 5D", "vld4.16 {d25,d27,d29,d31},[r10@64]!",
- "F9 6A 91 6D", "vld4.16 {d25,d27,d29,d31},[r10@128]!",
- "F9 6A 91 7D", "vld4.16 {d25,d27,d29,d31},[r10@256]!",
- "F9 6A B0 9D", "vld4.32 {d27,d28,d29,d30},[r10@64]!",
- "F9 6A B0 AD", "vld4.32 {d27,d28,d29,d30},[r10@128]!",
- "F9 6A B0 BD", "vld4.32 {d27,d28,d29,d30},[r10@256]!",
- "F9 6A 91 9D", "vld4.32 {d25,d27,d29,d31},[r10@64]!",
- "F9 6A 91 AD", "vld4.32 {d25,d27,d29,d31},[r10@128]!",
- "F9 6A 91 BD", "vld4.32 {d25,d27,d29,d31},[r10@256]!",
- "F9 6A B0 09", "vld4.8 {d27,d28,d29,d30},[r10],r9",
- "F9 6A 91 09", "vld4.8 {d25,d27,d29,d31},[r10],r9",
- "F9 6A B0 49", "vld4.16 {d27,d28,d29,d30},[r10],r9",
- "F9 6A 91 49", "vld4.16 {d25,d27,d29,d31},[r10],r9",
- "F9 6A B0 89", "vld4.32 {d27,d28,d29,d30},[r10],r9",
- "F9 6A 91 89", "vld4.32 {d25,d27,d29,d31},[r10],r9",
- "F9 6A B0 19", "vld4.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B0 29", "vld4.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B0 39", "vld4.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A 91 19", "vld4.8 {d25,d27,d29,d31},[r10@64],r9",
- "F9 6A 91 29", "vld4.8 {d25,d27,d29,d31},[r10@128],r9",
- "F9 6A 91 39", "vld4.8 {d25,d27,d29,d31},[r10@256],r9",
- "F9 6A B0 59", "vld4.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B0 69", "vld4.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B0 79", "vld4.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A 91 59", "vld4.16 {d25,d27,d29,d31},[r10@64],r9",
- "F9 6A 91 69", "vld4.16 {d25,d27,d29,d31},[r10@128],r9",
- "F9 6A 91 79", "vld4.16 {d25,d27,d29,d31},[r10@256],r9",
- "F9 6A B0 99", "vld4.32 {d27,d28,d29,d30},[r10@64],r9",
- "F9 6A B0 A9", "vld4.32 {d27,d28,d29,d30},[r10@128],r9",
- "F9 6A B0 B9", "vld4.32 {d27,d28,d29,d30},[r10@256],r9",
- "F9 6A 91 99", "vld4.32 {d25,d27,d29,d31},[r10@64],r9",
- "F9 6A 91 A9", "vld4.32 {d25,d27,d29,d31},[r10@128],r9",
- "F9 6A 91 B9", "vld4.32 {d25,d27,d29,d31},[r10@256],r9",
- "F9 EA B3 2F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 EA B7 4F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 EA 97 6F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F9 EA BB 8F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 EA 9B CF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F9 EA B3 3F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
- "F9 EA B7 5F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F9 EA 97 7F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F9 EA BB 9F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F9 EA BB AF", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
- "F9 EA 9B DF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F9 EA 9B EF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
- "F9 EA B3 2D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 EA B7 4D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 EA 97 6D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F9 EA BB 8D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 EA 9B CD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F9 EA B3 3D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
- "F9 EA B7 5D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F9 EA 97 7D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F9 EA BB 9D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F9 EA BB AD", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
- "F9 EA 9B DD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F9 EA 9B ED", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
- "F9 EA B3 29", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 EA B7 49", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 EA 97 69", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F9 EA BB 89", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 EA 9B C9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F9 EA B3 39", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
- "F9 EA B7 59", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F9 EA 97 79", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F9 EA BB 99", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F9 EA BB A9", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
- "F9 EA 9B D9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F9 EA 9B E9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
- "F9 EA BF 0F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]",
- "F9 EA 9F 2F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]",
- "F9 EA BF 4F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]",
- "F9 EA 9F 6F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]",
- "F9 EA BF 8F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]",
- "F9 EA 9F AF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]",
- "F9 EA BF 1F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]",
- "F9 EA 9F 3F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]",
- "F9 EA BF 5F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]",
- "F9 EA 9F 7F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]",
- "F9 EA BF 9F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]",
- "F9 EA BF DF", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]",
- "F9 EA 9F BF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]",
- "F9 EA 9F FF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]",
- "F9 EA BF 0D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]!",
- "F9 EA 9F 2D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]!",
- "F9 EA BF 4D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]!",
- "F9 EA 9F 6D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]!",
- "F9 EA BF 8D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]!",
- "F9 EA 9F AD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]!",
- "F9 EA BF 1D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]!",
- "F9 EA 9F 3D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]!",
- "F9 EA BF 5D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]!",
- "F9 EA 9F 7D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]!",
- "F9 EA BF 9D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]!",
- "F9 EA BF DD", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]!",
- "F9 EA 9F BD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]!",
- "F9 EA 9F FD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]!",
- "F9 EA BF 09", "vld4.8 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F9 EA 9F 29", "vld4.8 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F9 EA BF 49", "vld4.16 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F9 EA 9F 69", "vld4.16 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F9 EA BF 89", "vld4.32 {d27[],d28[],d29[],d30[]},[r10],r9",
- "F9 EA 9F A9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10],r9",
- "F9 EA BF 19", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32],r9",
- "F9 EA 9F 39", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32],r9",
- "F9 EA BF 59", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64],r9",
- "F9 EA 9F 79", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64],r9",
- "F9 EA BF 99", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64],r9",
- "F9 EA BF D9", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128],r9",
- "F9 EA 9F B9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64],r9",
- "F9 EA 9F F9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128],r9",
- "EC BA AA 03", "vldmia r10!,{s20-s22}",
- "ED 3A AA 03", "vldmdb r10!,{s20-s22}",
- "EC FA 4B 06", "vldmia r10!,{d20-d22}",
- "ED 7A 4B 06", "vldmdb r10!,{d20-d22}",
- "EC 9A AA 03", "vldmia r10,{s20-s22}",
- "EC DA 4B 06", "vldmia r10,{d20-d22}",
- "ED 5F 5B 21", "vldr.64 d21,[pc,#-0x84]",
- "ED DF 5B 21", "vldr.64 d21,[pc,#0x84]",
- "ED DA 5B 00", "vldr.64 d21,[r10]",
- "ED 5A 5B 21", "vldr.64 d21,[r10,#-0x84]",
- "ED DA 5B 00", "vldr.64 d21,[r10]",
- "ED DA 5B 21", "vldr.64 d21,[r10,#0x84]",
- "ED 5F AA 21", "vldr.32 s21,[pc,#-0x84]",
- "ED DF AA 21", "vldr.32 s21,[pc,#0x84]",
- "ED DA AA 00", "vldr.32 s21,[r10]",
- "ED 5A AA 21", "vldr.32 s21,[r10,#-0x84]",
- "ED DA AA 00", "vldr.32 s21,[r10]",
- "ED DA AA 21", "vldr.32 s21,[r10,#0x84]",
- "EF 49 56 AA", "vmax.s8 d21,d25,d26",
- "EF 59 56 AA", "vmax.s16 d21,d25,d26",
- "EF 69 56 AA", "vmax.s32 d21,d25,d26",
- "FF 49 56 AA", "vmax.u8 d21,d25,d26",
- "FF 59 56 AA", "vmax.u16 d21,d25,d26",
- "FF 69 56 AA", "vmax.u32 d21,d25,d26",
- "EF 4C 66 EE", "vmax.s8 q11,q14,q15",
- "EF 5C 66 EE", "vmax.s16 q11,q14,q15",
- "EF 6C 66 EE", "vmax.s32 q11,q14,q15",
- "FF 4C 66 EE", "vmax.u8 q11,q14,q15",
- "FF 5C 66 EE", "vmax.u16 q11,q14,q15",
- "FF 6C 66 EE", "vmax.u32 q11,q14,q15",
- "EF 49 5F AA", "vmax.f32 d21,d25,d26",
- "EF 4C 6F EE", "vmax.f32 q11,q14,q15",
- "EF 49 56 BA", "vmin.s8 d21,d25,d26",
- "EF 59 56 BA", "vmin.s16 d21,d25,d26",
- "EF 69 56 BA", "vmin.s32 d21,d25,d26",
- "FF 49 56 BA", "vmin.u8 d21,d25,d26",
- "FF 59 56 BA", "vmin.u16 d21,d25,d26",
- "FF 69 56 BA", "vmin.u32 d21,d25,d26",
- "EF 4C 66 FE", "vmin.s8 q11,q14,q15",
- "EF 5C 66 FE", "vmin.s16 q11,q14,q15",
- "EF 6C 66 FE", "vmin.s32 q11,q14,q15",
- "FF 4C 66 FE", "vmin.u8 q11,q14,q15",
- "FF 5C 66 FE", "vmin.u16 q11,q14,q15",
- "FF 6C 66 FE", "vmin.u32 q11,q14,q15",
- "EF 69 5F AA", "vmin.f32 d21,d25,d26",
- "EF 6C 6F EE", "vmin.f32 q11,q14,q15",
- "EF D9 50 CF", "vmla.i16 d21,d25,d7[1]",
- "EF E9 50 EF", "vmla.i32 d21,d25,d15[1]",
- "EF E9 51 EF", "vmla.f32 d21,d25,d15[1]",
- "EF 49 59 AA", "vmla.i8 d21,d25,d26",
- "EF 59 59 AA", "vmla.i16 d21,d25,d26",
- "EF 69 59 AA", "vmla.i32 d21,d25,d26",
- "FF DC 60 CF", "vmla.i16 q11,q14,d7[1]",
- "FF EC 60 EF", "vmla.i32 q11,q14,d15[1]",
- "EF 4C 69 EE", "vmla.i8 q11,q14,q15",
- "EF 5C 69 EE", "vmla.i16 q11,q14,q15",
- "EF 6C 69 EE", "vmla.i32 q11,q14,q15",
- "EF 49 5D BA", "vmla.f32 d21,d25,d26",
- "EF 4C 6D FE", "vmla.f32 q11,q14,q15",
- "EE 4C AA 8D", "vmla.f32 s21,s25,s26",
- "EE 49 5B AA", "vmla.f64 d21,d25,d26",
- "EF D9 62 CF", "vmlal.s16 q11,d25,d7[1]",
- "EF E9 62 EF", "vmlal.s32 q11,d25,d15[1]",
- "FF D9 62 CF", "vmlal.u16 q11,d25,d7[1]",
- "FF E9 62 EF", "vmlal.u32 q11,d25,d15[1]",
- "EF C9 68 AA", "vmlal.s8 q11,d25,d26",
- "EF D9 68 AA", "vmlal.s16 q11,d25,d26",
- "EF E9 68 AA", "vmlal.s32 q11,d25,d26",
- "FF C9 68 AA", "vmlal.u8 q11,d25,d26",
- "FF D9 68 AA", "vmlal.u16 q11,d25,d26",
- "FF E9 68 AA", "vmlal.u32 q11,d25,d26",
- "EF D9 54 CF", "vmls.i16 d21,d25,d7[1]",
- "EF E9 54 EF", "vmls.i32 d21,d25,d15[1]",
- "EF E9 55 EF", "vmls.f32 d21,d25,d15[1]",
- "FF 49 59 AA", "vmls.i8 d21,d25,d26",
- "FF 59 59 AA", "vmls.i16 d21,d25,d26",
- "FF 69 59 AA", "vmls.i32 d21,d25,d26",
- "FF DC 64 CF", "vmls.i16 q11,q14,d7[1]",
- "FF EC 64 EF", "vmls.i32 q11,q14,d15[1]",
- "FF EC 65 EF", "vmls.f32 q11,q14,d15[1]",
- "FF 4C 69 EE", "vmls.i8 q11,q14,q15",
- "FF 5C 69 EE", "vmls.i16 q11,q14,q15",
- "FF 6C 69 EE", "vmls.i32 q11,q14,q15",
- "EF 69 5D BA", "vmls.f32 d21,d25,d26",
- "EF 6C 6D FE", "vmls.f32 q11,q14,q15",
- "EE 4C AA CD", "vmls.f32 s21,s25,s26",
- "EE 49 5B EA", "vmls.f64 d21,d25,d26",
- "EF D9 66 CF", "vmlsl.s16 q11,d25,d7[1]",
- "EF E9 66 EF", "vmlsl.s32 q11,d25,d15[1]",
- "FF D9 66 CF", "vmlsl.u16 q11,d25,d7[1]",
- "FF E9 66 EF", "vmlsl.u32 q11,d25,d15[1]",
- "EF C9 6A AA", "vmlsl.s8 q11,d25,d26",
- "EF D9 6A AA", "vmlsl.s16 q11,d25,d26",
- "EF E9 6A AA", "vmlsl.s32 q11,d25,d26",
- "FF C9 6A AA", "vmlsl.u8 q11,d25,d26",
- "FF D9 6A AA", "vmlsl.u16 q11,d25,d26",
- "FF E9 6A AA", "vmlsl.u32 q11,d25,d26",
- "EF 6A 51 BA", "vmov d21,d26",
- "EF 6E 61 FE", "vmov q11,q15",
- "EC 46 5B 3A", "vmov d26,r5,r6",
- "EC 56 5B 3A", "vmov r5,r6,d26",
- "EC 56 5A 1D", "vmov r5,r6,s26,s27",
- "EE 1C 5A 90", "vmov r5,s25",
- "EE 0C 5A 90", "vmov s25,r5",
- "EE 0C 5A 90", "vmov s25,r5",
- "EC 46 5A 1D", "vmov s26,s27,r5,r6",
- "FF C0 5E 19", "vmov.i8 d21,#0x89",
- "FF C0 58 19", "vmov.i16 d21,#0x89",
- "FF C0 50 19", "vmov.i32 d21,#0x89",
- "EF C0 5E 30", "vmov.i64 d21,#0x0",
- "FF C0 6E 59", "vmov.i8 q11,#0x89",
- "FF C0 68 59", "vmov.i16 q11,#0x89",
- "FF C0 60 59", "vmov.i32 q11,#0x89",
- "EF C0 6E 70", "vmov.i64 q11,#0x0",
- "EE 5B 5B B0", "vmov.s8 r5,d27[1]",
- "EE 1B 5B F0", "vmov.s16 r5,d27[1]",
- "EE DB 5B B0", "vmov.u8 r5,d27[1]",
- "EE 9B 5B F0", "vmov.u16 r5,d27[1]",
- "EE 3B 5B 90", "vmov.32 r5,d27[1]",
- "EE 4B 5B B0", "vmov.8 d27[1],r5",
- "EE 0B 5B F0", "vmov.16 d27[1],r5",
- "EE 2B 5B 90", "vmov.32 d27[1],r5",
- "EE B7 BA 00", "vmov.f32 s22,#0x70", // originally "vmov.f32 s22,#1.0"
- "EE F0 AA 4D", "vmov.f32 s21,s26",
- "EE F7 6B 00", "vmov.f64 d22,#0x70", // originally "vmov.f64 d22,#1.0"
- "EE F0 5B 6A", "vmov.f64 d21,d26",
- "EF C8 6A 3A", "vmovl.s8 q11,d26",
- "EF D0 6A 3A", "vmovl.s16 q11,d26",
- "EF E0 6A 3A", "vmovl.s32 q11,d26",
- "FF C8 6A 3A", "vmovl.u8 q11,d26",
- "FF D0 6A 3A", "vmovl.u16 q11,d26",
- "FF E0 6A 3A", "vmovl.u32 q11,d26",
- "FF F2 52 2E", "vmovn.i16 d21,q15",
- "FF F6 52 2E", "vmovn.i32 d21,q15",
- "FF FA 52 2E", "vmovn.i64 d21,q15",
- "EE F0 5A 10", "vmrs r5,fpsid",
- "EE F1 5A 10", "vmrs r5,fpscr",
- "EE F6 5A 10", "vmrs r5,mvfr1",
- "EE F7 5A 10", "vmrs r5,mvfr0",
- "EE F8 5A 10", "vmrs r5,fpexc",
- "EE F9 5A 10", "vmrs r5,fpinst",
- "EE FA 5A 10", "vmrs r5,fpinst2",
- "EE E0 5A 10", "vmsr fpsid,r5",
- "EE E1 5A 10", "vmsr fpscr,r5",
- "EE E8 5A 10", "vmsr fpexc,r5",
- "EE E9 5A 10", "vmsr fpinst,r5",
- "EE EA 5A 10", "vmsr fpinst2,r5",
- "EF D9 58 CF", "vmul.i16 d21,d25,d7[1]",
- "EF E9 58 EF", "vmul.i32 d21,d25,d15[1]",
- "EF E9 59 EF", "vmul.f32 d21,d25,d15[1]",
- "EF 49 59 BA", "vmul.i8 d21,d25,d26",
- "EF 49 59 BA", "vmul.i8 d21,d25,d26",
- "EF 59 59 BA", "vmul.i16 d21,d25,d26",
- "EF 69 59 BA", "vmul.i32 d21,d25,d26",
- "FF 49 59 BA", "vmul.p8 d21,d25,d26",
- "FF DC 68 CF", "vmul.i16 q11,q14,d7[1]",
- "FF EC 68 EF", "vmul.i32 q11,q14,d15[1]",
- "FF EC 69 EF", "vmul.f32 q11,q14,d15[1]",
- "EF 4C 69 FE", "vmul.i8 q11,q14,q15",
- "EF 5C 69 FE", "vmul.i16 q11,q14,q15",
- "EF 6C 69 FE", "vmul.i32 q11,q14,q15",
- "FF 4C 69 FE", "vmul.p8 q11,q14,q15",
- "FF 49 5D BA", "vmul.f32 d21,d25,d26",
- "FF 4C 6D FE", "vmul.f32 q11,q14,q15",
- "EE 6C AA 8D", "vmul.f32 s21,s25,s26",
- "EE 69 5B AA", "vmul.f64 d21,d25,d26",
- "EF D9 6A CF", "vmull.s16 q11,d25,d7[1]",
- "EF E9 6A EF", "vmull.s32 q11,d25,d15[1]",
- "FF D9 6A CF", "vmull.u16 q11,d25,d7[1]",
- "FF E9 6A EF", "vmull.u32 q11,d25,d15[1]",
- "EF C9 6C AA", "vmull.s8 q11,d25,d26",
- "EF D9 6C AA", "vmull.s16 q11,d25,d26",
- "EF E9 6C AA", "vmull.s32 q11,d25,d26",
- "FF C9 6C AA", "vmull.u8 q11,d25,d26",
- "FF D9 6C AA", "vmull.u16 q11,d25,d26",
- "FF E9 6C AA", "vmull.u32 q11,d25,d26",
- "EF C9 6E AA", "vmull.p8 q11,d25,d26",
- "FF F0 55 AA", "vmvn d21,d26",
- "FF F0 65 EE", "vmvn q11,q15",
- "FF C0 58 37", "vmvn.i16 d21,#0x87",
- "FF C0 50 37", "vmvn.i32 d21,#0x87",
- "FF C0 68 77", "vmvn.i16 q11,#0x87",
- "FF C0 60 77", "vmvn.i32 q11,#0x87",
- "FF F1 53 AA", "vneg.s8 d21,d26",
- "FF F5 53 AA", "vneg.s16 d21,d26",
- "FF F9 53 AA", "vneg.s32 d21,d26",
- "FF F9 57 AA", "vneg.f32 d21,d26",
- "EE F1 5B 6A", "vneg.f64 d21,d26",
- "FF F1 63 EE", "vneg.s8 q11,q15",
- "FF F5 63 EE", "vneg.s16 q11,q15",
- "FF F9 63 EE", "vneg.s32 q11,q15",
- "FF F9 67 EE", "vneg.f32 q11,q15",
- "EE F1 AA 4D", "vneg.f32 s21,s26",
- "EE 5C AA CD", "vnmla.f32 s21,s25,s26",
- "EE 59 5B EA", "vnmla.f64 d21,d25,d26",
- "EE 5C AA 8D", "vnmls.f32 s21,s25,s26",
- "EE 59 5B AA", "vnmls.f64 d21,d25,d26",
- "EE 6C AA CD", "vnmul.f32 s21,s25,s26",
- "EE 69 5B EA", "vnmul.f64 d21,d25,d26",
- "EF 79 51 BA", "vorn d21,d25,d26",
- "EF 7C 61 FE", "vorn q11,q14,q15",
- "EF 69 51 BA", "vorr d21,d25,d26",
- "EF 6C 61 FE", "vorr q11,q14,q15",
- "FF C0 59 17", "vorr.i16 d21,#0x87",
- "FF C0 51 17", "vorr.i32 d21,#0x87",
- "FF C0 69 57", "vorr.i16 q11,#0x87",
- "FF C0 61 57", "vorr.i32 q11,#0x87",
- "FF F0 56 2A", "vpadal.s8 d21,d26",
- "FF F4 56 2A", "vpadal.s16 d21,d26",
- "FF F8 56 2A", "vpadal.s32 d21,d26",
- "FF F0 56 AA", "vpadal.u8 d21,d26",
- "FF F4 56 AA", "vpadal.u16 d21,d26",
- "FF F8 56 AA", "vpadal.u32 d21,d26",
- "FF F0 66 6E", "vpadal.s8 q11,q15",
- "FF F4 66 6E", "vpadal.s16 q11,q15",
- "FF F8 66 6E", "vpadal.s32 q11,q15",
- "FF F0 66 EE", "vpadal.u8 q11,q15",
- "FF F4 66 EE", "vpadal.u16 q11,q15",
- "FF F8 66 EE", "vpadal.u32 q11,q15",
- "EF 49 5B BA", "vpadd.i8 d21,d25,d26",
- "EF 59 5B BA", "vpadd.i16 d21,d25,d26",
- "EF 69 5B BA", "vpadd.i32 d21,d25,d26",
- "FF 49 5D AA", "vpadd.f32 d21,d25,d26",
- "FF F0 52 2A", "vpaddl.s8 d21,d26",
- "FF F4 52 2A", "vpaddl.s16 d21,d26",
- "FF F8 52 2A", "vpaddl.s32 d21,d26",
- "FF F0 52 AA", "vpaddl.u8 d21,d26",
- "FF F4 52 AA", "vpaddl.u16 d21,d26",
- "FF F8 52 AA", "vpaddl.u32 d21,d26",
- "FF F0 62 6E", "vpaddl.s8 q11,q15",
- "FF F4 62 6E", "vpaddl.s16 q11,q15",
- "FF F8 62 6E", "vpaddl.s32 q11,q15",
- "FF F0 62 EE", "vpaddl.u8 q11,q15",
- "FF F4 62 EE", "vpaddl.u16 q11,q15",
- "FF F8 62 EE", "vpaddl.u32 q11,q15",
- "EF 49 5A AA", "vpmax.s8 d21,d25,d26",
- "EF 59 5A AA", "vpmax.s16 d21,d25,d26",
- "EF 69 5A AA", "vpmax.s32 d21,d25,d26",
- "FF 49 5A AA", "vpmax.u8 d21,d25,d26",
- "FF 59 5A AA", "vpmax.u16 d21,d25,d26",
- "FF 69 5A AA", "vpmax.u32 d21,d25,d26",
- "FF 49 5F AA", "vpmax.f32 d21,d25,d26",
- "EF 49 5A BA", "vpmin.s8 d21,d25,d26",
- "EF 59 5A BA", "vpmin.s16 d21,d25,d26",
- "EF 69 5A BA", "vpmin.s32 d21,d25,d26",
- "FF 49 5A BA", "vpmin.u8 d21,d25,d26",
- "FF 59 5A BA", "vpmin.u16 d21,d25,d26",
- "FF 69 5A BA", "vpmin.u32 d21,d25,d26",
- "FF 69 5F AA", "vpmin.f32 d21,d25,d26",
- "EC FD DA 02", "vpop {s27-s28}",
- "EC FD BB 04", "vpop {d27-d28}",
- "ED 6D DA 02", "vpush {s27-s28}",
- "ED 6D BB 04", "vpush {d27-d28}",
- "FF F0 57 2A", "vqabs.s8 d21,d26",
- "FF F4 57 2A", "vqabs.s16 d21,d26",
- "FF F8 57 2A", "vqabs.s32 d21,d26",
- "FF F0 67 6E", "vqabs.s8 q11,q15",
- "FF F4 67 6E", "vqabs.s16 q11,q15",
- "FF F8 67 6E", "vqabs.s32 q11,q15",
- "EF 49 50 BA", "vqadd.s8 d21,d25,d26",
- "EF 59 50 BA", "vqadd.s16 d21,d25,d26",
- "EF 69 50 BA", "vqadd.s32 d21,d25,d26",
- "EF 79 50 BA", "vqadd.s64 d21,d25,d26",
- "FF 49 50 BA", "vqadd.u8 d21,d25,d26",
- "FF 59 50 BA", "vqadd.u16 d21,d25,d26",
- "FF 69 50 BA", "vqadd.u32 d21,d25,d26",
- "FF 79 50 BA", "vqadd.u64 d21,d25,d26",
- "EF 4C 60 FE", "vqadd.s8 q11,q14,q15",
- "EF 5C 60 FE", "vqadd.s16 q11,q14,q15",
- "EF 6C 60 FE", "vqadd.s32 q11,q14,q15",
- "EF 7C 60 FE", "vqadd.s64 q11,q14,q15",
- "FF 4C 60 FE", "vqadd.u8 q11,q14,q15",
- "FF 5C 60 FE", "vqadd.u16 q11,q14,q15",
- "FF 6C 60 FE", "vqadd.u32 q11,q14,q15",
- "FF 7C 60 FE", "vqadd.u64 q11,q14,q15",
- "EF D9 63 CF", "vqdmlal.s16 q11,d25,d7[1]",
- "EF E9 63 EF", "vqdmlal.s32 q11,d25,d15[1]",
- "EF D9 69 AA", "vqdmlal.s16 q11,d25,d26",
- "EF E9 69 AA", "vqdmlal.s32 q11,d25,d26",
- "EF D9 67 CF", "vqdmlsl.s16 q11,d25,d7[1]",
- "EF E9 67 EF", "vqdmlsl.s32 q11,d25,d15[1]",
- "EF D9 6B AA", "vqdmlsl.s16 q11,d25,d26",
- "EF E9 6B AA", "vqdmlsl.s32 q11,d25,d26",
- "EF D9 5C CA", "vqdmulh.s16 d21,d25,d2[1]",
- "EF E9 5C EF", "vqdmulh.s32 d21,d25,d15[1]",
- "EF 59 5B AA", "vqdmulh.s16 d21,d25,d26",
- "EF 69 5B AA", "vqdmulh.s32 d21,d25,d26",
- "FF DC 6C CA", "vqdmulh.s16 q11,q14,d2[1]",
- "FF EC 6C EF", "vqdmulh.s32 q11,q14,d15[1]",
- "EF 5C 6B EE", "vqdmulh.s16 q11,q14,q15",
- "EF 6C 6B EE", "vqdmulh.s32 q11,q14,q15",
- "EF D9 6B CA", "vqdmull.s16 q11,d25,d2[1]",
- "EF E9 6B EF", "vqdmull.s32 q11,d25,d15[1]",
- "EF D9 6D AA", "vqdmull.s16 q11,d25,d26",
- "EF E9 6D AA", "vqdmull.s32 q11,d25,d26",
- "EF D9 6D AA", "vqdmull.s16 q11,d25,d26",
- "EF E9 6D AA", "vqdmull.s32 q11,d25,d26",
- "FF F2 52 AE", "vqmovn.s16 d21,q15",
- "FF F6 52 AE", "vqmovn.s32 d21,q15",
- "FF FA 52 AE", "vqmovn.s64 d21,q15",
- "FF F2 52 EE", "vqmovn.u16 d21,q15",
- "FF F6 52 EE", "vqmovn.u32 d21,q15",
- "FF FA 52 EE", "vqmovn.u64 d21,q15",
- "FF F2 52 6E", "vqmovun.s16 d21,q15",
- "FF F6 52 6E", "vqmovun.s32 d21,q15",
- "FF FA 52 6E", "vqmovun.s64 d21,q15",
- "FF F0 57 AA", "vqneg.s8 d21,d26",
- "FF F4 57 AA", "vqneg.s16 d21,d26",
- "FF F8 57 AA", "vqneg.s32 d21,d26",
- "FF F0 67 EE", "vqneg.s8 q11,q15",
- "FF F4 67 EE", "vqneg.s16 q11,q15",
- "FF F8 67 EE", "vqneg.s32 q11,q15",
- "EF D9 5D CF", "vqrdmulh.s16 d21,d25,d7[1]",
- "EF E9 5D EF", "vqrdmulh.s32 d21,d25,d15[1]",
- "FF 59 5B AA", "vqrdmulh.s16 d21,d25,d26",
- "FF 69 5B AA", "vqrdmulh.s32 d21,d25,d26",
- "FF DC 6D CF", "vqrdmulh.s16 q11,q14,d7[1]",
- "FF EC 6D EF", "vqrdmulh.s32 q11,q14,d15[1]",
- "FF 5C 6B EE", "vqrdmulh.s16 q11,q14,q15",
- "FF 6C 6B EE", "vqrdmulh.s32 q11,q14,q15",
- "EF 49 55 BA", "vqrshl.s8 d21,d26,d25",
- "EF 59 55 BA", "vqrshl.s16 d21,d26,d25",
- "EF 69 55 BA", "vqrshl.s32 d21,d26,d25",
- "EF 79 55 BA", "vqrshl.s64 d21,d26,d25",
- "FF 49 55 BA", "vqrshl.u8 d21,d26,d25",
- "FF 59 55 BA", "vqrshl.u16 d21,d26,d25",
- "FF 69 55 BA", "vqrshl.u32 d21,d26,d25",
- "FF 79 55 BA", "vqrshl.u64 d21,d26,d25",
- "EF 4C 65 FE", "vqrshl.s8 q11,q15,q14",
- "EF 5C 65 FE", "vqrshl.s16 q11,q15,q14",
- "EF 6C 65 FE", "vqrshl.s32 q11,q15,q14",
- "EF 7C 65 FE", "vqrshl.s64 q11,q15,q14",
- "FF 4C 65 FE", "vqrshl.u8 q11,q15,q14",
- "FF 5C 65 FE", "vqrshl.u16 q11,q15,q14",
- "FF 6C 65 FE", "vqrshl.u32 q11,q15,q14",
- "FF 7C 65 FE", "vqrshl.u64 q11,q15,q14",
- "EF CF 59 7E", "vqrshrn.s16 d21,q15,#1",
- "FF CF 59 7E", "vqrshrn.u16 d21,q15,#1",
- "EF CF 59 7E", "vqrshrn.s16 d21,q15,#1",
- "EF C8 59 7E", "vqrshrn.s16 d21,q15,#8",
- "FF CF 59 7E", "vqrshrn.u16 d21,q15,#1",
- "FF C8 59 7E", "vqrshrn.u16 d21,q15,#8",
- "EF DF 59 7E", "vqrshrn.s32 d21,q15,#1",
- "EF D0 59 7E", "vqrshrn.s32 d21,q15,#16",
- "FF DF 59 7E", "vqrshrn.u32 d21,q15,#1",
- "FF D0 59 7E", "vqrshrn.u32 d21,q15,#16",
- "EF FF 59 7E", "vqrshrn.s64 d21,q15,#1",
- "EF E0 59 7E", "vqrshrn.s64 d21,q15,#32",
- "FF FF 59 7E", "vqrshrn.u64 d21,q15,#1",
- "FF E0 59 7E", "vqrshrn.u64 d21,q15,#32",
- "FF CF 58 7E", "vqrshrun.s16 d21,q15,#1",
- "FF C8 58 7E", "vqrshrun.s16 d21,q15,#8",
- "FF DF 58 7E", "vqrshrun.s32 d21,q15,#1",
- "FF D0 58 7E", "vqrshrun.s32 d21,q15,#16",
- "FF FF 58 7E", "vqrshrun.s64 d21,q15,#1",
- "FF E0 58 7E", "vqrshrun.s64 d21,q15,#32",
- "EF C8 57 3A", "vqshl.s8 d21,d26,#0",
- "EF CF 57 3A", "vqshl.s8 d21,d26,#7",
- "FF C8 57 3A", "vqshl.u8 d21,d26,#0",
- "FF CF 57 3A", "vqshl.u8 d21,d26,#7",
- "EF D0 57 3A", "vqshl.s16 d21,d26,#0",
- "EF DF 57 3A", "vqshl.s16 d21,d26,#15",
- "FF D0 57 3A", "vqshl.u16 d21,d26,#0",
- "FF DF 57 3A", "vqshl.u16 d21,d26,#15",
- "EF E0 57 3A", "vqshl.s32 d21,d26,#0",
- "EF FF 57 3A", "vqshl.s32 d21,d26,#31",
- "FF E0 57 3A", "vqshl.u32 d21,d26,#0",
- "FF FF 57 3A", "vqshl.u32 d21,d26,#31",
- "EF C0 57 BA", "vqshl.s64 d21,d26,#0",
- "EF FF 57 BA", "vqshl.s64 d21,d26,#63",
- "FF C0 57 BA", "vqshl.u64 d21,d26,#0",
- "FF FF 57 BA", "vqshl.u64 d21,d26,#63",
- "EF 49 54 BA", "vqshl.s8 d21,d26,d25",
- "EF 59 54 BA", "vqshl.s16 d21,d26,d25",
- "EF 69 54 BA", "vqshl.s32 d21,d26,d25",
- "EF 79 54 BA", "vqshl.s64 d21,d26,d25",
- "FF 49 54 BA", "vqshl.u8 d21,d26,d25",
- "FF 59 54 BA", "vqshl.u16 d21,d26,d25",
- "FF 69 54 BA", "vqshl.u32 d21,d26,d25",
- "FF 79 54 BA", "vqshl.u64 d21,d26,d25",
- "EF C8 67 7E", "vqshl.s8 q11,q15,#0",
- "EF CF 67 7E", "vqshl.s8 q11,q15,#7",
- "FF C8 67 7E", "vqshl.u8 q11,q15,#0",
- "FF CF 67 7E", "vqshl.u8 q11,q15,#7",
- "EF D0 67 7E", "vqshl.s16 q11,q15,#0",
- "EF DF 67 7E", "vqshl.s16 q11,q15,#15",
- "FF D0 67 7E", "vqshl.u16 q11,q15,#0",
- "FF DF 67 7E", "vqshl.u16 q11,q15,#15",
- "EF E0 67 7E", "vqshl.s32 q11,q15,#0",
- "EF FF 67 7E", "vqshl.s32 q11,q15,#31",
- "FF E0 67 7E", "vqshl.u32 q11,q15,#0",
- "FF FF 67 7E", "vqshl.u32 q11,q15,#31",
- "EF C0 67 FE", "vqshl.s64 q11,q15,#0",
- "EF FF 67 FE", "vqshl.s64 q11,q15,#63",
- "FF C0 67 FE", "vqshl.u64 q11,q15,#0",
- "FF FF 67 FE", "vqshl.u64 q11,q15,#63",
- "EF 4C 64 FE", "vqshl.s8 q11,q15,q14",
- "EF 5C 64 FE", "vqshl.s16 q11,q15,q14",
- "EF 6C 64 FE", "vqshl.s32 q11,q15,q14",
- "EF 7C 64 FE", "vqshl.s64 q11,q15,q14",
- "FF 4C 64 FE", "vqshl.u8 q11,q15,q14",
- "FF 5C 64 FE", "vqshl.u16 q11,q15,q14",
- "FF 6C 64 FE", "vqshl.u32 q11,q15,q14",
- "FF 7C 64 FE", "vqshl.u64 q11,q15,q14",
- "FF C8 56 3A", "vqshlu.s8 d21,d26,#0",
- "FF CF 56 3A", "vqshlu.s8 d21,d26,#7",
- "FF D0 56 3A", "vqshlu.s16 d21,d26,#0",
- "FF DF 56 3A", "vqshlu.s16 d21,d26,#15",
- "FF E0 56 3A", "vqshlu.s32 d21,d26,#0",
- "FF FF 56 3A", "vqshlu.s32 d21,d26,#31",
- "FF C0 56 BA", "vqshlu.s64 d21,d26,#0",
- "FF FF 56 BA", "vqshlu.s64 d21,d26,#63",
- "FF C8 66 7E", "vqshlu.s8 q11,q15,#0",
- "FF CF 66 7E", "vqshlu.s8 q11,q15,#7",
- "FF D0 66 7E", "vqshlu.s16 q11,q15,#0",
- "FF DF 66 7E", "vqshlu.s16 q11,q15,#15",
- "FF E0 66 7E", "vqshlu.s32 q11,q15,#0",
- "FF FF 66 7E", "vqshlu.s32 q11,q15,#31",
- "FF C0 66 FE", "vqshlu.s64 q11,q15,#0",
- "FF FF 66 FE", "vqshlu.s64 q11,q15,#63",
- "EF CF 59 3E", "vqshrn.s16 d21,q15,#1",
- "EF C8 59 3E", "vqshrn.s16 d21,q15,#8",
- "FF CF 59 3E", "vqshrn.u16 d21,q15,#1",
- "FF C8 59 3E", "vqshrn.u16 d21,q15,#8",
- "EF DF 59 3E", "vqshrn.s32 d21,q15,#1",
- "EF D0 59 3E", "vqshrn.s32 d21,q15,#16",
- "FF DF 59 3E", "vqshrn.u32 d21,q15,#1",
- "FF D0 59 3E", "vqshrn.u32 d21,q15,#16",
- "EF FF 59 3E", "vqshrn.s64 d21,q15,#1",
- "EF E0 59 3E", "vqshrn.s64 d21,q15,#32",
- "FF FF 59 3E", "vqshrn.u64 d21,q15,#1",
- "FF E0 59 3E", "vqshrn.u64 d21,q15,#32",
- "FF CF 58 3E", "vqshrun.s16 d21,q15,#1",
- "FF C8 58 3E", "vqshrun.s16 d21,q15,#8",
- "FF DF 58 3E", "vqshrun.s32 d21,q15,#1",
- "FF D0 58 3E", "vqshrun.s32 d21,q15,#16",
- "FF FF 58 3E", "vqshrun.s64 d21,q15,#1",
- "FF E0 58 3E", "vqshrun.s64 d21,q15,#32",
- "EF 49 52 BA", "vqsub.s8 d21,d25,d26",
- "EF 59 52 BA", "vqsub.s16 d21,d25,d26",
- "EF 69 52 BA", "vqsub.s32 d21,d25,d26",
- "EF 79 52 BA", "vqsub.s64 d21,d25,d26",
- "FF 49 52 BA", "vqsub.u8 d21,d25,d26",
- "FF 59 52 BA", "vqsub.u16 d21,d25,d26",
- "FF 69 52 BA", "vqsub.u32 d21,d25,d26",
- "FF 79 52 BA", "vqsub.u64 d21,d25,d26",
- "EF 4C 62 FE", "vqsub.s8 q11,q14,q15",
- "EF 5C 62 FE", "vqsub.s16 q11,q14,q15",
- "EF 6C 62 FE", "vqsub.s32 q11,q14,q15",
- "EF 7C 62 FE", "vqsub.s64 q11,q14,q15",
- "FF 4C 62 FE", "vqsub.u8 q11,q14,q15",
- "FF 5C 62 FE", "vqsub.u16 q11,q14,q15",
- "FF 6C 62 FE", "vqsub.u32 q11,q14,q15",
- "FF 7C 62 FE", "vqsub.u64 q11,q14,q15",
- "FF CC 54 AE", "vraddhn.i16 d21,q14,q15",
- "FF DC 54 AE", "vraddhn.i32 d21,q14,q15",
- "FF EC 54 AE", "vraddhn.i64 d21,q14,q15",
- "FF FB 54 2A", "vrecpe.u32 d21,d26",
- "FF FB 55 2A", "vrecpe.f32 d21,d26",
- "FF FB 64 6E", "vrecpe.u32 q11,q15",
- "FF FB 65 6E", "vrecpe.f32 q11,q15",
- "EF 49 5F BA", "vrecps.f32 d21,d25,d26",
- "EF 4C 6F FE", "vrecps.f32 q11,q14,q15",
- "FF F0 51 2A", "vrev16.8 d21,d26",
- "FF F0 61 6E", "vrev16.8 q11,q15",
- "FF F0 50 AA", "vrev32.8 d21,d26",
- "FF F4 50 AA", "vrev32.16 d21,d26",
- "FF F0 60 EE", "vrev32.8 q11,q15",
- "FF F4 60 EE", "vrev32.16 q11,q15",
- "FF F0 50 2A", "vrev64.8 d21,d26",
- "FF F4 50 2A", "vrev64.16 d21,d26",
- "FF F8 50 2A", "vrev64.32 d21,d26",
- "FF F0 60 6E", "vrev64.8 q11,q15",
- "FF F4 60 6E", "vrev64.16 q11,q15",
- "FF F8 60 6E", "vrev64.32 q11,q15",
- "EF 49 51 AA", "vrhadd.s8 d21,d25,d26",
- "EF 59 51 AA", "vrhadd.s16 d21,d25,d26",
- "EF 69 51 AA", "vrhadd.s32 d21,d25,d26",
- "FF 49 51 AA", "vrhadd.u8 d21,d25,d26",
- "FF 59 51 AA", "vrhadd.u16 d21,d25,d26",
- "FF 69 51 AA", "vrhadd.u32 d21,d25,d26",
- "EF 4C 61 EE", "vrhadd.s8 q11,q14,q15",
- "EF 5C 61 EE", "vrhadd.s16 q11,q14,q15",
- "EF 6C 61 EE", "vrhadd.s32 q11,q14,q15",
- "FF 4C 61 EE", "vrhadd.u8 q11,q14,q15",
- "FF 5C 61 EE", "vrhadd.u16 q11,q14,q15",
- "FF 6C 61 EE", "vrhadd.u32 q11,q14,q15",
- "EF 49 55 AA", "vrshl.s8 d21,d26,d25",
- "EF 59 55 AA", "vrshl.s16 d21,d26,d25",
- "EF 69 55 AA", "vrshl.s32 d21,d26,d25",
- "EF 79 55 AA", "vrshl.s64 d21,d26,d25",
- "FF 49 55 AA", "vrshl.u8 d21,d26,d25",
- "FF 59 55 AA", "vrshl.u16 d21,d26,d25",
- "FF 69 55 AA", "vrshl.u32 d21,d26,d25",
- "FF 79 55 AA", "vrshl.u64 d21,d26,d25",
- "EF 4C 65 EE", "vrshl.s8 q11,q15,q14",
- "EF 5C 65 EE", "vrshl.s16 q11,q15,q14",
- "EF 6C 65 EE", "vrshl.s32 q11,q15,q14",
- "EF 7C 65 EE", "vrshl.s64 q11,q15,q14",
- "FF 4C 65 EE", "vrshl.u8 q11,q15,q14",
- "FF 5C 65 EE", "vrshl.u16 q11,q15,q14",
- "FF 6C 65 EE", "vrshl.u32 q11,q15,q14",
- "FF 7C 65 EE", "vrshl.u64 q11,q15,q14",
- "EF CF 52 3A", "vrshr.s8 d21,d26,#1",
- "EF C8 52 3A", "vrshr.s8 d21,d26,#8",
- "FF CF 52 3A", "vrshr.u8 d21,d26,#1",
- "FF C8 52 3A", "vrshr.u8 d21,d26,#8",
- "EF DF 52 3A", "vrshr.s16 d21,d26,#1",
- "EF D0 52 3A", "vrshr.s16 d21,d26,#16",
- "FF DF 52 3A", "vrshr.u16 d21,d26,#1",
- "FF D0 52 3A", "vrshr.u16 d21,d26,#16",
- "EF FF 52 3A", "vrshr.s32 d21,d26,#1",
- "EF E0 52 3A", "vrshr.s32 d21,d26,#32",
- "FF FF 52 3A", "vrshr.u32 d21,d26,#1",
- "FF E0 52 3A", "vrshr.u32 d21,d26,#32",
- "EF FF 52 BA", "vrshr.s64 d21,d26,#1",
- "EF C0 52 BA", "vrshr.s64 d21,d26,#64",
- "FF FF 52 BA", "vrshr.u64 d21,d26,#1",
- "FF C0 52 BA", "vrshr.u64 d21,d26,#64",
- "EF CF 62 7E", "vrshr.s8 q11,q15,#1",
- "EF C8 62 7E", "vrshr.s8 q11,q15,#8",
- "FF CF 62 7E", "vrshr.u8 q11,q15,#1",
- "FF C8 62 7E", "vrshr.u8 q11,q15,#8",
- "EF DF 62 7E", "vrshr.s16 q11,q15,#1",
- "EF D0 62 7E", "vrshr.s16 q11,q15,#16",
- "FF DF 62 7E", "vrshr.u16 q11,q15,#1",
- "FF D0 62 7E", "vrshr.u16 q11,q15,#16",
- "EF FF 62 7E", "vrshr.s32 q11,q15,#1",
- "EF E0 62 7E", "vrshr.s32 q11,q15,#32",
- "FF FF 62 7E", "vrshr.u32 q11,q15,#1",
- "FF E0 62 7E", "vrshr.u32 q11,q15,#32",
- "EF FF 62 FE", "vrshr.s64 q11,q15,#1",
- "EF C0 62 FE", "vrshr.s64 q11,q15,#64",
- "FF FF 62 FE", "vrshr.u64 q11,q15,#1",
- "FF C0 62 FE", "vrshr.u64 q11,q15,#64",
- "EF CF 58 7E", "vrshrn.i16 d21,q15,#1",
- "EF C8 58 7E", "vrshrn.i16 d21,q15,#8",
- "EF DF 58 7E", "vrshrn.i32 d21,q15,#1",
- "EF D0 58 7E", "vrshrn.i32 d21,q15,#16",
- "EF FF 58 7E", "vrshrn.i64 d21,q15,#1",
- "EF E0 58 7E", "vrshrn.i64 d21,q15,#32",
- "FF FB 54 AA", "vrsqrte.u32 d21,d26",
- "FF FB 55 AA", "vrsqrte.f32 d21,d26",
- "FF FB 64 EE", "vrsqrte.u32 q11,q15",
- "FF FB 65 EE", "vrsqrte.f32 q11,q15",
- "EF 69 5F BA", "vrsqrts.f32 d21,d25,d26",
- "EF 6C 6F FE", "vrsqrts.f32 q11,q14,q15",
- "EF CF 53 3A", "vrsra.s8 d21,d26,#1",
- "EF C8 53 3A", "vrsra.s8 d21,d26,#8",
- "FF CF 53 3A", "vrsra.u8 d21,d26,#1",
- "FF C8 53 3A", "vrsra.u8 d21,d26,#8",
- "EF DF 53 3A", "vrsra.s16 d21,d26,#1",
- "EF D0 53 3A", "vrsra.s16 d21,d26,#16",
- "FF DF 53 3A", "vrsra.u16 d21,d26,#1",
- "FF D0 53 3A", "vrsra.u16 d21,d26,#16",
- "EF FF 53 3A", "vrsra.s32 d21,d26,#1",
- "EF E0 53 3A", "vrsra.s32 d21,d26,#32",
- "FF FF 53 3A", "vrsra.u32 d21,d26,#1",
- "FF E0 53 3A", "vrsra.u32 d21,d26,#32",
- "EF FF 53 BA", "vrsra.s64 d21,d26,#1",
- "EF C0 53 BA", "vrsra.s64 d21,d26,#64",
- "FF FF 53 BA", "vrsra.u64 d21,d26,#1",
- "FF C0 53 BA", "vrsra.u64 d21,d26,#64",
- "EF CF 63 7E", "vrsra.s8 q11,q15,#1",
- "EF C8 63 7E", "vrsra.s8 q11,q15,#8",
- "FF CF 63 7E", "vrsra.u8 q11,q15,#1",
- "FF C8 63 7E", "vrsra.u8 q11,q15,#8",
- "EF DF 63 7E", "vrsra.s16 q11,q15,#1",
- "EF D0 63 7E", "vrsra.s16 q11,q15,#16",
- "FF DF 63 7E", "vrsra.u16 q11,q15,#1",
- "FF D0 63 7E", "vrsra.u16 q11,q15,#16",
- "EF FF 63 7E", "vrsra.s32 q11,q15,#1",
- "EF E0 63 7E", "vrsra.s32 q11,q15,#32",
- "FF FF 63 7E", "vrsra.u32 q11,q15,#1",
- "FF E0 63 7E", "vrsra.u32 q11,q15,#32",
- "EF FF 63 FE", "vrsra.s64 q11,q15,#1",
- "EF C0 63 FE", "vrsra.s64 q11,q15,#64",
- "FF FF 63 FE", "vrsra.u64 q11,q15,#1",
- "FF C0 63 FE", "vrsra.u64 q11,q15,#64",
- "FF CC 56 AE", "vrsubhn.i16 d21,q14,q15",
- "FF DC 56 AE", "vrsubhn.i32 d21,q14,q15",
- "FF EC 56 AE", "vrsubhn.i64 d21,q14,q15",
- "EF C8 55 3A", "vshl.i8 d21,d26,#0",
- "EF CF 55 3A", "vshl.i8 d21,d26,#7",
- "EF D0 55 3A", "vshl.i16 d21,d26,#0",
- "EF DF 55 3A", "vshl.i16 d21,d26,#15",
- "EF E0 55 3A", "vshl.i32 d21,d26,#0",
- "EF FF 55 3A", "vshl.i32 d21,d26,#31",
- "EF C0 55 BA", "vshl.i64 d21,d26,#0",
- "EF FF 55 BA", "vshl.i64 d21,d26,#63",
- "EF C8 65 7E", "vshl.i8 q11,q15,#0",
- "EF CF 65 7E", "vshl.i8 q11,q15,#7",
- "EF D0 65 7E", "vshl.i16 q11,q15,#0",
- "EF DF 65 7E", "vshl.i16 q11,q15,#15",
- "EF E0 65 7E", "vshl.i32 q11,q15,#0",
- "EF FF 65 7E", "vshl.i32 q11,q15,#31",
- "EF C0 65 FE", "vshl.i64 q11,q15,#0",
- "EF FF 65 FE", "vshl.i64 q11,q15,#63",
- "EF 49 54 AA", "vshl.s8 d21,d26,d25",
- "EF 59 54 AA", "vshl.s16 d21,d26,d25",
- "EF 69 54 AA", "vshl.s32 d21,d26,d25",
- "EF 79 54 AA", "vshl.s64 d21,d26,d25",
- "FF 49 54 AA", "vshl.u8 d21,d26,d25",
- "FF 59 54 AA", "vshl.u16 d21,d26,d25",
- "FF 69 54 AA", "vshl.u32 d21,d26,d25",
- "FF 79 54 AA", "vshl.u64 d21,d26,d25",
- "EF 4C 64 EE", "vshl.s8 q11,q15,q14",
- "EF 5C 64 EE", "vshl.s16 q11,q15,q14",
- "EF 6C 64 EE", "vshl.s32 q11,q15,q14",
- "EF 7C 64 EE", "vshl.s64 q11,q15,q14",
- "FF 4C 64 EE", "vshl.u8 q11,q15,q14",
- "FF 5C 64 EE", "vshl.u16 q11,q15,q14",
- "FF 6C 64 EE", "vshl.u32 q11,q15,q14",
- "FF 7C 64 EE", "vshl.u64 q11,q15,q14",
- "EF C9 6A 3A", "vshll.s8 q11,d26,#1",
- "EF CF 6A 3A", "vshll.s8 q11,d26,#7",
- "FF C9 6A 3A", "vshll.u8 q11,d26,#1",
- "FF CF 6A 3A", "vshll.u8 q11,d26,#7",
- "EF D1 6A 3A", "vshll.s16 q11,d26,#1",
- "EF DF 6A 3A", "vshll.s16 q11,d26,#15",
- "FF D1 6A 3A", "vshll.u16 q11,d26,#1",
- "FF DF 6A 3A", "vshll.u16 q11,d26,#15",
- "EF E1 6A 3A", "vshll.s32 q11,d26,#1",
- "EF FF 6A 3A", "vshll.s32 q11,d26,#31",
- "FF E1 6A 3A", "vshll.u32 q11,d26,#1",
- "FF FF 6A 3A", "vshll.u32 q11,d26,#31",
- "FF F2 63 2A", "vshll.i8 q11,d26,#8",
- "FF F6 63 2A", "vshll.i16 q11,d26,#16",
- "FF FA 63 2A", "vshll.i32 q11,d26,#32",
- "EF CF 50 3A", "vshr.s8 d21,d26,#1",
- "EF C8 50 3A", "vshr.s8 d21,d26,#8",
- "FF CF 50 3A", "vshr.u8 d21,d26,#1",
- "FF C8 50 3A", "vshr.u8 d21,d26,#8",
- "EF DF 50 3A", "vshr.s16 d21,d26,#1",
- "EF D0 50 3A", "vshr.s16 d21,d26,#16",
- "FF DF 50 3A", "vshr.u16 d21,d26,#1",
- "FF D0 50 3A", "vshr.u16 d21,d26,#16",
- "EF FF 50 3A", "vshr.s32 d21,d26,#1",
- "EF E0 50 3A", "vshr.s32 d21,d26,#32",
- "FF FF 50 3A", "vshr.u32 d21,d26,#1",
- "FF E0 50 3A", "vshr.u32 d21,d26,#32",
- "EF FF 50 BA", "vshr.s64 d21,d26,#1",
- "EF C0 50 BA", "vshr.s64 d21,d26,#64",
- "FF FF 50 BA", "vshr.u64 d21,d26,#1",
- "FF C0 50 BA", "vshr.u64 d21,d26,#64",
- "EF CF 60 7E", "vshr.s8 q11,q15,#1",
- "EF C8 60 7E", "vshr.s8 q11,q15,#8",
- "FF CF 60 7E", "vshr.u8 q11,q15,#1",
- "FF C8 60 7E", "vshr.u8 q11,q15,#8",
- "EF DF 60 7E", "vshr.s16 q11,q15,#1",
- "EF D0 60 7E", "vshr.s16 q11,q15,#16",
- "FF DF 60 7E", "vshr.u16 q11,q15,#1",
- "FF D0 60 7E", "vshr.u16 q11,q15,#16",
- "EF FF 60 7E", "vshr.s32 q11,q15,#1",
- "EF E0 60 7E", "vshr.s32 q11,q15,#32",
- "FF FF 60 7E", "vshr.u32 q11,q15,#1",
- "FF E0 60 7E", "vshr.u32 q11,q15,#32",
- "EF FF 60 FE", "vshr.s64 q11,q15,#1",
- "EF C0 60 FE", "vshr.s64 q11,q15,#64",
- "FF FF 60 FE", "vshr.u64 q11,q15,#1",
- "FF C0 60 FE", "vshr.u64 q11,q15,#64",
- "EF CF 58 3E", "vshrn.i16 d21,q15,#1",
- "EF C8 58 3E", "vshrn.i16 d21,q15,#8",
- "EF DF 58 3E", "vshrn.i32 d21,q15,#1",
- "EF D0 58 3E", "vshrn.i32 d21,q15,#16",
- "EF FF 58 3E", "vshrn.i64 d21,q15,#1",
- "EF E0 58 3E", "vshrn.i64 d21,q15,#32",
- "FF C8 55 3A", "vsli.8 d21,d26,#0",
- "FF CF 55 3A", "vsli.8 d21,d26,#7",
- "FF D0 55 3A", "vsli.16 d21,d26,#0",
- "FF DF 55 3A", "vsli.16 d21,d26,#15",
- "FF E0 55 3A", "vsli.32 d21,d26,#0",
- "FF FF 55 3A", "vsli.32 d21,d26,#31",
- "FF C0 55 BA", "vsli.64 d21,d26,#0",
- "FF FF 55 BA", "vsli.64 d21,d26,#63",
- "FF C8 65 7E", "vsli.8 q11,q15,#0",
- "FF CF 65 7E", "vsli.8 q11,q15,#7",
- "FF D0 65 7E", "vsli.16 q11,q15,#0",
- "FF DF 65 7E", "vsli.16 q11,q15,#15",
- "FF E0 65 7E", "vsli.32 q11,q15,#0",
- "FF FF 65 7E", "vsli.32 q11,q15,#31",
- "FF C0 65 FE", "vsli.64 q11,q15,#0",
- "FF FF 65 FE", "vsli.64 q11,q15,#63",
- "EE F1 AA CD", "vsqrt.f32 s21,s26",
- "EE F1 5B EA", "vsqrt.f64 d21,d26",
- "EF CF 51 3A", "vsra.s8 d21,d26,#1",
- "EF C8 51 3A", "vsra.s8 d21,d26,#8",
- "FF CF 51 3A", "vsra.u8 d21,d26,#1",
- "FF C8 51 3A", "vsra.u8 d21,d26,#8",
- "EF DF 51 3A", "vsra.s16 d21,d26,#1",
- "EF D0 51 3A", "vsra.s16 d21,d26,#16",
- "FF DF 51 3A", "vsra.u16 d21,d26,#1",
- "FF D0 51 3A", "vsra.u16 d21,d26,#16",
- "EF FF 51 3A", "vsra.s32 d21,d26,#1",
- "EF E0 51 3A", "vsra.s32 d21,d26,#32",
- "FF FF 51 3A", "vsra.u32 d21,d26,#1",
- "FF E0 51 3A", "vsra.u32 d21,d26,#32",
- "EF FF 51 BA", "vsra.s64 d21,d26,#1",
- "EF C0 51 BA", "vsra.s64 d21,d26,#64",
- "FF FF 51 BA", "vsra.u64 d21,d26,#1",
- "FF C0 51 BA", "vsra.u64 d21,d26,#64",
- "EF CF 61 7E", "vsra.s8 q11,q15,#1",
- "EF C8 61 7E", "vsra.s8 q11,q15,#8",
- "FF CF 61 7E", "vsra.u8 q11,q15,#1",
- "FF C8 61 7E", "vsra.u8 q11,q15,#8",
- "EF DF 61 7E", "vsra.s16 q11,q15,#1",
- "EF D0 61 7E", "vsra.s16 q11,q15,#16",
- "FF DF 61 7E", "vsra.u16 q11,q15,#1",
- "FF D0 61 7E", "vsra.u16 q11,q15,#16",
- "EF FF 61 7E", "vsra.s32 q11,q15,#1",
- "EF E0 61 7E", "vsra.s32 q11,q15,#32",
- "FF FF 61 7E", "vsra.u32 q11,q15,#1",
- "FF E0 61 7E", "vsra.u32 q11,q15,#32",
- "EF FF 61 FE", "vsra.s64 q11,q15,#1",
- "EF C0 61 FE", "vsra.s64 q11,q15,#64",
- "FF FF 61 FE", "vsra.u64 q11,q15,#1",
- "FF C0 61 FE", "vsra.u64 q11,q15,#64",
- "FF CF 54 3A", "vsri.8 d21,d26,#1",
- "FF C8 54 3A", "vsri.8 d21,d26,#8",
- "FF DF 54 3A", "vsri.16 d21,d26,#1",
- "FF D0 54 3A", "vsri.16 d21,d26,#16",
- "FF FF 54 3A", "vsri.32 d21,d26,#1",
- "FF E0 54 3A", "vsri.32 d21,d26,#32",
- "FF FF 54 BA", "vsri.64 d21,d26,#1",
- "FF C0 54 BA", "vsri.64 d21,d26,#64",
- "FF CF 64 7E", "vsri.8 q11,q15,#1",
- "FF C8 64 7E", "vsri.8 q11,q15,#8",
- "FF DF 64 7E", "vsri.16 q11,q15,#1",
- "FF D0 64 7E", "vsri.16 q11,q15,#16",
- "FF FF 64 7E", "vsri.32 q11,q15,#1",
- "FF E0 64 7E", "vsri.32 q11,q15,#32",
- "FF FF 64 FE", "vsri.64 q11,q15,#1",
- "FF C0 64 FE", "vsri.64 q11,q15,#64",
- "F9 4A B7 0F", "vst1.8 {d27},[r10]",
- "F9 4A BA 0F", "vst1.8 {d27,d28},[r10]",
- "F9 4A B6 0F", "vst1.8 {d27,d28,d29},[r10]",
- "F9 4A B2 0F", "vst1.8 {d27,d28,d29,d30},[r10]",
- "F9 4A B7 4F", "vst1.16 {d27},[r10]",
- "F9 4A BA 4F", "vst1.16 {d27,d28},[r10]",
- "F9 4A B6 4F", "vst1.16 {d27,d28,d29},[r10]",
- "F9 4A B2 4F", "vst1.16 {d27,d28,d29,d30},[r10]",
- "F9 4A B7 8F", "vst1.32 {d27},[r10]",
- "F9 4A BA 8F", "vst1.32 {d27,d28},[r10]",
- "F9 4A B6 8F", "vst1.32 {d27,d28,d29},[r10]",
- "F9 4A B2 8F", "vst1.32 {d27,d28,d29,d30},[r10]",
- "F9 4A B7 CF", "vst1.64 {d27},[r10]",
- "F9 4A BA CF", "vst1.64 {d27,d28},[r10]",
- "F9 4A B6 CF", "vst1.64 {d27,d28,d29},[r10]",
- "F9 4A B2 CF", "vst1.64 {d27,d28,d29,d30},[r10]",
- "F9 4A B7 1F", "vst1.8 {d27},[r10@64]",
- "F9 4A BA 1F", "vst1.8 {d27,d28},[r10@64]",
- "F9 4A BA 2F", "vst1.8 {d27,d28},[r10@128]",
- "F9 4A B6 1F", "vst1.8 {d27,d28,d29},[r10@64]",
- "F9 4A B2 1F", "vst1.8 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B2 2F", "vst1.8 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B2 3F", "vst1.8 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B7 5F", "vst1.16 {d27},[r10@64]",
- "F9 4A BA 5F", "vst1.16 {d27,d28},[r10@64]",
- "F9 4A BA 6F", "vst1.16 {d27,d28},[r10@128]",
- "F9 4A B6 5F", "vst1.16 {d27,d28,d29},[r10@64]",
- "F9 4A B2 5F", "vst1.16 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B2 6F", "vst1.16 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B2 7F", "vst1.16 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B7 9F", "vst1.32 {d27},[r10@64]",
- "F9 4A BA 9F", "vst1.32 {d27,d28},[r10@64]",
- "F9 4A BA AF", "vst1.32 {d27,d28},[r10@128]",
- "F9 4A B6 9F", "vst1.32 {d27,d28,d29},[r10@64]",
- "F9 4A B2 9F", "vst1.32 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B2 AF", "vst1.32 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B2 BF", "vst1.32 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B7 DF", "vst1.64 {d27},[r10@64]",
- "F9 4A BA DF", "vst1.64 {d27,d28},[r10@64]",
- "F9 4A BA EF", "vst1.64 {d27,d28},[r10@128]",
- "F9 4A B6 DF", "vst1.64 {d27,d28,d29},[r10@64]",
- "F9 4A B2 DF", "vst1.64 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B2 EF", "vst1.64 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B2 FF", "vst1.64 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B7 0D", "vst1.8 {d27},[r10]!",
- "F9 4A BA 0D", "vst1.8 {d27,d28},[r10]!",
- "F9 4A B6 0D", "vst1.8 {d27,d28,d29},[r10]!",
- "F9 4A B2 0D", "vst1.8 {d27,d28,d29,d30},[r10]!",
- "F9 4A B7 4D", "vst1.16 {d27},[r10]!",
- "F9 4A BA 4D", "vst1.16 {d27,d28},[r10]!",
- "F9 4A B6 4D", "vst1.16 {d27,d28,d29},[r10]!",
- "F9 4A B2 4D", "vst1.16 {d27,d28,d29,d30},[r10]!",
- "F9 4A B7 8D", "vst1.32 {d27},[r10]!",
- "F9 4A BA 8D", "vst1.32 {d27,d28},[r10]!",
- "F9 4A B6 8D", "vst1.32 {d27,d28,d29},[r10]!",
- "F9 4A B2 8D", "vst1.32 {d27,d28,d29,d30},[r10]!",
- "F9 4A B7 CD", "vst1.64 {d27},[r10]!",
- "F9 4A BA CD", "vst1.64 {d27,d28},[r10]!",
- "F9 4A B6 CD", "vst1.64 {d27,d28,d29},[r10]!",
- "F9 4A B2 CD", "vst1.64 {d27,d28,d29,d30},[r10]!",
- "F9 4A B7 1D", "vst1.8 {d27},[r10@64]!",
- "F9 4A BA 1D", "vst1.8 {d27,d28},[r10@64]!",
- "F9 4A BA 2D", "vst1.8 {d27,d28},[r10@128]!",
- "F9 4A B6 1D", "vst1.8 {d27,d28,d29},[r10@64]!",
- "F9 4A B2 1D", "vst1.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B2 2D", "vst1.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B2 3D", "vst1.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B7 5D", "vst1.16 {d27},[r10@64]!",
- "F9 4A BA 5D", "vst1.16 {d27,d28},[r10@64]!",
- "F9 4A BA 6D", "vst1.16 {d27,d28},[r10@128]!",
- "F9 4A B6 5D", "vst1.16 {d27,d28,d29},[r10@64]!",
- "F9 4A B2 5D", "vst1.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B2 6D", "vst1.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B2 7D", "vst1.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B7 9D", "vst1.32 {d27},[r10@64]!",
- "F9 4A BA 9D", "vst1.32 {d27,d28},[r10@64]!",
- "F9 4A BA AD", "vst1.32 {d27,d28},[r10@128]!",
- "F9 4A B6 9D", "vst1.32 {d27,d28,d29},[r10@64]!",
- "F9 4A B2 9D", "vst1.32 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B2 AD", "vst1.32 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B2 BD", "vst1.32 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B7 DD", "vst1.64 {d27},[r10@64]!",
- "F9 4A BA DD", "vst1.64 {d27,d28},[r10@64]!",
- "F9 4A BA ED", "vst1.64 {d27,d28},[r10@128]!",
- "F9 4A B6 DD", "vst1.64 {d27,d28,d29},[r10@64]!",
- "F9 4A B2 DD", "vst1.64 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B2 ED", "vst1.64 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B2 FD", "vst1.64 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B7 09", "vst1.8 {d27},[r10],r9",
- "F9 4A BA 09", "vst1.8 {d27,d28},[r10],r9",
- "F9 4A B6 09", "vst1.8 {d27,d28,d29},[r10],r9",
- "F9 4A B2 09", "vst1.8 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B7 49", "vst1.16 {d27},[r10],r9",
- "F9 4A BA 49", "vst1.16 {d27,d28},[r10],r9",
- "F9 4A B6 49", "vst1.16 {d27,d28,d29},[r10],r9",
- "F9 4A B2 49", "vst1.16 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B7 89", "vst1.32 {d27},[r10],r9",
- "F9 4A BA 89", "vst1.32 {d27,d28},[r10],r9",
- "F9 4A B6 89", "vst1.32 {d27,d28,d29},[r10],r9",
- "F9 4A B2 89", "vst1.32 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B7 C9", "vst1.64 {d27},[r10],r9",
- "F9 4A BA C9", "vst1.64 {d27,d28},[r10],r9",
- "F9 4A B6 C9", "vst1.64 {d27,d28,d29},[r10],r9",
- "F9 4A B2 C9", "vst1.64 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B7 19", "vst1.8 {d27},[r10@64],r9",
- "F9 4A BA 19", "vst1.8 {d27,d28},[r10@64],r9",
- "F9 4A BA 29", "vst1.8 {d27,d28},[r10@128],r9",
- "F9 4A B6 19", "vst1.8 {d27,d28,d29},[r10@64],r9",
- "F9 4A B2 19", "vst1.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B2 29", "vst1.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B2 39", "vst1.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A B7 59", "vst1.16 {d27},[r10@64],r9",
- "F9 4A BA 59", "vst1.16 {d27,d28},[r10@64],r9",
- "F9 4A BA 69", "vst1.16 {d27,d28},[r10@128],r9",
- "F9 4A B6 59", "vst1.16 {d27,d28,d29},[r10@64],r9",
- "F9 4A B2 59", "vst1.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B2 69", "vst1.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B2 79", "vst1.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A B7 99", "vst1.32 {d27},[r10@64],r9",
- "F9 4A BA 99", "vst1.32 {d27,d28},[r10@64],r9",
- "F9 4A BA A9", "vst1.32 {d27,d28},[r10@128],r9",
- "F9 4A B6 99", "vst1.32 {d27,d28,d29},[r10@64],r9",
- "F9 4A B2 99", "vst1.32 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B2 A9", "vst1.32 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B2 B9", "vst1.32 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A B7 D9", "vst1.64 {d27},[r10@64],r9",
- "F9 4A BA D9", "vst1.64 {d27,d28},[r10@64],r9",
- "F9 4A BA E9", "vst1.64 {d27,d28},[r10@128],r9",
- "F9 4A B6 D9", "vst1.64 {d27,d28,d29},[r10@64],r9",
- "F9 4A B2 D9", "vst1.64 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B2 E9", "vst1.64 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B2 F9", "vst1.64 {d27,d28,d29,d30},[r10@256],r9",
- "F9 CA B0 2F", "vst1.8 {d27[1]},[r10]",
- "F9 CA B4 4F", "vst1.16 {d27[1]},[r10]",
- "F9 CA B8 8F", "vst1.32 {d27[1]},[r10]",
- "F9 CA B4 5F", "vst1.16 {d27[1]},[r10@16]",
- "F9 CA B8 BF", "vst1.32 {d27[1]},[r10@32]",
- "F9 CA B0 2D", "vst1.8 {d27[1]},[r10]!",
- "F9 CA B4 4D", "vst1.16 {d27[1]},[r10]!",
- "F9 CA B8 8D", "vst1.32 {d27[1]},[r10]!",
- "F9 CA B4 5D", "vst1.16 {d27[1]},[r10@16]!",
- "F9 CA B8 BD", "vst1.32 {d27[1]},[r10@32]!",
- "F9 CA B0 29", "vst1.8 {d27[1]},[r10],r9",
- "F9 CA B4 49", "vst1.16 {d27[1]},[r10],r9",
- "F9 CA B8 89", "vst1.32 {d27[1]},[r10],r9",
- "F9 CA B4 59", "vst1.16 {d27[1]},[r10@16],r9",
- "F9 CA B8 B9", "vst1.32 {d27[1]},[r10@32],r9",
- "F9 4A B8 0F", "vst2.8 {d27,d28},[r10]",
- "F9 4A B9 0F", "vst2.8 {d27,d29},[r10]",
- "F9 4A B3 0F", "vst2.8 {d27,d28,d29,d30},[r10]",
- "F9 4A B8 4F", "vst2.16 {d27,d28},[r10]",
- "F9 4A B9 4F", "vst2.16 {d27,d29},[r10]",
- "F9 4A B3 4F", "vst2.16 {d27,d28,d29,d30},[r10]",
- "F9 4A B8 1F", "vst2.8 {d27,d28},[r10@64]",
- "F9 4A B8 2F", "vst2.8 {d27,d28},[r10@128]",
- "F9 4A B9 1F", "vst2.8 {d27,d29},[r10@64]",
- "F9 4A B9 2F", "vst2.8 {d27,d29},[r10@128]",
- "F9 4A B3 1F", "vst2.8 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B3 2F", "vst2.8 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B3 3F", "vst2.8 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B8 5F", "vst2.16 {d27,d28},[r10@64]",
- "F9 4A B8 6F", "vst2.16 {d27,d28},[r10@128]",
- "F9 4A B9 5F", "vst2.16 {d27,d29},[r10@64]",
- "F9 4A B9 6F", "vst2.16 {d27,d29},[r10@128]",
- "F9 4A B3 5F", "vst2.16 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B3 6F", "vst2.16 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B3 7F", "vst2.16 {d27,d28,d29,d30},[r10@256]",
- "F9 4A B8 0D", "vst2.8 {d27,d28},[r10]!",
- "F9 4A B9 0D", "vst2.8 {d27,d29},[r10]!",
- "F9 4A B3 0D", "vst2.8 {d27,d28,d29,d30},[r10]!",
- "F9 4A B8 4D", "vst2.16 {d27,d28},[r10]!",
- "F9 4A B9 4D", "vst2.16 {d27,d29},[r10]!",
- "F9 4A B3 4D", "vst2.16 {d27,d28,d29,d30},[r10]!",
- "F9 4A B8 1D", "vst2.8 {d27,d28},[r10@64]!",
- "F9 4A B8 2D", "vst2.8 {d27,d28},[r10@128]!",
- "F9 4A B9 1D", "vst2.8 {d27,d29},[r10@64]!",
- "F9 4A B9 2D", "vst2.8 {d27,d29},[r10@128]!",
- "F9 4A B3 1D", "vst2.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B3 2D", "vst2.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B3 3D", "vst2.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B8 5D", "vst2.16 {d27,d28},[r10@64]!",
- "F9 4A B8 6D", "vst2.16 {d27,d28},[r10@128]!",
- "F9 4A B9 5D", "vst2.16 {d27,d29},[r10@64]!",
- "F9 4A B9 6D", "vst2.16 {d27,d29},[r10@128]!",
- "F9 4A B3 5D", "vst2.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B3 6D", "vst2.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B3 7D", "vst2.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A B8 09", "vst2.8 {d27,d28},[r10],r9",
- "F9 4A B9 09", "vst2.8 {d27,d29},[r10],r9",
- "F9 4A B3 09", "vst2.8 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B8 49", "vst2.16 {d27,d28},[r10],r9",
- "F9 4A B9 49", "vst2.16 {d27,d29},[r10],r9",
- "F9 4A B3 49", "vst2.16 {d27,d28,d29,d30},[r10],r9",
- "F9 4A B8 19", "vst2.8 {d27,d28},[r10@64],r9",
- "F9 4A B8 29", "vst2.8 {d27,d28},[r10@128],r9",
- "F9 4A B9 19", "vst2.8 {d27,d29},[r10@64],r9",
- "F9 4A B9 29", "vst2.8 {d27,d29},[r10@128],r9",
- "F9 4A B3 19", "vst2.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B3 29", "vst2.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B3 39", "vst2.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A B8 59", "vst2.16 {d27,d28},[r10@64],r9",
- "F9 4A B8 69", "vst2.16 {d27,d28},[r10@128],r9",
- "F9 4A B9 59", "vst2.16 {d27,d29},[r10@64],r9",
- "F9 4A B9 69", "vst2.16 {d27,d29},[r10@128],r9",
- "F9 4A B3 59", "vst2.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B3 69", "vst2.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B3 79", "vst2.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 CA B1 2F", "vst2.8 {d27[1],d28[1]},[r10]",
- "F9 CA B5 4F", "vst2.16 {d27[1],d28[1]},[r10]",
- "F9 CA B5 6F", "vst2.16 {d27[1],d29[1]},[r10]",
- "F9 CA B9 8F", "vst2.32 {d27[1],d28[1]},[r10]",
- "F9 CA B9 CF", "vst2.32 {d27[1],d29[1]},[r10]",
- "F9 CA B1 3F", "vst2.8 {d27[1],d28[1]},[r10@16]",
- "F9 CA B5 5F", "vst2.16 {d27[1],d28[1]},[r10@32]",
- "F9 CA B5 7F", "vst2.16 {d27[1],d29[1]},[r10@32]",
- "F9 CA B9 9F", "vst2.32 {d27[1],d28[1]},[r10@64]",
- "F9 CA B9 DF", "vst2.32 {d27[1],d29[1]},[r10@64]",
- "F9 CA B1 2D", "vst2.8 {d27[1],d28[1]},[r10]!",
- "F9 CA B5 4D", "vst2.16 {d27[1],d28[1]},[r10]!",
- "F9 CA B5 6D", "vst2.16 {d27[1],d29[1]},[r10]!",
- "F9 CA B9 8D", "vst2.32 {d27[1],d28[1]},[r10]!",
- "F9 CA B9 CD", "vst2.32 {d27[1],d29[1]},[r10]!",
- "F9 CA B1 3D", "vst2.8 {d27[1],d28[1]},[r10@16]!",
- "F9 CA B5 5D", "vst2.16 {d27[1],d28[1]},[r10@32]!",
- "F9 CA B5 7D", "vst2.16 {d27[1],d29[1]},[r10@32]!",
- "F9 CA B9 9D", "vst2.32 {d27[1],d28[1]},[r10@64]!",
- "F9 CA B9 DD", "vst2.32 {d27[1],d29[1]},[r10@64]!",
- "F9 CA B1 29", "vst2.8 {d27[1],d28[1]},[r10],r9",
- "F9 CA B5 49", "vst2.16 {d27[1],d28[1]},[r10],r9",
- "F9 CA B5 69", "vst2.16 {d27[1],d29[1]},[r10],r9",
- "F9 CA B9 89", "vst2.32 {d27[1],d28[1]},[r10],r9",
- "F9 CA B9 C9", "vst2.32 {d27[1],d29[1]},[r10],r9",
- "F9 CA B1 39", "vst2.8 {d27[1],d28[1]},[r10@16],r9",
- "F9 CA B5 59", "vst2.16 {d27[1],d28[1]},[r10@32],r9",
- "F9 CA B5 79", "vst2.16 {d27[1],d29[1]},[r10@32],r9",
- "F9 CA B9 99", "vst2.32 {d27[1],d28[1]},[r10@64],r9",
- "F9 CA B9 D9", "vst2.32 {d27[1],d29[1]},[r10@64],r9",
- "F9 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F9 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F9 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
- "F9 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
- "F9 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
- "F9 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
- "F9 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
- "F9 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
- "F9 4A B0 0F", "vst4.8 {d27,d28,d29,d30},[r10]",
- "F9 4A 91 0F", "vst4.8 {d25,d27,d29,d31},[r10]",
- "F9 4A B0 4F", "vst4.16 {d27,d28,d29,d30},[r10]",
- "F9 4A 91 4F", "vst4.16 {d25,d27,d29,d31},[r10]",
- "F9 4A B0 8F", "vst4.32 {d27,d28,d29,d30},[r10]",
- "F9 4A 91 8F", "vst4.32 {d25,d27,d29,d31},[r10]",
- "F9 4A B0 1F", "vst4.8 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B0 2F", "vst4.8 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B0 3F", "vst4.8 {d27,d28,d29,d30},[r10@256]",
- "F9 4A 91 1F", "vst4.8 {d25,d27,d29,d31},[r10@64]",
- "F9 4A 91 2F", "vst4.8 {d25,d27,d29,d31},[r10@128]",
- "F9 4A 91 3F", "vst4.8 {d25,d27,d29,d31},[r10@256]",
- "F9 4A B0 5F", "vst4.16 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B0 6F", "vst4.16 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B0 7F", "vst4.16 {d27,d28,d29,d30},[r10@256]",
- "F9 4A 91 5F", "vst4.16 {d25,d27,d29,d31},[r10@64]",
- "F9 4A 91 6F", "vst4.16 {d25,d27,d29,d31},[r10@128]",
- "F9 4A 91 7F", "vst4.16 {d25,d27,d29,d31},[r10@256]",
- "F9 4A B0 9F", "vst4.32 {d27,d28,d29,d30},[r10@64]",
- "F9 4A B0 AF", "vst4.32 {d27,d28,d29,d30},[r10@128]",
- "F9 4A B0 BF", "vst4.32 {d27,d28,d29,d30},[r10@256]",
- "F9 4A 91 9F", "vst4.32 {d25,d27,d29,d31},[r10@64]",
- "F9 4A 91 AF", "vst4.32 {d25,d27,d29,d31},[r10@128]",
- "F9 4A 91 BF", "vst4.32 {d25,d27,d29,d31},[r10@256]",
- "F9 4A B0 0D", "vst4.8 {d27,d28,d29,d30},[r10]!",
- "F9 4A 91 0D", "vst4.8 {d25,d27,d29,d31},[r10]!",
- "F9 4A B0 4D", "vst4.16 {d27,d28,d29,d30},[r10]!",
- "F9 4A 91 4D", "vst4.16 {d25,d27,d29,d31},[r10]!",
- "F9 4A B0 8D", "vst4.32 {d27,d28,d29,d30},[r10]!",
- "F9 4A 91 8D", "vst4.32 {d25,d27,d29,d31},[r10]!",
- "F9 4A B0 1D", "vst4.8 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B0 2D", "vst4.8 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B0 3D", "vst4.8 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A 91 1D", "vst4.8 {d25,d27,d29,d31},[r10@64]!",
- "F9 4A 91 2D", "vst4.8 {d25,d27,d29,d31},[r10@128]!",
- "F9 4A 91 3D", "vst4.8 {d25,d27,d29,d31},[r10@256]!",
- "F9 4A B0 5D", "vst4.16 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B0 6D", "vst4.16 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B0 7D", "vst4.16 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A 91 5D", "vst4.16 {d25,d27,d29,d31},[r10@64]!",
- "F9 4A 91 6D", "vst4.16 {d25,d27,d29,d31},[r10@128]!",
- "F9 4A 91 7D", "vst4.16 {d25,d27,d29,d31},[r10@256]!",
- "F9 4A B0 9D", "vst4.32 {d27,d28,d29,d30},[r10@64]!",
- "F9 4A B0 AD", "vst4.32 {d27,d28,d29,d30},[r10@128]!",
- "F9 4A B0 BD", "vst4.32 {d27,d28,d29,d30},[r10@256]!",
- "F9 4A 91 9D", "vst4.32 {d25,d27,d29,d31},[r10@64]!",
- "F9 4A 91 AD", "vst4.32 {d25,d27,d29,d31},[r10@128]!",
- "F9 4A 91 BD", "vst4.32 {d25,d27,d29,d31},[r10@256]!",
- "F9 4A B0 09", "vst4.8 {d27,d28,d29,d30},[r10],r9",
- "F9 4A 91 09", "vst4.8 {d25,d27,d29,d31},[r10],r9",
- "F9 4A B0 49", "vst4.16 {d27,d28,d29,d30},[r10],r9",
- "F9 4A 91 49", "vst4.16 {d25,d27,d29,d31},[r10],r9",
- "F9 4A B0 89", "vst4.32 {d27,d28,d29,d30},[r10],r9",
- "F9 4A 91 89", "vst4.32 {d25,d27,d29,d31},[r10],r9",
- "F9 4A B0 19", "vst4.8 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B0 29", "vst4.8 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B0 39", "vst4.8 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A 91 19", "vst4.8 {d25,d27,d29,d31},[r10@64],r9",
- "F9 4A 91 29", "vst4.8 {d25,d27,d29,d31},[r10@128],r9",
- "F9 4A 91 39", "vst4.8 {d25,d27,d29,d31},[r10@256],r9",
- "F9 4A B0 59", "vst4.16 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B0 69", "vst4.16 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B0 79", "vst4.16 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A 91 59", "vst4.16 {d25,d27,d29,d31},[r10@64],r9",
- "F9 4A 91 69", "vst4.16 {d25,d27,d29,d31},[r10@128],r9",
- "F9 4A 91 79", "vst4.16 {d25,d27,d29,d31},[r10@256],r9",
- "F9 4A B0 99", "vst4.32 {d27,d28,d29,d30},[r10@64],r9",
- "F9 4A B0 A9", "vst4.32 {d27,d28,d29,d30},[r10@128],r9",
- "F9 4A B0 B9", "vst4.32 {d27,d28,d29,d30},[r10@256],r9",
- "F9 4A 91 99", "vst4.32 {d25,d27,d29,d31},[r10@64],r9",
- "F9 4A 91 A9", "vst4.32 {d25,d27,d29,d31},[r10@128],r9",
- "F9 4A 91 B9", "vst4.32 {d25,d27,d29,d31},[r10@256],r9",
- "F9 CA B3 2F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 CA B7 4F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 CA 97 6F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F9 CA BB 8F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
- "F9 CA 9B CF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
- "F9 CA B3 3F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
- "F9 CA B7 5F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F9 CA 97 7F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F9 CA BB 9F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
- "F9 CA BB AF", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
- "F9 CA 9B DF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
- "F9 CA 9B EF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
- "F9 CA B3 2D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 CA B7 4D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 CA 97 6D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA BB 8D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
- "F9 CA 9B CD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
- "F9 CA B3 3D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
- "F9 CA B7 5D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F9 CA 97 7D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F9 CA BB 9D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
- "F9 CA BB AD", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
- "F9 CA 9B DD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
- "F9 CA 9B ED", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
- "F9 CA B3 29", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 CA B7 49", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 CA 97 69", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F9 CA BB 89", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
- "F9 CA 9B C9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
- "F9 CA B3 39", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
- "F9 CA B7 59", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F9 CA 97 79", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F9 CA BB 99", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
- "F9 CA BB A9", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
- "F9 CA 9B D9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
- "F9 CA 9B E9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
- "EC CA BB 04", "vstmia r10,{d27-d28}",
- "EC CA DA 02", "vstmia r10,{s27-s28}",
- "EC EA BB 04", "vstmia r10!,{d27-d28}",
- "ED 6A BB 04", "vstmdb r10!,{d27-d28}",
- "EC EA DA 02", "vstmia r10!,{s27-s28}",
- "ED 6A DA 02", "vstmdb r10!,{s27-s28}",
- "ED 4A 5B FF", "vstr.64 d21,[r10,#-0x3fc]",
- "ED CA 5B FF", "vstr.64 d21,[r10,#0x3fc]",
- "ED CA 5B 00", "vstr.64 d21,[r10]",
- "ED 4A AA FF", "vstr.32 s21,[r10,#-0x3fc]",
- "ED CA AA FF", "vstr.32 s21,[r10,#0x3fc]",
- "ED CA AA 00", "vstr.32 s21,[r10]",
- "FF 49 58 AA", "vsub.i8 d21,d25,d26",
- "FF 59 58 AA", "vsub.i16 d21,d25,d26",
- "FF 69 58 AA", "vsub.i32 d21,d25,d26",
- "FF 79 58 AA", "vsub.i64 d21,d25,d26",
- "FF 4C 68 EE", "vsub.i8 q11,q14,q15",
- "FF 5C 68 EE", "vsub.i16 q11,q14,q15",
- "FF 6C 68 EE", "vsub.i32 q11,q14,q15",
- "FF 7C 68 EE", "vsub.i64 q11,q14,q15",
- "EF 69 5D AA", "vsub.f32 d21,d25,d26",
- "EF 6C 6D EE", "vsub.f32 q11,q14,q15",
- "EE 7C AA CD", "vsub.f32 s21,s25,s26",
- "EE 79 5B EA", "vsub.f64 d21,d25,d26",
- "EF CC 56 AE", "vsubhn.i16 d21,q14,q15",
- "EF DC 56 AE", "vsubhn.i32 d21,q14,q15",
- "EF EC 56 AE", "vsubhn.i64 d21,q14,q15",
- "EF C9 62 AA", "vsubl.s8 q11,d25,d26",
- "EF D9 62 AA", "vsubl.s16 q11,d25,d26",
- "EF E9 62 AA", "vsubl.s32 q11,d25,d26",
- "FF C9 62 AA", "vsubl.u8 q11,d25,d26",
- "FF D9 62 AA", "vsubl.u16 q11,d25,d26",
- "FF E9 62 AA", "vsubl.u32 q11,d25,d26",
- "EF CC 63 AA", "vsubw.s8 q11,q14,d26",
- "EF DC 63 AA", "vsubw.s16 q11,q14,d26",
- "EF EC 63 AA", "vsubw.s32 q11,q14,d26",
- "FF CC 63 AA", "vsubw.u8 q11,q14,d26",
- "FF DC 63 AA", "vsubw.u16 q11,q14,d26",
- "FF EC 63 AA", "vsubw.u32 q11,q14,d26",
- "FF F2 50 2A", "vswp d21,d26",
- "FF F2 60 6E", "vswp q11,q15",
- "FF FB 58 AA", "vtbl.8 d21,{d27},d26",
- "FF FB 59 AA", "vtbl.8 d21,{d27,d28},d26",
- "FF FB 5A AA", "vtbl.8 d21,{d27,d28,d29},d26",
- "FF FB 5B AA", "vtbl.8 d21,{d27,d28,d29,d30},d26",
- "FF FB 58 EA", "vtbx.8 d21,{d27},d26",
- "FF FB 59 EA", "vtbx.8 d21,{d27,d28},d26",
- "FF FB 5A EA", "vtbx.8 d21,{d27,d28,d29},d26",
- "FF FB 5B EA", "vtbx.8 d21,{d27,d28,d29,d30},d26",
- "FF F2 50 AA", "vtrn.8 d21,d26",
- "FF F6 50 AA", "vtrn.16 d21,d26",
- "FF FA 50 AA", "vtrn.32 d21,d26",
- "FF F2 60 EE", "vtrn.8 q11,q15",
- "FF F6 60 EE", "vtrn.16 q11,q15",
- "FF FA 60 EE", "vtrn.32 q11,q15",
- "EF 49 58 BA", "vtst.8 d21,d25,d26",
- "EF 59 58 BA", "vtst.16 d21,d25,d26",
- "EF 69 58 BA", "vtst.32 d21,d25,d26",
- "EF 4C 68 FE", "vtst.8 q11,q14,q15",
- "EF 5C 68 FE", "vtst.16 q11,q14,q15",
- "EF 6C 68 FE", "vtst.32 q11,q14,q15",
- "FF F2 51 2A", "vuzp.8 d21,d26",
- "FF F6 51 2A", "vuzp.16 d21,d26",
- "FF F2 61 6E", "vuzp.8 q11,q15",
- "FF F6 61 6E", "vuzp.16 q11,q15",
- "FF FA 61 6E", "vuzp.32 q11,q15",
- "FF F2 51 AA", "vzip.8 d21,d26",
- "FF F6 51 AA", "vzip.16 d21,d26",
- "FF F2 61 EE", "vzip.8 q11,q15",
- "FF F6 61 EE", "vzip.16 q11,q15",
- "FF FA 61 EE", "vzip.32 q11,q15",
- };
-
- disassembleInstArray(insts, thumbOptions);
- }
-
-
- /**
- * Test for Thumb 32-bit Imm12
- * see reference manual algorithm for ThumbExpandImm
- */
- @Test
- public void testThumb2ExpandImm12() {
-
- System.out.println("\n================== Thumb2 Expand Imm12 Mode ==================\n");
-
- // A6.3.2 Modified Immediate constants in Thumb 32-bit instructions
-
- String[] insts = {
- "F1 0A 05 71", "add.w r5,r10,#0x71",
- "F1 0B 06 F7", "add.w r6,r11,#0xf7",
- "F1 09 14 78", "add.w r4,r9,#0x780078",
- "F1 08 13 FC", "add.w r3,r8,#0xfc00fc",
- "F1 07 25 64", "add.w r5,r7,#0x64006400",
- "F1 06 25 E3", "add.w r5,r6,#0xe300e300",
- "F1 07 46 60", "add.w r6,r7,#0xe0000000",
- "F1 08 47 E0", "add.w r7,r8,#0x70000000",
- "F5 0A 05 60", "add.w r5,r10,#0xe00000",
- "F5 0A 45 60", "add.w r5,r10,#0xe000",
- "F5 0A 65 60", "add.w r5,r10,#0xe00",
- "F1 1A 05 71", "adds.w r5,r10,#0x71",
- "F1 1B 06 F7", "adds.w r6,r11,#0xf7",
- "F1 19 14 78", "adds.w r4,r9,#0x780078",
- "F1 18 13 FC", "adds.w r3,r8,#0xfc00fc",
- "F1 17 25 64", "adds.w r5,r7,#0x64006400",
- "F1 16 25 E3", "adds.w r5,r6,#0xe300e300",
- "F1 17 46 60", "adds.w r6,r7,#0xe0000000",
- "F1 18 47 E0", "adds.w r7,r8,#0x70000000",
- "F5 1A 05 60", "adds.w r5,r10,#0xe00000",
- "F5 1A 45 60", "adds.w r5,r10,#0xe000",
- "F5 1A 65 60", "adds.w r5,r10,#0xe00",
- };
-
- disassembleInstArray(insts, thumbOptions);
- }
-
- /**
- * Test for Thumb2 shifter operand).
- */
- @Test
- public void testThumb2ShifterOperand() {
-
- System.out.println("\n================== Thumb2 Shifter Operand ==================\n");
- String[] insts = {
- "EB 09 05 0A", "add.w r5,r9,r10",
- "EB 08 14 A9", "add.w r4,r8,r9,asr #6",
- "EB 07 03 48", "add.w r3,r7,r8,lsl #1",
- "EB 06 02 17", "add.w r2,r6,r7,lsr #32",
- "EB 09 75 F8", "add.w r5,r9,r8,ror #31",
- "EB 08 05 39", "add.w r5,r8,r9,rrx",
- };
- disassembleInstArray(insts, thumbOptions);
- }
-
- /**
- * check for instructions that will only get disassembled
- * a certain way for ARMv6T2
- */
- @Test
- public void testThumb2V6T2Instructions() {
- System.out.println("\n================== ARMv6T2 Hint Instructions ==================\n");
-
- String[] insts = {
- "F3 BF 8F 2F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
- "F3 AF 80 F0", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 AF 80 FD", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 BF 8F 50", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 52", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 53", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 56", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 57", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5A", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5B", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5E", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 5F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
- "F3 BF 8F 42", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 43", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 46", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 47", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4A", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4B", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4D", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4E", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 BF 8F 4F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
- "F3 AF 80 04", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
- "F3 AF 80 02", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411 T1
- "F3 AF 80 03", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412 T1
- "F3 AF 80 01", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413 T1
- };
-
- Map<String, Object> options = new HashMap<String, Object>();
- for (Map.Entry<String, Object> entry : thumbOptions.entrySet())
- options.put(entry.getKey(), entry.getValue());
- options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6T2);
- disassembleInstArray(insts, options);
- }
-
-
- /**
- * only BL & BLX with the J1 & J2 bits both set to 1 are allowed
- * for thumb2; everything else should produce "invalid opcode"
- */
- @Test
- public void testThumb2V4TInstructions() {
-
- System.out.println("\n================== Thumb2 V4T Instructions ==================\n");
-
- String[] insts = {
-// "Fx xx xx 0x", "bl 0x________", // 1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx // A8.6.23 T1
-// ARM "0B FF FF FE", "bleq 0x00000000",
-// ARM "EB 00 00 1C", "bl 0x00000078",
-// ARM "EB FF FF 00", "bl 0xfffffc08",
-//
-// "Fx xx xx 0x", "blx 0x________", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
-// ARM "FA FF FF FE", "blx 0x00000000",
-// ARM "01 2F FF 39", "blxeq r9",
- "F3 BF 8F 2F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
- "F3 AF 80 F0", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 AF 80 FD", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
- "F3 AF 80 04", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
- "F3 AF 80 02", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411 T1
- "F3 AF 80 03", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412 T1
- "F3 AF 80 01", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413 T1
- };
-
- Map<String, Object> options = new HashMap<String, Object>();
- for (Map.Entry<String, Object> entry : thumbOptions.entrySet())
- options.put(entry.getKey(), entry.getValue());
- options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv4T);
- disassembleInstArray(insts, options);
- }
-
- /**
- * Convert hex string into byte array.
- */
- private static byte[] getByteArray(String byteHexString) {
- byteHexString = byteHexString.replaceAll("0x", "");
- StringTokenizer tn = new StringTokenizer(byteHexString);
-
- int cnt = tn.countTokens();
- byte[] ret = new byte[cnt];
- for (int i = 0; i < cnt; i++) {
- ret[i] = (byte) Integer.parseInt(tn.nextToken(), 16);
- }
-
- return ret;
- }
-
- /**
- * Disassemble a single instruction and verify the output.
- */
- private void disassembleInst(long address, String code, IJumpToAddress expectedJumpAddr, String expectedMnemonics,
- Map<String, Object> options) {
- if (options == null)
- options = armOptions;
-
- IAddress addr = new Addr32(address);
- ByteBuffer codeBuf = ByteBuffer.wrap(getByteArray(code));
- String msg;
-
- InstructionParserARM disa = new InstructionParserARM(addr, codeBuf);
-
- IDisassembledInstruction output = null;
- try {
- output = disa.disassemble(options);
- } catch (CoreException e) {
- Assert.fail(e.getLocalizedMessage());
- }
-
- Assert.assertEquals(codeBuf.capacity(), output.getSize());
- Assert.assertEquals(address, output.getAddress().getValue().longValue());
-
- if (expectedJumpAddr != null) {
- msg = "Address\n " + expectedJumpAddr + "\n not match expected\n " + output.getJumpToAddress();
- Assert.assertNotNull(output.getJumpToAddress());
- Assert.assertEquals(msg, expectedJumpAddr, output.getJumpToAddress());
- }
-
- if (expectedMnemonics != null) {
- msg = "Mnemonics\n " + output.getMnemonics() + "\n not match expected\n " + expectedMnemonics;
- Assert
- .assertTrue(msg, TestUtils.stringCompare(expectedMnemonics, output.getMnemonics(), false, true,
- true));
- }
-
- System.out.println(output.getMnemonics());
- }
-
- /**
- * Disassemble a single instruction and verify the output.
- */
- private void catchCodeBufferUnderflowException(long address, String code,
- Map<String, Object> options) {
- if (options == null)
- options = armOptions;
-
- IAddress addr = new Addr32(address);
- ByteBuffer codeBuf = ByteBuffer.wrap(getByteArray(code));
-
- InstructionParserARM disa = new InstructionParserARM(addr, codeBuf);
-
- try {
- disa.disassemble(options);
- Assert.fail("expected disa.disassemble() to throw CodeBufferUnderflowException");
- } catch (CodeBufferUnderflowException e) {
- System.out.println("properly caught CodeBufferUnderflowException");
- } catch (CoreException e) {
- Assert.fail(e.getLocalizedMessage());
- }
- }
-
- /**
- * Disassemble an array of instructions and verify the output.
- */
- private void disassembleInstArray(String[] insts, Map<String, Object> options) {
- if (insts.length % 2 != 0)
- throw new IllegalArgumentException();
-
- // Don't show address nor bytes
- options.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, false);
- options.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, false);
-
- int cnt = insts.length;
-
- for (int i = 0; i < cnt; i += 2) {
- disassembleInst(0 /* don't care */, insts[i], null /* don't care */, insts[i + 1], options);
- }
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IJumpToAddress;
+import org.eclipse.cdt.debug.edc.JumpToAddress;
+import org.eclipse.cdt.debug.edc.disassembler.CodeBufferUnderflowException;
+import org.eclipse.cdt.debug.edc.disassembler.IDisassembledInstruction;
+import org.eclipse.cdt.debug.edc.disassembler.IDisassembler.IDisassemblerOptions;
+import org.eclipse.cdt.debug.edc.internal.arm.disassembler.DisassemblerARM;
+import org.eclipse.cdt.debug.edc.internal.arm.disassembler.DisassemblerARM.IDisassemblerOptionsARM;
+import org.eclipse.cdt.debug.edc.internal.arm.disassembler.InstructionParserARM;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.CoreException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Unit test for ARM disassembler.
+ */
+public class TestDisassemblerARM {
+
+ static Map<String, Object> armOptions = null;
+ static Map<String, Object> thumbOptions = null;
+ static DisassemblerARM sDisassembler;
+
+ /**
+ * Set up.
+ */
+ @BeforeClass
+ public static void beforeClass() {
+ /*
+ * set up common disassembler options.
+ */
+ armOptions = new HashMap<String, Object>();
+ armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
+ armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
+ armOptions.put(IDisassemblerOptionsARM.DISASSEMBLER_MODE, InstructionParserARM.DISASSEMBLER_MODE_ARM);
+ armOptions.put(IDisassemblerOptionsARM.ENDIAN_MODE, InstructionParserARM.BIG_ENDIAN_MODE);
+
+
+ thumbOptions = new HashMap<String, Object>();
+ thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
+ thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
+ thumbOptions.put(IDisassemblerOptionsARM.DISASSEMBLER_MODE, InstructionParserARM.DISASSEMBLER_MODE_THUMB);
+ thumbOptions.put(IDisassemblerOptionsARM.ENDIAN_MODE, InstructionParserARM.BIG_ENDIAN_MODE);
+
+
+ sDisassembler = new DisassemblerARM(null);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ /**
+ * Test for non-VFP, 32-bit ARM v4*, v5T*, v6*, v7 instructions.
+ */
+ @Test
+ public void testArmInstructions() {
+
+ System.out.println("\n===================== ARMv5 ========================\n");
+ String[] insts = {
+ "E7 F1 23 F4", "undefined",
+ "E7 F0 00 10", "undefined",
+ "02 AA 51 FE", "adceq r5,r10,#0x8000003f",
+ "00 A9 50 0A", "adceq r5,r9,r10",
+ "00 A9 56 5A", "adceq r5,r9,r10,asr r6",
+ "E0 A9 56 3A", "adc r5,r9,r10,lsr r6",
+ "02 BA 50 71", "adcseq r5,r10,#0x71",
+ "00 B9 50 0A", "adcseq r5,r9,r10",
+ "00 B9 56 1A", "adcseq r5,r9,r10,lsl r6",
+ "E0 B9 56 7A", "adcs r5,r9,r10,ror r6",
+ "02 8F 50 71", "addeq r5,pc,#0x71",
+ "02 8A 51 FE", "addeq r5,r10,#0x8000003f",
+ "00 89 50 0A", "addeq r5,r9,r10",
+ "00 89 50 CA", "addeq r5,r9,r10,asr #1",
+ "E0 89 56 5A", "add r5,r9,r10,asr r6",
+ "E0 89 50 8A", "add r5,r9,r10,lsl #1",
+ "E0 89 56 1A", "add r5,r9,r10,lsl r6",
+ "E0 89 50 2A", "add r5,r9,r10,lsr #32",
+ "E0 89 5F EA", "add r5,r9,r10,ror #31",
+ "E0 89 50 6A", "add r5,r9,r10,rrx",
+ "02 8D 51 FE", "addeq r5,sp,#0x8000003f",
+ "02 9A 50 71", "addseq r5,r10,#0x71",
+ "00 99 50 0A", "addseq r5,r9,r10",
+ "00 99 50 4A", "addseq r5,r9,r10,asr #32",
+ "E0 99 5F 8A", "adds r5,r9,r10,lsl #31",
+ "E0 99 50 AA", "adds r5,r9,r10,lsr #1",
+ "E0 99 56 3A", "adds r5,r9,r10,lsr r6",
+ "E0 99 50 EA", "adds r5,r9,r10,ror #1",
+ "E0 99 56 7A", "adds r5,r9,r10,ror r6",
+ "E0 99 50 6A", "adds r5,r9,r10,rrx",
+ "02 9D 50 71", "addseq r5,sp,#0x71",
+ "02 0A 50 71", "andeq r5,r10,#0x71",
+ "00 09 50 0A", "andeq r5,r9,r10",
+ "00 09 50 CA", "andeq r5,r9,r10,asr #1",
+ "E0 09 56 5A", "and r5,r9,r10,asr r6",
+ "E0 09 50 8A", "and r5,r9,r10,lsl #1",
+ "00 09 56 1A", "andeq r5,r9,r10,lsl r6",
+ "E0 09 50 2A", "and r5,r9,r10,lsr #32",
+ "E0 09 5F EA", "and r5,r9,r10,ror #31",
+ "E0 09 50 6A", "and r5,r9,r10,rrx",
+ "02 1A 51 FE", "andseq r5,r10,#0x8000003f",
+ "00 19 50 0A", "andseq r5,r9,r10",
+ "00 19 50 4A", "andseq r5,r9,r10,asr #32",
+ "E0 19 5F 8A", "ands r5,r9,r10,lsl #31",
+ "E0 19 50 AA", "ands r5,r9,r10,lsr #1",
+ "00 19 56 3A", "andseq r5,r9,r10,lsr r6",
+ "E0 19 50 EA", "ands r5,r9,r10,ror #1",
+ "E0 19 56 7A", "ands r5,r9,r10,ror r6",
+ "01 A0 5E C9", "asreq r5,r9,#29",
+ "01 A0 5A 59", "asreq r5,r9,r10",
+ "01 B0 5E C9", "asrseq r5,r9,#29",
+ "01 B0 5A 59", "asrseq r5,r9,r10",
+ "0A FF FF FE", "beq 0x00000000",
+ "0A 00 00 1C", "beq 0x00000078",
+ "0A FF FF 00", "beq 0xfffffc08",
+ "07 DF 50 1F", "bfceq r5,#0,#32",
+ "E7 D9 50 9F", "bfc r5,#1,#25",
+ "E7 DF 5F 9F", "bfc r5,#31,#1",
+ "07 DF 50 1A", "bfieq r5,r10,#0,#32",
+ "E7 DF 5F 9A", "bfi r5,r10,#31,#1",
+ "E7 DC 53 9A", "bfi r5,r10,#7,#22",
+ "03 CA 50 71", "biceq r5,r10,#0x71",
+ "01 C9 50 CA", "biceq r5,r9,r10,asr #1",
+ "E1 C9 56 5A", "bic r5,r9,r10,asr r6",
+ "E1 C9 50 8A", "bic r5,r9,r10,lsl #1",
+ "E1 C9 56 1A", "bic r5,r9,r10,lsl r6",
+ "E1 C9 50 2A", "bic r5,r9,r10,lsr #32",
+ "E1 C9 5F EA", "bic r5,r9,r10,ror #31",
+ "E1 C9 50 6A", "bic r5,r9,r10,rrx",
+ "03 DA 51 FE", "bicseq r5,r10,#0x8000003f",
+ "01 D9 50 4A", "bicseq r5,r9,r10,asr #32",
+ "E1 D9 5F 8A", "bics r5,r9,r10,lsl #31",
+ "E1 D9 50 AA", "bics r5,r9,r10,lsr #1",
+ "01 D9 56 3A", "bicseq r5,r9,r10,lsr r6",
+ "E1 D9 50 EA", "bics r5,r9,r10,ror #1",
+ "E1 D9 56 7A", "bics r5,r9,r10,ror r6",
+ "E1 28 5A 77", "bkpt #0x85a7",
+ "0B FF FF FE", "bleq 0x00000000",
+ "EB 00 00 1C", "bl 0x00000078",
+ "EB FF FF 00", "bl 0xfffffc08",
+ "FA FF FF FE", "blx 0x00000000",
+ "01 2F FF 39", "blxeq r9",
+ "01 2F FF 16", "bxeq r6",
+ "01 2F FF 29", "bxjeq r9",
+ "0E C9 59 EA", "cdpeq p9,0xc,c5,c9,c10,0x7",
+ "FE 19 57 6A", "cdp2 p7,0x1,c5,c9,c10,0x3",
+ "F5 7F F0 1F", "clrex",
+ "01 6F 5F 19", "clzeq r5,r9",
+ "03 7A 00 71", "cmneq r10,#0x71",
+ "E3 7A 01 FE", "cmn r10,#0x8000003f",
+ "01 75 00 C9", "cmneq r5,r9,asr #1",
+ "E1 75 00 49", "cmn r5,r9,asr #32",
+ "01 75 06 59", "cmneq r5,r9,asr r6",
+ "E1 75 00 89", "cmn r5,r9,lsl #1",
+ "E1 75 0F 89", "cmn r5,r9,lsl #31",
+ "E1 75 06 19", "cmn r5,r9,lsl r6",
+ "E1 75 00 A9", "cmn r5,r9,lsr #1",
+ "E1 75 00 29", "cmn r5,r9,lsr #32",
+ "E1 75 06 39", "cmn r5,r9,lsr r6",
+ "E1 75 00 E9", "cmn r5,r9,ror #1",
+ "E1 75 0F E9", "cmn r5,r9,ror #31",
+ "E1 75 06 79", "cmn r5,r9,ror r6",
+ "E1 75 00 69", "cmn r5,r9,rrx",
+ "03 5A 00 71", "cmpeq r10,#0x71",
+ "E3 5A 01 FE", "cmp r10,#0x8000003f",
+ "01 55 00 C9", "cmpeq r5,r9,asr #1",
+ "E1 55 00 49", "cmp r5,r9,asr #32",
+ "E1 55 06 59", "cmp r5,r9,asr r6",
+ "E1 55 00 89", "cmp r5,r9,lsl #1",
+ "E1 55 0F 89", "cmp r5,r9,lsl #31",
+ "E1 55 06 19", "cmp r5,r9,lsl r6",
+ "E1 55 00 A9", "cmp r5,r9,lsr #1",
+ "E1 55 00 29", "cmp r5,r9,lsr #32",
+ "E1 55 06 39", "cmp r5,r9,lsr r6",
+ "E1 55 00 E9", "cmp r5,r9,ror #1",
+ "E1 55 0F E9", "cmp r5,r9,ror #31",
+ "E1 55 06 79", "cmp r5,r9,ror r6",
+ "E1 55 00 69", "cmp r5,r9,rrx",
+ "F1 02 00 00", "cps #0",
+ "F1 02 00 1F", "cps #31",
+ "F1 0C 01 40", "cpsid af",
+ "F1 0E 01 DF", "cpsid aif,#31",
+ "F1 0E 00 C1", "cpsid if,#1",
+ "F1 08 01 40", "cpsie af",
+ "F1 0A 01 DF", "cpsie aif,#31",
+ "F1 0A 00 C1", "cpsie if,#1",
+ "03 20 F0 FD", "dbgeq #13",
+ "F5 7F F0 50", "dmb #0",
+ "F5 7F F0 52", "dmb oshst",
+ "F5 7F F0 53", "dmb osh",
+ "F5 7F F0 56", "dmb nshst",
+ "F5 7F F0 57", "dmb nsh",
+ "F5 7F F0 5A", "dmb ishst",
+ "F5 7F F0 5B", "dmb ish",
+ "F5 7F F0 5E", "dmb st",
+ "F5 7F F0 5F", "dmb sy",
+ "F5 7F F0 42", "dsb oshst",
+ "F5 7F F0 43", "dsb osh",
+ "F5 7F F0 46", "dsb nshst",
+ "F5 7F F0 47", "dsb nsh",
+ "F5 7F F0 4A", "dsb ishst",
+ "F5 7F F0 4B", "dsb ish",
+ "F5 7F F0 4D", "dsb #13",
+ "F5 7F F0 4E", "dsb st",
+ "F5 7F F0 4F", "dsb sy",
+ "02 2A 50 71", "eoreq r5,r10,#0x71",
+ "00 29 50 CA", "eoreq r5,r9,r10,asr #1",
+ "00 29 56 5A", "eoreq r5,r9,r10,asr r6",
+ "E0 29 50 8A", "eor r5,r9,r10,lsl #1",
+ "E0 29 56 1A", "eor r5,r9,r10,lsl r6",
+ "E0 29 50 2A", "eor r5,r9,r10,lsr #32",
+ "E0 29 5F EA", "eor r5,r9,r10,ror #31",
+ "E0 29 50 6A", "eor r5,r9,r10,rrx",
+ "02 3A 51 FE", "eorseq r5,r10,#0x8000003f",
+ "00 39 50 4A", "eorseq r5,r9,r10,asr #32",
+ "E0 39 5F 8A", "eors r5,r9,r10,lsl #31",
+ "E0 39 50 AA", "eors r5,r9,r10,lsr #1",
+ "00 39 56 3A", "eorseq r5,r9,r10,lsr r6",
+ "E0 39 50 EA", "eors r5,r9,r10,ror #1",
+ "E0 39 56 7A", "eors r5,r9,r10,ror r6",
+ "F5 7F F0 60", "isb #0",
+ "F5 7F F0 6D", "isb #13",
+ "F5 7F F0 6F", "isb sy",
+ "0D 1F B9 00", "ldceq p9,c11,[pc,#-0x0]",
+ "ED 1F B9 00", "ldc p9,c11,[pc,#-0x0]",
+ "0D 1A B9 00", "ldceq p9,c11,[r10,#-0x0]",
+ "ED 3A B9 00", "ldc p9,c11,[r10,#-0x0]!",
+ "ED 1A B9 21", "ldc p9,c11,[r10,#-0x84]",
+ "ED 3A B9 21", "ldc p9,c11,[r10,#-0x84]!",
+ "ED 9A B9 21", "ldc p9,c11,[r10,#0x84]",
+ "ED BA B9 21", "ldc p9,c11,[r10,#0x84]!",
+ "EC 3A B9 00", "ldc p9,c11,[r10],#-0x0",
+ "0C 3A B9 21", "ldceq p9,c11,[r10],#-0x84",
+ "EC BA B9 21", "ldc p9,c11,[r10],#0x84",
+ "EC 9D B9 00", "ldc p9,c11,[sp],{0}",
+ "0C 9A B9 FF", "ldceq p9,c11,[r10],{255}",
+ "FD 1F B9 00", "ldc2 p9,c11,[pc,#-0x0]",
+ "FD 1A B9 21", "ldc2 p9,c11,[r10,#-0x84]",
+ "FD 3A B9 21", "ldc2 p9,c11,[r10,#-0x84]!",
+ "FD 9A B9 21", "ldc2 p9,c11,[r10,#0x84]",
+ "FD BA B9 21", "ldc2 p9,c11,[r10,#0x84]!",
+ "FC 3A B9 21", "ldc2 p9,c11,[r10],#-0x84",
+ "FC BA B9 21", "ldc2 p9,c11,[r10],#0x84",
+ "FC 9A B9 FF", "ldc2 p9,c11,[r10],{255}",
+ "FC 9D B9 00", "ldc2 p9,c11,[sp],{0}",
+ "FD 5F B9 00", "ldc2l p9,c11,[pc,#-0x0]",
+ "FD 5A B9 21", "ldc2l p9,c11,[r10,#-0x84]",
+ "FD 7A B9 21", "ldc2l p9,c11,[r10,#-0x84]!",
+ "FD DA B9 21", "ldc2l p9,c11,[r10,#0x84]",
+ "FD FA B9 21", "ldc2l p9,c11,[r10,#0x84]!",
+ "FC 7A B9 21", "ldc2l p9,c11,[r10],#-0x84",
+ "FC FA B9 21", "ldc2l p9,c11,[r10],#0x84",
+ "FC DA B9 00", "ldc2l p9,c11,[r10],{0}",
+ "FC DD B9 FF", "ldc2l p9,c11,[sp],{255}",
+ "0D 5F B9 00", "ldcleq p9,c11,[pc,#-0x0]",
+ "ED 5F B9 00", "ldcl p9,c11,[pc,#-0x0]",
+ "ED 5A B9 00", "ldcl p9,c11,[r10,#-0x0]",
+ "ED 7A B9 00", "ldcl p9,c11,[r10,#-0x0]!",
+ "0D 5A B9 21", "ldcleq p9,c11,[r10,#-0x84]",
+ "ED 7A B9 21", "ldcl p9,c11,[r10,#-0x84]!",
+ "ED DA B9 21", "ldcl p9,c11,[r10,#0x84]",
+ "ED FA B9 21", "ldcl p9,c11,[r10,#0x84]!",
+ "0C 7A B9 00", "ldcleq p9,c11,[r10],#-0x0",
+ "EC 7A B9 21", "ldcl p9,c11,[r10],#-0x84",
+ "EC FA B9 21", "ldcl p9,c11,[r10],#0x84",
+ "0C DA B9 00", "ldcleq p9,c11,[r10],{0}",
+ "EC DD B9 FF", "ldcl p9,c11,[sp],{255}",
+ "E8 BA 42 40", "ldm r10!,{r6,r9,lr}",
+ "08 9A 82 40", "ldmeq r10,{r6,r9,pc}",
+ "08 7A C2 40", "ldmdaeq r10!,{r6,r9,lr,pc}^",
+ "E8 3A 42 40", "ldmda r10!,{r6,r9,lr}",
+ "E8 5A C2 40", "ldmda r10,{r6,r9,lr,pc}^",
+ "E8 5A 42 40", "ldmda r10,{r6,r9,lr}^",
+ "E8 1A 82 40", "ldmda r10,{r6,r9,pc}",
+ "09 7A C2 40", "ldmdbeq r10!,{r6,r9,lr,pc}^",
+ "E9 3A 42 40", "ldmdb r10!,{r6,r9,lr}",
+ "E9 5A C2 40", "ldmdb r10,{r6,r9,lr,pc}^",
+ "E9 5A 42 40", "ldmdb r10,{r6,r9,lr}^",
+ "E9 1A 82 40", "ldmdb r10,{r6,r9,pc}",
+ "08 D0 00 06", "ldmiaeq r0,{r1,r2}^",
+ "E8 D0 00 06", "ldmia r0,{r1,r2}^",
+ "E8 FA C2 40", "ldmia r10!,{r6,r9,lr,pc}^",
+ "E8 DA C2 40", "ldmia r10,{r6,r9,lr,pc}^",
+ "E8 DA 42 40", "ldmia r10,{r6,r9,lr}^",
+ "E8 D0 00 06", "ldmia r0,{r1,r2}^",
+ "E8 F0 00 06", "ldmia r0,{r1,r2}^",
+ "09 FA C2 40", "ldmibeq r10!,{r6,r9,lr,pc}^",
+ "E9 BA 42 40", "ldmib r10!,{r6,r9,lr}",
+ "E9 DA C2 40", "ldmib r10,{r6,r9,lr,pc}^",
+ "E9 DA 42 40", "ldmib r10,{r6,r9,lr}^",
+ "E9 9A 82 40", "ldmib r10,{r6,r9,pc}",
+ "05 1F 59 87", "ldreq r5,[pc,#-0x987] ; 0xfffff679",
+ "E5 9F 59 87", "ldr r5,[pc,#0x987] ; 0x987",
+ "E7 9A 50 C9", "ldr r5,[r10,r9,asr #1]",
+ "E7 BA 50 C9", "ldr r5,[r10,r9,asr #1]!",
+ "E7 9A 50 49", "ldr r5,[r10,r9,asr #32]",
+ "E7 BA 50 49", "ldr r5,[r10,r9,asr #32]!",
+ "E7 9A 50 89", "ldr r5,[r10,r9,lsl #1]",
+ "E7 BA 50 89", "ldr r5,[r10,r9,lsl #1]!",
+ "E7 9A 5F 89", "ldr r5,[r10,r9,lsl #31]",
+ "E7 BA 5F 89", "ldr r5,[r10,r9,lsl #31]!",
+ "E7 9A 50 A9", "ldr r5,[r10,r9,lsr #1]",
+ "E7 BA 50 A9", "ldr r5,[r10,r9,lsr #1]!",
+ "E7 9A 50 29", "ldr r5,[r10,r9,lsr #32]",
+ "E7 BA 50 29", "ldr r5,[r10,r9,lsr #32]!",
+ "E7 9A 50 E9", "ldr r5,[r10,r9,ror #1]",
+ "E7 BA 50 E9", "ldr r5,[r10,r9,ror #1]!",
+ "E7 9A 5F E9", "ldr r5,[r10,r9,ror #31]",
+ "E7 BA 5F E9", "ldr r5,[r10,r9,ror #31]!",
+ "E7 9A 50 69", "ldr r5,[r10,r9,rrx]",
+ "E7 BA 50 69", "ldr r5,[r10,r9,rrx]!",
+ "07 9A 50 09", "ldreq r5,[r10,r9]",
+ "E7 BA 50 09", "ldr r5,[r10,r9]!",
+ "07 1A 50 C9", "ldreq r5,[r10,-r9,asr #1]",
+ "E7 3A 50 C9", "ldr r5,[r10,-r9,asr #1]!",
+ "E7 1A 50 49", "ldr r5,[r10,-r9,asr #32]",
+ "E7 3A 50 49", "ldr r5,[r10,-r9,asr #32]!",
+ "E7 1A 50 89", "ldr r5,[r10,-r9,lsl #1]",
+ "E7 3A 50 89", "ldr r5,[r10,-r9,lsl #1]!",
+ "E7 1A 5F 89", "ldr r5,[r10,-r9,lsl #31]",
+ "E7 3A 5F 89", "ldr r5,[r10,-r9,lsl #31]!",
+ "E7 1A 50 A9", "ldr r5,[r10,-r9,lsr #1]",
+ "E7 3A 50 A9", "ldr r5,[r10,-r9,lsr #1]!",
+ "E7 1A 50 29", "ldr r5,[r10,-r9,lsr #32]",
+ "E7 3A 50 29", "ldr r5,[r10,-r9,lsr #32]!",
+ "E7 1A 50 E9", "ldr r5,[r10,-r9,ror #1]",
+ "E7 3A 50 E9", "ldr r5,[r10,-r9,ror #1]!",
+ "E7 1A 5F E9", "ldr r5,[r10,-r9,ror #31]",
+ "E7 3A 5F E9", "ldr r5,[r10,-r9,ror #31]!",
+ "E7 1A 50 69", "ldr r5,[r10,-r9,rrx]",
+ "E7 3A 50 69", "ldr r5,[r10,-r9,rrx]!",
+ "E7 1A 50 09", "ldr r5,[r10,-r9]",
+ "E7 3A 50 09", "ldr r5,[r10,-r9]!",
+ "05 1A 59 87", "ldreq r5,[r10,#-0x987]",
+ "E5 3A 59 87", "ldr r5,[r10,#-0x987]!",
+ "E5 9A 59 87", "ldr r5,[r10,#0x987]",
+ "E5 BA 59 87", "ldr r5,[r10,#0x987]!",
+ "E5 9A 50 00", "ldr r5,[r10]",
+ "E6 1A 50 09", "ldr r5,[r10],-r9",
+ "E6 9A 50 09", "ldr r5,[r10],r9",
+ "E6 9A 50 C9", "ldr r5,[r10],r9,asr #1",
+ "E6 9A 50 49", "ldr r5,[r10],r9,asr #32",
+ "E6 9A 50 89", "ldr r5,[r10],r9,lsl #1",
+ "E6 9A 5F 89", "ldr r5,[r10],r9,lsl #31",
+ "E6 9A 50 A9", "ldr r5,[r10],r9,lsr #1",
+ "E6 9A 50 29", "ldr r5,[r10],r9,lsr #32",
+ "E6 9A 50 E9", "ldr r5,[r10],r9,ror #1",
+ "E6 9A 5F E9", "ldr r5,[r10],r9,ror #31",
+ "E6 9A 50 69", "ldr r5,[r10],r9,rrx",
+ "06 1A 50 C9", "ldreq r5,[r10],-r9,asr #1",
+ "E6 1A 50 49", "ldr r5,[r10],-r9,asr #32",
+ "E6 1A 50 89", "ldr r5,[r10],-r9,lsl #1",
+ "E6 1A 5F 89", "ldr r5,[r10],-r9,lsl #31",
+ "E6 1A 50 A9", "ldr r5,[r10],-r9,lsr #1",
+ "E6 1A 50 29", "ldr r5,[r10],-r9,lsr #32",
+ "E6 1A 50 E9", "ldr r5,[r10],-r9,ror #1",
+ "E6 1A 5F E9", "ldr r5,[r10],-r9,ror #31",
+ "E6 1A 50 69", "ldr r5,[r10],-r9,rrx",
+ "04 1A 59 87", "ldreq r5,[r10],#-0x987",
+ "E4 9A 59 87", "ldr r5,[r10],#0x987",
+ "05 5F 59 87", "ldrbeq r5,[pc,#-0x987] ; 0xfffff679",
+ "E5 DF 59 87", "ldrb r5,[pc,#0x987] ; 0x987",
+ "E7 7A 50 09", "ldrb r5,[r10,-r9]!",
+ "05 5A 59 87", "ldrbeq r5,[r10,#-0x987]",
+ "E5 7A 59 87", "ldrb r5,[r10,#-0x987]!",
+ "E5 DA 59 87", "ldrb r5,[r10,#0x987]",
+ "E5 FA 59 87", "ldrb r5,[r10,#0x987]!",
+ "07 DA 50 C9", "ldrbeq r5,[r10,r9,asr #1]",
+ "E7 FA 50 C9", "ldrb r5,[r10,r9,asr #1]!",
+ "E7 DA 50 49", "ldrb r5,[r10,r9,asr #32]",
+ "E7 FA 50 49", "ldrb r5,[r10,r9,asr #32]!",
+ "E7 DA 50 89", "ldrb r5,[r10,r9,lsl #1]",
+ "E7 FA 50 89", "ldrb r5,[r10,r9,lsl #1]!",
+ "E7 DA 5F 89", "ldrb r5,[r10,r9,lsl #31]",
+ "E7 FA 5F 89", "ldrb r5,[r10,r9,lsl #31]!",
+ "E7 DA 50 A9", "ldrb r5,[r10,r9,lsr #1]",
+ "E7 FA 50 A9", "ldrb r5,[r10,r9,lsr #1]!",
+ "E7 DA 50 29", "ldrb r5,[r10,r9,lsr #32]",
+ "E7 FA 50 29", "ldrb r5,[r10,r9,lsr #32]!",
+ "E7 DA 50 E9", "ldrb r5,[r10,r9,ror #1]",
+ "E7 FA 50 E9", "ldrb r5,[r10,r9,ror #1]!",
+ "E7 DA 5F E9", "ldrb r5,[r10,r9,ror #31]",
+ "E7 FA 5F E9", "ldrb r5,[r10,r9,ror #31]!",
+ "E7 DA 50 69", "ldrb r5,[r10,r9,rrx]",
+ "E7 FA 50 69", "ldrb r5,[r10,r9,rrx]!",
+ "E7 DA 50 09", "ldrb r5,[r10,r9]",
+ "E7 FA 50 09", "ldrb r5,[r10,r9]!",
+ "07 5A 50 C9", "ldrbeq r5,[r10,-r9,asr #1]",
+ "E7 7A 50 C9", "ldrb r5,[r10,-r9,asr #1]!",
+ "E7 5A 50 49", "ldrb r5,[r10,-r9,asr #32]",
+ "E7 7A 50 49", "ldrb r5,[r10,-r9,asr #32]!",
+ "E7 5A 50 89", "ldrb r5,[r10,-r9,lsl #1]",
+ "E7 7A 50 89", "ldrb r5,[r10,-r9,lsl #1]!",
+ "E7 5A 5F 89", "ldrb r5,[r10,-r9,lsl #31]",
+ "E7 7A 5F 89", "ldrb r5,[r10,-r9,lsl #31]!",
+ "E7 5A 50 A9", "ldrb r5,[r10,-r9,lsr #1]",
+ "E7 7A 50 A9", "ldrb r5,[r10,-r9,lsr #1]!",
+ "E7 5A 50 29", "ldrb r5,[r10,-r9,lsr #32]",
+ "E7 7A 50 29", "ldrb r5,[r10,-r9,lsr #32]!",
+ "E7 5A 50 E9", "ldrb r5,[r10,-r9,ror #1]",
+ "E7 7A 50 E9", "ldrb r5,[r10,-r9,ror #1]!",
+ "E7 5A 5F E9", "ldrb r5,[r10,-r9,ror #31]",
+ "E7 7A 5F E9", "ldrb r5,[r10,-r9,ror #31]!",
+ "E7 5A 50 69", "ldrb r5,[r10,-r9,rrx]",
+ "E7 7A 50 69", "ldrb r5,[r10,-r9,rrx]!",
+ "E7 5A 50 09", "ldrb r5,[r10,-r9]",
+ "E5 DA 50 00", "ldrb r5,[r10]",
+ "E4 5A 59 87", "ldrb r5,[r10],#-0x987",
+ "E4 DA 59 87", "ldrb r5,[r10],#0x987",
+ "E6 DA 50 09", "ldrb r5,[r10],r9",
+ "E6 DA 50 C9", "ldrb r5,[r10],r9,asr #1",
+ "E6 DA 50 49", "ldrb r5,[r10],r9,asr #32",
+ "E6 DA 50 89", "ldrb r5,[r10],r9,lsl #1",
+ "E6 DA 5F 89", "ldrb r5,[r10],r9,lsl #31",
+ "E6 DA 50 A9", "ldrb r5,[r10],r9,lsr #1",
+ "E6 DA 50 29", "ldrb r5,[r10],r9,lsr #32",
+ "E6 DA 50 E9", "ldrb r5,[r10],r9,ror #1",
+ "E6 DA 5F E9", "ldrb r5,[r10],r9,ror #31",
+ "E6 DA 50 69", "ldrb r5,[r10],r9,rrx",
+ "E6 5A 50 09", "ldrb r5,[r10],-r9",
+ "E6 5A 50 C9", "ldrb r5,[r10],-r9,asr #1",
+ "E6 5A 50 49", "ldrb r5,[r10],-r9,asr #32",
+ "E6 5A 50 89", "ldrb r5,[r10],-r9,lsl #1",
+ "E6 5A 5F 89", "ldrb r5,[r10],-r9,lsl #31",
+ "E6 5A 50 A9", "ldrb r5,[r10],-r9,lsr #1",
+ "E6 5A 50 29", "ldrb r5,[r10],-r9,lsr #32",
+ "E6 5A 50 E9", "ldrb r5,[r10],-r9,ror #1",
+ "E6 5A 5F E9", "ldrb r5,[r10],-r9,ror #31",
+ "E6 5A 50 69", "ldrb r5,[r10],-r9,rrx",
+ "04 7A 59 87", "ldrbteq r5,[r10],#-0x987",
+ "E4 FA 59 87", "ldrbt r5,[r10],#0x987",
+ "E6 FA 50 09", "ldrbt r5,[r10],r9",
+ "E6 FA 50 C9", "ldrbt r5,[r10],r9,asr #1",
+ "E6 FA 50 49", "ldrbt r5,[r10],r9,asr #32",
+ "E6 FA 50 89", "ldrbt r5,[r10],r9,lsl #1",
+ "E6 FA 5F 89", "ldrbt r5,[r10],r9,lsl #31",
+ "E6 FA 50 A9", "ldrbt r5,[r10],r9,lsr #1",
+ "E6 FA 50 29", "ldrbt r5,[r10],r9,lsr #32",
+ "E6 FA 50 E9", "ldrbt r5,[r10],r9,ror #1",
+ "E6 FA 5F E9", "ldrbt r5,[r10],r9,ror #31",
+ "E6 FA 50 69", "ldrbt r5,[r10],r9,rrx",
+ "06 7A 50 09", "ldrbteq r5,[r10],-r9",
+ "06 7A 50 C9", "ldrbteq r5,[r10],-r9,asr #1",
+ "E6 7A 50 49", "ldrbt r5,[r10],-r9,asr #32",
+ "E6 7A 50 89", "ldrbt r5,[r10],-r9,lsl #1",
+ "E6 7A 5F 89", "ldrbt r5,[r10],-r9,lsl #31",
+ "E6 7A 50 A9", "ldrbt r5,[r10],-r9,lsr #1",
+ "E6 7A 50 29", "ldrbt r5,[r10],-r9,lsr #32",
+ "E6 7A 50 E9", "ldrbt r5,[r10],-r9,ror #1",
+ "E6 7A 5F E9", "ldrbt r5,[r10],-r9,ror #31",
+ "E6 7A 50 69", "ldrbt r5,[r10],-r9,rrx",
+ "01 4F 68 D7", "ldrdeq r6,r7,[pc,#-0x87] ; 0xffffff79",
+ "E1 CF 68 D7", "ldrd r6,r7,[pc,#0x87] ; 0x87",
+ "01 4A 68 D7", "ldrdeq r6,r7,[r10,#-0x87]",
+ "E1 6A 68 D7", "ldrd r6,r7,[r10,#-0x87]!",
+ "E1 CA 68 D7", "ldrd r6,r7,[r10,#0x87]",
+ "E1 EA 68 D7", "ldrd r6,r7,[r10,#0x87]!",
+ "E1 8A 60 D9", "ldrd r6,r7,[r10,r9]",
+ "E1 AA 60 D9", "ldrd r6,r7,[r10,r9]!",
+ "01 0A 60 D9", "ldrdeq r6,r7,[r10,-r9]",
+ "E1 2A 60 D9", "ldrd r6,r7,[r10,-r9]!",
+ "E1 CA 60 D0", "ldrd r6,r7,[r10]",
+ "00 4A 68 D7", "ldrdeq r6,r7,[r10],#-0x87",
+ "E0 CA 68 D7", "ldrd r6,r7,[r10],#0x87",
+ "E0 8A 60 D9", "ldrd r6,r7,[r10],r9",
+ "E0 0A 60 D9", "ldrd r6,r7,[r10],-r9",
+ "01 9A 5F 9F", "ldrexeq r5,[r10]",
+ "01 DA 5F 9F", "ldrexbeq r5,[r10]",
+ "01 BA 6F 9F", "ldrexdeq r6,r7,[r10]",
+ "01 FA 5F 9F", "ldrexheq r5,[r10]",
+ "01 5F 58 B7", "ldrheq r5,[pc,#-0x87] ; 0xffffff79",
+ "E1 DF 58 B7", "ldrh r5,[pc,#0x87] ; 0x87",
+ "01 5A 58 B7", "ldrheq r5,[r10,#-0x87]",
+ "E1 7A 58 B7", "ldrh r5,[r10,#-0x87]!",
+ "E1 DA 58 B7", "ldrh r5,[r10,#0x87]",
+ "E1 FA 58 B7", "ldrh r5,[r10,#0x87]!",
+ "E1 9A 50 B9", "ldrh r5,[r10,r9]",
+ "E1 BA 50 B9", "ldrh r5,[r10,r9]!",
+ "01 1A 50 B9", "ldrheq r5,[r10,-r9]",
+ "E1 3A 50 B9", "ldrh r5,[r10,-r9]!",
+ "E1 DA 50 B0", "ldrh r5,[r10]",
+ "E0 1A 50 B9", "ldrh r5,[r10],-r9",
+ "00 5A 58 B7", "ldrheq r5,[r10],#-0x87",
+ "E0 DA 58 B7", "ldrh r5,[r10],#0x87",
+ "E0 9A 50 B9", "ldrh r5,[r10],r9",
+ "E1 DA 50 B0", "ldrh r5,[r10]",
+ "00 FA 50 B0", "ldrhteq r5,[r10]",
+ "00 7A 58 B7", "ldrhteq r5,[r10],#-0x87",
+ "E0 FA 58 B7", "ldrht r5,[r10],#0x87",
+ "E0 BA 50 B9", "ldrht r5,[r10],r9",
+ "00 3A 50 B9", "ldrhteq r5,[r10],-r9",
+ "01 5F 58 D7", "ldrsbeq r5,[pc,#-0x87] ; 0xffffff79",
+ "E1 DF 58 D7", "ldrsb r5,[pc,#0x87] ; 0x87",
+ "01 5A 58 D7", "ldrsbeq r5,[r10,#-0x87]",
+ "E1 7A 58 D7", "ldrsb r5,[r10,#-0x87]!",
+ "E1 DA 58 D7", "ldrsb r5,[r10,#0x87]",
+ "E1 FA 58 D7", "ldrsb r5,[r10,#0x87]!",
+ "E1 9A 50 D9", "ldrsb r5,[r10,r9]",
+ "E1 BA 50 D9", "ldrsb r5,[r10,r9]!",
+ "01 1A 50 D9", "ldrsbeq r5,[r10,-r9]",
+ "E1 3A 50 D9", "ldrsb r5,[r10,-r9]!",
+ "E1 DA 50 D0", "ldrsb r5,[r10]",
+ "00 5A 58 D7", "ldrsbeq r5,[r10],#-0x87",
+ "E0 DA 58 D7", "ldrsb r5,[r10],#0x87",
+ "E0 9A 50 D9", "ldrsb r5,[r10],r9",
+ "00 1A 50 D9", "ldrsbeq r5,[r10],-r9",
+ "00 FA 50 D0", "ldrsbteq r5,[r10]",
+ "00 7A 58 D7", "ldrsbteq r5,[r10],#-0x87",
+ "E0 FA 58 D7", "ldrsbt r5,[r10],#0x87",
+ "E0 BA 50 D9", "ldrsbt r5,[r10],r9",
+ "00 3A 50 D9", "ldrsbteq r5,[r10],-r9",
+ "01 5F 58 F7", "ldrsheq r5,[pc,#-0x87] ; 0xffffff79",
+ "E1 DF 58 F7", "ldrsh r5,[pc,#0x87] ; 0x87",
+ "01 5A 58 F7", "ldrsheq r5,[r10,#-0x87]",
+ "E1 7A 58 F7", "ldrsh r5,[r10,#-0x87]!",
+ "E1 DA 58 F7", "ldrsh r5,[r10,#0x87]",
+ "E1 FA 58 F7", "ldrsh r5,[r10,#0x87]!",
+ "E1 9A 50 F9", "ldrsh r5,[r10,r9]",
+ "E1 BA 50 F9", "ldrsh r5,[r10,r9]!",
+ "01 1A 50 F9", "ldrsheq r5,[r10,-r9]",
+ "E1 3A 50 F9", "ldrsh r5,[r10,-r9]!",
+ "E1 DA 50 F0", "ldrsh r5,[r10]",
+ "00 5A 58 F7", "ldrsheq r5,[r10],#-0x87",
+ "E0 DA 58 F7", "ldrsh r5,[r10],#0x87",
+ "E0 9A 50 F9", "ldrsh r5,[r10],r9",
+ "E0 1A 50 F9", "ldrsh r5,[r10],-r9",
+ "00 FA 50 F0", "ldrshteq r5,[r10]",
+ "00 7A 58 F7", "ldrshteq r5,[r10],#-0x87",
+ "E0 FA 58 F7", "ldrsht r5,[r10],#0x87",
+ "E0 BA 50 F9", "ldrsht r5,[r10],r9",
+ "00 3A 50 F9", "ldrshteq r5,[r10],-r9",
+ "04 BA 50 00", "ldrteq r5,[r10]",
+ "04 3A 59 87", "ldrteq r5,[r10],#-0x987",
+ "E4 BA 59 87", "ldrt r5,[r10],#0x987",
+ "E6 BA 50 09", "ldrt r5,[r10],r9",
+ "E6 BA 50 C9", "ldrt r5,[r10],r9,asr #1",
+ "E6 BA 50 49", "ldrt r5,[r10],r9,asr #32",
+ "E6 BA 50 89", "ldrt r5,[r10],r9,lsl #1",
+ "E6 BA 5F 89", "ldrt r5,[r10],r9,lsl #31",
+ "E6 BA 50 A9", "ldrt r5,[r10],r9,lsr #1",
+ "E6 BA 50 29", "ldrt r5,[r10],r9,lsr #32",
+ "E6 BA 50 E9", "ldrt r5,[r10],r9,ror #1",
+ "E6 BA 5F E9", "ldrt r5,[r10],r9,ror #31",
+ "E6 BA 50 69", "ldrt r5,[r10],r9,rrx",
+ "06 3A 50 09", "ldrteq r5,[r10],-r9",
+ "06 3A 50 C9", "ldrteq r5,[r10],-r9,asr #1",
+ "E6 3A 50 49", "ldrt r5,[r10],-r9,asr #32",
+ "E6 3A 50 89", "ldrt r5,[r10],-r9,lsl #1",
+ "E6 3A 5F 89", "ldrt r5,[r10],-r9,lsl #31",
+ "E6 3A 50 A9", "ldrt r5,[r10],-r9,lsr #1",
+ "E6 3A 50 29", "ldrt r5,[r10],-r9,lsr #32",
+ "E6 3A 50 E9", "ldrt r5,[r10],-r9,ror #1",
+ "E6 3A 5F E9", "ldrt r5,[r10],-r9,ror #31",
+ "E6 3A 50 69", "ldrt r5,[r10],-r9,rrx",
+ "01 A0 5E 89", "lsleq r5,r9,#29",
+ "01 A0 5A 19", "lsleq r5,r9,r10",
+ "E1 B0 5E 89", "lsls r5,r9,#29",
+ "E1 B0 5A 19", "lsls r5,r9,r10",
+ "01 A0 5E A9", "lsreq r5,r9,#29",
+ "01 A0 5A 39", "lsreq r5,r9,r10",
+ "01 B0 5E A9", "lsrseq r5,r9,#29",
+ "01 B0 5A 39", "lsrseq r5,r9,r10",
+ "0E C9 59 FA", "mcreq p9,0x6,r5,c9,c10,0x7",
+ "FE C9 59 FA", "mcr2 p9,0x6,r5,c9,c10,0x7",
+ "0C 46 59 C9", "mcrreq p9,0xc,r5,r6,c9",
+ "FC 46 59 C9", "mcrr2 p9,0xc,r5,r6,c9",
+ "00 25 8A 99", "mlaeq r5,r9,r10,r8",
+ "00 35 8A 99", "mlaseq r5,r9,r10,r8",
+ "00 65 8A 99", "mlseq r5,r9,r10,r8",
+ "03 A0 50 71", "moveq r5,#0x71",
+ "01 A0 50 09", "moveq r5,r9",
+ "03 B0 51 FE", "movseq r5,#0x8000003f",
+ "01 B0 50 09", "movseq r5,r9",
+ "03 49 58 76", "movteq r5,#0x9876",
+ "03 09 58 76", "movweq r5,#0x9876",
+ "0E D5 F9 B9", "mrceq p9,0x6,apsr_nzcv,c5,c9,0x5",
+ "EE F5 59 99", "mrc p9,0x7,r5,c5,c9,0x4",
+ "FE 95 F9 F9", "mrc2 p9,0x4,apsr_nzcv,c5,c9,0x7",
+ "FE B5 59 D9", "mrc2 p9,0x5,r5,c5,c9,0x6",
+ "0C 56 59 F9", "mrrceq p9,0xf,r5,r6,c9",
+ "FC 56 59 39", "mrrc2 p9,0x3,r5,r6,c9",
+ "01 0F 50 00", "mrseq r5,cpsr",
+ "E1 4F 50 00", "mrs r5,spsr",
+ "03 2F F1 FE", "msreq cpsr_cxfs,#0x8000003f",
+ "01 2F F0 0A", "msreq cpsr_cxfs,r10",
+ "E3 6F F1 FE", "msr spsr_cxfs,#0x8000003f",
+ "E1 6F F0 0A", "msr spsr_cxfs,r10",
+ "03 28 F0 71", "msreq cpsr_f,#0x71",
+ "01 28 F0 0A", "msreq cpsr_f,r10",
+ "E3 24 F1 FE", "msr cpsr_s,#0x8000003f",
+ "E1 24 F0 0A", "msr cpsr_s,r10",
+ "E3 2C F1 FE", "msr cpsr_fs,#0x8000003f",
+ "E1 2C F0 0A", "msr cpsr_fs,r10",
+ "00 05 0A 99", "muleq r5,r9,r10",
+ "00 15 0A 99", "mulseq r5,r9,r10",
+ "03 E0 50 71", "mvneq r5,#0x71",
+ "01 E0 50 C9", "mvneq r5,r9,asr #1",
+ "01 E0 56 59", "mvneq r5,r9,asr r6",
+ "E1 E0 50 89", "mvn r5,r9,lsl #1",
+ "E1 E0 56 19", "mvn r5,r9,lsl r6",
+ "E1 E0 50 29", "mvn r5,r9,lsr #32",
+ "E1 E0 5F E9", "mvn r5,r9,ror #31",
+ "E1 E0 50 69", "mvn r5,r9,rrx",
+ "03 F0 51 FE", "mvnseq r5,#0x8000003f",
+ "01 F0 50 49", "mvnseq r5,r9,asr #32",
+ "E1 F0 5F 89", "mvns r5,r9,lsl #31",
+ "E1 F0 50 A9", "mvns r5,r9,lsr #1",
+ "01 F0 56 39", "mvnseq r5,r9,lsr r6",
+ "E1 F0 50 E9", "mvns r5,r9,ror #1",
+ "E1 F0 56 79", "mvns r5,r9,ror r6",
+ "E3 20 F0 00", "nop",
+ "03 20 F0 00", "nopeq",
+ "03 8A 50 71", "orreq r5,r10,#0x71",
+ "01 89 50 CA", "orreq r5,r9,r10,asr #1",
+ "01 89 56 5A", "orreq r5,r9,r10,asr r6",
+ "E1 89 50 8A", "orr r5,r9,r10,lsl #1",
+ "E1 89 56 1A", "orr r5,r9,r10,lsl r6",
+ "E1 89 50 2A", "orr r5,r9,r10,lsr #32",
+ "E1 89 5F EA", "orr r5,r9,r10,ror #31",
+ "E1 89 50 6A", "orr r5,r9,r10,rrx",
+ "03 9A 51 FE", "orrseq r5,r10,#0x8000003f",
+ "01 99 50 4A", "orrseq r5,r9,r10,asr #32",
+ "E1 99 5F 8A", "orrs r5,r9,r10,lsl #31",
+ "E1 99 50 AA", "orrs r5,r9,r10,lsr #1",
+ "01 99 56 3A", "orrseq r5,r9,r10,lsr r6",
+ "E1 99 50 EA", "orrs r5,r9,r10,ror #1",
+ "E1 99 56 7A", "orrs r5,r9,r10,ror r6",
+ "06 89 50 1A", "pkhbteq r5,r9,r10",
+ "06 89 5E 9A", "pkhbteq r5,r9,r10,lsl #29",
+ "06 89 5E DA", "pkhtbeq r5,r9,r10,asr #29",
+ "F5 5F F9 87", "pld [pc,#-0x987] ; 0xfffff679",
+ "F5 DF F9 87", "pld [pc,#0x987] ; 0x987",
+ "F5 5A F9 87", "pld [r10,#-0x987]",
+ "F5 DA F9 87", "pld [r10,#0x987]",
+ "F7 DA F0 C9", "pld [r10,r9,asr #1]",
+ "F7 DA F0 49", "pld [r10,r9,asr #32]",
+ "F7 DA F0 89", "pld [r10,r9,lsl #1]",
+ "F7 DA FF 89", "pld [r10,r9,lsl #31]",
+ "F7 DA F0 A9", "pld [r10,r9,lsr #1]",
+ "F7 DA F0 29", "pld [r10,r9,lsr #32]",
+ "F7 DA F0 E9", "pld [r10,r9,ror #1]",
+ "F7 DA FF E9", "pld [r10,r9,ror #31]",
+ "F7 DA F0 69", "pld [r10,r9,rrx]",
+ "F7 DA F0 09", "pld [r10,r9]",
+ "F7 5A F0 C9", "pld [r10,-r9,asr #1]",
+ "F7 5A F0 49", "pld [r10,-r9,asr #32]",
+ "F7 5A F0 89", "pld [r10,-r9,lsl #1]",
+ "F7 5A FF 89", "pld [r10,-r9,lsl #31]",
+ "F7 5A F0 A9", "pld [r10,-r9,lsr #1]",
+ "F7 5A F0 29", "pld [r10,-r9,lsr #32]",
+ "F7 5A F0 E9", "pld [r10,-r9,ror #1]",
+ "F7 5A FF E9", "pld [r10,-r9,ror #31]",
+ "F7 5A F0 69", "pld [r10,-r9,rrx]",
+ "F7 5A F0 09", "pld [r10,-r9]",
+ "F5 1A F9 87", "pldw [r10,#-0x987]",
+ "F5 9A F9 87", "pldw [r10,#0x987]",
+ "F7 9A F0 C9", "pldw [r10,r9,asr #1]",
+ "F7 9A F0 49", "pldw [r10,r9,asr #32]",
+ "F7 9A F0 89", "pldw [r10,r9,lsl #1]",
+ "F7 9A FF 89", "pldw [r10,r9,lsl #31]",
+ "F7 9A F0 A9", "pldw [r10,r9,lsr #1]",
+ "F7 9A F0 29", "pldw [r10,r9,lsr #32]",
+ "F7 9A F0 E9", "pldw [r10,r9,ror #1]",
+ "F7 9A FF E9", "pldw [r10,r9,ror #31]",
+ "F7 9A F0 69", "pldw [r10,r9,rrx]",
+ "F7 9A F0 09", "pldw [r10,r9]",
+ "F7 1A F0 C9", "pldw [r10,-r9,asr #1]",
+ "F7 1A F0 49", "pldw [r10,-r9,asr #32]",
+ "F7 1A F0 89", "pldw [r10,-r9,lsl #1]",
+ "F7 1A FF 89", "pldw [r10,-r9,lsl #31]",
+ "F7 1A F0 A9", "pldw [r10,-r9,lsr #1]",
+ "F7 1A F0 29", "pldw [r10,-r9,lsr #32]",
+ "F7 1A F0 E9", "pldw [r10,-r9,ror #1]",
+ "F7 1A FF E9", "pldw [r10,-r9,ror #31]",
+ "F7 1A F0 69", "pldw [r10,-r9,rrx]",
+ "F7 1A F0 09", "pldw [r10,-r9]",
+ "F4 5F F9 87", "pli [pc,#-0x987] ; 0xfffff679",
+ "F4 DF F9 87", "pli [pc,#0x987] ; 0x987",
+ "F4 5A F9 87", "pli [r10,#-0x987]",
+ "F4 DA F9 87", "pli [r10,#0x987]",
+ "F6 DA F0 C9", "pli [r10,r9,asr #1]",
+ "F6 DA F0 49", "pli [r10,r9,asr #32]",
+ "F6 DA F0 89", "pli [r10,r9,lsl #1]",
+ "F6 DA FF 89", "pli [r10,r9,lsl #31]",
+ "F6 DA F0 A9", "pli [r10,r9,lsr #1]",
+ "F6 DA F0 29", "pli [r10,r9,lsr #32]",
+ "F6 DA F0 E9", "pli [r10,r9,ror #1]",
+ "F6 DA FF E9", "pli [r10,r9,ror #31]",
+ "F6 DA F0 69", "pli [r10,r9,rrx]",
+ "F6 DA F0 09", "pli [r10,r9]",
+ "04 9D E0 04", "popeq {lr}",
+ "F6 5A F0 C9", "pli [r10,-r9,asr #1]",
+ "F6 5A F0 49", "pli [r10,-r9,asr #32]",
+ "F6 5A F0 89", "pli [r10,-r9,lsl #1]",
+ "F6 5A FF 89", "pli [r10,-r9,lsl #31]",
+ "F6 5A F0 A9", "pli [r10,-r9,lsr #1]",
+ "F6 5A F0 29", "pli [r10,-r9,lsr #32]",
+ "F6 5A F0 E9", "pli [r10,-r9,ror #1]",
+ "F6 5A FF E9", "pli [r10,-r9,ror #31]",
+ "F6 5A F0 69", "pli [r10,-r9,rrx]",
+ "F6 5A F0 09", "pli [r10,-r9]",
+ "E8 BD 82 40", "pop {r6,r9,pc}",
+ "05 2D E0 04", "pusheq {lr}",
+ "E9 2D 12 40", "push {r6,r9,r12}",
+ "01 0A 50 59", "qaddeq r5,r9,r10",
+ "06 29 5F 1A", "qadd16eq r5,r9,r10",
+ "06 29 5F 9A", "qadd8eq r5,r9,r10",
+ "06 29 5F 3A", "qasxeq r5,r9,r10",
+ "01 4A 50 59", "qdaddeq r5,r9,r10",
+ "01 6A 50 59", "qdsubeq r5,r9,r10",
+ "06 29 5F 5A", "qsaxeq r5,r9,r10",
+ "01 2A 50 59", "qsubeq r5,r9,r10",
+ "06 29 5F 7A", "qsub16eq r5,r9,r10",
+ "06 29 5F FA", "qsub8eq r5,r9,r10",
+ "06 FF 5F 39", "rbiteq r5,r9",
+ "06 BF 5F 39", "reveq r5,r9",
+ "06 BF 5F B9", "rev16eq r5,r9",
+ "06 FF 5F B9", "revsheq r5,r9",
+ "F8 1A 0A 00", "rfeda r10",
+ "F8 3A 0A 00", "rfeda r10!",
+ "F9 1A 0A 00", "rfedb r10",
+ "F9 3A 0A 00", "rfedb r10!",
+ "F8 9A 0A 00", "rfeia r10",
+ "F8 BA 0A 00", "rfeia r10!",
+ "F9 9A 0A 00", "rfeib r10",
+ "F9 BA 0A 00", "rfeib r10!",
+ "01 A0 5E E9", "roreq r5,r9,#29",
+ "01 A0 5A 79", "roreq r5,r9,r10",
+ "E1 B0 5E E9", "rors r5,r9,#29",
+ "E1 B0 5A 79", "rors r5,r9,r10",
+ "01 A0 50 69", "rrxeq r5,r9",
+ "01 B0 50 69", "rrxseq r5,r9",
+ "02 6A 50 71", "rsbeq r5,r10,#0x71",
+ "00 69 50 CA", "rsbeq r5,r9,r10,asr #1",
+ "00 69 56 5A", "rsbeq r5,r9,r10,asr r6",
+ "E0 69 50 8A", "rsb r5,r9,r10,lsl #1",
+ "E0 69 56 1A", "rsb r5,r9,r10,lsl r6",
+ "E0 69 50 2A", "rsb r5,r9,r10,lsr #32",
+ "E0 69 5F EA", "rsb r5,r9,r10,ror #31",
+ "E0 69 50 6A", "rsb r5,r9,r10,rrx",
+ "02 7A 51 FE", "rsbseq r5,r10,#0x8000003f",
+ "00 79 50 4A", "rsbseq r5,r9,r10,asr #32",
+ "E0 79 5F 8A", "rsbs r5,r9,r10,lsl #31",
+ "E0 79 50 AA", "rsbs r5,r9,r10,lsr #1",
+ "00 79 56 3A", "rsbseq r5,r9,r10,lsr r6",
+ "E0 79 50 EA", "rsbs r5,r9,r10,ror #1",
+ "E0 79 56 7A", "rsbs r5,r9,r10,ror r6",
+ "02 EA 50 71", "rsceq r5,r10,#0x71",
+ "00 E9 50 CA", "rsceq r5,r9,r10,asr #1",
+ "00 E9 56 5A", "rsceq r5,r9,r10,asr r6",
+ "E0 E9 50 8A", "rsc r5,r9,r10,lsl #1",
+ "E0 E9 56 1A", "rsc r5,r9,r10,lsl r6",
+ "E0 E9 50 2A", "rsc r5,r9,r10,lsr #32",
+ "E0 E9 5F EA", "rsc r5,r9,r10,ror #31",
+ "E0 E9 50 6A", "rsc r5,r9,r10,rrx",
+ "02 FA 51 FE", "rscseq r5,r10,#0x8000003f",
+ "00 F9 50 4A", "rscseq r5,r9,r10,asr #32",
+ "E0 F9 5F 8A", "rscs r5,r9,r10,lsl #31",
+ "E0 F9 50 AA", "rscs r5,r9,r10,lsr #1",
+ "00 F9 56 3A", "rscseq r5,r9,r10,lsr r6",
+ "E0 F9 50 EA", "rscs r5,r9,r10,ror #1",
+ "E0 F9 56 7A", "rscs r5,r9,r10,ror r6",
+ "06 19 5F 1A", "sadd16eq r5,r9,r10",
+ "06 19 5F 9A", "sadd8eq r5,r9,r10",
+ "06 19 5F 3A", "sasxeq r5,r9,r10",
+ "02 CA 50 71", "sbceq r5,r10,#0x71",
+ "00 C9 50 CA", "sbceq r5,r9,r10,asr #1",
+ "00 C9 56 5A", "sbceq r5,r9,r10,asr r6",
+ "E0 C9 50 8A", "sbc r5,r9,r10,lsl #1",
+ "E0 C9 56 1A", "sbc r5,r9,r10,lsl r6",
+ "E0 C9 50 2A", "sbc r5,r9,r10,lsr #32",
+ "E0 C9 5F EA", "sbc r5,r9,r10,ror #31",
+ "E0 C9 50 6A", "sbc r5,r9,r10,rrx",
+ "02 DA 51 FE", "sbcseq r5,r10,#0x8000003f",
+ "00 D9 50 4A", "sbcseq r5,r9,r10,asr #32",
+ "E0 D9 5F 8A", "sbcs r5,r9,r10,lsl #31",
+ "E0 D9 50 AA", "sbcs r5,r9,r10,lsr #1",
+ "00 D9 56 3A", "sbcseq r5,r9,r10,lsr r6",
+ "E0 D9 50 EA", "sbcs r5,r9,r10,ror #1",
+ "E0 D9 56 7A", "sbcs r5,r9,r10,ror r6",
+ "07 BF 50 5A", "sbfxeq r5,r10,#0,#32",
+ "E7 A0 5F DA", "sbfx r5,r10,#31,#1",
+ "06 89 5F BA", "seleq r5,r9,r10",
+ "F1 01 02 00", "setend be",
+ "F1 01 00 00", "setend le",
+ "03 20 F0 04", "seveq",
+ "06 39 5F 1A", "shadd16eq r5,r9,r10",
+ "06 39 5F 9A", "shadd8eq r5,r9,r10",
+ "06 39 5F 3A", "shasxeq r5,r9,r10",
+ "06 39 5F 5A", "shsaxeq r5,r9,r10",
+ "06 39 5F 7A", "shsub16eq r5,r9,r10",
+ "06 39 5F FA", "shsub8eq r5,r9,r10",
+ "01 60 00 7E", "smceq #0xe",
+ "01 05 8A 89", "smlabbeq r5,r9,r10,r8",
+ "E1 05 8A C9", "smlabt r5,r9,r10,r8",
+ "07 05 8A 19", "smladeq r5,r9,r10,r8",
+ "07 05 8A 39", "smladxeq r5,r9,r10,r8",
+ "00 E9 58 9A", "smlaleq r5,r9,r10,r8",
+ "00 F9 58 9A", "smlalseq r5,r9,r10,r8",
+ "01 49 58 8A", "smlalbbeq r5,r9,r10,r8",
+ "01 49 58 CA", "smlalbteq r5,r9,r10,r8",
+ "07 49 58 1A", "smlaldeq r5,r9,r10,r8",
+ "07 49 58 3A", "smlaldxeq r5,r9,r10,r8",
+ "01 49 58 AA", "smlaltbeq r5,r9,r10,r8",
+ "01 49 58 EA", "smlaltteq r5,r9,r10,r8",
+ "01 05 8A A9", "smlatbeq r5,r9,r10,r8",
+ "01 05 8A E9", "smlatteq r5,r9,r10,r8",
+ "01 25 8A 89", "smlawbeq r5,r9,r10,r8",
+ "01 25 8A C9", "smlawteq r5,r9,r10,r8",
+ "07 05 8A 59", "smlsdeq r5,r9,r10,r8",
+ "07 05 8A 79", "smlsdxeq r5,r9,r10,r8",
+ "07 49 58 5A", "smlsldeq r5,r9,r10,r8",
+ "07 49 58 7A", "smlsldxeq r5,r9,r10,r8",
+ "07 55 8A 19", "smmlaeq r5,r9,r10,r8",
+ "07 55 8A 39", "smmlareq r5,r9,r10,r8",
+ "07 55 8A D9", "smmlseq r5,r9,r10,r8",
+ "07 55 8A F9", "smmlsreq r5,r9,r10,r8",
+ "07 55 FA 19", "smmuleq r5,r9,r10",
+ "07 55 FA 39", "smmulreq r5,r9,r10",
+ "07 05 FA 19", "smuadeq r5,r9,r10",
+ "07 05 FA 39", "smuadxeq r5,r9,r10",
+ "01 65 0A 89", "smulbbeq r5,r9,r10",
+ "01 65 0A C9", "smulbteq r5,r9,r10",
+ "01 65 0A A9", "smultbeq r5,r9,r10",
+ "01 65 0A E9", "smultteq r5,r9,r10",
+ "00 C9 58 9A", "smulleq r5,r9,r10,r8",
+ "00 D9 58 9A", "smullseq r5,r9,r10,r8",
+ "01 25 0A A9", "smulwbeq r5,r9,r10",
+ "01 25 0A E9", "smulwteq r5,r9,r10",
+ "07 05 FA 59", "smusdeq r5,r9,r10",
+ "07 05 FA 79", "smusdxeq r5,r9,r10",
+ "F8 6D 05 13", "srsda sp!,#0x13",
+ "F8 4D 05 13", "srsda sp,#0x13",
+ "F9 6D 05 13", "srsdb sp!,#0x13",
+ "F9 4D 05 13", "srsdb sp,#0x13",
+ "F8 ED 05 13", "srsia sp!,#0x13",
+ "F8 CD 05 13", "srsia sp,#0x13",
+ "F9 ED 05 13", "srsib sp!,#0x13",
+ "F9 CD 05 13", "srsib sp,#0x13",
+ "06 BC 50 1A", "ssateq r5,#29,r10",
+ "06 BC 50 DA", "ssateq r5,#29,r10,asr #1",
+ "E6 BC 50 5A", "ssat r5,#29,r10,asr #32",
+ "E6 BC 50 9A", "ssat r5,#29,r10,lsl #1",
+ "E6 BC 5F 9A", "ssat r5,#29,r10,lsl #31",
+ "06 AE 5F 3A", "ssat16eq r5,#15,r10",
+ "06 19 5F 5A", "ssaxeq r5,r9,r10",
+ "06 19 5F 7A", "ssub16eq r5,r9,r10",
+ "06 19 5F FA", "ssub8eq r5,r9,r10",
+ "0D 0A B9 21", "stceq p9,c11,[r10,#-0x84]",
+ "ED 2A B9 21", "stc p9,c11,[r10,#-0x84]!",
+ "ED 8A B9 21", "stc p9,c11,[r10,#0x84]",
+ "ED AA B9 21", "stc p9,c11,[r10,#0x84]!",
+ "0C 2A B9 21", "stceq p9,c11,[r10],#-0x84",
+ "EC AA B9 21", "stc p9,c11,[r10],#0x84",
+ "0C 8A B9 00", "stceq p9,c11,[r10],{0}",
+ "EC 8A B9 FF", "stc p9,c11,[r10],{255}",
+ "FD 0A B9 21", "stc2 p9,c11,[r10,#-0x84]",
+ "FD 2A B9 21", "stc2 p9,c11,[r10,#-0x84]!",
+ "FD 8A B9 21", "stc2 p9,c11,[r10,#0x84]",
+ "FD AA B9 21", "stc2 p9,c11,[r10,#0x84]!",
+ "FC 2A B9 21", "stc2 p9,c11,[r10],#-0x84",
+ "FC AA B9 21", "stc2 p9,c11,[r10],#0x84",
+ "FC 8A B9 00", "stc2 p9,c11,[r10],{0}",
+ "FC 8A B9 FF", "stc2 p9,c11,[r10],{255}",
+ "FD 4A B9 21", "stc2l p9,c11,[r10,#-0x84]",
+ "FD 6A B9 21", "stc2l p9,c11,[r10,#-0x84]!",
+ "FD CA B9 21", "stc2l p9,c11,[r10,#0x84]",
+ "FD EA B9 21", "stc2l p9,c11,[r10,#0x84]!",
+ "FC 6A B9 21", "stc2l p9,c11,[r10],#-0x84",
+ "FC EA B9 21", "stc2l p9,c11,[r10],#0x84",
+ "FC CA B9 00", "stc2l p9,c11,[r10],{0}",
+ "FC CA B9 FF", "stc2l p9,c11,[r10],{255}",
+ "0D 4A B9 21", "stcleq p9,c11,[r10,#-0x84]",
+ "ED 6A B9 21", "stcl p9,c11,[r10,#-0x84]!",
+ "ED CA B9 21", "stcl p9,c11,[r10,#0x84]",
+ "ED EA B9 21", "stcl p9,c11,[r10,#0x84]!",
+ "0C 6A B9 21", "stcleq p9,c11,[r10],#-0x84",
+ "EC EA B9 21", "stcl p9,c11,[r10],#0x84",
+ "0C CA B9 00", "stcleq p9,c11,[r10],{0}",
+ "EC CA B9 FF", "stcl p9,c11,[r10],{255}",
+ "08 AA 42 40", "stmeq r10!,{r6,r9,lr}",
+ "E8 8A 42 40", "stm r10,{r6,r9,lr}",
+ "08 2A 42 40", "stmdaeq r10!,{r6,r9,lr}",
+ "E8 4A 64 20", "stmda r10,{r5,r10,sp,lr}^",
+ "E8 0A 42 40", "stmda r10,{r6,r9,lr}",
+ "09 2A 42 40", "stmdbeq r10!,{r6,r9,lr}",
+ "E9 4A 64 20", "stmdb r10,{r5,r10,sp,lr}^",
+ "E9 0A 42 40", "stmdb r10,{r6,r9,lr}",
+ "08 CA 64 20", "stmiaeq r10,{r5,r10,sp,lr}^",
+ "09 AA 42 40", "stmibeq r10!,{r6,r9,lr}",
+ "E9 CA 64 20", "stmib r10,{r5,r10,sp,lr}^",
+ "E9 8A 42 40", "stmib r10,{r6,r9,lr}",
+ "05 0A 59 87", "streq r5,[r10,#-0x987]",
+ "E5 2A 59 87", "str r5,[r10,#-0x987]!",
+ "E5 8A 59 87", "str r5,[r10,#0x987]",
+ "E5 AA 59 87", "str r5,[r10,#0x987]!",
+ "E7 8A 50 C9", "str r5,[r10,r9,asr #1]",
+ "E7 AA 50 C9", "str r5,[r10,r9,asr #1]!",
+ "E7 8A 50 49", "str r5,[r10,r9,asr #32]",
+ "E7 AA 50 49", "str r5,[r10,r9,asr #32]!",
+ "E7 8A 50 89", "str r5,[r10,r9,lsl #1]",
+ "E7 AA 50 89", "str r5,[r10,r9,lsl #1]!",
+ "E7 8A 5F 89", "str r5,[r10,r9,lsl #31]",
+ "E7 AA 5F 89", "str r5,[r10,r9,lsl #31]!",
+ "E7 8A 50 A9", "str r5,[r10,r9,lsr #1]",
+ "E7 AA 50 A9", "str r5,[r10,r9,lsr #1]!",
+ "E7 8A 50 29", "str r5,[r10,r9,lsr #32]",
+ "E7 AA 50 29", "str r5,[r10,r9,lsr #32]!",
+ "E7 8A 50 E9", "str r5,[r10,r9,ror #1]",
+ "E7 AA 50 E9", "str r5,[r10,r9,ror #1]!",
+ "E7 8A 5F E9", "str r5,[r10,r9,ror #31]",
+ "E7 AA 5F E9", "str r5,[r10,r9,ror #31]!",
+ "E7 8A 50 69", "str r5,[r10,r9,rrx]",
+ "E7 AA 50 69", "str r5,[r10,r9,rrx]!",
+ "E7 8A 50 09", "str r5,[r10,r9]",
+ "E7 AA 50 09", "str r5,[r10,r9]!",
+ "E5 8A 50 00", "str r5,[r10]",
+ "07 0A 50 C9", "streq r5,[r10,-r9,asr #1]",
+ "E7 2A 50 C9", "str r5,[r10,-r9,asr #1]!",
+ "E7 0A 50 49", "str r5,[r10,-r9,asr #32]",
+ "E7 2A 50 49", "str r5,[r10,-r9,asr #32]!",
+ "E7 0A 50 89", "str r5,[r10,-r9,lsl #1]",
+ "E7 2A 50 89", "str r5,[r10,-r9,lsl #1]!",
+ "E7 0A 5F 89", "str r5,[r10,-r9,lsl #31]",
+ "E7 2A 5F 89", "str r5,[r10,-r9,lsl #31]!",
+ "E7 0A 50 A9", "str r5,[r10,-r9,lsr #1]",
+ "E7 2A 50 A9", "str r5,[r10,-r9,lsr #1]!",
+ "E7 0A 50 29", "str r5,[r10,-r9,lsr #32]",
+ "E7 2A 50 29", "str r5,[r10,-r9,lsr #32]!",
+ "E7 0A 50 E9", "str r5,[r10,-r9,ror #1]",
+ "E7 2A 50 E9", "str r5,[r10,-r9,ror #1]!",
+ "E7 0A 5F E9", "str r5,[r10,-r9,ror #31]",
+ "E7 2A 5F E9", "str r5,[r10,-r9,ror #31]!",
+ "E7 0A 50 69", "str r5,[r10,-r9,rrx]",
+ "E7 2A 50 69", "str r5,[r10,-r9,rrx]!",
+ "07 0A 50 09", "streq r5,[r10,-r9]",
+ "E7 2A 50 09", "str r5,[r10,-r9]!",
+ "04 0A 59 87", "streq r5,[r10],#-0x987",
+ "E4 8A 59 87", "str r5,[r10],#0x987",
+ "E6 8A 50 09", "str r5,[r10],r9",
+ "E6 8A 50 C9", "str r5,[r10],r9,asr #1",
+ "E6 8A 50 49", "str r5,[r10],r9,asr #32",
+ "E6 8A 50 89", "str r5,[r10],r9,lsl #1",
+ "E6 8A 5F 89", "str r5,[r10],r9,lsl #31",
+ "E6 8A 50 A9", "str r5,[r10],r9,lsr #1",
+ "E6 8A 50 29", "str r5,[r10],r9,lsr #32",
+ "E6 8A 50 E9", "str r5,[r10],r9,ror #1",
+ "E6 8A 5F E9", "str r5,[r10],r9,ror #31",
+ "E6 8A 50 69", "str r5,[r10],r9,rrx",
+ "E6 0A 50 09", "str r5,[r10],-r9",
+ "06 0A 50 C9", "streq r5,[r10],-r9,asr #1",
+ "E6 0A 50 49", "str r5,[r10],-r9,asr #32",
+ "E6 0A 50 89", "str r5,[r10],-r9,lsl #1",
+ "E6 0A 5F 89", "str r5,[r10],-r9,lsl #31",
+ "E6 0A 50 A9", "str r5,[r10],-r9,lsr #1",
+ "E6 0A 50 29", "str r5,[r10],-r9,lsr #32",
+ "E6 0A 50 E9", "str r5,[r10],-r9,ror #1",
+ "E6 0A 5F E9", "str r5,[r10],-r9,ror #31",
+ "E6 0A 50 69", "str r5,[r10],-r9,rrx",
+ "05 4A 59 87", "strbeq r5,[r10,#-0x987]",
+ "E5 6A 59 87", "strb r5,[r10,#-0x987]!",
+ "E5 CA 59 87", "strb r5,[r10,#0x987]",
+ "E5 EA 59 87", "strb r5,[r10,#0x987]!",
+ "07 CA 50 C9", "strbeq r5,[r10,r9,asr #1]",
+ "E7 EA 50 C9", "strb r5,[r10,r9,asr #1]!",
+ "E7 CA 50 49", "strb r5,[r10,r9,asr #32]",
+ "E7 EA 50 49", "strb r5,[r10,r9,asr #32]!",
+ "E7 CA 50 89", "strb r5,[r10,r9,lsl #1]",
+ "E7 EA 50 89", "strb r5,[r10,r9,lsl #1]!",
+ "E7 CA 5F 89", "strb r5,[r10,r9,lsl #31]",
+ "E7 EA 5F 89", "strb r5,[r10,r9,lsl #31]!",
+ "E7 CA 50 A9", "strb r5,[r10,r9,lsr #1]",
+ "E7 EA 50 A9", "strb r5,[r10,r9,lsr #1]!",
+ "E7 CA 50 29", "strb r5,[r10,r9,lsr #32]",
+ "E7 EA 50 29", "strb r5,[r10,r9,lsr #32]!",
+ "E7 CA 50 E9", "strb r5,[r10,r9,ror #1]",
+ "E7 EA 50 E9", "strb r5,[r10,r9,ror #1]!",
+ "E7 CA 5F E9", "strb r5,[r10,r9,ror #31]",
+ "E7 EA 5F E9", "strb r5,[r10,r9,ror #31]!",
+ "E7 CA 50 69", "strb r5,[r10,r9,rrx]",
+ "E7 EA 50 69", "strb r5,[r10,r9,rrx]!",
+ "E7 CA 50 09", "strb r5,[r10,r9]",
+ "E7 EA 50 09", "strb r5,[r10,r9]!",
+ "E7 4A 50 C9", "strb r5,[r10,-r9,asr #1]",
+ "E7 6A 50 C9", "strb r5,[r10,-r9,asr #1]!",
+ "E7 4A 50 49", "strb r5,[r10,-r9,asr #32]",
+ "E7 6A 50 49", "strb r5,[r10,-r9,asr #32]!",
+ "E7 4A 50 89", "strb r5,[r10,-r9,lsl #1]",
+ "E7 6A 50 89", "strb r5,[r10,-r9,lsl #1]!",
+ "E7 4A 5F 89", "strb r5,[r10,-r9,lsl #31]",
+ "E7 6A 5F 89", "strb r5,[r10,-r9,lsl #31]!",
+ "E7 4A 50 A9", "strb r5,[r10,-r9,lsr #1]",
+ "E7 6A 50 A9", "strb r5,[r10,-r9,lsr #1]!",
+ "E7 4A 50 29", "strb r5,[r10,-r9,lsr #32]",
+ "E7 6A 50 29", "strb r5,[r10,-r9,lsr #32]!",
+ "E7 4A 50 E9", "strb r5,[r10,-r9,ror #1]",
+ "E7 6A 50 E9", "strb r5,[r10,-r9,ror #1]!",
+ "E7 4A 5F E9", "strb r5,[r10,-r9,ror #31]",
+ "E7 6A 5F E9", "strb r5,[r10,-r9,ror #31]!",
+ "E7 4A 50 69", "strb r5,[r10,-r9,rrx]",
+ "E7 6A 50 69", "strb r5,[r10,-r9,rrx]!",
+ "E7 4A 50 09", "strb r5,[r10,-r9]",
+ "E7 6A 50 09", "strb r5,[r10,-r9]!",
+ "05 CA 50 00", "strbeq r5,[r10]",
+ "04 4A 59 87", "strbeq r5,[r10],#-0x987",
+ "E4 CA 59 87", "strb r5,[r10],#0x987",
+ "06 CA 50 09", "strbeq r5,[r10],r9",
+ "06 CA 50 C9", "strbeq r5,[r10],r9,asr #1",
+ "E6 CA 50 49", "strb r5,[r10],r9,asr #32",
+ "E6 CA 50 89", "strb r5,[r10],r9,lsl #1",
+ "E6 CA 5F 89", "strb r5,[r10],r9,lsl #31",
+ "E6 CA 50 A9", "strb r5,[r10],r9,lsr #1",
+ "E6 CA 50 29", "strb r5,[r10],r9,lsr #32",
+ "E6 CA 50 E9", "strb r5,[r10],r9,ror #1",
+ "E6 CA 5F E9", "strb r5,[r10],r9,ror #31",
+ "E6 CA 50 69", "strb r5,[r10],r9,rrx",
+ "E6 4A 50 09", "strb r5,[r10],-r9",
+ "E6 4A 50 C9", "strb r5,[r10],-r9,asr #1",
+ "E6 4A 50 49", "strb r5,[r10],-r9,asr #32",
+ "E6 4A 50 89", "strb r5,[r10],-r9,lsl #1",
+ "E6 4A 5F 89", "strb r5,[r10],-r9,lsl #31",
+ "E6 4A 50 A9", "strb r5,[r10],-r9,lsr #1",
+ "E6 4A 50 29", "strb r5,[r10],-r9,lsr #32",
+ "E6 4A 50 E9", "strb r5,[r10],-r9,ror #1",
+ "E6 4A 5F E9", "strb r5,[r10],-r9,ror #31",
+ "E6 4A 50 69", "strb r5,[r10],-r9,rrx",
+ "04 6A 59 87", "strbteq r5,[r10],#-0x987",
+ "E4 EA 59 87", "strbt r5,[r10],#0x987",
+ "06 EA 50 09", "strbteq r5,[r10],r9",
+ "06 EA 50 C9", "strbteq r5,[r10],r9,asr #1",
+ "E6 EA 50 49", "strbt r5,[r10],r9,asr #32",
+ "E6 EA 50 89", "strbt r5,[r10],r9,lsl #1",
+ "E6 EA 5F 89", "strbt r5,[r10],r9,lsl #31",
+ "E6 EA 50 A9", "strbt r5,[r10],r9,lsr #1",
+ "E6 EA 50 29", "strbt r5,[r10],r9,lsr #32",
+ "E6 EA 50 E9", "strbt r5,[r10],r9,ror #1",
+ "E6 EA 5F E9", "strbt r5,[r10],r9,ror #31",
+ "E6 EA 50 69", "strbt r5,[r10],r9,rrx",
+ "E6 6A 50 09", "strbt r5,[r10],-r9",
+ "E6 6A 50 C9", "strbt r5,[r10],-r9,asr #1",
+ "E6 6A 50 49", "strbt r5,[r10],-r9,asr #32",
+ "E6 6A 50 89", "strbt r5,[r10],-r9,lsl #1",
+ "E6 6A 5F 89", "strbt r5,[r10],-r9,lsl #31",
+ "E6 6A 50 A9", "strbt r5,[r10],-r9,lsr #1",
+ "E6 6A 50 29", "strbt r5,[r10],-r9,lsr #32",
+ "E6 6A 50 E9", "strbt r5,[r10],-r9,ror #1",
+ "E6 6A 5F E9", "strbt r5,[r10],-r9,ror #31",
+ "E6 6A 50 69", "strbt r5,[r10],-r9,rrx",
+ "01 4A 68 F7", "strdeq r6,r7,[r10,#-0x87]",
+ "E1 6A 68 F7", "strd r6,r7,[r10,#-0x87]!",
+ "E1 CA 68 F7", "strd r6,r7,[r10,#0x87]",
+ "E1 EA 68 F7", "strd r6,r7,[r10,#0x87]!",
+ "01 8A 60 F9", "strdeq r6,r7,[r10,r9]",
+ "E1 AA 60 F9", "strd r6,r7,[r10,r9]!",
+ "E1 0A 60 F9", "strd r6,r7,[r10,-r9]",
+ "E1 2A 60 F9", "strd r6,r7,[r10,-r9]!",
+ "01 CA 60 F0", "strdeq r6,r7,[r10]",
+ "E1 CA 60 F0", "strd r6,r7,[r10]",
+ "00 4A 68 F7", "strdeq r6,r7,[r10],#-0x87",
+ "E0 CA 68 F7", "strd r6,r7,[r10],#0x87",
+ "00 8A 60 F9", "strdeq r6,r7,[r10],r9",
+ "E0 0A 60 F9", "strd r6,r7,[r10],-r9",
+ "01 8A 5F 99", "strexeq r5,r9,[r10]",
+ "01 CA 5F 99", "strexbeq r5,r9,[r10]",
+ "01 AA 9F 96", "strexdeq r9,r6,r7,[r10]",
+ "01 EA 5F 99", "strexheq r5,r9,[r10]",
+ "01 4A 58 B7", "strheq r5,[r10,#-0x87]",
+ "E1 6A 58 B7", "strh r5,[r10,#-0x87]!",
+ "E1 CA 58 B7", "strh r5,[r10,#0x87]",
+ "E1 EA 58 B7", "strh r5,[r10,#0x87]!",
+ "01 8A 50 B9", "strheq r5,[r10,r9]",
+ "E1 AA 50 B9", "strh r5,[r10,r9]!",
+ "01 0A 50 B9", "strheq r5,[r10,-r9]",
+ "E1 2A 50 B9", "strh r5,[r10,-r9]!",
+ "01 CA 50 B0", "strheq r5,[r10]",
+ "00 4A 58 B7", "strheq r5,[r10],#-0x87",
+ "E0 CA 58 B7", "strh r5,[r10],#0x87",
+ "00 8A 50 B9", "strheq r5,[r10],r9",
+ "E0 0A 50 B9", "strh r5,[r10],-r9",
+ "E0 EA 50 B0", "strht r5,[r10]",
+ "00 6A 58 B7", "strhteq r5,[r10],#-0x87",
+ "E0 EA 58 B7", "strht r5,[r10],#0x87",
+ "00 AA 50 B9", "strhteq r5,[r10],r9",
+ "E0 2A 50 B9", "strht r5,[r10],-r9",
+ "04 AA 50 00", "strteq r5,[r10]",
+ "04 2A 59 87", "strteq r5,[r10],#-0x987",
+ "E4 AA 59 87", "strt r5,[r10],#0x987",
+ "06 AA 50 09", "strteq r5,[r10],r9",
+ "06 AA 50 C9", "strteq r5,[r10],r9,asr #1",
+ "E6 AA 50 49", "strt r5,[r10],r9,asr #32",
+ "E6 AA 50 89", "strt r5,[r10],r9,lsl #1",
+ "E6 AA 5F 89", "strt r5,[r10],r9,lsl #31",
+ "E6 AA 50 A9", "strt r5,[r10],r9,lsr #1",
+ "E6 AA 50 29", "strt r5,[r10],r9,lsr #32",
+ "E6 AA 50 E9", "strt r5,[r10],r9,ror #1",
+ "E6 AA 5F E9", "strt r5,[r10],r9,ror #31",
+ "E6 AA 50 69", "strt r5,[r10],r9,rrx",
+ "E6 2A 50 09", "strt r5,[r10],-r9",
+ "E6 2A 50 C9", "strt r5,[r10],-r9,asr #1",
+ "E6 2A 50 49", "strt r5,[r10],-r9,asr #32",
+ "E6 2A 50 89", "strt r5,[r10],-r9,lsl #1",
+ "E6 2A 5F 89", "strt r5,[r10],-r9,lsl #31",
+ "E6 2A 50 A9", "strt r5,[r10],-r9,lsr #1",
+ "E6 2A 50 29", "strt r5,[r10],-r9,lsr #32",
+ "E6 2A 50 E9", "strt r5,[r10],-r9,ror #1",
+ "E6 2A 5F E9", "strt r5,[r10],-r9,ror #31",
+ "E6 2A 50 69", "strt r5,[r10],-r9,rrx",
+ "02 4F 50 00", "subeq r5,pc,#0x0",
+ "E2 4F 50 87", "sub r5,pc,#0x87",
+ "02 4A 50 71", "subeq r5,r10,#0x71",
+ "00 49 50 CA", "subeq r5,r9,r10,asr #1",
+ "00 49 56 5A", "subeq r5,r9,r10,asr r6",
+ "E0 49 50 8A", "sub r5,r9,r10,lsl #1",
+ "E0 49 56 1A", "sub r5,r9,r10,lsl r6",
+ "E0 49 50 2A", "sub r5,r9,r10,lsr #32",
+ "E0 49 5F EA", "sub r5,r9,r10,ror #31",
+ "E0 49 50 6A", "sub r5,r9,r10,rrx",
+ "02 5A 51 FE", "subseq r5,r10,#0x8000003f",
+ "00 59 50 4A", "subseq r5,r9,r10,asr #32",
+ "E0 59 5F 8A", "subs r5,r9,r10,lsl #31",
+ "E0 59 50 AA", "subs r5,r9,r10,lsr #1",
+ "00 59 56 3A", "subseq r5,r9,r10,lsr r6",
+ "E0 59 50 EA", "subs r5,r9,r10,ror #1",
+ "E0 59 56 7A", "subs r5,r9,r10,ror r6",
+ "0F AB CE F9", "svceq #0xabcef9",
+ "E1 0A 50 96", "swp r5,r6,[r10]",
+ "E1 4A 50 96", "swpb r5,r6,[r10]",
+ "06 A9 50 7A", "sxtabeq r5,r9,r10",
+ "06 A9 58 7A", "sxtabeq r5,r9,r10,ror #16",
+ "E6 A9 5C 7A", "sxtab r5,r9,r10,ror #24",
+ "E6 A9 54 7A", "sxtab r5,r9,r10,ror #8",
+ "06 89 50 7A", "sxtab16eq r5,r9,r10",
+ "06 89 58 7A", "sxtab16eq r5,r9,r10,ror #16",
+ "E6 89 5C 7A", "sxtab16 r5,r9,r10,ror #24",
+ "E6 89 54 7A", "sxtab16 r5,r9,r10,ror #8",
+ "06 B9 50 7A", "sxtaheq r5,r9,r10",
+ "06 B9 58 7A", "sxtaheq r5,r9,r10,ror #16",
+ "E6 B9 5C 7A", "sxtah r5,r9,r10,ror #24",
+ "E6 B9 54 7A", "sxtah r5,r9,r10,ror #8",
+ "06 AF 50 79", "sxtbeq r5,r9",
+ "06 AF 58 79", "sxtbeq r5,r9,ror #16",
+ "E6 AF 5C 79", "sxtb r5,r9,ror #24",
+ "E6 AF 54 79", "sxtb r5,r9,ror #8",
+ "06 8F 50 79", "sxtb16eq r5,r9",
+ "06 8F 58 79", "sxtb16eq r5,r9,ror #16",
+ "E6 8F 5C 79", "sxtb16 r5,r9,ror #24",
+ "E6 8F 54 79", "sxtb16 r5,r9,ror #8",
+ "06 BF 50 79", "sxtheq r5,r9",
+ "06 BF 58 79", "sxtheq r5,r9,ror #16",
+ "E6 BF 5C 79", "sxth r5,r9,ror #24",
+ "E6 BF 54 79", "sxth r5,r9,ror #8",
+ "03 3A 00 71", "teqeq r10,#0x71",
+ "E3 3A 01 FE", "teq r10,#0x8000003f",
+ "01 35 00 CA", "teqeq r5,r10,asr #1",
+ "E1 35 00 4A", "teq r5,r10,asr #32",
+ "01 35 06 5A", "teqeq r5,r10,asr r6",
+ "E1 35 00 8A", "teq r5,r10,lsl #1",
+ "E1 35 0F 8A", "teq r5,r10,lsl #31",
+ "E1 35 06 1A", "teq r5,r10,lsl r6",
+ "E1 35 00 AA", "teq r5,r10,lsr #1",
+ "E1 35 00 2A", "teq r5,r10,lsr #32",
+ "E1 35 06 3A", "teq r5,r10,lsr r6",
+ "E1 35 00 EA", "teq r5,r10,ror #1",
+ "E1 35 0F EA", "teq r5,r10,ror #31",
+ "E1 35 06 7A", "teq r5,r10,ror r6",
+ "E1 35 00 6A", "teq r5,r10,rrx",
+ "03 1A 00 71", "tsteq r10,#0x71",
+ "E3 1A 01 FE", "tst r10,#0x8000003f",
+ "01 15 00 CA", "tsteq r5,r10,asr #1",
+ "E1 15 00 4A", "tst r5,r10,asr #32",
+ "01 15 06 5A", "tsteq r5,r10,asr r6",
+ "E1 15 00 8A", "tst r5,r10,lsl #1",
+ "E1 15 0F 8A", "tst r5,r10,lsl #31",
+ "E1 15 06 1A", "tst r5,r10,lsl r6",
+ "E1 15 00 AA", "tst r5,r10,lsr #1",
+ "E1 15 00 2A", "tst r5,r10,lsr #32",
+ "E1 15 06 3A", "tst r5,r10,lsr r6",
+ "E1 15 00 EA", "tst r5,r10,ror #1",
+ "E1 15 0F EA", "tst r5,r10,ror #31",
+ "E1 15 06 7A", "tst r5,r10,ror r6",
+ "E1 15 00 6A", "tst r5,r10,rrx",
+ "06 59 5F 1A", "uadd16eq r5,r9,r10",
+ "06 59 5F 9A", "uadd8eq r5,r9,r10",
+ "06 59 5F 3A", "uasxeq r5,r9,r10",
+ "07 FF 50 5A", "ubfxeq r5,r10,#0,#32",
+ "E7 FF 50 5A", "ubfx r5,r10,#0,#32",
+ "E7 E0 5F DA", "ubfx r5,r10,#31,#1",
+ "06 79 5F 1A", "uhadd16eq r5,r9,r10",
+ "06 79 5F 9A", "uhadd8eq r5,r9,r10",
+ "06 79 5F 3A", "uhasxeq r5,r9,r10",
+ "06 79 5F 5A", "uhsaxeq r5,r9,r10",
+ "06 79 5F 7A", "uhsub16eq r5,r9,r10",
+ "06 79 5F FA", "uhsub8eq r5,r9,r10",
+ "00 49 58 9A", "umaaleq r5,r9,r10,r8",
+ "00 A9 58 9A", "umlaleq r5,r9,r10,r8",
+ "00 B9 58 9A", "umlalseq r5,r9,r10,r8",
+ "00 89 58 9A", "umulleq r5,r9,r10,r8",
+ "00 99 58 9A", "umullseq r5,r9,r10,r8",
+ "06 69 5F 1A", "uqadd16eq r5,r9,r10",
+ "06 69 5F 9A", "uqadd8eq r5,r9,r10",
+ "06 69 5F 3A", "uqasxeq r5,r9,r10",
+ "06 69 5F 5A", "uqsaxeq r5,r9,r10",
+ "06 69 5F 7A", "uqsub16eq r5,r9,r10",
+ "06 69 5F FA", "uqsub8eq r5,r9,r10",
+ "07 85 FA 19", "usad8eq r5,r9,r10",
+ "07 85 8A 19", "usada8eq r5,r9,r10,r8",
+ "06 FE 50 1A", "usateq r5,#30,r10",
+ "06 FE 50 DA", "usateq r5,#30,r10,asr #1",
+ "E6 FE 50 5A", "usat r5,#30,r10,asr #32",
+ "E6 FE 50 9A", "usat r5,#30,r10,lsl #1",
+ "E6 FE 5F 9A", "usat r5,#30,r10,lsl #31",
+ "06 EF 5F 3A", "usat16eq r5,#15,r10",
+ "06 59 5F 5A", "usaxeq r5,r9,r10",
+ "06 59 5F 7A", "usub16eq r5,r9,r10",
+ "06 59 5F FA", "usub8eq r5,r9,r10",
+ "06 E9 50 7A", "uxtabeq r5,r9,r10",
+ "06 E9 58 7A", "uxtabeq r5,r9,r10,ror #16",
+ "E6 E9 5C 7A", "uxtab r5,r9,r10,ror #24",
+ "E6 E9 54 7A", "uxtab r5,r9,r10,ror #8",
+ "06 C9 50 7A", "uxtab16eq r5,r9,r10",
+ "06 C9 58 7A", "uxtab16eq r5,r9,r10,ror #16",
+ "E6 C9 5C 7A", "uxtab16 r5,r9,r10,ror #24",
+ "E6 C9 54 7A", "uxtab16 r5,r9,r10,ror #8",
+ "06 F9 50 7A", "uxtaheq r5,r9,r10",
+ "06 F9 58 7A", "uxtaheq r5,r9,r10,ror #16",
+ "E6 F9 5C 7A", "uxtah r5,r9,r10,ror #24",
+ "E6 F9 54 7A", "uxtah r5,r9,r10,ror #8",
+ "06 EF 50 79", "uxtbeq r5,r9",
+ "06 EF 58 79", "uxtbeq r5,r9,ror #16",
+ "E6 EF 5C 79", "uxtb r5,r9,ror #24",
+ "E6 EF 54 79", "uxtb r5,r9,ror #8",
+ "06 CF 50 79", "uxtb16eq r5,r9",
+ "06 CF 58 79", "uxtb16eq r5,r9,ror #16",
+ "E6 CF 5C 79", "uxtb16 r5,r9,ror #24",
+ "E6 CF 54 79", "uxtb16 r5,r9,ror #8",
+ "06 FF 50 79", "uxtheq r5,r9",
+ "06 FF 58 79", "uxtheq r5,r9,ror #16",
+ "E6 FF 5C 79", "uxth r5,r9,ror #24",
+ "E6 FF 54 79", "uxth r5,r9,ror #8",
+ "03 20 F0 02", "wfeeq",
+ "03 20 F0 03", "wfieq",
+ "03 20 F0 01", "yieldeq",
+ };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ @Test
+ public void testArmVFPInstructions() {
+
+ System.out.println("\n====================== ARM VFP ======================\n");
+ String[] insts = {
+ "F2 49 57 BA", "vaba.s8 d21,d25,d26",
+ "F2 59 57 BA", "vaba.s16 d21,d25,d26",
+ "F2 69 57 BA", "vaba.s32 d21,d25,d26",
+ "F3 49 57 BA", "vaba.u8 d21,d25,d26",
+ "F3 59 57 BA", "vaba.u16 d21,d25,d26",
+ "F3 69 57 BA", "vaba.u32 d21,d25,d26",
+ "F2 4C 67 FE", "vaba.s8 q11,q14,q15",
+ "F2 5C 67 FE", "vaba.s16 q11,q14,q15",
+ "F2 6C 67 FE", "vaba.s32 q11,q14,q15",
+ "F3 4C 67 FE", "vaba.u8 q11,q14,q15",
+ "F3 5C 67 FE", "vaba.u16 q11,q14,q15",
+ "F3 6C 67 FE", "vaba.u32 q11,q14,q15",
+ "F2 C9 65 AA", "vabal.s8 q11,d25,d26",
+ "F2 D9 65 AA", "vabal.s16 q11,d25,d26",
+ "F2 E9 65 AA", "vabal.s32 q11,d25,d26",
+ "F3 C9 65 AA", "vabal.u8 q11,d25,d26",
+ "F3 D9 65 AA", "vabal.u16 q11,d25,d26",
+ "F3 E9 65 AA", "vabal.u32 q11,d25,d26",
+ "F2 49 57 AA", "vabd.s8 d21,d25,d26",
+ "F2 59 57 AA", "vabd.s16 d21,d25,d26",
+ "F2 69 57 AA", "vabd.s32 d21,d25,d26",
+ "F3 49 57 AA", "vabd.u8 d21,d25,d26",
+ "F3 59 57 AA", "vabd.u16 d21,d25,d26",
+ "F3 69 57 AA", "vabd.u32 d21,d25,d26",
+ "F2 4C 67 EE", "vabd.s8 q11,q14,q15",
+ "F2 5C 67 EE", "vabd.s16 q11,q14,q15",
+ "F2 6C 67 EE", "vabd.s32 q11,q14,q15",
+ "F3 4C 67 EE", "vabd.u8 q11,q14,q15",
+ "F3 5C 67 EE", "vabd.u16 q11,q14,q15",
+ "F3 6C 67 EE", "vabd.u32 q11,q14,q15",
+ "F3 69 5D AA", "vabd.f32 d21,d25,d26",
+ "F3 6C 6D EE", "vabd.f32 q11,q14,q15",
+ "F2 C9 67 AA", "vabdl.s8 q11,d25,d26",
+ "F2 D9 67 AA", "vabdl.s16 q11,d25,d26",
+ "F2 E9 67 AA", "vabdl.s32 q11,d25,d26",
+ "F3 C9 67 AA", "vabdl.u8 q11,d25,d26",
+ "F3 D9 67 AA", "vabdl.u16 q11,d25,d26",
+ "F3 E9 67 AA", "vabdl.u32 q11,d25,d26",
+ "F3 F1 63 6E", "vabs.s8 q11,q15",
+ "F3 F5 63 6E", "vabs.s16 q11,q15",
+ "F3 F9 63 6E", "vabs.s32 q11,q15",
+ "F3 F9 67 6E", "vabs.f32 q11,q15",
+ "F3 F1 53 2A", "vabs.s8 d21,d26",
+ "F3 F5 53 2A", "vabs.s16 d21,d26",
+ "F3 F9 53 2A", "vabs.s32 d21,d26",
+ "F3 F9 57 2A", "vabs.f32 d21,d26",
+ "0E F0 5B EA", "vabseq.f64 d21,d26",
+ "EE F0 AA CD", "vabs.f32 s21,s26",
+ "EE F0 5B EA", "vabs.f64 d21,d26",
+ "F3 49 5E BA", "vacge.f32 d21,d25,d26",
+ "F3 4C 6E FE", "vacge.f32 q11,q14,q15",
+ "F3 69 5E BA", "vacgt.f32 d21,d25,d26",
+ "F3 6C 6E FE", "vacgt.f32 q11,q14,q15",
+ "F2 49 58 AA", "vadd.i8 d21,d25,d26",
+ "F2 59 58 AA", "vadd.i16 d21,d25,d26",
+ "F2 69 58 AA", "vadd.i32 d21,d25,d26",
+ "F2 79 58 AA", "vadd.i64 d21,d25,d26",
+ "F2 4C 68 EE", "vadd.i8 q11,q14,q15",
+ "F2 5C 68 EE", "vadd.i16 q11,q14,q15",
+ "F2 6C 68 EE", "vadd.i32 q11,q14,q15",
+ "F2 7C 68 EE", "vadd.i64 q11,q14,q15",
+ "F2 49 5D AA", "vadd.f32 d21,d25,d26",
+ "F2 4C 6D EE", "vadd.f32 q11,q14,q15",
+ "EE 7C AA 8D", "vadd.f32 s21,s25,s26",
+ "0E 79 5B AA", "vaddeq.f64 d21,d25,d26",
+ "F2 CC 54 AE", "vaddhn.i16 d21,q14,q15",
+ "F2 DC 54 AE", "vaddhn.i32 d21,q14,q15",
+ "F2 EC 54 AE", "vaddhn.i64 d21,q14,q15",
+ "F2 C9 60 AA", "vaddl.s8 q11,d25,d26",
+ "F2 D9 60 AA", "vaddl.s16 q11,d25,d26",
+ "F2 E9 60 AA", "vaddl.s32 q11,d25,d26",
+ "F3 C9 60 AA", "vaddl.u8 q11,d25,d26",
+ "F3 D9 60 AA", "vaddl.u16 q11,d25,d26",
+ "F3 E9 60 AA", "vaddl.u32 q11,d25,d26",
+ "F2 CC 61 AA", "vaddw.s8 q11,q14,d26",
+ "F2 DC 61 AA", "vaddw.s16 q11,q14,d26",
+ "F2 EC 61 AA", "vaddw.s32 q11,q14,d26",
+ "F3 CC 61 AA", "vaddw.u8 q11,q14,d26",
+ "F3 DC 61 AA", "vaddw.u16 q11,q14,d26",
+ "F3 EC 61 AA", "vaddw.u32 q11,q14,d26",
+ "F2 49 51 BA", "vand d21,d25,d26",
+ "F2 4C 61 FE", "vand q11,q14,q15",
+ "F2 59 51 BA", "vbic d21,d25,d26",
+ "F2 5C 61 FE", "vbic q11,q14,q15",
+ "F3 C0 59 39", "vbic.i16 d21,#0x89",
+ "F3 C0 51 39", "vbic.i32 d21,#0x89",
+ "F3 C0 69 79", "vbic.i16 q11,#0x89",
+ "F3 C0 61 79", "vbic.i32 q11,#0x89",
+ "F3 79 51 BA", "vbif d21,d25,d26",
+ "F3 7C 61 FE", "vbif q11,q14,q15",
+ "F3 69 51 BA", "vbit d21,d25,d26",
+ "F3 6C 61 FE", "vbit q11,q14,q15",
+ "F3 59 51 BA", "vbsl d21,d25,d26",
+ "F3 5C 61 FE", "vbsl q11,q14,q15",
+ "F3 49 58 BA", "vceq.i8 d21,d25,d26",
+ "F3 59 58 BA", "vceq.i16 d21,d25,d26",
+ "F3 69 58 BA", "vceq.i32 d21,d25,d26",
+ "F3 F1 51 2A", "vceq.i8 d21,d26,#0",
+ "F3 F5 51 2A", "vceq.i16 d21,d26,#0",
+ "F3 F9 51 2A", "vceq.i32 d21,d26,#0",
+ "F3 F9 55 2A", "vceq.f32 d21,d26,#0",
+ "F3 4C 68 FE", "vceq.i8 q11,q14,q15",
+ "F3 5C 68 FE", "vceq.i16 q11,q14,q15",
+ "F3 6C 68 FE", "vceq.i32 q11,q14,q15",
+ "F3 F1 61 6E", "vceq.i8 q11,q15,#0",
+ "F3 F5 61 6E", "vceq.i16 q11,q15,#0",
+ "F3 F9 61 6E", "vceq.i32 q11,q15,#0",
+ "F3 F9 65 6E", "vceq.f32 q11,q15,#0",
+ "F2 49 5E AA", "vceq.f32 d21,d25,d26",
+ "F2 4C 6E EE", "vceq.f32 q11,q14,q15",
+ "F2 49 53 BA", "vcge.s8 d21,d25,d26",
+ "F2 59 53 BA", "vcge.s16 d21,d25,d26",
+ "F2 69 53 BA", "vcge.s32 d21,d25,d26",
+ "F3 49 53 BA", "vcge.u8 d21,d25,d26",
+ "F3 59 53 BA", "vcge.u16 d21,d25,d26",
+ "F3 69 53 BA", "vcge.u32 d21,d25,d26",
+ "F3 F1 50 AA", "vcge.s8 d21,d26,#0",
+ "F3 F5 50 AA", "vcge.s16 d21,d26,#0",
+ "F3 F9 50 AA", "vcge.s32 d21,d26,#0",
+ "F3 F9 54 AA", "vcge.f32 d21,d26,#0",
+ "F2 4C 63 FE", "vcge.s8 q11,q14,q15",
+ "F2 5C 63 FE", "vcge.s16 q11,q14,q15",
+ "F2 6C 63 FE", "vcge.s32 q11,q14,q15",
+ "F3 4C 63 FE", "vcge.u8 q11,q14,q15",
+ "F3 5C 63 FE", "vcge.u16 q11,q14,q15",
+ "F3 6C 63 FE", "vcge.u32 q11,q14,q15",
+ "F3 F1 60 EE", "vcge.s8 q11,q15,#0",
+ "F3 F5 60 EE", "vcge.s16 q11,q15,#0",
+ "F3 F9 60 EE", "vcge.s32 q11,q15,#0",
+ "F3 F9 64 EE", "vcge.f32 q11,q15,#0",
+ "F3 49 5E AA", "vcge.f32 d21,d25,d26",
+ "F3 4C 6E EE", "vcge.f32 q11,q14,q15",
+ "F2 49 53 AA", "vcgt.s8 d21,d25,d26",
+ "F2 59 53 AA", "vcgt.s16 d21,d25,d26",
+ "F2 69 53 AA", "vcgt.s32 d21,d25,d26",
+ "F3 49 53 AA", "vcgt.u8 d21,d25,d26",
+ "F3 59 53 AA", "vcgt.u16 d21,d25,d26",
+ "F3 69 53 AA", "vcgt.u32 d21,d25,d26",
+ "F3 F1 50 2A", "vcgt.s8 d21,d26,#0",
+ "F3 F5 50 2A", "vcgt.s16 d21,d26,#0",
+ "F3 F9 50 2A", "vcgt.s32 d21,d26,#0",
+ "F3 F9 54 2A", "vcgt.f32 d21,d26,#0",
+ "F2 4C 63 EE", "vcgt.s8 q11,q14,q15",
+ "F2 5C 63 EE", "vcgt.s16 q11,q14,q15",
+ "F2 6C 63 EE", "vcgt.s32 q11,q14,q15",
+ "F3 4C 63 EE", "vcgt.u8 q11,q14,q15",
+ "F3 5C 63 EE", "vcgt.u16 q11,q14,q15",
+ "F3 6C 63 EE", "vcgt.u32 q11,q14,q15",
+ "F3 F1 60 6E", "vcgt.s8 q11,q15,#0",
+ "F3 F5 60 6E", "vcgt.s16 q11,q15,#0",
+ "F3 F9 60 6E", "vcgt.s32 q11,q15,#0",
+ "F3 F9 64 6E", "vcgt.f32 q11,q15,#0",
+ "F3 69 5E AA", "vcgt.f32 d21,d25,d26",
+ "F3 6C 6E EE", "vcgt.f32 q11,q14,q15",
+ "F3 F1 51 AA", "vcle.s8 d21,d26,#0",
+ "F3 F5 51 AA", "vcle.s16 d21,d26,#0",
+ "F3 F9 51 AA", "vcle.s32 d21,d26,#0",
+ "F3 F9 55 AA", "vcle.f32 d21,d26,#0",
+ "F3 F1 61 EE", "vcle.s8 q11,q15,#0",
+ "F3 F5 61 EE", "vcle.s16 q11,q15,#0",
+ "F3 F9 61 EE", "vcle.s32 q11,q15,#0",
+ "F3 F9 65 EE", "vcle.f32 q11,q15,#0",
+ "F3 F0 54 2A", "vcls.s8 d21,d26",
+ "F3 F4 54 2A", "vcls.s16 d21,d26",
+ "F3 F8 54 2A", "vcls.s32 d21,d26",
+ "F3 F0 64 6E", "vcls.s8 q11,q15",
+ "F3 F4 64 6E", "vcls.s16 q11,q15",
+ "F3 F8 64 6E", "vcls.s32 q11,q15",
+ "F3 F1 52 2A", "vclt.s8 d21,d26,#0",
+ "F3 F5 52 2A", "vclt.s16 d21,d26,#0",
+ "F3 F9 52 2A", "vclt.s32 d21,d26,#0",
+ "F3 F9 56 2A", "vclt.f32 d21,d26,#0",
+ "F3 F1 62 6E", "vclt.s8 q11,q15,#0",
+ "F3 F5 62 6E", "vclt.s16 q11,q15,#0",
+ "F3 F9 62 6E", "vclt.s32 q11,q15,#0",
+ "F3 F9 66 6E", "vclt.f32 q11,q15,#0",
+ "F3 F0 54 AA", "vclz.i8 d21,d26",
+ "F3 F4 54 AA", "vclz.i16 d21,d26",
+ "F3 F8 54 AA", "vclz.i32 d21,d26",
+ "F3 F0 64 EE", "vclz.i8 q11,q15",
+ "F3 F4 64 EE", "vclz.i16 q11,q15",
+ "F3 F8 64 EE", "vclz.i32 q11,q15",
+ "0E F5 AA 40", "vcmpeq.f32 s21,#0.0",
+ "0E F4 AA 4D", "vcmpeq.f32 s21,s26",
+ "EE F5 5B 40", "vcmp.f64 d21,#0.0",
+ "EE F4 5B 6A", "vcmp.f64 d21,d26",
+ "EE F5 AA C0", "vcmpe.f32 s21,#0.0",
+ "EE F4 AA CD", "vcmpe.f32 s21,s26",
+ "EE F5 5B C0", "vcmpe.f64 d21,#0.0",
+ "EE F4 5B EA", "vcmpe.f64 d21,d26",
+ "F3 F0 55 2A", "vcnt.8 d21,d26",
+ "F3 F0 65 6E", "vcnt.8 q11,q15",
+ "F3 FB 57 2A", "vcvt.s32.f32 d21,d26",
+ "F3 FB 57 AA", "vcvt.u32.f32 d21,d26",
+ "F3 FB 56 2A", "vcvt.f32.s32 d21,d26",
+ "F3 FB 56 AA", "vcvt.f32.u32 d21,d26",
+ "F2 E0 5F 3A", "vcvt.s32.f32 d21,d26,#32",
+ "F3 E0 5F 3A", "vcvt.u32.f32 d21,d26,#32",
+ "F2 E0 5E 3A", "vcvt.f32.s32 d21,d26,#32",
+ "F3 E0 5E 3A", "vcvt.f32.u32 d21,d26,#32",
+ "F3 FB 67 6E", "vcvt.s32.f32 q11,q15",
+ "F3 FB 67 EE", "vcvt.u32.f32 q11,q15",
+ "F3 FB 66 6E", "vcvt.f32.s32 q11,q15",
+ "F3 FB 66 EE", "vcvt.f32.u32 q11,q15",
+ "F2 E0 6F 7E", "vcvt.s32.f32 q11,q15,#32",
+ "F3 E0 6F 7E", "vcvt.u32.f32 q11,q15,#32",
+ "F2 E0 6E 7E", "vcvt.f32.s32 q11,q15,#32",
+ "F3 E0 6E 7E", "vcvt.f32.u32 q11,q15,#32",
+ "EE FA AA E8", "vcvt.f32.s32 s21,s21,#15",
+ "EE FF AA 60", "vcvt.u16.f32 s21,s21,#15",
+ "EE FE AA E2", "vcvt.s32.f32 s21,s21,#27",
+ "EE FF AA E2", "vcvt.u32.f32 s21,s21,#27",
+ "EE FE 5B 60", "vcvt.s16.f64 d21,d21,#15",
+ "EE FF 5B 60", "vcvt.u16.f64 d21,d21,#15",
+ "EE FE 5B E2", "vcvt.s32.f64 d21,d21,#27",
+ "EE FF 5B E2", "vcvt.u32.f64 d21,d21,#27",
+ "F3 F6 56 2E", "vcvt.f16.f32 d21,q15",
+ "EE FA AA 60", "vcvt.f32.s16 s21,s21,#15",
+ "EE FB AA 60", "vcvt.f32.u16 s21,s21,#15",
+ "EE FA AA E2", "vcvt.f32.s32 s21,s21,#27",
+ "EE FB AA E2", "vcvt.f32.u32 s21,s21,#27",
+ "EE F8 AA CD", "vcvt.f32.s32 s21,s26",
+ "EE F8 AA 4D", "vcvt.f32.u32 s21,s26",
+ "F3 F6 67 2A", "vcvt.f32.f16 q11,d26",
+ "EE F7 AB EA", "vcvt.f32.f64 s21,d26",
+ "EE FA 5B 60", "vcvt.f64.s16 d21,d21,#15",
+ "EE FB 5B 60", "vcvt.f64.u16 d21,d21,#15",
+ "EE FA 5B E2", "vcvt.f64.s32 d21,d21,#27",
+ "0E FB 5B E2", "vcvteq.f64.u32 d21,d21,#27",
+ "EE F8 5B CD", "vcvt.f64.s32 d21,s26",
+ "EE F8 5B 4D", "vcvt.f64.u32 d21,s26",
+ "0E F7 5A CD", "vcvteq.f64.f32 d21,s26",
+ "EE FD AA CD", "vcvt.s32.f32 s21,s26",
+ "EE FD AB EA", "vcvt.s32.f64 s21,d26",
+ "EE FC AA CD", "vcvt.u32.f32 s21,s26",
+ "EE FC AB EA", "vcvt.u32.f64 s21,d26",
+ "0E F3 AA 4D", "vcvtbeq.f16.f32 s21,s26",
+ "EE F2 AA 4D", "vcvtb.f32.f16 s21,s26",
+ "EE F3 AA CD", "vcvtt.f16.f32 s21,s26",
+ "EE F2 AA CD", "vcvtt.f32.f16 s21,s26",
+ "0E FD AA 4D", "vcvtreq.s32.f32 s21,s26",
+ "EE FD AB 6A", "vcvtr.s32.f64 s21,d26",
+ "EE FC AA 4D", "vcvtr.u32.f32 s21,s26",
+ "EE FC AB 6A", "vcvtr.u32.f64 s21,d26",
+ "0E CC AA 8D", "vdiveq.f32 s21,s25,s26",
+ "EE C9 5B AA", "vdiv.f64 d21,d25,d26",
+ "F3 F5 5C 26", "vdup.8 d21,d22[2]",
+ "F3 FA 5C 26", "vdup.16 d21,d22[2]",
+ "F3 FC 5C 26", "vdup.32 d21,d22[1]",
+ "0E C5 5B 90", "vdupeq.8 d21,r5",
+ "EE 85 5B B0", "vdup.16 d21,r5",
+ "EE 85 5B 90", "vdup.32 d21,r5",
+ "F3 F5 6C 66", "vdup.8 q11,d22[2]",
+ "F3 FA 6C 66", "vdup.16 q11,d22[2]",
+ "F3 FC 6C 66", "vdup.32 q11,d22[1]",
+ "EE E6 5B 90", "vdup.8 q11,r5",
+ "EE A6 5B B0", "vdup.16 q11,r5",
+ "EE A6 5B 90", "vdup.32 q11,r5",
+ "F3 49 51 BA", "veor d21,d25,d26",
+ "F3 4C 61 FE", "veor q11,q14,q15",
+ "F2 F9 55 AA", "vext.8 d21,d25,d26,#5",
+ "F2 FC 6D EE", "vext.8 q11,q14,q15,#13",
+ "F2 49 50 AA", "vhadd.s8 d21,d25,d26",
+ "F2 59 50 AA", "vhadd.s16 d21,d25,d26",
+ "F2 69 50 AA", "vhadd.s32 d21,d25,d26",
+ "F3 49 50 AA", "vhadd.u8 d21,d25,d26",
+ "F3 59 50 AA", "vhadd.u16 d21,d25,d26",
+ "F3 69 50 AA", "vhadd.u32 d21,d25,d26",
+ "F2 4C 60 EE", "vhadd.s8 q11,q14,q15",
+ "F2 5C 60 EE", "vhadd.s16 q11,q14,q15",
+ "F2 6C 60 EE", "vhadd.s32 q11,q14,q15",
+ "F3 4C 60 EE", "vhadd.u8 q11,q14,q15",
+ "F3 5C 60 EE", "vhadd.u16 q11,q14,q15",
+ "F3 6C 60 EE", "vhadd.u32 q11,q14,q15",
+ "F2 49 52 AA", "vhsub.s8 d21,d25,d26",
+ "F2 59 52 AA", "vhsub.s16 d21,d25,d26",
+ "F2 69 52 AA", "vhsub.s32 d21,d25,d26",
+ "F3 49 52 AA", "vhsub.u8 d21,d25,d26",
+ "F3 59 52 AA", "vhsub.u16 d21,d25,d26",
+ "F3 69 52 AA", "vhsub.u32 d21,d25,d26",
+ "F2 4C 62 EE", "vhsub.s8 q11,q14,q15",
+ "F2 5C 62 EE", "vhsub.s16 q11,q14,q15",
+ "F2 6C 62 EE", "vhsub.s32 q11,q14,q15",
+ "F3 4C 62 EE", "vhsub.u8 q11,q14,q15",
+ "F3 5C 62 EE", "vhsub.u16 q11,q14,q15",
+ "F3 6C 62 EE", "vhsub.u32 q11,q14,q15",
+ "F4 6A B7 0F", "vld1.8 {d27},[r10]",
+ "F4 6A BA 0F", "vld1.8 {d27,d28},[r10]",
+ "F4 6A B6 0F", "vld1.8 {d27,d28,d29},[r10]",
+ "F4 6A B2 0F", "vld1.8 {d27,d28,d29,d30},[r10]",
+ "F4 6A B7 4F", "vld1.16 {d27},[r10]",
+ "F4 6A BA 4F", "vld1.16 {d27,d28},[r10]",
+ "F4 6A B6 4F", "vld1.16 {d27,d28,d29},[r10]",
+ "F4 6A B2 4F", "vld1.16 {d27,d28,d29,d30},[r10]",
+ "F4 6A B7 8F", "vld1.32 {d27},[r10]",
+ "F4 6A BA 8F", "vld1.32 {d27,d28},[r10]",
+ "F4 6A B6 8F", "vld1.32 {d27,d28,d29},[r10]",
+ "F4 6A B2 8F", "vld1.32 {d27,d28,d29,d30},[r10]",
+ "F4 6A B7 CF", "vld1.64 {d27},[r10]",
+ "F4 6A BA CF", "vld1.64 {d27,d28},[r10]",
+ "F4 6A B6 CF", "vld1.64 {d27,d28,d29},[r10]",
+ "F4 6A B2 CF", "vld1.64 {d27,d28,d29,d30},[r10]",
+ "F4 6A B7 1F", "vld1.8 {d27},[r10@64]",
+ "F4 6A BA 1F", "vld1.8 {d27,d28},[r10@64]",
+ "F4 6A BA 2F", "vld1.8 {d27,d28},[r10@128]",
+ "F4 6A B6 1F", "vld1.8 {d27,d28,d29},[r10@64]",
+ "F4 6A B2 1F", "vld1.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B2 2F", "vld1.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B2 3F", "vld1.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B7 5F", "vld1.16 {d27},[r10@64]",
+ "F4 6A BA 5F", "vld1.16 {d27,d28},[r10@64]",
+ "F4 6A BA 6F", "vld1.16 {d27,d28},[r10@128]",
+ "F4 6A B6 5F", "vld1.16 {d27,d28,d29},[r10@64]",
+ "F4 6A B2 5F", "vld1.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B2 6F", "vld1.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B2 7F", "vld1.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B7 9F", "vld1.32 {d27},[r10@64]",
+ "F4 6A BA 9F", "vld1.32 {d27,d28},[r10@64]",
+ "F4 6A BA AF", "vld1.32 {d27,d28},[r10@128]",
+ "F4 6A B6 9F", "vld1.32 {d27,d28,d29},[r10@64]",
+ "F4 6A B2 9F", "vld1.32 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B2 AF", "vld1.32 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B2 BF", "vld1.32 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B7 DF", "vld1.64 {d27},[r10@64]",
+ "F4 6A BA DF", "vld1.64 {d27,d28},[r10@64]",
+ "F4 6A BA EF", "vld1.64 {d27,d28},[r10@128]",
+ "F4 6A B6 DF", "vld1.64 {d27,d28,d29},[r10@64]",
+ "F4 6A B2 DF", "vld1.64 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B2 EF", "vld1.64 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B2 FF", "vld1.64 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B7 0D", "vld1.8 {d27},[r10]!",
+ "F4 6A BA 0D", "vld1.8 {d27,d28},[r10]!",
+ "F4 6A B6 0D", "vld1.8 {d27,d28,d29},[r10]!",
+ "F4 6A B2 0D", "vld1.8 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B7 4D", "vld1.16 {d27},[r10]!",
+ "F4 6A BA 4D", "vld1.16 {d27,d28},[r10]!",
+ "F4 6A B6 4D", "vld1.16 {d27,d28,d29},[r10]!",
+ "F4 6A B2 4D", "vld1.16 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B7 8D", "vld1.32 {d27},[r10]!",
+ "F4 6A BA 8D", "vld1.32 {d27,d28},[r10]!",
+ "F4 6A B6 8D", "vld1.32 {d27,d28,d29},[r10]!",
+ "F4 6A B2 8D", "vld1.32 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B7 CD", "vld1.64 {d27},[r10]!",
+ "F4 6A BA CD", "vld1.64 {d27,d28},[r10]!",
+ "F4 6A B6 CD", "vld1.64 {d27,d28,d29},[r10]!",
+ "F4 6A B2 CD", "vld1.64 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B7 1D", "vld1.8 {d27},[r10@64]!",
+ "F4 6A BA 1D", "vld1.8 {d27,d28},[r10@64]!",
+ "F4 6A BA 2D", "vld1.8 {d27,d28},[r10@128]!",
+ "F4 6A B6 1D", "vld1.8 {d27,d28,d29},[r10@64]!",
+ "F4 6A B2 1D", "vld1.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B2 2D", "vld1.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B2 3D", "vld1.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B7 5D", "vld1.16 {d27},[r10@64]!",
+ "F4 6A BA 5D", "vld1.16 {d27,d28},[r10@64]!",
+ "F4 6A BA 6D", "vld1.16 {d27,d28},[r10@128]!",
+ "F4 6A B6 5D", "vld1.16 {d27,d28,d29},[r10@64]!",
+ "F4 6A B2 5D", "vld1.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B2 6D", "vld1.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B2 7D", "vld1.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B7 9D", "vld1.32 {d27},[r10@64]!",
+ "F4 6A BA 9D", "vld1.32 {d27,d28},[r10@64]!",
+ "F4 6A BA AD", "vld1.32 {d27,d28},[r10@128]!",
+ "F4 6A B6 9D", "vld1.32 {d27,d28,d29},[r10@64]!",
+ "F4 6A B2 9D", "vld1.32 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B2 AD", "vld1.32 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B2 BD", "vld1.32 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B7 DD", "vld1.64 {d27},[r10@64]!",
+ "F4 6A BA DD", "vld1.64 {d27,d28},[r10@64]!",
+ "F4 6A BA ED", "vld1.64 {d27,d28},[r10@128]!",
+ "F4 6A B6 DD", "vld1.64 {d27,d28,d29},[r10@64]!",
+ "F4 6A B2 DD", "vld1.64 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B2 ED", "vld1.64 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B2 FD", "vld1.64 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B7 09", "vld1.8 {d27},[r10],r9",
+ "F4 6A BA 09", "vld1.8 {d27,d28},[r10],r9",
+ "F4 6A B6 09", "vld1.8 {d27,d28,d29},[r10],r9",
+ "F4 6A B2 09", "vld1.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B7 49", "vld1.16 {d27},[r10],r9",
+ "F4 6A BA 49", "vld1.16 {d27,d28},[r10],r9",
+ "F4 6A B6 49", "vld1.16 {d27,d28,d29},[r10],r9",
+ "F4 6A B2 49", "vld1.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B7 89", "vld1.32 {d27},[r10],r9",
+ "F4 6A BA 89", "vld1.32 {d27,d28},[r10],r9",
+ "F4 6A B6 89", "vld1.32 {d27,d28,d29},[r10],r9",
+ "F4 6A B2 89", "vld1.32 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B7 C9", "vld1.64 {d27},[r10],r9",
+ "F4 6A BA C9", "vld1.64 {d27,d28},[r10],r9",
+ "F4 6A B6 C9", "vld1.64 {d27,d28,d29},[r10],r9",
+ "F4 6A B2 C9", "vld1.64 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B7 19", "vld1.8 {d27},[r10@64],r9",
+ "F4 6A BA 19", "vld1.8 {d27,d28},[r10@64],r9",
+ "F4 6A BA 29", "vld1.8 {d27,d28},[r10@128],r9",
+ "F4 6A B6 19", "vld1.8 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B2 19", "vld1.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B2 29", "vld1.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B2 39", "vld1.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A B7 59", "vld1.16 {d27},[r10@64],r9",
+ "F4 6A BA 59", "vld1.16 {d27,d28},[r10@64],r9",
+ "F4 6A BA 69", "vld1.16 {d27,d28},[r10@128],r9",
+ "F4 6A B6 59", "vld1.16 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B2 59", "vld1.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B2 69", "vld1.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B2 79", "vld1.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A B7 99", "vld1.32 {d27},[r10@64],r9",
+ "F4 6A BA 99", "vld1.32 {d27,d28},[r10@64],r9",
+ "F4 6A BA A9", "vld1.32 {d27,d28},[r10@128],r9",
+ "F4 6A B6 99", "vld1.32 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B2 99", "vld1.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B2 A9", "vld1.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B2 B9", "vld1.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A B7 D9", "vld1.64 {d27},[r10@64],r9",
+ "F4 6A BA D9", "vld1.64 {d27,d28},[r10@64],r9",
+ "F4 6A BA E9", "vld1.64 {d27,d28},[r10@128],r9",
+ "F4 6A B6 D9", "vld1.64 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B2 D9", "vld1.64 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B2 E9", "vld1.64 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B2 F9", "vld1.64 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 EA B0 2F", "vld1.8 {d27[1]},[r10]",
+ "F4 EA B4 4F", "vld1.16 {d27[1]},[r10]",
+ "F4 EA B8 8F", "vld1.32 {d27[1]},[r10]",
+ "F4 EA B4 5F", "vld1.16 {d27[1]},[r10@16]",
+ "F4 EA B8 BF", "vld1.32 {d27[1]},[r10@32]",
+ "F4 EA B0 2D", "vld1.8 {d27[1]},[r10]!",
+ "F4 EA B4 4D", "vld1.16 {d27[1]},[r10]!",
+ "F4 EA B8 8D", "vld1.32 {d27[1]},[r10]!",
+ "F4 EA B4 5D", "vld1.16 {d27[1]},[r10@16]!",
+ "F4 EA B8 BD", "vld1.32 {d27[1]},[r10@32]!",
+ "F4 EA B0 29", "vld1.8 {d27[1]},[r10],r9",
+ "F4 EA B4 49", "vld1.16 {d27[1]},[r10],r9",
+ "F4 EA B8 89", "vld1.32 {d27[1]},[r10],r9",
+ "F4 EA B4 59", "vld1.16 {d27[1]},[r10@16],r9",
+ "F4 EA B8 B9", "vld1.32 {d27[1]},[r10@32],r9",
+ "F4 EA BC 0F", "vld1.8 {d27[]},[r10]",
+ "F4 EA BC 2F", "vld1.8 {d27[],d28[]},[r10]",
+ "F4 EA BC 4F", "vld1.16 {d27[]},[r10]",
+ "F4 EA BC 6F", "vld1.16 {d27[],d28[]},[r10]",
+ "F4 EA BC 8F", "vld1.32 {d27[]},[r10]",
+ "F4 EA BC AF", "vld1.32 {d27[],d28[]},[r10]",
+ "F4 EA BC 5F", "vld1.16 {d27[]},[r10@16]",
+ "F4 EA BC 7F", "vld1.16 {d27[],d28[]},[r10@16]",
+ "F4 EA BC 9F", "vld1.32 {d27[]},[r10@32]",
+ "F4 EA BC BF", "vld1.32 {d27[],d28[]},[r10@32]",
+ "F4 EA BC 0D", "vld1.8 {d27[]},[r10]!",
+ "F4 EA BC 2D", "vld1.8 {d27[],d28[]},[r10]!",
+ "F4 EA BC 4D", "vld1.16 {d27[]},[r10]!",
+ "F4 EA BC 6D", "vld1.16 {d27[],d28[]},[r10]!",
+ "F4 EA BC 8D", "vld1.32 {d27[]},[r10]!",
+ "F4 EA BC AD", "vld1.32 {d27[],d28[]},[r10]!",
+ "F4 EA BC 5D", "vld1.16 {d27[]},[r10@16]!",
+ "F4 EA BC 7D", "vld1.16 {d27[],d28[]},[r10@16]!",
+ "F4 EA BC 9D", "vld1.32 {d27[]},[r10@32]!",
+ "F4 EA BC BD", "vld1.32 {d27[],d28[]},[r10@32]!",
+ "F4 EA BC 09", "vld1.8 {d27[]},[r10],r9",
+ "F4 EA BC 29", "vld1.8 {d27[],d28[]},[r10],r9",
+ "F4 EA BC 49", "vld1.16 {d27[]},[r10],r9",
+ "F4 EA BC 69", "vld1.16 {d27[],d28[]},[r10],r9",
+ "F4 EA BC 89", "vld1.32 {d27[]},[r10],r9",
+ "F4 EA BC A9", "vld1.32 {d27[],d28[]},[r10],r9",
+ "F4 EA BC 59", "vld1.16 {d27[]},[r10@16],r9",
+ "F4 EA BC 79", "vld1.16 {d27[],d28[]},[r10@16],r9",
+ "F4 EA BC 99", "vld1.32 {d27[]},[r10@32],r9",
+ "F4 EA BC B9", "vld1.32 {d27[],d28[]},[r10@32],r9",
+ "F4 6A B8 0F", "vld2.8 {d27,d28},[r10]",
+ "F4 6A B9 0F", "vld2.8 {d27,d29},[r10]",
+ "F4 6A B3 0F", "vld2.8 {d27,d28,d29,d30},[r10]",
+ "F4 6A B8 4F", "vld2.16 {d27,d28},[r10]",
+ "F4 6A B9 4F", "vld2.16 {d27,d29},[r10]",
+ "F4 6A B3 4F", "vld2.16 {d27,d28,d29,d30},[r10]",
+ "F4 6A B8 8F", "vld2.32 {d27,d28},[r10]",
+ "F4 6A B9 8F", "vld2.32 {d27,d29},[r10]",
+ "F4 6A B3 8F", "vld2.32 {d27,d28,d29,d30},[r10]",
+ "F4 6A B8 1F", "vld2.8 {d27,d28},[r10@64]",
+ "F4 6A B8 2F", "vld2.8 {d27,d28},[r10@128]",
+ "F4 6A B9 1F", "vld2.8 {d27,d29},[r10@64]",
+ "F4 6A B9 2F", "vld2.8 {d27,d29},[r10@128]",
+ "F4 6A B3 1F", "vld2.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B3 2F", "vld2.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B3 3F", "vld2.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B8 5F", "vld2.16 {d27,d28},[r10@64]",
+ "F4 6A B8 6F", "vld2.16 {d27,d28},[r10@128]",
+ "F4 6A B9 5F", "vld2.16 {d27,d29},[r10@64]",
+ "F4 6A B9 6F", "vld2.16 {d27,d29},[r10@128]",
+ "F4 6A B3 5F", "vld2.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B3 6F", "vld2.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B3 7F", "vld2.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B8 9F", "vld2.32 {d27,d28},[r10@64]",
+ "F4 6A B8 AF", "vld2.32 {d27,d28},[r10@128]",
+ "F4 6A B9 9F", "vld2.32 {d27,d29},[r10@64]",
+ "F4 6A B9 AF", "vld2.32 {d27,d29},[r10@128]",
+ "F4 6A B3 9F", "vld2.32 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B3 AF", "vld2.32 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B3 BF", "vld2.32 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A B8 0D", "vld2.8 {d27,d28},[r10]!",
+ "F4 6A B9 0D", "vld2.8 {d27,d29},[r10]!",
+ "F4 6A B3 0D", "vld2.8 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B8 4D", "vld2.16 {d27,d28},[r10]!",
+ "F4 6A B9 4D", "vld2.16 {d27,d29},[r10]!",
+ "F4 6A B3 4D", "vld2.16 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B8 8D", "vld2.32 {d27,d28},[r10]!",
+ "F4 6A B9 8D", "vld2.32 {d27,d29},[r10]!",
+ "F4 6A B3 8D", "vld2.32 {d27,d28,d29,d30},[r10]!",
+ "F4 6A B8 1D", "vld2.8 {d27,d28},[r10@64]!",
+ "F4 6A B8 2D", "vld2.8 {d27,d28},[r10@128]!",
+ "F4 6A B9 1D", "vld2.8 {d27,d29},[r10@64]!",
+ "F4 6A B9 2D", "vld2.8 {d27,d29},[r10@128]!",
+ "F4 6A B3 1D", "vld2.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B3 2D", "vld2.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B3 3D", "vld2.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B8 5D", "vld2.16 {d27,d28},[r10@64]!",
+ "F4 6A B8 6D", "vld2.16 {d27,d28},[r10@128]!",
+ "F4 6A B9 5D", "vld2.16 {d27,d29},[r10@64]!",
+ "F4 6A B9 6D", "vld2.16 {d27,d29},[r10@128]!",
+ "F4 6A B3 5D", "vld2.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B3 6D", "vld2.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B3 7D", "vld2.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B8 9D", "vld2.32 {d27,d28},[r10@64]!",
+ "F4 6A B8 AD", "vld2.32 {d27,d28},[r10@128]!",
+ "F4 6A B9 9D", "vld2.32 {d27,d29},[r10@64]!",
+ "F4 6A B9 AD", "vld2.32 {d27,d29},[r10@128]!",
+ "F4 6A B3 9D", "vld2.32 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B3 AD", "vld2.32 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B3 BD", "vld2.32 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A B8 09", "vld2.8 {d27,d28},[r10],r9",
+ "F4 6A B9 09", "vld2.8 {d27,d29},[r10],r9",
+ "F4 6A B3 09", "vld2.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B8 49", "vld2.16 {d27,d28},[r10],r9",
+ "F4 6A B9 49", "vld2.16 {d27,d29},[r10],r9",
+ "F4 6A B3 49", "vld2.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B8 89", "vld2.32 {d27,d28},[r10],r9",
+ "F4 6A B9 89", "vld2.32 {d27,d29},[r10],r9",
+ "F4 6A B3 89", "vld2.32 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A B8 19", "vld2.8 {d27,d28},[r10@64],r9",
+ "F4 6A B8 29", "vld2.8 {d27,d28},[r10@128],r9",
+ "F4 6A B9 19", "vld2.8 {d27,d29},[r10@64],r9",
+ "F4 6A B9 29", "vld2.8 {d27,d29},[r10@128],r9",
+ "F4 6A B3 19", "vld2.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B3 29", "vld2.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B3 39", "vld2.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A B8 59", "vld2.16 {d27,d28},[r10@64],r9",
+ "F4 6A B8 69", "vld2.16 {d27,d28},[r10@128],r9",
+ "F4 6A B9 59", "vld2.16 {d27,d29},[r10@64],r9",
+ "F4 6A B9 69", "vld2.16 {d27,d29},[r10@128],r9",
+ "F4 6A B3 59", "vld2.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B3 69", "vld2.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B3 79", "vld2.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A B8 99", "vld2.32 {d27,d28},[r10@64],r9",
+ "F4 6A B8 A9", "vld2.32 {d27,d28},[r10@128],r9",
+ "F4 6A B9 99", "vld2.32 {d27,d29},[r10@64],r9",
+ "F4 6A B9 A9", "vld2.32 {d27,d29},[r10@128],r9",
+ "F4 6A B3 99", "vld2.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B3 A9", "vld2.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B3 B9", "vld2.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 EA B1 2F", "vld2.8 {d27[1],d28[1]},[r10]",
+ "F4 EA B5 4F", "vld2.16 {d27[1],d28[1]},[r10]",
+ "F4 EA B5 6F", "vld2.16 {d27[1],d29[1]},[r10]",
+ "F4 EA B9 8F", "vld2.32 {d27[1],d28[1]},[r10]",
+ "F4 EA B9 CF", "vld2.32 {d27[1],d29[1]},[r10]",
+ "F4 EA B1 3F", "vld2.8 {d27[1],d28[1]},[r10@16]",
+ "F4 EA B5 5F", "vld2.16 {d27[1],d28[1]},[r10@32]",
+ "F4 EA B5 7F", "vld2.16 {d27[1],d29[1]},[r10@32]",
+ "F4 EA B9 9F", "vld2.32 {d27[1],d28[1]},[r10@64]",
+ "F4 EA B9 DF", "vld2.32 {d27[1],d29[1]},[r10@64]",
+ "F4 EA B1 2D", "vld2.8 {d27[1],d28[1]},[r10]!",
+ "F4 EA B5 4D", "vld2.16 {d27[1],d28[1]},[r10]!",
+ "F4 EA B5 6D", "vld2.16 {d27[1],d29[1]},[r10]!",
+ "F4 EA B9 8D", "vld2.32 {d27[1],d28[1]},[r10]!",
+ "F4 EA B9 CD", "vld2.32 {d27[1],d29[1]},[r10]!",
+ "F4 EA B1 3D", "vld2.8 {d27[1],d28[1]},[r10@16]!",
+ "F4 EA B5 5D", "vld2.16 {d27[1],d28[1]},[r10@32]!",
+ "F4 EA B5 7D", "vld2.16 {d27[1],d29[1]},[r10@32]!",
+ "F4 EA B9 9D", "vld2.32 {d27[1],d28[1]},[r10@64]!",
+ "F4 EA B9 DD", "vld2.32 {d27[1],d29[1]},[r10@64]!",
+ "F4 EA B1 29", "vld2.8 {d27[1],d28[1]},[r10],r9",
+ "F4 EA B5 49", "vld2.16 {d27[1],d28[1]},[r10],r9",
+ "F4 EA B5 69", "vld2.16 {d27[1],d29[1]},[r10],r9",
+ "F4 EA B9 89", "vld2.32 {d27[1],d28[1]},[r10],r9",
+ "F4 EA B9 C9", "vld2.32 {d27[1],d29[1]},[r10],r9",
+ "F4 EA B1 39", "vld2.8 {d27[1],d28[1]},[r10@16],r9",
+ "F4 EA B5 59", "vld2.16 {d27[1],d28[1]},[r10@32],r9",
+ "F4 EA B5 79", "vld2.16 {d27[1],d29[1]},[r10@32],r9",
+ "F4 EA B9 99", "vld2.32 {d27[1],d28[1]},[r10@64],r9",
+ "F4 EA B9 D9", "vld2.32 {d27[1],d29[1]},[r10@64],r9",
+ "F4 EA BD 0F", "vld2.8 {d27[],d28[]},[r10]",
+ "F4 EA BD 2F", "vld2.8 {d27[],d29[]},[r10]",
+ "F4 EA BD 4F", "vld2.16 {d27[],d28[]},[r10]",
+ "F4 EA BD 6F", "vld2.16 {d27[],d29[]},[r10]",
+ "F4 EA BD 8F", "vld2.32 {d27[],d28[]},[r10]",
+ "F4 EA BD AF", "vld2.32 {d27[],d29[]},[r10]",
+ "F4 EA BD 1F", "vld2.8 {d27[],d28[]},[r10@16]",
+ "F4 EA BD 3F", "vld2.8 {d27[],d29[]},[r10@16]",
+ "F4 EA BD 5F", "vld2.16 {d27[],d28[]},[r10@32]",
+ "F4 EA BD 7F", "vld2.16 {d27[],d29[]},[r10@32]",
+ "F4 EA BD 9F", "vld2.32 {d27[],d28[]},[r10@64]",
+ "F4 EA BD BF", "vld2.32 {d27[],d29[]},[r10@64]",
+ "F4 EA BD 0D", "vld2.8 {d27[],d28[]},[r10]!",
+ "F4 EA BD 2D", "vld2.8 {d27[],d29[]},[r10]!",
+ "F4 EA BD 4D", "vld2.16 {d27[],d28[]},[r10]!",
+ "F4 EA BD 6D", "vld2.16 {d27[],d29[]},[r10]!",
+ "F4 EA BD 8D", "vld2.32 {d27[],d28[]},[r10]!",
+ "F4 EA BD AD", "vld2.32 {d27[],d29[]},[r10]!",
+ "F4 EA BD 1D", "vld2.8 {d27[],d28[]},[r10@16]!",
+ "F4 EA BD 3D", "vld2.8 {d27[],d29[]},[r10@16]!",
+ "F4 EA BD 5D", "vld2.16 {d27[],d28[]},[r10@32]!",
+ "F4 EA BD 7D", "vld2.16 {d27[],d29[]},[r10@32]!",
+ "F4 EA BD 9D", "vld2.32 {d27[],d28[]},[r10@64]!",
+ "F4 EA BD BD", "vld2.32 {d27[],d29[]},[r10@64]!",
+ "F4 EA BD 09", "vld2.8 {d27[],d28[]},[r10],r9",
+ "F4 EA BD 29", "vld2.8 {d27[],d29[]},[r10],r9",
+ "F4 EA BD 49", "vld2.16 {d27[],d28[]},[r10],r9",
+ "F4 EA BD 69", "vld2.16 {d27[],d29[]},[r10],r9",
+ "F4 EA BD 89", "vld2.32 {d27[],d28[]},[r10],r9",
+ "F4 EA BD A9", "vld2.32 {d27[],d29[]},[r10],r9",
+ "F4 EA BD 19", "vld2.8 {d27[],d28[]},[r10@16],r9",
+ "F4 EA BD 39", "vld2.8 {d27[],d29[]},[r10@16],r9",
+ "F4 EA BD 59", "vld2.16 {d27[],d28[]},[r10@32],r9",
+ "F4 EA BD 79", "vld2.16 {d27[],d29[]},[r10@32],r9",
+ "F4 EA BD 99", "vld2.32 {d27[],d28[]},[r10@64],r9",
+ "F4 EA BD B9", "vld2.32 {d27[],d29[]},[r10@64],r9",
+ "F4 6A B4 0F", "vld3.8 {d27,d28,d29},[r10]",
+ "F4 6A B5 0F", "vld3.8 {d27,d29,d31},[r10]",
+ "F4 6A B4 4F", "vld3.16 {d27,d28,d29},[r10]",
+ "F4 6A B5 4F", "vld3.16 {d27,d29,d31},[r10]",
+ "F4 6A B4 8F", "vld3.32 {d27,d28,d29},[r10]",
+ "F4 6A B5 8F", "vld3.32 {d27,d29,d31},[r10]",
+ "F4 6A B4 1F", "vld3.8 {d27,d28,d29},[r10@64]",
+ "F4 6A B5 1F", "vld3.8 {d27,d29,d31},[r10@64]",
+ "F4 6A B4 5F", "vld3.16 {d27,d28,d29},[r10@64]",
+ "F4 6A B5 5F", "vld3.16 {d27,d29,d31},[r10@64]",
+ "F4 6A B4 9F", "vld3.32 {d27,d28,d29},[r10@64]",
+ "F4 6A B5 9F", "vld3.32 {d27,d29,d31},[r10@64]",
+ "F4 6A B4 0D", "vld3.8 {d27,d28,d29},[r10]!",
+ "F4 6A B5 0D", "vld3.8 {d27,d29,d31},[r10]!",
+ "F4 6A B4 4D", "vld3.16 {d27,d28,d29},[r10]!",
+ "F4 6A B5 4D", "vld3.16 {d27,d29,d31},[r10]!",
+ "F4 6A B4 8D", "vld3.32 {d27,d28,d29},[r10]!",
+ "F4 6A B5 8D", "vld3.32 {d27,d29,d31},[r10]!",
+ "F4 6A B4 1D", "vld3.8 {d27,d28,d29},[r10@64]!",
+ "F4 6A B5 1D", "vld3.8 {d27,d29,d31},[r10@64]!",
+ "F4 6A B4 5D", "vld3.16 {d27,d28,d29},[r10@64]!",
+ "F4 6A B5 5D", "vld3.16 {d27,d29,d31},[r10@64]!",
+ "F4 6A B4 9D", "vld3.32 {d27,d28,d29},[r10@64]!",
+ "F4 6A B5 9D", "vld3.32 {d27,d29,d31},[r10@64]!",
+ "F4 6A B4 09", "vld3.8 {d27,d28,d29},[r10],r9",
+ "F4 6A B5 09", "vld3.8 {d27,d29,d31},[r10],r9",
+ "F4 6A B4 49", "vld3.16 {d27,d28,d29},[r10],r9",
+ "F4 6A B5 49", "vld3.16 {d27,d29,d31},[r10],r9",
+ "F4 6A B4 89", "vld3.32 {d27,d28,d29},[r10],r9",
+ "F4 6A B5 89", "vld3.32 {d27,d29,d31},[r10],r9",
+ "F4 6A B4 19", "vld3.8 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B5 19", "vld3.8 {d27,d29,d31},[r10@64],r9",
+ "F4 6A B4 59", "vld3.16 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B5 59", "vld3.16 {d27,d29,d31},[r10@64],r9",
+ "F4 6A B4 99", "vld3.32 {d27,d28,d29},[r10@64],r9",
+ "F4 6A B5 99", "vld3.32 {d27,d29,d31},[r10@64],r9",
+ "F4 EA B2 2F", "vld3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 EA B6 4F", "vld3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 EA B6 6F", "vld3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 EA BA 8F", "vld3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 EA BA CF", "vld3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 EA B2 2D", "vld3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 EA B6 4D", "vld3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 EA B6 6D", "vld3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 EA BA 8D", "vld3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 EA BA CD", "vld3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 EA B2 29", "vld3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 EA B6 49", "vld3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 EA B6 69", "vld3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 EA BA 89", "vld3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 EA BA C9", "vld3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 EA BE 0F", "vld3.8 {d27[],d28[],d29[]},[r10]",
+ "F4 EA BE 2F", "vld3.8 {d27[],d29[],d31[]},[r10]",
+ "F4 EA BE 4F", "vld3.16 {d27[],d28[],d29[]},[r10]",
+ "F4 EA BE 6F", "vld3.16 {d27[],d29[],d31[]},[r10]",
+ "F4 EA BE 8F", "vld3.32 {d27[],d28[],d29[]},[r10]",
+ "F4 EA BE AF", "vld3.32 {d27[],d29[],d31[]},[r10]",
+ "F4 EA BE 0D", "vld3.8 {d27[],d28[],d29[]},[r10]!",
+ "F4 EA BE 2D", "vld3.8 {d27[],d29[],d31[]},[r10]!",
+ "F4 EA BE 4D", "vld3.16 {d27[],d28[],d29[]},[r10]!",
+ "F4 EA BE 6D", "vld3.16 {d27[],d29[],d31[]},[r10]!",
+ "F4 EA BE 8D", "vld3.32 {d27[],d28[],d29[]},[r10]!",
+ "F4 EA BE AD", "vld3.32 {d27[],d29[],d31[]},[r10]!",
+ "F4 EA BE 09", "vld3.8 {d27[],d28[],d29[]},[r10],r9",
+ "F4 EA BE 29", "vld3.8 {d27[],d29[],d31[]},[r10],r9",
+ "F4 EA BE 49", "vld3.16 {d27[],d28[],d29[]},[r10],r9",
+ "F4 EA BE 69", "vld3.16 {d27[],d29[],d31[]},[r10],r9",
+ "F4 EA BE 89", "vld3.32 {d27[],d28[],d29[]},[r10],r9",
+ "F4 EA BE A9", "vld3.32 {d27[],d29[],d31[]},[r10],r9",
+ "F4 6A B0 0F", "vld4.8 {d27,d28,d29,d30},[r10]",
+ "F4 6A 91 0F", "vld4.8 {d25,d27,d29,d31},[r10]",
+ "F4 6A B0 4F", "vld4.16 {d27,d28,d29,d30},[r10]",
+ "F4 6A 91 4F", "vld4.16 {d25,d27,d29,d31},[r10]",
+ "F4 6A B0 8F", "vld4.32 {d27,d28,d29,d30},[r10]",
+ "F4 6A 91 8F", "vld4.32 {d25,d27,d29,d31},[r10]",
+ "F4 6A B0 1F", "vld4.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B0 2F", "vld4.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B0 3F", "vld4.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A 91 1F", "vld4.8 {d25,d27,d29,d31},[r10@64]",
+ "F4 6A 91 2F", "vld4.8 {d25,d27,d29,d31},[r10@128]",
+ "F4 6A 91 3F", "vld4.8 {d25,d27,d29,d31},[r10@256]",
+ "F4 6A B0 5F", "vld4.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B0 6F", "vld4.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B0 7F", "vld4.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A 91 5F", "vld4.16 {d25,d27,d29,d31},[r10@64]",
+ "F4 6A 91 6F", "vld4.16 {d25,d27,d29,d31},[r10@128]",
+ "F4 6A 91 7F", "vld4.16 {d25,d27,d29,d31},[r10@256]",
+ "F4 6A B0 9F", "vld4.32 {d27,d28,d29,d30},[r10@64]",
+ "F4 6A B0 AF", "vld4.32 {d27,d28,d29,d30},[r10@128]",
+ "F4 6A B0 BF", "vld4.32 {d27,d28,d29,d30},[r10@256]",
+ "F4 6A 91 9F", "vld4.32 {d25,d27,d29,d31},[r10@64]",
+ "F4 6A 91 AF", "vld4.32 {d25,d27,d29,d31},[r10@128]",
+ "F4 6A 91 BF", "vld4.32 {d25,d27,d29,d31},[r10@256]",
+ "F4 6A B0 0D", "vld4.8 {d27,d28,d29,d30},[r10]!",
+ "F4 6A 91 0D", "vld4.8 {d25,d27,d29,d31},[r10]!",
+ "F4 6A B0 4D", "vld4.16 {d27,d28,d29,d30},[r10]!",
+ "F4 6A 91 4D", "vld4.16 {d25,d27,d29,d31},[r10]!",
+ "F4 6A B0 8D", "vld4.32 {d27,d28,d29,d30},[r10]!",
+ "F4 6A 91 8D", "vld4.32 {d25,d27,d29,d31},[r10]!",
+ "F4 6A B0 1D", "vld4.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B0 2D", "vld4.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B0 3D", "vld4.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A 91 1D", "vld4.8 {d25,d27,d29,d31},[r10@64]!",
+ "F4 6A 91 2D", "vld4.8 {d25,d27,d29,d31},[r10@128]!",
+ "F4 6A 91 3D", "vld4.8 {d25,d27,d29,d31},[r10@256]!",
+ "F4 6A B0 5D", "vld4.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B0 6D", "vld4.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B0 7D", "vld4.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A 91 5D", "vld4.16 {d25,d27,d29,d31},[r10@64]!",
+ "F4 6A 91 6D", "vld4.16 {d25,d27,d29,d31},[r10@128]!",
+ "F4 6A 91 7D", "vld4.16 {d25,d27,d29,d31},[r10@256]!",
+ "F4 6A B0 9D", "vld4.32 {d27,d28,d29,d30},[r10@64]!",
+ "F4 6A B0 AD", "vld4.32 {d27,d28,d29,d30},[r10@128]!",
+ "F4 6A B0 BD", "vld4.32 {d27,d28,d29,d30},[r10@256]!",
+ "F4 6A 91 9D", "vld4.32 {d25,d27,d29,d31},[r10@64]!",
+ "F4 6A 91 AD", "vld4.32 {d25,d27,d29,d31},[r10@128]!",
+ "F4 6A 91 BD", "vld4.32 {d25,d27,d29,d31},[r10@256]!",
+ "F4 6A B0 09", "vld4.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A 91 09", "vld4.8 {d25,d27,d29,d31},[r10],r9",
+ "F4 6A B0 49", "vld4.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A 91 49", "vld4.16 {d25,d27,d29,d31},[r10],r9",
+ "F4 6A B0 89", "vld4.32 {d27,d28,d29,d30},[r10],r9",
+ "F4 6A 91 89", "vld4.32 {d25,d27,d29,d31},[r10],r9",
+ "F4 6A B0 19", "vld4.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B0 29", "vld4.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B0 39", "vld4.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A 91 19", "vld4.8 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 6A 91 29", "vld4.8 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 6A 91 39", "vld4.8 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 6A B0 59", "vld4.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B0 69", "vld4.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B0 79", "vld4.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A 91 59", "vld4.16 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 6A 91 69", "vld4.16 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 6A 91 79", "vld4.16 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 6A B0 99", "vld4.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 6A B0 A9", "vld4.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 6A B0 B9", "vld4.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 6A 91 99", "vld4.32 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 6A 91 A9", "vld4.32 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 6A 91 B9", "vld4.32 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 EA B3 2F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 EA B7 4F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 EA 97 6F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F4 EA BB 8F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 EA 9B CF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F4 EA B3 3F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
+ "F4 EA B7 5F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F4 EA 97 7F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F4 EA BB 9F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F4 EA BB AF", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
+ "F4 EA 9B DF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F4 EA 9B EF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
+ "F4 EA B3 2D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 EA B7 4D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 EA 97 6D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F4 EA BB 8D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 EA 9B CD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F4 EA B3 3D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
+ "F4 EA B7 5D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F4 EA 97 7D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F4 EA BB 9D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F4 EA BB AD", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
+ "F4 EA 9B DD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F4 EA 9B ED", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
+ "F4 EA B3 29", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 EA B7 49", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 EA 97 69", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 EA BB 89", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 EA 9B C9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 EA B3 39", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
+ "F4 EA B7 59", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F4 EA 97 79", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F4 EA BB 99", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F4 EA BB A9", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
+ "F4 EA 9B D9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F4 EA 9B E9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
+ "F4 EA BF 0F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]",
+ "F4 EA 9F 2F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]",
+ "F4 EA BF 4F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]",
+ "F4 EA 9F 6F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]",
+ "F4 EA BF 8F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]",
+ "F4 EA 9F AF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]",
+ "F4 EA BF 1F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]",
+ "F4 EA 9F 3F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]",
+ "F4 EA BF 5F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]",
+ "F4 EA 9F 7F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]",
+ "F4 EA BF 9F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]",
+ "F4 EA BF DF", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]",
+ "F4 EA 9F BF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]",
+ "F4 EA 9F FF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]",
+ "F4 EA BF 0D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F4 EA 9F 2D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F4 EA BF 4D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F4 EA 9F 6D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F4 EA BF 8D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F4 EA 9F AD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F4 EA BF 1D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]!",
+ "F4 EA 9F 3D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]!",
+ "F4 EA BF 5D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]!",
+ "F4 EA 9F 7D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]!",
+ "F4 EA BF 9D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]!",
+ "F4 EA BF DD", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]!",
+ "F4 EA 9F BD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]!",
+ "F4 EA 9F FD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]!",
+ "F4 EA BF 09", "vld4.8 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F4 EA 9F 29", "vld4.8 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F4 EA BF 49", "vld4.16 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F4 EA 9F 69", "vld4.16 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F4 EA BF 89", "vld4.32 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F4 EA 9F A9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F4 EA BF 19", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32],r9",
+ "F4 EA 9F 39", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32],r9",
+ "F4 EA BF 59", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64],r9",
+ "F4 EA 9F 79", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64],r9",
+ "F4 EA BF 99", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64],r9",
+ "F4 EA BF D9", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128],r9",
+ "F4 EA 9F B9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64],r9",
+ "F4 EA 9F F9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128],r9",
+ "0C BA AA 03", "vldmiaeq r10!,{s20-s22}",
+ "ED 3A AA 03", "vldmdb r10!,{s20-s22}",
+ "EC FA 4B 06", "vldmia r10!,{d20-d22}",
+ "ED 7A 4B 06", "vldmdb r10!,{d20-d22}",
+ "EC 9A AA 03", "vldmia r10,{s20-s22}",
+ "0C DA 4B 06", "vldmiaeq r10,{d20-d22}",
+ "0D 5F 5B 21", "vldreq.64 d21,[pc,#-0x84]",
+ "ED DF 5B 21", "vldr.64 d21,[pc,#0x84]",
+ "ED DA 5B 00", "vldr.64 d21,[r10]",
+ "ED 5A 5B 21", "vldr.64 d21,[r10,#-0x84]",
+ "ED DA 5B 00", "vldr.64 d21,[r10]",
+ "ED DA 5B 21", "vldr.64 d21,[r10,#0x84]",
+ "0D 5F AA 21", "vldreq.32 s21,[pc,#-0x84]",
+ "ED DF AA 21", "vldr.32 s21,[pc,#0x84]",
+ "ED DA AA 00", "vldr.32 s21,[r10]",
+ "ED 5A AA 21", "vldr.32 s21,[r10,#-0x84]",
+ "ED DA AA 00", "vldr.32 s21,[r10]",
+ "ED DA AA 21", "vldr.32 s21,[r10,#0x84]",
+ "F2 49 56 AA", "vmax.s8 d21,d25,d26",
+ "F2 59 56 AA", "vmax.s16 d21,d25,d26",
+ "F2 69 56 AA", "vmax.s32 d21,d25,d26",
+ "F3 49 56 AA", "vmax.u8 d21,d25,d26",
+ "F3 59 56 AA", "vmax.u16 d21,d25,d26",
+ "F3 69 56 AA", "vmax.u32 d21,d25,d26",
+ "F2 4C 66 EE", "vmax.s8 q11,q14,q15",
+ "F2 5C 66 EE", "vmax.s16 q11,q14,q15",
+ "F2 6C 66 EE", "vmax.s32 q11,q14,q15",
+ "F3 4C 66 EE", "vmax.u8 q11,q14,q15",
+ "F3 5C 66 EE", "vmax.u16 q11,q14,q15",
+ "F3 6C 66 EE", "vmax.u32 q11,q14,q15",
+ "F2 49 5F AA", "vmax.f32 d21,d25,d26",
+ "F2 4C 6F EE", "vmax.f32 q11,q14,q15",
+ "F2 49 56 BA", "vmin.s8 d21,d25,d26",
+ "F2 59 56 BA", "vmin.s16 d21,d25,d26",
+ "F2 69 56 BA", "vmin.s32 d21,d25,d26",
+ "F3 49 56 BA", "vmin.u8 d21,d25,d26",
+ "F3 59 56 BA", "vmin.u16 d21,d25,d26",
+ "F3 69 56 BA", "vmin.u32 d21,d25,d26",
+ "F2 4C 66 FE", "vmin.s8 q11,q14,q15",
+ "F2 5C 66 FE", "vmin.s16 q11,q14,q15",
+ "F2 6C 66 FE", "vmin.s32 q11,q14,q15",
+ "F3 4C 66 FE", "vmin.u8 q11,q14,q15",
+ "F3 5C 66 FE", "vmin.u16 q11,q14,q15",
+ "F3 6C 66 FE", "vmin.u32 q11,q14,q15",
+ "F2 69 5F AA", "vmin.f32 d21,d25,d26",
+ "F2 6C 6F EE", "vmin.f32 q11,q14,q15",
+ "F2 D9 50 CF", "vmla.i16 d21,d25,d7[1]",
+ "F2 E9 50 EF", "vmla.i32 d21,d25,d15[1]",
+ "F2 E9 51 EF", "vmla.f32 d21,d25,d15[1]",
+ "F2 49 59 AA", "vmla.i8 d21,d25,d26",
+ "F2 59 59 AA", "vmla.i16 d21,d25,d26",
+ "F2 69 59 AA", "vmla.i32 d21,d25,d26",
+ "F3 DC 60 CF", "vmla.i16 q11,q14,d7[1]",
+ "F3 EC 60 EF", "vmla.i32 q11,q14,d15[1]",
+ "F2 4C 69 EE", "vmla.i8 q11,q14,q15",
+ "F2 5C 69 EE", "vmla.i16 q11,q14,q15",
+ "F2 6C 69 EE", "vmla.i32 q11,q14,q15",
+ "F2 49 5D BA", "vmla.f32 d21,d25,d26",
+ "F2 4C 6D FE", "vmla.f32 q11,q14,q15",
+ "EE 4C AA 8D", "vmla.f32 s21,s25,s26",
+ "0E 49 5B AA", "vmlaeq.f64 d21,d25,d26",
+ "F2 D9 62 CF", "vmlal.s16 q11,d25,d7[1]",
+ "F2 E9 62 EF", "vmlal.s32 q11,d25,d15[1]",
+ "F3 D9 62 CF", "vmlal.u16 q11,d25,d7[1]",
+ "F3 E9 62 EF", "vmlal.u32 q11,d25,d15[1]",
+ "F2 C9 68 AA", "vmlal.s8 q11,d25,d26",
+ "F2 D9 68 AA", "vmlal.s16 q11,d25,d26",
+ "F2 E9 68 AA", "vmlal.s32 q11,d25,d26",
+ "F3 C9 68 AA", "vmlal.u8 q11,d25,d26",
+ "F3 D9 68 AA", "vmlal.u16 q11,d25,d26",
+ "F3 E9 68 AA", "vmlal.u32 q11,d25,d26",
+ "F2 D9 54 CF", "vmls.i16 d21,d25,d7[1]",
+ "F2 E9 54 EF", "vmls.i32 d21,d25,d15[1]",
+ "F2 E9 55 EF", "vmls.f32 d21,d25,d15[1]",
+ "F3 49 59 AA", "vmls.i8 d21,d25,d26",
+ "F3 59 59 AA", "vmls.i16 d21,d25,d26",
+ "F3 69 59 AA", "vmls.i32 d21,d25,d26",
+ "F3 DC 64 CF", "vmls.i16 q11,q14,d7[1]",
+ "F3 EC 64 EF", "vmls.i32 q11,q14,d15[1]",
+ "F3 EC 65 EF", "vmls.f32 q11,q14,d15[1]",
+ "F3 4C 69 EE", "vmls.i8 q11,q14,q15",
+ "F3 5C 69 EE", "vmls.i16 q11,q14,q15",
+ "F3 6C 69 EE", "vmls.i32 q11,q14,q15",
+ "F2 69 5D BA", "vmls.f32 d21,d25,d26",
+ "F2 6C 6D FE", "vmls.f32 q11,q14,q15",
+ "EE 4C AA CD", "vmls.f32 s21,s25,s26",
+ "EE 49 5B EA", "vmls.f64 d21,d25,d26",
+ "F2 D9 66 CF", "vmlsl.s16 q11,d25,d7[1]",
+ "F2 E9 66 EF", "vmlsl.s32 q11,d25,d15[1]",
+ "F3 D9 66 CF", "vmlsl.u16 q11,d25,d7[1]",
+ "F3 E9 66 EF", "vmlsl.u32 q11,d25,d15[1]",
+ "F2 C9 6A AA", "vmlsl.s8 q11,d25,d26",
+ "F2 D9 6A AA", "vmlsl.s16 q11,d25,d26",
+ "F2 E9 6A AA", "vmlsl.s32 q11,d25,d26",
+ "F3 C9 6A AA", "vmlsl.u8 q11,d25,d26",
+ "F3 D9 6A AA", "vmlsl.u16 q11,d25,d26",
+ "F3 E9 6A AA", "vmlsl.u32 q11,d25,d26",
+ "F2 6A 51 BA", "vmov d21,d26",
+ "F2 6E 61 FE", "vmov q11,q15",
+ "0C 46 5B 3A", "vmoveq d26,r5,r6",
+ "EC 56 5B 3A", "vmov r5,r6,d26",
+ "0C 56 5A 1D", "vmoveq r5,r6,s26,s27",
+ "0E 1C 5A 90", "vmoveq r5,s25",
+ "EE 0C 5A 90", "vmov s25,r5",
+ "EE 0C 5A 90", "vmov s25,r5",
+ "EC 46 5A 1D", "vmov s26,s27,r5,r6",
+ "F3 C0 5E 19", "vmov.i8 d21,#0x89",
+ "F3 C0 58 19", "vmov.i16 d21,#0x89",
+ "F3 C0 50 19", "vmov.i32 d21,#0x89",
+ "F2 C0 5E 30", "vmov.i64 d21,#0x0",
+ "F3 C0 6E 59", "vmov.i8 q11,#0x89",
+ "F3 C0 68 59", "vmov.i16 q11,#0x89",
+ "F3 C0 60 59", "vmov.i32 q11,#0x89",
+ "F2 C0 6E 70", "vmov.i64 q11,#0x0",
+ "0E 5B 5B B0", "vmoveq.s8 r5,d27[1]",
+ "EE 1B 5B F0", "vmov.s16 r5,d27[1]",
+ "EE DB 5B B0", "vmov.u8 r5,d27[1]",
+ "EE 9B 5B F0", "vmov.u16 r5,d27[1]",
+ "EE 3B 5B 90", "vmov.32 r5,d27[1]",
+ "0E 4B 5B B0", "vmoveq.8 d27[1],r5",
+ "EE 0B 5B F0", "vmov.16 d27[1],r5",
+ "EE 2B 5B 90", "vmov.32 d27[1],r5",
+ "EE B7 BA 00", "vmov.f32 s22,#0x70", // originally "vmov.f32 s22,#1.0"
+ "EE F0 AA 4D", "vmov.f32 s21,s26",
+ "0E F7 6B 00", "vmoveq.f64 d22,#0x70", // originally "vmov.f64 d22,#1.0"
+ "0E F0 5B 6A", "vmoveq.f64 d21,d26",
+ "F2 C8 6A 3A", "vmovl.s8 q11,d26",
+ "F2 D0 6A 3A", "vmovl.s16 q11,d26",
+ "F2 E0 6A 3A", "vmovl.s32 q11,d26",
+ "F3 C8 6A 3A", "vmovl.u8 q11,d26",
+ "F3 D0 6A 3A", "vmovl.u16 q11,d26",
+ "F3 E0 6A 3A", "vmovl.u32 q11,d26",
+ "F3 F2 52 2E", "vmovn.i16 d21,q15",
+ "F3 F6 52 2E", "vmovn.i32 d21,q15",
+ "F3 FA 52 2E", "vmovn.i64 d21,q15",
+ "0E F0 5A 10", "vmrseq r5,fpsid",
+ "0E F1 5A 10", "vmrseq r5,fpscr",
+ "EE F6 5A 10", "vmrs r5,mvfr1",
+ "EE F7 5A 10", "vmrs r5,mvfr0",
+ "EE F8 5A 10", "vmrs r5,fpexc",
+ "EE F9 5A 10", "vmrs r5,fpinst",
+ "EE FA 5A 10", "vmrs r5,fpinst2",
+ "0E E0 5A 10", "vmsreq fpsid,r5",
+ "0E E1 5A 10", "vmsreq fpscr,r5",
+ "EE E8 5A 10", "vmsr fpexc,r5",
+ "EE E9 5A 10", "vmsr fpinst,r5",
+ "EE EA 5A 10", "vmsr fpinst2,r5",
+ "F2 D9 58 CF", "vmul.i16 d21,d25,d7[1]",
+ "F2 E9 58 EF", "vmul.i32 d21,d25,d15[1]",
+ "F2 E9 59 EF", "vmul.f32 d21,d25,d15[1]",
+ "F2 49 59 BA", "vmul.i8 d21,d25,d26",
+ "F2 49 59 BA", "vmul.i8 d21,d25,d26",
+ "F2 59 59 BA", "vmul.i16 d21,d25,d26",
+ "F2 69 59 BA", "vmul.i32 d21,d25,d26",
+ "F3 49 59 BA", "vmul.p8 d21,d25,d26",
+ "F3 DC 68 CF", "vmul.i16 q11,q14,d7[1]",
+ "F3 EC 68 EF", "vmul.i32 q11,q14,d15[1]",
+ "F3 EC 69 EF", "vmul.f32 q11,q14,d15[1]",
+ "F2 4C 69 FE", "vmul.i8 q11,q14,q15",
+ "F2 5C 69 FE", "vmul.i16 q11,q14,q15",
+ "F2 6C 69 FE", "vmul.i32 q11,q14,q15",
+ "F3 4C 69 FE", "vmul.p8 q11,q14,q15",
+ "F3 49 5D BA", "vmul.f32 d21,d25,d26",
+ "F3 4C 6D FE", "vmul.f32 q11,q14,q15",
+ "EE 6C AA 8D", "vmul.f32 s21,s25,s26",
+ "0E 69 5B AA", "vmuleq.f64 d21,d25,d26",
+ "F2 D9 6A CF", "vmull.s16 q11,d25,d7[1]",
+ "F2 E9 6A EF", "vmull.s32 q11,d25,d15[1]",
+ "F3 D9 6A CF", "vmull.u16 q11,d25,d7[1]",
+ "F3 E9 6A EF", "vmull.u32 q11,d25,d15[1]",
+ "F2 C9 6C AA", "vmull.s8 q11,d25,d26",
+ "F2 D9 6C AA", "vmull.s16 q11,d25,d26",
+ "F2 E9 6C AA", "vmull.s32 q11,d25,d26",
+ "F3 C9 6C AA", "vmull.u8 q11,d25,d26",
+ "F3 D9 6C AA", "vmull.u16 q11,d25,d26",
+ "F3 E9 6C AA", "vmull.u32 q11,d25,d26",
+ "F2 C9 6E AA", "vmull.p8 q11,d25,d26",
+ "F3 F0 55 AA", "vmvn d21,d26",
+ "F3 F0 65 EE", "vmvn q11,q15",
+ "F3 C0 58 37", "vmvn.i16 d21,#0x87",
+ "F3 C0 50 37", "vmvn.i32 d21,#0x87",
+ "F3 C0 68 77", "vmvn.i16 q11,#0x87",
+ "F3 C0 60 77", "vmvn.i32 q11,#0x87",
+ "F3 F1 53 AA", "vneg.s8 d21,d26",
+ "F3 F5 53 AA", "vneg.s16 d21,d26",
+ "F3 F9 53 AA", "vneg.s32 d21,d26",
+ "F3 F9 57 AA", "vneg.f32 d21,d26",
+ "EE F1 5B 6A", "vneg.f64 d21,d26",
+ "F3 F1 63 EE", "vneg.s8 q11,q15",
+ "F3 F5 63 EE", "vneg.s16 q11,q15",
+ "F3 F9 63 EE", "vneg.s32 q11,q15",
+ "F3 F9 67 EE", "vneg.f32 q11,q15",
+ "0E F1 AA 4D", "vnegeq.f32 s21,s26",
+ "0E 5C AA CD", "vnmlaeq.f32 s21,s25,s26",
+ "EE 59 5B EA", "vnmla.f64 d21,d25,d26",
+ "EE 5C AA 8D", "vnmls.f32 s21,s25,s26",
+ "EE 59 5B AA", "vnmls.f64 d21,d25,d26",
+ "0E 6C AA CD", "vnmuleq.f32 s21,s25,s26",
+ "EE 69 5B EA", "vnmul.f64 d21,d25,d26",
+ "F2 79 51 BA", "vorn d21,d25,d26",
+ "F2 7C 61 FE", "vorn q11,q14,q15",
+ "F2 69 51 BA", "vorr d21,d25,d26",
+ "F2 6C 61 FE", "vorr q11,q14,q15",
+ "F3 C0 59 17", "vorr.i16 d21,#0x87",
+ "F3 C0 51 17", "vorr.i32 d21,#0x87",
+ "F3 C0 69 57", "vorr.i16 q11,#0x87",
+ "F3 C0 61 57", "vorr.i32 q11,#0x87",
+ "F3 F0 56 2A", "vpadal.s8 d21,d26",
+ "F3 F4 56 2A", "vpadal.s16 d21,d26",
+ "F3 F8 56 2A", "vpadal.s32 d21,d26",
+ "F3 F0 56 AA", "vpadal.u8 d21,d26",
+ "F3 F4 56 AA", "vpadal.u16 d21,d26",
+ "F3 F8 56 AA", "vpadal.u32 d21,d26",
+ "F3 F0 66 6E", "vpadal.s8 q11,q15",
+ "F3 F4 66 6E", "vpadal.s16 q11,q15",
+ "F3 F8 66 6E", "vpadal.s32 q11,q15",
+ "F3 F0 66 EE", "vpadal.u8 q11,q15",
+ "F3 F4 66 EE", "vpadal.u16 q11,q15",
+ "F3 F8 66 EE", "vpadal.u32 q11,q15",
+ "F2 49 5B BA", "vpadd.i8 d21,d25,d26",
+ "F2 59 5B BA", "vpadd.i16 d21,d25,d26",
+ "F2 69 5B BA", "vpadd.i32 d21,d25,d26",
+ "F3 49 5D AA", "vpadd.f32 d21,d25,d26",
+ "F3 F0 52 2A", "vpaddl.s8 d21,d26",
+ "F3 F4 52 2A", "vpaddl.s16 d21,d26",
+ "F3 F8 52 2A", "vpaddl.s32 d21,d26",
+ "F3 F0 52 AA", "vpaddl.u8 d21,d26",
+ "F3 F4 52 AA", "vpaddl.u16 d21,d26",
+ "F3 F8 52 AA", "vpaddl.u32 d21,d26",
+ "F3 F0 62 6E", "vpaddl.s8 q11,q15",
+ "F3 F4 62 6E", "vpaddl.s16 q11,q15",
+ "F3 F8 62 6E", "vpaddl.s32 q11,q15",
+ "F3 F0 62 EE", "vpaddl.u8 q11,q15",
+ "F3 F4 62 EE", "vpaddl.u16 q11,q15",
+ "F3 F8 62 EE", "vpaddl.u32 q11,q15",
+ "F2 49 5A AA", "vpmax.s8 d21,d25,d26",
+ "F2 59 5A AA", "vpmax.s16 d21,d25,d26",
+ "F2 69 5A AA", "vpmax.s32 d21,d25,d26",
+ "F3 49 5A AA", "vpmax.u8 d21,d25,d26",
+ "F3 59 5A AA", "vpmax.u16 d21,d25,d26",
+ "F3 69 5A AA", "vpmax.u32 d21,d25,d26",
+ "F3 49 5F AA", "vpmax.f32 d21,d25,d26",
+ "F2 49 5A BA", "vpmin.s8 d21,d25,d26",
+ "F2 59 5A BA", "vpmin.s16 d21,d25,d26",
+ "F2 69 5A BA", "vpmin.s32 d21,d25,d26",
+ "F3 49 5A BA", "vpmin.u8 d21,d25,d26",
+ "F3 59 5A BA", "vpmin.u16 d21,d25,d26",
+ "F3 69 5A BA", "vpmin.u32 d21,d25,d26",
+ "F3 69 5F AA", "vpmin.f32 d21,d25,d26",
+ "0C FD DA 02", "vpopeq {s27-s28}",
+ "0C FD BB 04", "vpopeq {d27-d28}",
+ "0D 6D DA 02", "vpusheq {s27-s28}",
+ "0D 6D BB 04", "vpusheq {d27-d28}",
+ "F3 F0 57 2A", "vqabs.s8 d21,d26",
+ "F3 F4 57 2A", "vqabs.s16 d21,d26",
+ "F3 F8 57 2A", "vqabs.s32 d21,d26",
+ "F3 F0 67 6E", "vqabs.s8 q11,q15",
+ "F3 F4 67 6E", "vqabs.s16 q11,q15",
+ "F3 F8 67 6E", "vqabs.s32 q11,q15",
+ "F2 49 50 BA", "vqadd.s8 d21,d25,d26",
+ "F2 59 50 BA", "vqadd.s16 d21,d25,d26",
+ "F2 69 50 BA", "vqadd.s32 d21,d25,d26",
+ "F2 79 50 BA", "vqadd.s64 d21,d25,d26",
+ "F3 49 50 BA", "vqadd.u8 d21,d25,d26",
+ "F3 59 50 BA", "vqadd.u16 d21,d25,d26",
+ "F3 69 50 BA", "vqadd.u32 d21,d25,d26",
+ "F3 79 50 BA", "vqadd.u64 d21,d25,d26",
+ "F2 4C 60 FE", "vqadd.s8 q11,q14,q15",
+ "F2 5C 60 FE", "vqadd.s16 q11,q14,q15",
+ "F2 6C 60 FE", "vqadd.s32 q11,q14,q15",
+ "F2 7C 60 FE", "vqadd.s64 q11,q14,q15",
+ "F3 4C 60 FE", "vqadd.u8 q11,q14,q15",
+ "F3 5C 60 FE", "vqadd.u16 q11,q14,q15",
+ "F3 6C 60 FE", "vqadd.u32 q11,q14,q15",
+ "F3 7C 60 FE", "vqadd.u64 q11,q14,q15",
+ "F2 D9 63 CF", "vqdmlal.s16 q11,d25,d7[1]",
+ "F2 E9 63 EF", "vqdmlal.s32 q11,d25,d15[1]",
+ "F2 D9 69 AA", "vqdmlal.s16 q11,d25,d26",
+ "F2 E9 69 AA", "vqdmlal.s32 q11,d25,d26",
+ "F2 D9 67 CF", "vqdmlsl.s16 q11,d25,d7[1]",
+ "F2 E9 67 EF", "vqdmlsl.s32 q11,d25,d15[1]",
+ "F2 D9 6B AA", "vqdmlsl.s16 q11,d25,d26",
+ "F2 E9 6B AA", "vqdmlsl.s32 q11,d25,d26",
+ "F2 D9 5C CA", "vqdmulh.s16 d21,d25,d2[1]",
+ "F2 E9 5C EF", "vqdmulh.s32 d21,d25,d15[1]",
+ "F2 59 5B AA", "vqdmulh.s16 d21,d25,d26",
+ "F2 69 5B AA", "vqdmulh.s32 d21,d25,d26",
+ "F3 DC 6C CA", "vqdmulh.s16 q11,q14,d2[1]",
+ "F3 EC 6C EF", "vqdmulh.s32 q11,q14,d15[1]",
+ "F2 5C 6B EE", "vqdmulh.s16 q11,q14,q15",
+ "F2 6C 6B EE", "vqdmulh.s32 q11,q14,q15",
+ "F2 D9 6B CA", "vqdmull.s16 q11,d25,d2[1]",
+ "F2 E9 6B EF", "vqdmull.s32 q11,d25,d15[1]",
+ "F2 D9 6D AA", "vqdmull.s16 q11,d25,d26",
+ "F2 E9 6D AA", "vqdmull.s32 q11,d25,d26",
+ "F2 D9 6D AA", "vqdmull.s16 q11,d25,d26",
+ "F2 E9 6D AA", "vqdmull.s32 q11,d25,d26",
+ "F3 F2 52 AE", "vqmovn.s16 d21,q15",
+ "F3 F6 52 AE", "vqmovn.s32 d21,q15",
+ "F3 FA 52 AE", "vqmovn.s64 d21,q15",
+ "F3 F2 52 EE", "vqmovn.u16 d21,q15",
+ "F3 F6 52 EE", "vqmovn.u32 d21,q15",
+ "F3 FA 52 EE", "vqmovn.u64 d21,q15",
+ "F3 F2 52 6E", "vqmovun.s16 d21,q15",
+ "F3 F6 52 6E", "vqmovun.s32 d21,q15",
+ "F3 FA 52 6E", "vqmovun.s64 d21,q15",
+ "F3 F0 57 AA", "vqneg.s8 d21,d26",
+ "F3 F4 57 AA", "vqneg.s16 d21,d26",
+ "F3 F8 57 AA", "vqneg.s32 d21,d26",
+ "F3 F0 67 EE", "vqneg.s8 q11,q15",
+ "F3 F4 67 EE", "vqneg.s16 q11,q15",
+ "F3 F8 67 EE", "vqneg.s32 q11,q15",
+ "F2 D9 5D CF", "vqrdmulh.s16 d21,d25,d7[1]",
+ "F2 E9 5D EF", "vqrdmulh.s32 d21,d25,d15[1]",
+ "F3 59 5B AA", "vqrdmulh.s16 d21,d25,d26",
+ "F3 69 5B AA", "vqrdmulh.s32 d21,d25,d26",
+ "F3 DC 6D CF", "vqrdmulh.s16 q11,q14,d7[1]",
+ "F3 EC 6D EF", "vqrdmulh.s32 q11,q14,d15[1]",
+ "F3 5C 6B EE", "vqrdmulh.s16 q11,q14,q15",
+ "F3 6C 6B EE", "vqrdmulh.s32 q11,q14,q15",
+ "F2 49 55 BA", "vqrshl.s8 d21,d26,d25",
+ "F2 59 55 BA", "vqrshl.s16 d21,d26,d25",
+ "F2 69 55 BA", "vqrshl.s32 d21,d26,d25",
+ "F2 79 55 BA", "vqrshl.s64 d21,d26,d25",
+ "F3 49 55 BA", "vqrshl.u8 d21,d26,d25",
+ "F3 59 55 BA", "vqrshl.u16 d21,d26,d25",
+ "F3 69 55 BA", "vqrshl.u32 d21,d26,d25",
+ "F3 79 55 BA", "vqrshl.u64 d21,d26,d25",
+ "F2 4C 65 FE", "vqrshl.s8 q11,q15,q14",
+ "F2 5C 65 FE", "vqrshl.s16 q11,q15,q14",
+ "F2 6C 65 FE", "vqrshl.s32 q11,q15,q14",
+ "F2 7C 65 FE", "vqrshl.s64 q11,q15,q14",
+ "F3 4C 65 FE", "vqrshl.u8 q11,q15,q14",
+ "F3 5C 65 FE", "vqrshl.u16 q11,q15,q14",
+ "F3 6C 65 FE", "vqrshl.u32 q11,q15,q14",
+ "F3 7C 65 FE", "vqrshl.u64 q11,q15,q14",
+ "F2 CF 59 7E", "vqrshrn.s16 d21,q15,#1",
+ "F3 CF 59 7E", "vqrshrn.u16 d21,q15,#1",
+ "F2 CF 59 7E", "vqrshrn.s16 d21,q15,#1",
+ "F2 C8 59 7E", "vqrshrn.s16 d21,q15,#8",
+ "F3 CF 59 7E", "vqrshrn.u16 d21,q15,#1",
+ "F3 C8 59 7E", "vqrshrn.u16 d21,q15,#8",
+ "F2 DF 59 7E", "vqrshrn.s32 d21,q15,#1",
+ "F2 D0 59 7E", "vqrshrn.s32 d21,q15,#16",
+ "F3 DF 59 7E", "vqrshrn.u32 d21,q15,#1",
+ "F3 D0 59 7E", "vqrshrn.u32 d21,q15,#16",
+ "F2 FF 59 7E", "vqrshrn.s64 d21,q15,#1",
+ "F2 E0 59 7E", "vqrshrn.s64 d21,q15,#32",
+ "F3 FF 59 7E", "vqrshrn.u64 d21,q15,#1",
+ "F3 E0 59 7E", "vqrshrn.u64 d21,q15,#32",
+ "F3 CF 58 7E", "vqrshrun.s16 d21,q15,#1",
+ "F3 C8 58 7E", "vqrshrun.s16 d21,q15,#8",
+ "F3 DF 58 7E", "vqrshrun.s32 d21,q15,#1",
+ "F3 D0 58 7E", "vqrshrun.s32 d21,q15,#16",
+ "F3 FF 58 7E", "vqrshrun.s64 d21,q15,#1",
+ "F3 E0 58 7E", "vqrshrun.s64 d21,q15,#32",
+ "F2 C8 57 3A", "vqshl.s8 d21,d26,#0",
+ "F2 CF 57 3A", "vqshl.s8 d21,d26,#7",
+ "F3 C8 57 3A", "vqshl.u8 d21,d26,#0",
+ "F3 CF 57 3A", "vqshl.u8 d21,d26,#7",
+ "F2 D0 57 3A", "vqshl.s16 d21,d26,#0",
+ "F2 DF 57 3A", "vqshl.s16 d21,d26,#15",
+ "F3 D0 57 3A", "vqshl.u16 d21,d26,#0",
+ "F3 DF 57 3A", "vqshl.u16 d21,d26,#15",
+ "F2 E0 57 3A", "vqshl.s32 d21,d26,#0",
+ "F2 FF 57 3A", "vqshl.s32 d21,d26,#31",
+ "F3 E0 57 3A", "vqshl.u32 d21,d26,#0",
+ "F3 FF 57 3A", "vqshl.u32 d21,d26,#31",
+ "F2 C0 57 BA", "vqshl.s64 d21,d26,#0",
+ "F2 FF 57 BA", "vqshl.s64 d21,d26,#63",
+ "F3 C0 57 BA", "vqshl.u64 d21,d26,#0",
+ "F3 FF 57 BA", "vqshl.u64 d21,d26,#63",
+ "F2 49 54 BA", "vqshl.s8 d21,d26,d25",
+ "F2 59 54 BA", "vqshl.s16 d21,d26,d25",
+ "F2 69 54 BA", "vqshl.s32 d21,d26,d25",
+ "F2 79 54 BA", "vqshl.s64 d21,d26,d25",
+ "F3 49 54 BA", "vqshl.u8 d21,d26,d25",
+ "F3 59 54 BA", "vqshl.u16 d21,d26,d25",
+ "F3 69 54 BA", "vqshl.u32 d21,d26,d25",
+ "F3 79 54 BA", "vqshl.u64 d21,d26,d25",
+ "F2 C8 67 7E", "vqshl.s8 q11,q15,#0",
+ "F2 CF 67 7E", "vqshl.s8 q11,q15,#7",
+ "F3 C8 67 7E", "vqshl.u8 q11,q15,#0",
+ "F3 CF 67 7E", "vqshl.u8 q11,q15,#7",
+ "F2 D0 67 7E", "vqshl.s16 q11,q15,#0",
+ "F2 DF 67 7E", "vqshl.s16 q11,q15,#15",
+ "F3 D0 67 7E", "vqshl.u16 q11,q15,#0",
+ "F3 DF 67 7E", "vqshl.u16 q11,q15,#15",
+ "F2 E0 67 7E", "vqshl.s32 q11,q15,#0",
+ "F2 FF 67 7E", "vqshl.s32 q11,q15,#31",
+ "F3 E0 67 7E", "vqshl.u32 q11,q15,#0",
+ "F3 FF 67 7E", "vqshl.u32 q11,q15,#31",
+ "F2 C0 67 FE", "vqshl.s64 q11,q15,#0",
+ "F2 FF 67 FE", "vqshl.s64 q11,q15,#63",
+ "F3 C0 67 FE", "vqshl.u64 q11,q15,#0",
+ "F3 FF 67 FE", "vqshl.u64 q11,q15,#63",
+ "F2 4C 64 FE", "vqshl.s8 q11,q15,q14",
+ "F2 5C 64 FE", "vqshl.s16 q11,q15,q14",
+ "F2 6C 64 FE", "vqshl.s32 q11,q15,q14",
+ "F2 7C 64 FE", "vqshl.s64 q11,q15,q14",
+ "F3 4C 64 FE", "vqshl.u8 q11,q15,q14",
+ "F3 5C 64 FE", "vqshl.u16 q11,q15,q14",
+ "F3 6C 64 FE", "vqshl.u32 q11,q15,q14",
+ "F3 7C 64 FE", "vqshl.u64 q11,q15,q14",
+ "F3 C8 56 3A", "vqshlu.s8 d21,d26,#0",
+ "F3 CF 56 3A", "vqshlu.s8 d21,d26,#7",
+ "F3 D0 56 3A", "vqshlu.s16 d21,d26,#0",
+ "F3 DF 56 3A", "vqshlu.s16 d21,d26,#15",
+ "F3 E0 56 3A", "vqshlu.s32 d21,d26,#0",
+ "F3 FF 56 3A", "vqshlu.s32 d21,d26,#31",
+ "F3 C0 56 BA", "vqshlu.s64 d21,d26,#0",
+ "F3 FF 56 BA", "vqshlu.s64 d21,d26,#63",
+ "F3 C8 66 7E", "vqshlu.s8 q11,q15,#0",
+ "F3 CF 66 7E", "vqshlu.s8 q11,q15,#7",
+ "F3 D0 66 7E", "vqshlu.s16 q11,q15,#0",
+ "F3 DF 66 7E", "vqshlu.s16 q11,q15,#15",
+ "F3 E0 66 7E", "vqshlu.s32 q11,q15,#0",
+ "F3 FF 66 7E", "vqshlu.s32 q11,q15,#31",
+ "F3 C0 66 FE", "vqshlu.s64 q11,q15,#0",
+ "F3 FF 66 FE", "vqshlu.s64 q11,q15,#63",
+ "F2 CF 59 3E", "vqshrn.s16 d21,q15,#1",
+ "F2 C8 59 3E", "vqshrn.s16 d21,q15,#8",
+ "F3 CF 59 3E", "vqshrn.u16 d21,q15,#1",
+ "F3 C8 59 3E", "vqshrn.u16 d21,q15,#8",
+ "F2 DF 59 3E", "vqshrn.s32 d21,q15,#1",
+ "F2 D0 59 3E", "vqshrn.s32 d21,q15,#16",
+ "F3 DF 59 3E", "vqshrn.u32 d21,q15,#1",
+ "F3 D0 59 3E", "vqshrn.u32 d21,q15,#16",
+ "F2 FF 59 3E", "vqshrn.s64 d21,q15,#1",
+ "F2 E0 59 3E", "vqshrn.s64 d21,q15,#32",
+ "F3 FF 59 3E", "vqshrn.u64 d21,q15,#1",
+ "F3 E0 59 3E", "vqshrn.u64 d21,q15,#32",
+ "F3 CF 58 3E", "vqshrun.s16 d21,q15,#1",
+ "F3 C8 58 3E", "vqshrun.s16 d21,q15,#8",
+ "F3 DF 58 3E", "vqshrun.s32 d21,q15,#1",
+ "F3 D0 58 3E", "vqshrun.s32 d21,q15,#16",
+ "F3 FF 58 3E", "vqshrun.s64 d21,q15,#1",
+ "F3 E0 58 3E", "vqshrun.s64 d21,q15,#32",
+ "F2 49 52 BA", "vqsub.s8 d21,d25,d26",
+ "F2 59 52 BA", "vqsub.s16 d21,d25,d26",
+ "F2 69 52 BA", "vqsub.s32 d21,d25,d26",
+ "F2 79 52 BA", "vqsub.s64 d21,d25,d26",
+ "F3 49 52 BA", "vqsub.u8 d21,d25,d26",
+ "F3 59 52 BA", "vqsub.u16 d21,d25,d26",
+ "F3 69 52 BA", "vqsub.u32 d21,d25,d26",
+ "F3 79 52 BA", "vqsub.u64 d21,d25,d26",
+ "F2 4C 62 FE", "vqsub.s8 q11,q14,q15",
+ "F2 5C 62 FE", "vqsub.s16 q11,q14,q15",
+ "F2 6C 62 FE", "vqsub.s32 q11,q14,q15",
+ "F2 7C 62 FE", "vqsub.s64 q11,q14,q15",
+ "F3 4C 62 FE", "vqsub.u8 q11,q14,q15",
+ "F3 5C 62 FE", "vqsub.u16 q11,q14,q15",
+ "F3 6C 62 FE", "vqsub.u32 q11,q14,q15",
+ "F3 7C 62 FE", "vqsub.u64 q11,q14,q15",
+ "F3 CC 54 AE", "vraddhn.i16 d21,q14,q15",
+ "F3 DC 54 AE", "vraddhn.i32 d21,q14,q15",
+ "F3 EC 54 AE", "vraddhn.i64 d21,q14,q15",
+ "F3 FB 54 2A", "vrecpe.u32 d21,d26",
+ "F3 FB 55 2A", "vrecpe.f32 d21,d26",
+ "F3 FB 64 6E", "vrecpe.u32 q11,q15",
+ "F3 FB 65 6E", "vrecpe.f32 q11,q15",
+ "F2 49 5F BA", "vrecps.f32 d21,d25,d26",
+ "F2 4C 6F FE", "vrecps.f32 q11,q14,q15",
+ "F3 F0 51 2A", "vrev16.8 d21,d26",
+ "F3 F0 61 6E", "vrev16.8 q11,q15",
+ "F3 F0 50 AA", "vrev32.8 d21,d26",
+ "F3 F4 50 AA", "vrev32.16 d21,d26",
+ "F3 F0 60 EE", "vrev32.8 q11,q15",
+ "F3 F4 60 EE", "vrev32.16 q11,q15",
+ "F3 F0 50 2A", "vrev64.8 d21,d26",
+ "F3 F4 50 2A", "vrev64.16 d21,d26",
+ "F3 F8 50 2A", "vrev64.32 d21,d26",
+ "F3 F0 60 6E", "vrev64.8 q11,q15",
+ "F3 F4 60 6E", "vrev64.16 q11,q15",
+ "F3 F8 60 6E", "vrev64.32 q11,q15",
+ "F2 49 51 AA", "vrhadd.s8 d21,d25,d26",
+ "F2 59 51 AA", "vrhadd.s16 d21,d25,d26",
+ "F2 69 51 AA", "vrhadd.s32 d21,d25,d26",
+ "F3 49 51 AA", "vrhadd.u8 d21,d25,d26",
+ "F3 59 51 AA", "vrhadd.u16 d21,d25,d26",
+ "F3 69 51 AA", "vrhadd.u32 d21,d25,d26",
+ "F2 4C 61 EE", "vrhadd.s8 q11,q14,q15",
+ "F2 5C 61 EE", "vrhadd.s16 q11,q14,q15",
+ "F2 6C 61 EE", "vrhadd.s32 q11,q14,q15",
+ "F3 4C 61 EE", "vrhadd.u8 q11,q14,q15",
+ "F3 5C 61 EE", "vrhadd.u16 q11,q14,q15",
+ "F3 6C 61 EE", "vrhadd.u32 q11,q14,q15",
+ "F2 49 55 AA", "vrshl.s8 d21,d26,d25",
+ "F2 59 55 AA", "vrshl.s16 d21,d26,d25",
+ "F2 69 55 AA", "vrshl.s32 d21,d26,d25",
+ "F2 79 55 AA", "vrshl.s64 d21,d26,d25",
+ "F3 49 55 AA", "vrshl.u8 d21,d26,d25",
+ "F3 59 55 AA", "vrshl.u16 d21,d26,d25",
+ "F3 69 55 AA", "vrshl.u32 d21,d26,d25",
+ "F3 79 55 AA", "vrshl.u64 d21,d26,d25",
+ "F2 4C 65 EE", "vrshl.s8 q11,q15,q14",
+ "F2 5C 65 EE", "vrshl.s16 q11,q15,q14",
+ "F2 6C 65 EE", "vrshl.s32 q11,q15,q14",
+ "F2 7C 65 EE", "vrshl.s64 q11,q15,q14",
+ "F3 4C 65 EE", "vrshl.u8 q11,q15,q14",
+ "F3 5C 65 EE", "vrshl.u16 q11,q15,q14",
+ "F3 6C 65 EE", "vrshl.u32 q11,q15,q14",
+ "F3 7C 65 EE", "vrshl.u64 q11,q15,q14",
+ "F2 CF 52 3A", "vrshr.s8 d21,d26,#1",
+ "F2 C8 52 3A", "vrshr.s8 d21,d26,#8",
+ "F3 CF 52 3A", "vrshr.u8 d21,d26,#1",
+ "F3 C8 52 3A", "vrshr.u8 d21,d26,#8",
+ "F2 DF 52 3A", "vrshr.s16 d21,d26,#1",
+ "F2 D0 52 3A", "vrshr.s16 d21,d26,#16",
+ "F3 DF 52 3A", "vrshr.u16 d21,d26,#1",
+ "F3 D0 52 3A", "vrshr.u16 d21,d26,#16",
+ "F2 FF 52 3A", "vrshr.s32 d21,d26,#1",
+ "F2 E0 52 3A", "vrshr.s32 d21,d26,#32",
+ "F3 FF 52 3A", "vrshr.u32 d21,d26,#1",
+ "F3 E0 52 3A", "vrshr.u32 d21,d26,#32",
+ "F2 FF 52 BA", "vrshr.s64 d21,d26,#1",
+ "F2 C0 52 BA", "vrshr.s64 d21,d26,#64",
+ "F3 FF 52 BA", "vrshr.u64 d21,d26,#1",
+ "F3 C0 52 BA", "vrshr.u64 d21,d26,#64",
+ "F2 CF 62 7E", "vrshr.s8 q11,q15,#1",
+ "F2 C8 62 7E", "vrshr.s8 q11,q15,#8",
+ "F3 CF 62 7E", "vrshr.u8 q11,q15,#1",
+ "F3 C8 62 7E", "vrshr.u8 q11,q15,#8",
+ "F2 DF 62 7E", "vrshr.s16 q11,q15,#1",
+ "F2 D0 62 7E", "vrshr.s16 q11,q15,#16",
+ "F3 DF 62 7E", "vrshr.u16 q11,q15,#1",
+ "F3 D0 62 7E", "vrshr.u16 q11,q15,#16",
+ "F2 FF 62 7E", "vrshr.s32 q11,q15,#1",
+ "F2 E0 62 7E", "vrshr.s32 q11,q15,#32",
+ "F3 FF 62 7E", "vrshr.u32 q11,q15,#1",
+ "F3 E0 62 7E", "vrshr.u32 q11,q15,#32",
+ "F2 FF 62 FE", "vrshr.s64 q11,q15,#1",
+ "F2 C0 62 FE", "vrshr.s64 q11,q15,#64",
+ "F3 FF 62 FE", "vrshr.u64 q11,q15,#1",
+ "F3 C0 62 FE", "vrshr.u64 q11,q15,#64",
+ "F2 CF 58 7E", "vrshrn.i16 d21,q15,#1",
+ "F2 C8 58 7E", "vrshrn.i16 d21,q15,#8",
+ "F2 DF 58 7E", "vrshrn.i32 d21,q15,#1",
+ "F2 D0 58 7E", "vrshrn.i32 d21,q15,#16",
+ "F2 FF 58 7E", "vrshrn.i64 d21,q15,#1",
+ "F2 E0 58 7E", "vrshrn.i64 d21,q15,#32",
+ "F3 FB 54 AA", "vrsqrte.u32 d21,d26",
+ "F3 FB 55 AA", "vrsqrte.f32 d21,d26",
+ "F3 FB 64 EE", "vrsqrte.u32 q11,q15",
+ "F3 FB 65 EE", "vrsqrte.f32 q11,q15",
+ "F2 69 5F BA", "vrsqrts.f32 d21,d25,d26",
+ "F2 6C 6F FE", "vrsqrts.f32 q11,q14,q15",
+ "F2 CF 53 3A", "vrsra.s8 d21,d26,#1",
+ "F2 C8 53 3A", "vrsra.s8 d21,d26,#8",
+ "F3 CF 53 3A", "vrsra.u8 d21,d26,#1",
+ "F3 C8 53 3A", "vrsra.u8 d21,d26,#8",
+ "F2 DF 53 3A", "vrsra.s16 d21,d26,#1",
+ "F2 D0 53 3A", "vrsra.s16 d21,d26,#16",
+ "F3 DF 53 3A", "vrsra.u16 d21,d26,#1",
+ "F3 D0 53 3A", "vrsra.u16 d21,d26,#16",
+ "F2 FF 53 3A", "vrsra.s32 d21,d26,#1",
+ "F2 E0 53 3A", "vrsra.s32 d21,d26,#32",
+ "F3 FF 53 3A", "vrsra.u32 d21,d26,#1",
+ "F3 E0 53 3A", "vrsra.u32 d21,d26,#32",
+ "F2 FF 53 BA", "vrsra.s64 d21,d26,#1",
+ "F2 C0 53 BA", "vrsra.s64 d21,d26,#64",
+ "F3 FF 53 BA", "vrsra.u64 d21,d26,#1",
+ "F3 C0 53 BA", "vrsra.u64 d21,d26,#64",
+ "F2 CF 63 7E", "vrsra.s8 q11,q15,#1",
+ "F2 C8 63 7E", "vrsra.s8 q11,q15,#8",
+ "F3 CF 63 7E", "vrsra.u8 q11,q15,#1",
+ "F3 C8 63 7E", "vrsra.u8 q11,q15,#8",
+ "F2 DF 63 7E", "vrsra.s16 q11,q15,#1",
+ "F2 D0 63 7E", "vrsra.s16 q11,q15,#16",
+ "F3 DF 63 7E", "vrsra.u16 q11,q15,#1",
+ "F3 D0 63 7E", "vrsra.u16 q11,q15,#16",
+ "F2 FF 63 7E", "vrsra.s32 q11,q15,#1",
+ "F2 E0 63 7E", "vrsra.s32 q11,q15,#32",
+ "F3 FF 63 7E", "vrsra.u32 q11,q15,#1",
+ "F3 E0 63 7E", "vrsra.u32 q11,q15,#32",
+ "F2 FF 63 FE", "vrsra.s64 q11,q15,#1",
+ "F2 C0 63 FE", "vrsra.s64 q11,q15,#64",
+ "F3 FF 63 FE", "vrsra.u64 q11,q15,#1",
+ "F3 C0 63 FE", "vrsra.u64 q11,q15,#64",
+ "F3 CC 56 AE", "vrsubhn.i16 d21,q14,q15",
+ "F3 DC 56 AE", "vrsubhn.i32 d21,q14,q15",
+ "F3 EC 56 AE", "vrsubhn.i64 d21,q14,q15",
+ "F2 C8 55 3A", "vshl.i8 d21,d26,#0",
+ "F2 CF 55 3A", "vshl.i8 d21,d26,#7",
+ "F2 D0 55 3A", "vshl.i16 d21,d26,#0",
+ "F2 DF 55 3A", "vshl.i16 d21,d26,#15",
+ "F2 E0 55 3A", "vshl.i32 d21,d26,#0",
+ "F2 FF 55 3A", "vshl.i32 d21,d26,#31",
+ "F2 C0 55 BA", "vshl.i64 d21,d26,#0",
+ "F2 FF 55 BA", "vshl.i64 d21,d26,#63",
+ "F2 C8 65 7E", "vshl.i8 q11,q15,#0",
+ "F2 CF 65 7E", "vshl.i8 q11,q15,#7",
+ "F2 D0 65 7E", "vshl.i16 q11,q15,#0",
+ "F2 DF 65 7E", "vshl.i16 q11,q15,#15",
+ "F2 E0 65 7E", "vshl.i32 q11,q15,#0",
+ "F2 FF 65 7E", "vshl.i32 q11,q15,#31",
+ "F2 C0 65 FE", "vshl.i64 q11,q15,#0",
+ "F2 FF 65 FE", "vshl.i64 q11,q15,#63",
+ "F2 49 54 AA", "vshl.s8 d21,d26,d25",
+ "F2 59 54 AA", "vshl.s16 d21,d26,d25",
+ "F2 69 54 AA", "vshl.s32 d21,d26,d25",
+ "F2 79 54 AA", "vshl.s64 d21,d26,d25",
+ "F3 49 54 AA", "vshl.u8 d21,d26,d25",
+ "F3 59 54 AA", "vshl.u16 d21,d26,d25",
+ "F3 69 54 AA", "vshl.u32 d21,d26,d25",
+ "F3 79 54 AA", "vshl.u64 d21,d26,d25",
+ "F2 4C 64 EE", "vshl.s8 q11,q15,q14",
+ "F2 5C 64 EE", "vshl.s16 q11,q15,q14",
+ "F2 6C 64 EE", "vshl.s32 q11,q15,q14",
+ "F2 7C 64 EE", "vshl.s64 q11,q15,q14",
+ "F3 4C 64 EE", "vshl.u8 q11,q15,q14",
+ "F3 5C 64 EE", "vshl.u16 q11,q15,q14",
+ "F3 6C 64 EE", "vshl.u32 q11,q15,q14",
+ "F3 7C 64 EE", "vshl.u64 q11,q15,q14",
+ "F2 C9 6A 3A", "vshll.s8 q11,d26,#1",
+ "F2 CF 6A 3A", "vshll.s8 q11,d26,#7",
+ "F3 C9 6A 3A", "vshll.u8 q11,d26,#1",
+ "F3 CF 6A 3A", "vshll.u8 q11,d26,#7",
+ "F2 D1 6A 3A", "vshll.s16 q11,d26,#1",
+ "F2 DF 6A 3A", "vshll.s16 q11,d26,#15",
+ "F3 D1 6A 3A", "vshll.u16 q11,d26,#1",
+ "F3 DF 6A 3A", "vshll.u16 q11,d26,#15",
+ "F2 E1 6A 3A", "vshll.s32 q11,d26,#1",
+ "F2 FF 6A 3A", "vshll.s32 q11,d26,#31",
+ "F3 E1 6A 3A", "vshll.u32 q11,d26,#1",
+ "F3 FF 6A 3A", "vshll.u32 q11,d26,#31",
+ "F3 F2 63 2A", "vshll.i8 q11,d26,#8",
+ "F3 F6 63 2A", "vshll.i16 q11,d26,#16",
+ "F3 FA 63 2A", "vshll.i32 q11,d26,#32",
+ "F2 CF 50 3A", "vshr.s8 d21,d26,#1",
+ "F2 C8 50 3A", "vshr.s8 d21,d26,#8",
+ "F3 CF 50 3A", "vshr.u8 d21,d26,#1",
+ "F3 C8 50 3A", "vshr.u8 d21,d26,#8",
+ "F2 DF 50 3A", "vshr.s16 d21,d26,#1",
+ "F2 D0 50 3A", "vshr.s16 d21,d26,#16",
+ "F3 DF 50 3A", "vshr.u16 d21,d26,#1",
+ "F3 D0 50 3A", "vshr.u16 d21,d26,#16",
+ "F2 FF 50 3A", "vshr.s32 d21,d26,#1",
+ "F2 E0 50 3A", "vshr.s32 d21,d26,#32",
+ "F3 FF 50 3A", "vshr.u32 d21,d26,#1",
+ "F3 E0 50 3A", "vshr.u32 d21,d26,#32",
+ "F2 FF 50 BA", "vshr.s64 d21,d26,#1",
+ "F2 C0 50 BA", "vshr.s64 d21,d26,#64",
+ "F3 FF 50 BA", "vshr.u64 d21,d26,#1",
+ "F3 C0 50 BA", "vshr.u64 d21,d26,#64",
+ "F2 CF 60 7E", "vshr.s8 q11,q15,#1",
+ "F2 C8 60 7E", "vshr.s8 q11,q15,#8",
+ "F3 CF 60 7E", "vshr.u8 q11,q15,#1",
+ "F3 C8 60 7E", "vshr.u8 q11,q15,#8",
+ "F2 DF 60 7E", "vshr.s16 q11,q15,#1",
+ "F2 D0 60 7E", "vshr.s16 q11,q15,#16",
+ "F3 DF 60 7E", "vshr.u16 q11,q15,#1",
+ "F3 D0 60 7E", "vshr.u16 q11,q15,#16",
+ "F2 FF 60 7E", "vshr.s32 q11,q15,#1",
+ "F2 E0 60 7E", "vshr.s32 q11,q15,#32",
+ "F3 FF 60 7E", "vshr.u32 q11,q15,#1",
+ "F3 E0 60 7E", "vshr.u32 q11,q15,#32",
+ "F2 FF 60 FE", "vshr.s64 q11,q15,#1",
+ "F2 C0 60 FE", "vshr.s64 q11,q15,#64",
+ "F3 FF 60 FE", "vshr.u64 q11,q15,#1",
+ "F3 C0 60 FE", "vshr.u64 q11,q15,#64",
+ "F2 CF 58 3E", "vshrn.i16 d21,q15,#1",
+ "F2 C8 58 3E", "vshrn.i16 d21,q15,#8",
+ "F2 DF 58 3E", "vshrn.i32 d21,q15,#1",
+ "F2 D0 58 3E", "vshrn.i32 d21,q15,#16",
+ "F2 FF 58 3E", "vshrn.i64 d21,q15,#1",
+ "F2 E0 58 3E", "vshrn.i64 d21,q15,#32",
+ "F3 C8 55 3A", "vsli.8 d21,d26,#0",
+ "F3 CF 55 3A", "vsli.8 d21,d26,#7",
+ "F3 D0 55 3A", "vsli.16 d21,d26,#0",
+ "F3 DF 55 3A", "vsli.16 d21,d26,#15",
+ "F3 E0 55 3A", "vsli.32 d21,d26,#0",
+ "F3 FF 55 3A", "vsli.32 d21,d26,#31",
+ "F3 C0 55 BA", "vsli.64 d21,d26,#0",
+ "F3 FF 55 BA", "vsli.64 d21,d26,#63",
+ "F3 C8 65 7E", "vsli.8 q11,q15,#0",
+ "F3 CF 65 7E", "vsli.8 q11,q15,#7",
+ "F3 D0 65 7E", "vsli.16 q11,q15,#0",
+ "F3 DF 65 7E", "vsli.16 q11,q15,#15",
+ "F3 E0 65 7E", "vsli.32 q11,q15,#0",
+ "F3 FF 65 7E", "vsli.32 q11,q15,#31",
+ "F3 C0 65 FE", "vsli.64 q11,q15,#0",
+ "F3 FF 65 FE", "vsli.64 q11,q15,#63",
+ "0E F1 AA CD", "vsqrteq.f32 s21,s26",
+ "EE F1 5B EA", "vsqrt.f64 d21,d26",
+ "F2 CF 51 3A", "vsra.s8 d21,d26,#1",
+ "F2 C8 51 3A", "vsra.s8 d21,d26,#8",
+ "F3 CF 51 3A", "vsra.u8 d21,d26,#1",
+ "F3 C8 51 3A", "vsra.u8 d21,d26,#8",
+ "F2 DF 51 3A", "vsra.s16 d21,d26,#1",
+ "F2 D0 51 3A", "vsra.s16 d21,d26,#16",
+ "F3 DF 51 3A", "vsra.u16 d21,d26,#1",
+ "F3 D0 51 3A", "vsra.u16 d21,d26,#16",
+ "F2 FF 51 3A", "vsra.s32 d21,d26,#1",
+ "F2 E0 51 3A", "vsra.s32 d21,d26,#32",
+ "F3 FF 51 3A", "vsra.u32 d21,d26,#1",
+ "F3 E0 51 3A", "vsra.u32 d21,d26,#32",
+ "F2 FF 51 BA", "vsra.s64 d21,d26,#1",
+ "F2 C0 51 BA", "vsra.s64 d21,d26,#64",
+ "F3 FF 51 BA", "vsra.u64 d21,d26,#1",
+ "F3 C0 51 BA", "vsra.u64 d21,d26,#64",
+ "F2 CF 61 7E", "vsra.s8 q11,q15,#1",
+ "F2 C8 61 7E", "vsra.s8 q11,q15,#8",
+ "F3 CF 61 7E", "vsra.u8 q11,q15,#1",
+ "F3 C8 61 7E", "vsra.u8 q11,q15,#8",
+ "F2 DF 61 7E", "vsra.s16 q11,q15,#1",
+ "F2 D0 61 7E", "vsra.s16 q11,q15,#16",
+ "F3 DF 61 7E", "vsra.u16 q11,q15,#1",
+ "F3 D0 61 7E", "vsra.u16 q11,q15,#16",
+ "F2 FF 61 7E", "vsra.s32 q11,q15,#1",
+ "F2 E0 61 7E", "vsra.s32 q11,q15,#32",
+ "F3 FF 61 7E", "vsra.u32 q11,q15,#1",
+ "F3 E0 61 7E", "vsra.u32 q11,q15,#32",
+ "F2 FF 61 FE", "vsra.s64 q11,q15,#1",
+ "F2 C0 61 FE", "vsra.s64 q11,q15,#64",
+ "F3 FF 61 FE", "vsra.u64 q11,q15,#1",
+ "F3 C0 61 FE", "vsra.u64 q11,q15,#64",
+ "F3 CF 54 3A", "vsri.8 d21,d26,#1",
+ "F3 C8 54 3A", "vsri.8 d21,d26,#8",
+ "F3 DF 54 3A", "vsri.16 d21,d26,#1",
+ "F3 D0 54 3A", "vsri.16 d21,d26,#16",
+ "F3 FF 54 3A", "vsri.32 d21,d26,#1",
+ "F3 E0 54 3A", "vsri.32 d21,d26,#32",
+ "F3 FF 54 BA", "vsri.64 d21,d26,#1",
+ "F3 C0 54 BA", "vsri.64 d21,d26,#64",
+ "F3 CF 64 7E", "vsri.8 q11,q15,#1",
+ "F3 C8 64 7E", "vsri.8 q11,q15,#8",
+ "F3 DF 64 7E", "vsri.16 q11,q15,#1",
+ "F3 D0 64 7E", "vsri.16 q11,q15,#16",
+ "F3 FF 64 7E", "vsri.32 q11,q15,#1",
+ "F3 E0 64 7E", "vsri.32 q11,q15,#32",
+ "F3 FF 64 FE", "vsri.64 q11,q15,#1",
+ "F3 C0 64 FE", "vsri.64 q11,q15,#64",
+ "F4 4A B7 0F", "vst1.8 {d27},[r10]",
+ "F4 4A BA 0F", "vst1.8 {d27,d28},[r10]",
+ "F4 4A B6 0F", "vst1.8 {d27,d28,d29},[r10]",
+ "F4 4A B2 0F", "vst1.8 {d27,d28,d29,d30},[r10]",
+ "F4 4A B7 4F", "vst1.16 {d27},[r10]",
+ "F4 4A BA 4F", "vst1.16 {d27,d28},[r10]",
+ "F4 4A B6 4F", "vst1.16 {d27,d28,d29},[r10]",
+ "F4 4A B2 4F", "vst1.16 {d27,d28,d29,d30},[r10]",
+ "F4 4A B7 8F", "vst1.32 {d27},[r10]",
+ "F4 4A BA 8F", "vst1.32 {d27,d28},[r10]",
+ "F4 4A B6 8F", "vst1.32 {d27,d28,d29},[r10]",
+ "F4 4A B2 8F", "vst1.32 {d27,d28,d29,d30},[r10]",
+ "F4 4A B7 CF", "vst1.64 {d27},[r10]",
+ "F4 4A BA CF", "vst1.64 {d27,d28},[r10]",
+ "F4 4A B6 CF", "vst1.64 {d27,d28,d29},[r10]",
+ "F4 4A B2 CF", "vst1.64 {d27,d28,d29,d30},[r10]",
+ "F4 4A B7 1F", "vst1.8 {d27},[r10@64]",
+ "F4 4A BA 1F", "vst1.8 {d27,d28},[r10@64]",
+ "F4 4A BA 2F", "vst1.8 {d27,d28},[r10@128]",
+ "F4 4A B6 1F", "vst1.8 {d27,d28,d29},[r10@64]",
+ "F4 4A B2 1F", "vst1.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B2 2F", "vst1.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B2 3F", "vst1.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B7 5F", "vst1.16 {d27},[r10@64]",
+ "F4 4A BA 5F", "vst1.16 {d27,d28},[r10@64]",
+ "F4 4A BA 6F", "vst1.16 {d27,d28},[r10@128]",
+ "F4 4A B6 5F", "vst1.16 {d27,d28,d29},[r10@64]",
+ "F4 4A B2 5F", "vst1.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B2 6F", "vst1.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B2 7F", "vst1.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B7 9F", "vst1.32 {d27},[r10@64]",
+ "F4 4A BA 9F", "vst1.32 {d27,d28},[r10@64]",
+ "F4 4A BA AF", "vst1.32 {d27,d28},[r10@128]",
+ "F4 4A B6 9F", "vst1.32 {d27,d28,d29},[r10@64]",
+ "F4 4A B2 9F", "vst1.32 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B2 AF", "vst1.32 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B2 BF", "vst1.32 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B7 DF", "vst1.64 {d27},[r10@64]",
+ "F4 4A BA DF", "vst1.64 {d27,d28},[r10@64]",
+ "F4 4A BA EF", "vst1.64 {d27,d28},[r10@128]",
+ "F4 4A B6 DF", "vst1.64 {d27,d28,d29},[r10@64]",
+ "F4 4A B2 DF", "vst1.64 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B2 EF", "vst1.64 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B2 FF", "vst1.64 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B7 0D", "vst1.8 {d27},[r10]!",
+ "F4 4A BA 0D", "vst1.8 {d27,d28},[r10]!",
+ "F4 4A B6 0D", "vst1.8 {d27,d28,d29},[r10]!",
+ "F4 4A B2 0D", "vst1.8 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B7 4D", "vst1.16 {d27},[r10]!",
+ "F4 4A BA 4D", "vst1.16 {d27,d28},[r10]!",
+ "F4 4A B6 4D", "vst1.16 {d27,d28,d29},[r10]!",
+ "F4 4A B2 4D", "vst1.16 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B7 8D", "vst1.32 {d27},[r10]!",
+ "F4 4A BA 8D", "vst1.32 {d27,d28},[r10]!",
+ "F4 4A B6 8D", "vst1.32 {d27,d28,d29},[r10]!",
+ "F4 4A B2 8D", "vst1.32 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B7 CD", "vst1.64 {d27},[r10]!",
+ "F4 4A BA CD", "vst1.64 {d27,d28},[r10]!",
+ "F4 4A B6 CD", "vst1.64 {d27,d28,d29},[r10]!",
+ "F4 4A B2 CD", "vst1.64 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B7 1D", "vst1.8 {d27},[r10@64]!",
+ "F4 4A BA 1D", "vst1.8 {d27,d28},[r10@64]!",
+ "F4 4A BA 2D", "vst1.8 {d27,d28},[r10@128]!",
+ "F4 4A B6 1D", "vst1.8 {d27,d28,d29},[r10@64]!",
+ "F4 4A B2 1D", "vst1.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B2 2D", "vst1.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B2 3D", "vst1.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B7 5D", "vst1.16 {d27},[r10@64]!",
+ "F4 4A BA 5D", "vst1.16 {d27,d28},[r10@64]!",
+ "F4 4A BA 6D", "vst1.16 {d27,d28},[r10@128]!",
+ "F4 4A B6 5D", "vst1.16 {d27,d28,d29},[r10@64]!",
+ "F4 4A B2 5D", "vst1.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B2 6D", "vst1.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B2 7D", "vst1.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B7 9D", "vst1.32 {d27},[r10@64]!",
+ "F4 4A BA 9D", "vst1.32 {d27,d28},[r10@64]!",
+ "F4 4A BA AD", "vst1.32 {d27,d28},[r10@128]!",
+ "F4 4A B6 9D", "vst1.32 {d27,d28,d29},[r10@64]!",
+ "F4 4A B2 9D", "vst1.32 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B2 AD", "vst1.32 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B2 BD", "vst1.32 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B7 DD", "vst1.64 {d27},[r10@64]!",
+ "F4 4A BA DD", "vst1.64 {d27,d28},[r10@64]!",
+ "F4 4A BA ED", "vst1.64 {d27,d28},[r10@128]!",
+ "F4 4A B6 DD", "vst1.64 {d27,d28,d29},[r10@64]!",
+ "F4 4A B2 DD", "vst1.64 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B2 ED", "vst1.64 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B2 FD", "vst1.64 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B7 09", "vst1.8 {d27},[r10],r9",
+ "F4 4A BA 09", "vst1.8 {d27,d28},[r10],r9",
+ "F4 4A B6 09", "vst1.8 {d27,d28,d29},[r10],r9",
+ "F4 4A B2 09", "vst1.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B7 49", "vst1.16 {d27},[r10],r9",
+ "F4 4A BA 49", "vst1.16 {d27,d28},[r10],r9",
+ "F4 4A B6 49", "vst1.16 {d27,d28,d29},[r10],r9",
+ "F4 4A B2 49", "vst1.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B7 89", "vst1.32 {d27},[r10],r9",
+ "F4 4A BA 89", "vst1.32 {d27,d28},[r10],r9",
+ "F4 4A B6 89", "vst1.32 {d27,d28,d29},[r10],r9",
+ "F4 4A B2 89", "vst1.32 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B7 C9", "vst1.64 {d27},[r10],r9",
+ "F4 4A BA C9", "vst1.64 {d27,d28},[r10],r9",
+ "F4 4A B6 C9", "vst1.64 {d27,d28,d29},[r10],r9",
+ "F4 4A B2 C9", "vst1.64 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B7 19", "vst1.8 {d27},[r10@64],r9",
+ "F4 4A BA 19", "vst1.8 {d27,d28},[r10@64],r9",
+ "F4 4A BA 29", "vst1.8 {d27,d28},[r10@128],r9",
+ "F4 4A B6 19", "vst1.8 {d27,d28,d29},[r10@64],r9",
+ "F4 4A B2 19", "vst1.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B2 29", "vst1.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B2 39", "vst1.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A B7 59", "vst1.16 {d27},[r10@64],r9",
+ "F4 4A BA 59", "vst1.16 {d27,d28},[r10@64],r9",
+ "F4 4A BA 69", "vst1.16 {d27,d28},[r10@128],r9",
+ "F4 4A B6 59", "vst1.16 {d27,d28,d29},[r10@64],r9",
+ "F4 4A B2 59", "vst1.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B2 69", "vst1.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B2 79", "vst1.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A B7 99", "vst1.32 {d27},[r10@64],r9",
+ "F4 4A BA 99", "vst1.32 {d27,d28},[r10@64],r9",
+ "F4 4A BA A9", "vst1.32 {d27,d28},[r10@128],r9",
+ "F4 4A B6 99", "vst1.32 {d27,d28,d29},[r10@64],r9",
+ "F4 4A B2 99", "vst1.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B2 A9", "vst1.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B2 B9", "vst1.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A B7 D9", "vst1.64 {d27},[r10@64],r9",
+ "F4 4A BA D9", "vst1.64 {d27,d28},[r10@64],r9",
+ "F4 4A BA E9", "vst1.64 {d27,d28},[r10@128],r9",
+ "F4 4A B6 D9", "vst1.64 {d27,d28,d29},[r10@64],r9",
+ "F4 4A B2 D9", "vst1.64 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B2 E9", "vst1.64 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B2 F9", "vst1.64 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 CA B0 2F", "vst1.8 {d27[1]},[r10]",
+ "F4 CA B4 4F", "vst1.16 {d27[1]},[r10]",
+ "F4 CA B8 8F", "vst1.32 {d27[1]},[r10]",
+ "F4 CA B4 5F", "vst1.16 {d27[1]},[r10@16]",
+ "F4 CA B8 BF", "vst1.32 {d27[1]},[r10@32]",
+ "F4 CA B0 2D", "vst1.8 {d27[1]},[r10]!",
+ "F4 CA B4 4D", "vst1.16 {d27[1]},[r10]!",
+ "F4 CA B8 8D", "vst1.32 {d27[1]},[r10]!",
+ "F4 CA B4 5D", "vst1.16 {d27[1]},[r10@16]!",
+ "F4 CA B8 BD", "vst1.32 {d27[1]},[r10@32]!",
+ "F4 CA B0 29", "vst1.8 {d27[1]},[r10],r9",
+ "F4 CA B4 49", "vst1.16 {d27[1]},[r10],r9",
+ "F4 CA B8 89", "vst1.32 {d27[1]},[r10],r9",
+ "F4 CA B4 59", "vst1.16 {d27[1]},[r10@16],r9",
+ "F4 CA B8 B9", "vst1.32 {d27[1]},[r10@32],r9",
+ "F4 4A B8 0F", "vst2.8 {d27,d28},[r10]",
+ "F4 4A B9 0F", "vst2.8 {d27,d29},[r10]",
+ "F4 4A B3 0F", "vst2.8 {d27,d28,d29,d30},[r10]",
+ "F4 4A B8 4F", "vst2.16 {d27,d28},[r10]",
+ "F4 4A B9 4F", "vst2.16 {d27,d29},[r10]",
+ "F4 4A B3 4F", "vst2.16 {d27,d28,d29,d30},[r10]",
+ "F4 4A B8 1F", "vst2.8 {d27,d28},[r10@64]",
+ "F4 4A B8 2F", "vst2.8 {d27,d28},[r10@128]",
+ "F4 4A B9 1F", "vst2.8 {d27,d29},[r10@64]",
+ "F4 4A B9 2F", "vst2.8 {d27,d29},[r10@128]",
+ "F4 4A B3 1F", "vst2.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B3 2F", "vst2.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B3 3F", "vst2.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B8 5F", "vst2.16 {d27,d28},[r10@64]",
+ "F4 4A B8 6F", "vst2.16 {d27,d28},[r10@128]",
+ "F4 4A B9 5F", "vst2.16 {d27,d29},[r10@64]",
+ "F4 4A B9 6F", "vst2.16 {d27,d29},[r10@128]",
+ "F4 4A B3 5F", "vst2.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B3 6F", "vst2.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B3 7F", "vst2.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A B8 0D", "vst2.8 {d27,d28},[r10]!",
+ "F4 4A B9 0D", "vst2.8 {d27,d29},[r10]!",
+ "F4 4A B3 0D", "vst2.8 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B8 4D", "vst2.16 {d27,d28},[r10]!",
+ "F4 4A B9 4D", "vst2.16 {d27,d29},[r10]!",
+ "F4 4A B3 4D", "vst2.16 {d27,d28,d29,d30},[r10]!",
+ "F4 4A B8 1D", "vst2.8 {d27,d28},[r10@64]!",
+ "F4 4A B8 2D", "vst2.8 {d27,d28},[r10@128]!",
+ "F4 4A B9 1D", "vst2.8 {d27,d29},[r10@64]!",
+ "F4 4A B9 2D", "vst2.8 {d27,d29},[r10@128]!",
+ "F4 4A B3 1D", "vst2.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B3 2D", "vst2.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B3 3D", "vst2.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B8 5D", "vst2.16 {d27,d28},[r10@64]!",
+ "F4 4A B8 6D", "vst2.16 {d27,d28},[r10@128]!",
+ "F4 4A B9 5D", "vst2.16 {d27,d29},[r10@64]!",
+ "F4 4A B9 6D", "vst2.16 {d27,d29},[r10@128]!",
+ "F4 4A B3 5D", "vst2.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B3 6D", "vst2.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B3 7D", "vst2.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A B8 09", "vst2.8 {d27,d28},[r10],r9",
+ "F4 4A B9 09", "vst2.8 {d27,d29},[r10],r9",
+ "F4 4A B3 09", "vst2.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B8 49", "vst2.16 {d27,d28},[r10],r9",
+ "F4 4A B9 49", "vst2.16 {d27,d29},[r10],r9",
+ "F4 4A B3 49", "vst2.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A B8 19", "vst2.8 {d27,d28},[r10@64],r9",
+ "F4 4A B8 29", "vst2.8 {d27,d28},[r10@128],r9",
+ "F4 4A B9 19", "vst2.8 {d27,d29},[r10@64],r9",
+ "F4 4A B9 29", "vst2.8 {d27,d29},[r10@128],r9",
+ "F4 4A B3 19", "vst2.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B3 29", "vst2.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B3 39", "vst2.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A B8 59", "vst2.16 {d27,d28},[r10@64],r9",
+ "F4 4A B8 69", "vst2.16 {d27,d28},[r10@128],r9",
+ "F4 4A B9 59", "vst2.16 {d27,d29},[r10@64],r9",
+ "F4 4A B9 69", "vst2.16 {d27,d29},[r10@128],r9",
+ "F4 4A B3 59", "vst2.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B3 69", "vst2.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B3 79", "vst2.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 CA B1 2F", "vst2.8 {d27[1],d28[1]},[r10]",
+ "F4 CA B5 4F", "vst2.16 {d27[1],d28[1]},[r10]",
+ "F4 CA B5 6F", "vst2.16 {d27[1],d29[1]},[r10]",
+ "F4 CA B9 8F", "vst2.32 {d27[1],d28[1]},[r10]",
+ "F4 CA B9 CF", "vst2.32 {d27[1],d29[1]},[r10]",
+ "F4 CA B1 3F", "vst2.8 {d27[1],d28[1]},[r10@16]",
+ "F4 CA B5 5F", "vst2.16 {d27[1],d28[1]},[r10@32]",
+ "F4 CA B5 7F", "vst2.16 {d27[1],d29[1]},[r10@32]",
+ "F4 CA B9 9F", "vst2.32 {d27[1],d28[1]},[r10@64]",
+ "F4 CA B9 DF", "vst2.32 {d27[1],d29[1]},[r10@64]",
+ "F4 CA B1 2D", "vst2.8 {d27[1],d28[1]},[r10]!",
+ "F4 CA B5 4D", "vst2.16 {d27[1],d28[1]},[r10]!",
+ "F4 CA B5 6D", "vst2.16 {d27[1],d29[1]},[r10]!",
+ "F4 CA B9 8D", "vst2.32 {d27[1],d28[1]},[r10]!",
+ "F4 CA B9 CD", "vst2.32 {d27[1],d29[1]},[r10]!",
+ "F4 CA B1 3D", "vst2.8 {d27[1],d28[1]},[r10@16]!",
+ "F4 CA B5 5D", "vst2.16 {d27[1],d28[1]},[r10@32]!",
+ "F4 CA B5 7D", "vst2.16 {d27[1],d29[1]},[r10@32]!",
+ "F4 CA B9 9D", "vst2.32 {d27[1],d28[1]},[r10@64]!",
+ "F4 CA B9 DD", "vst2.32 {d27[1],d29[1]},[r10@64]!",
+ "F4 CA B1 29", "vst2.8 {d27[1],d28[1]},[r10],r9",
+ "F4 CA B5 49", "vst2.16 {d27[1],d28[1]},[r10],r9",
+ "F4 CA B5 69", "vst2.16 {d27[1],d29[1]},[r10],r9",
+ "F4 CA B9 89", "vst2.32 {d27[1],d28[1]},[r10],r9",
+ "F4 CA B9 C9", "vst2.32 {d27[1],d29[1]},[r10],r9",
+ "F4 CA B1 39", "vst2.8 {d27[1],d28[1]},[r10@16],r9",
+ "F4 CA B5 59", "vst2.16 {d27[1],d28[1]},[r10@32],r9",
+ "F4 CA B5 79", "vst2.16 {d27[1],d29[1]},[r10@32],r9",
+ "F4 CA B9 99", "vst2.32 {d27[1],d28[1]},[r10@64],r9",
+ "F4 CA B9 D9", "vst2.32 {d27[1],d29[1]},[r10@64],r9",
+ "F4 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F4 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F4 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F4 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 4A B0 0F", "vst4.8 {d27,d28,d29,d30},[r10]",
+ "F4 4A 91 0F", "vst4.8 {d25,d27,d29,d31},[r10]",
+ "F4 4A B0 4F", "vst4.16 {d27,d28,d29,d30},[r10]",
+ "F4 4A 91 4F", "vst4.16 {d25,d27,d29,d31},[r10]",
+ "F4 4A B0 8F", "vst4.32 {d27,d28,d29,d30},[r10]",
+ "F4 4A 91 8F", "vst4.32 {d25,d27,d29,d31},[r10]",
+ "F4 4A B0 1F", "vst4.8 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B0 2F", "vst4.8 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B0 3F", "vst4.8 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A 91 1F", "vst4.8 {d25,d27,d29,d31},[r10@64]",
+ "F4 4A 91 2F", "vst4.8 {d25,d27,d29,d31},[r10@128]",
+ "F4 4A 91 3F", "vst4.8 {d25,d27,d29,d31},[r10@256]",
+ "F4 4A B0 5F", "vst4.16 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B0 6F", "vst4.16 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B0 7F", "vst4.16 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A 91 5F", "vst4.16 {d25,d27,d29,d31},[r10@64]",
+ "F4 4A 91 6F", "vst4.16 {d25,d27,d29,d31},[r10@128]",
+ "F4 4A 91 7F", "vst4.16 {d25,d27,d29,d31},[r10@256]",
+ "F4 4A B0 9F", "vst4.32 {d27,d28,d29,d30},[r10@64]",
+ "F4 4A B0 AF", "vst4.32 {d27,d28,d29,d30},[r10@128]",
+ "F4 4A B0 BF", "vst4.32 {d27,d28,d29,d30},[r10@256]",
+ "F4 4A 91 9F", "vst4.32 {d25,d27,d29,d31},[r10@64]",
+ "F4 4A 91 AF", "vst4.32 {d25,d27,d29,d31},[r10@128]",
+ "F4 4A 91 BF", "vst4.32 {d25,d27,d29,d31},[r10@256]",
+ "F4 4A B0 0D", "vst4.8 {d27,d28,d29,d30},[r10]!",
+ "F4 4A 91 0D", "vst4.8 {d25,d27,d29,d31},[r10]!",
+ "F4 4A B0 4D", "vst4.16 {d27,d28,d29,d30},[r10]!",
+ "F4 4A 91 4D", "vst4.16 {d25,d27,d29,d31},[r10]!",
+ "F4 4A B0 8D", "vst4.32 {d27,d28,d29,d30},[r10]!",
+ "F4 4A 91 8D", "vst4.32 {d25,d27,d29,d31},[r10]!",
+ "F4 4A B0 1D", "vst4.8 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B0 2D", "vst4.8 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B0 3D", "vst4.8 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A 91 1D", "vst4.8 {d25,d27,d29,d31},[r10@64]!",
+ "F4 4A 91 2D", "vst4.8 {d25,d27,d29,d31},[r10@128]!",
+ "F4 4A 91 3D", "vst4.8 {d25,d27,d29,d31},[r10@256]!",
+ "F4 4A B0 5D", "vst4.16 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B0 6D", "vst4.16 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B0 7D", "vst4.16 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A 91 5D", "vst4.16 {d25,d27,d29,d31},[r10@64]!",
+ "F4 4A 91 6D", "vst4.16 {d25,d27,d29,d31},[r10@128]!",
+ "F4 4A 91 7D", "vst4.16 {d25,d27,d29,d31},[r10@256]!",
+ "F4 4A B0 9D", "vst4.32 {d27,d28,d29,d30},[r10@64]!",
+ "F4 4A B0 AD", "vst4.32 {d27,d28,d29,d30},[r10@128]!",
+ "F4 4A B0 BD", "vst4.32 {d27,d28,d29,d30},[r10@256]!",
+ "F4 4A 91 9D", "vst4.32 {d25,d27,d29,d31},[r10@64]!",
+ "F4 4A 91 AD", "vst4.32 {d25,d27,d29,d31},[r10@128]!",
+ "F4 4A 91 BD", "vst4.32 {d25,d27,d29,d31},[r10@256]!",
+ "F4 4A B0 09", "vst4.8 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A 91 09", "vst4.8 {d25,d27,d29,d31},[r10],r9",
+ "F4 4A B0 49", "vst4.16 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A 91 49", "vst4.16 {d25,d27,d29,d31},[r10],r9",
+ "F4 4A B0 89", "vst4.32 {d27,d28,d29,d30},[r10],r9",
+ "F4 4A 91 89", "vst4.32 {d25,d27,d29,d31},[r10],r9",
+ "F4 4A B0 19", "vst4.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B0 29", "vst4.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B0 39", "vst4.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A 91 19", "vst4.8 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 4A 91 29", "vst4.8 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 4A 91 39", "vst4.8 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 4A B0 59", "vst4.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B0 69", "vst4.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B0 79", "vst4.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A 91 59", "vst4.16 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 4A 91 69", "vst4.16 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 4A 91 79", "vst4.16 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 4A B0 99", "vst4.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F4 4A B0 A9", "vst4.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F4 4A B0 B9", "vst4.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F4 4A 91 99", "vst4.32 {d25,d27,d29,d31},[r10@64],r9",
+ "F4 4A 91 A9", "vst4.32 {d25,d27,d29,d31},[r10@128],r9",
+ "F4 4A 91 B9", "vst4.32 {d25,d27,d29,d31},[r10@256],r9",
+ "F4 CA B3 2F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 CA B7 4F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 CA 97 6F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA BB 8F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F4 CA 9B CF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F4 CA B3 3F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
+ "F4 CA B7 5F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F4 CA 97 7F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F4 CA BB 9F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F4 CA BB AF", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
+ "F4 CA 9B DF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F4 CA 9B EF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
+ "F4 CA B3 2D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 CA B7 4D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 CA 97 6D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA BB 8D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F4 CA 9B CD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F4 CA B3 3D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
+ "F4 CA B7 5D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F4 CA 97 7D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F4 CA BB 9D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F4 CA BB AD", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
+ "F4 CA 9B DD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F4 CA 9B ED", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
+ "F4 CA B3 29", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 CA B7 49", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 CA 97 69", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 CA BB 89", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F4 CA 9B C9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F4 CA B3 39", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
+ "F4 CA B7 59", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F4 CA 97 79", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F4 CA BB 99", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F4 CA BB A9", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
+ "F4 CA 9B D9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F4 CA 9B E9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
+ "0C CA BB 04", "vstmiaeq r10,{d27-d28}",
+ "0C CA DA 02", "vstmiaeq r10,{s27-s28}",
+ "EC EA BB 04", "vstmia r10!,{d27-d28}",
+ "ED 6A BB 04", "vstmdb r10!,{d27-d28}",
+ "EC EA DA 02", "vstmia r10!,{s27-s28}",
+ "ED 6A DA 02", "vstmdb r10!,{s27-s28}",
+ "0D 4A 5B FF", "vstreq.64 d21,[r10,#-0x3fc]",
+ "ED CA 5B FF", "vstr.64 d21,[r10,#0x3fc]",
+ "ED CA 5B 00", "vstr.64 d21,[r10]",
+ "0D 4A AA FF", "vstreq.32 s21,[r10,#-0x3fc]",
+ "ED CA AA FF", "vstr.32 s21,[r10,#0x3fc]",
+ "ED CA AA 00", "vstr.32 s21,[r10]",
+ "F3 49 58 AA", "vsub.i8 d21,d25,d26",
+ "F3 59 58 AA", "vsub.i16 d21,d25,d26",
+ "F3 69 58 AA", "vsub.i32 d21,d25,d26",
+ "F3 79 58 AA", "vsub.i64 d21,d25,d26",
+ "F3 4C 68 EE", "vsub.i8 q11,q14,q15",
+ "F3 5C 68 EE", "vsub.i16 q11,q14,q15",
+ "F3 6C 68 EE", "vsub.i32 q11,q14,q15",
+ "F3 7C 68 EE", "vsub.i64 q11,q14,q15",
+ "F2 69 5D AA", "vsub.f32 d21,d25,d26",
+ "F2 6C 6D EE", "vsub.f32 q11,q14,q15",
+ "0E 7C AA CD", "vsubeq.f32 s21,s25,s26",
+ "EE 79 5B EA", "vsub.f64 d21,d25,d26",
+ "F2 CC 56 AE", "vsubhn.i16 d21,q14,q15",
+ "F2 DC 56 AE", "vsubhn.i32 d21,q14,q15",
+ "F2 EC 56 AE", "vsubhn.i64 d21,q14,q15",
+ "F2 C9 62 AA", "vsubl.s8 q11,d25,d26",
+ "F2 D9 62 AA", "vsubl.s16 q11,d25,d26",
+ "F2 E9 62 AA", "vsubl.s32 q11,d25,d26",
+ "F3 C9 62 AA", "vsubl.u8 q11,d25,d26",
+ "F3 D9 62 AA", "vsubl.u16 q11,d25,d26",
+ "F3 E9 62 AA", "vsubl.u32 q11,d25,d26",
+ "F2 CC 63 AA", "vsubw.s8 q11,q14,d26",
+ "F2 DC 63 AA", "vsubw.s16 q11,q14,d26",
+ "F2 EC 63 AA", "vsubw.s32 q11,q14,d26",
+ "F3 CC 63 AA", "vsubw.u8 q11,q14,d26",
+ "F3 DC 63 AA", "vsubw.u16 q11,q14,d26",
+ "F3 EC 63 AA", "vsubw.u32 q11,q14,d26",
+ "F3 F2 50 2A", "vswp d21,d26",
+ "F3 F2 60 6E", "vswp q11,q15",
+ "F3 FB 58 AA", "vtbl.8 d21,{d27},d26",
+ "F3 FB 59 AA", "vtbl.8 d21,{d27,d28},d26",
+ "F3 FB 5A AA", "vtbl.8 d21,{d27,d28,d29},d26",
+ "F3 FB 5B AA", "vtbl.8 d21,{d27,d28,d29,d30},d26",
+ "F3 FB 58 EA", "vtbx.8 d21,{d27},d26",
+ "F3 FB 59 EA", "vtbx.8 d21,{d27,d28},d26",
+ "F3 FB 5A EA", "vtbx.8 d21,{d27,d28,d29},d26",
+ "F3 FB 5B EA", "vtbx.8 d21,{d27,d28,d29,d30},d26",
+ "F3 F2 50 AA", "vtrn.8 d21,d26",
+ "F3 F6 50 AA", "vtrn.16 d21,d26",
+ "F3 FA 50 AA", "vtrn.32 d21,d26",
+ "F3 F2 60 EE", "vtrn.8 q11,q15",
+ "F3 F6 60 EE", "vtrn.16 q11,q15",
+ "F3 FA 60 EE", "vtrn.32 q11,q15",
+ "F2 49 58 BA", "vtst.8 d21,d25,d26",
+ "F2 59 58 BA", "vtst.16 d21,d25,d26",
+ "F2 69 58 BA", "vtst.32 d21,d25,d26",
+ "F2 4C 68 FE", "vtst.8 q11,q14,q15",
+ "F2 5C 68 FE", "vtst.16 q11,q14,q15",
+ "F2 6C 68 FE", "vtst.32 q11,q14,q15",
+ "F3 F2 51 2A", "vuzp.8 d21,d26",
+ "F3 F6 51 2A", "vuzp.16 d21,d26",
+ "F3 F2 61 6E", "vuzp.8 q11,q15",
+ "F3 F6 61 6E", "vuzp.16 q11,q15",
+ "F3 FA 61 6E", "vuzp.32 q11,q15",
+ "F3 F2 51 AA", "vzip.8 d21,d26",
+ "F3 F6 51 AA", "vzip.16 d21,d26",
+ "F3 F2 61 EE", "vzip.8 q11,q15",
+ "F3 F6 61 EE", "vzip.16 q11,q15",
+ "F3 FA 61 EE", "vzip.32 q11,q15",
+ };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM condition code.
+ */
+ @Test
+ public void testArmConditionCode() {
+
+ System.out.println("\n================ ARM Condition Code ================\n");
+ String[] insts = {
+ "00 A1 00 02", "adceq r0,r1,r2",
+ "10 A1 00 02", "adcne r0,r1,r2",
+ "20 A1 00 02", "adccs r0,r1,r2",
+ "30 A1 00 02", "adccc r0,r1,r2",
+ "40 A1 00 02", "adcmi r0,r1,r2",
+ "50 A1 00 02", "adcpl r0,r1,r2",
+ "60 A1 00 02", "adcvs r0,r1,r2",
+ "70 A1 00 02", "adcvc r0,r1,r2",
+ "80 A1 00 02", "adchi r0,r1,r2",
+ "90 A1 00 02", "adcls r0,r1,r2",
+ "A0 A1 00 02", "adcge r0,r1,r2",
+ "B0 A1 00 02", "adclt r0,r1,r2",
+ "C0 A1 00 02", "adcgt r0,r1,r2",
+ "D0 A1 00 02", "adcle r0,r1,r2",
+ "E0 A1 00 02", "adc r0,r1,r2", };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM addressing mode 1 (shifter operand).
+ */
+ @Test
+ public void testArmAddrMode1() {
+
+ System.out.println("\n================== ARM Addr Mode 1 ==================\n");
+ String[] insts = {
+ "E2 81 00 11", "add r0,r1,#0x11",
+ "E0 81 00 02", "add r0,r1,r2",
+ "E0 81 08 82", "add r0,r1,r2,lsl #17",
+ "E0 81 03 12", "add r0,r1,r2,lsl r3",
+ "E0 81 08 A2", "add r0,r1,r2,lsr #17",
+ "E0 81 03 32", "add r0,r1,r2,lsr r3",
+ "E0 81 08 C2", "add r0,r1,r2,asr #17",
+ "E0 81 03 52", "add r0,r1,r2,asr r3",
+ "E0 81 08 E2", "add r0,r1,r2,ror #17",
+ "E0 81 03 72", "add r0,r1,r2,ror r3",
+ "E0 81 00 62", "add r0,r1,r2,rrx",
+ };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM addressing mode 2.
+ */
+ @Test
+ public void testArmAddrMode2() {
+
+ System.out.println("\n================== ARM Addr Mode 2 ==================\n");
+ String[] insts = {
+ "E5 91 00 11", "ldr r0,[r1,#0x11]",
+ "E5 11 00 11", "ldr r0,[r1,#-0x11]",
+ "E7 91 00 02", "ldr r0,[r1,r2]",
+ "E7 11 00 02", "ldr r0,[r1,-r2]",
+ "E7 91 08 82", "ldr r0,[r1,r2,lsl #17]",
+ "E7 91 08 A2", "ldr r0,[r1,r2,lsr #17]",
+ "E7 91 08 C2", "ldr r0,[r1,r2,asr #17]",
+ "E7 91 08 E2", "ldr r0,[r1,r2,ror #17]",
+ "E7 91 00 62", "ldr r0,[r1,r2,rrx]",
+ "E7 11 08 82", "ldr r0,[r1,-r2,lsl #17]",
+ "E7 11 08 A2", "ldr r0,[r1,-r2,lsr #17]",
+ "E7 11 08 C2", "ldr r0,[r1,-r2,asr #17]",
+ "E7 11 08 E2", "ldr r0,[r1,-r2,ror #17]",
+ "E7 11 00 62", "ldr r0,[r1,-r2,rrx]",
+ "E5 B1 00 11", "ldr r0,[r1,#0x11]!",
+ "E5 31 00 11", "ldr r0,[r1,#-0x11]!",
+ "E7 B1 00 02", "ldr r0,[r1,r2]!",
+ "E7 31 00 02", "ldr r0,[r1,-r2]!",
+ "E7 B1 08 82", "ldr r0,[r1,r2,lsl #17]!",
+ "E7 B1 08 A2", "ldr r0,[r1,r2,lsr #17]!",
+ "E7 B1 08 C2", "ldr r0,[r1,r2,asr #17]!",
+ "E7 B1 08 E2", "ldr r0,[r1,r2,ror #17]!",
+ "E7 B1 00 62", "ldr r0,[r1,r2,rrx]!",
+ "E7 31 08 82", "ldr r0,[r1,-r2,lsl #17]!",
+ "E7 31 08 A2", "ldr r0,[r1,-r2,lsr #17]!",
+ "E7 31 08 C2", "ldr r0,[r1,-r2,asr #17]!",
+ "E7 31 08 E2", "ldr r0,[r1,-r2,ror #17]!",
+ "E7 31 00 62", "ldr r0,[r1,-r2,rrx]!",
+ "E4 91 00 11", "ldr r0,[r1],#0x11",
+ "E4 11 00 11", "ldr r0,[r1],#-0x11",
+ "E6 91 00 02", "ldr r0,[r1],r2",
+ "E6 11 00 02", "ldr r0,[r1],-r2",
+ "E6 91 08 82", "ldr r0,[r1],r2,lsl #17",
+ "E6 91 08 A2", "ldr r0,[r1],r2,lsr #17",
+ "E6 91 08 C2", "ldr r0,[r1],r2,asr #17",
+ "E6 91 08 E2", "ldr r0,[r1],r2,ror #17",
+ "E6 91 00 62", "ldr r0,[r1],r2,rrx",
+ "E6 11 08 82", "ldr r0,[r1],-r2,lsl #17",
+ "E6 11 08 A2", "ldr r0,[r1],-r2,lsr #17",
+ "E6 11 08 C2", "ldr r0,[r1],-r2,asr #17",
+ "E6 11 08 E2", "ldr r0,[r1],-r2,ror #17",
+ "E6 11 00 62", "ldr r0,[r1],-r2,rrx",
+ };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM addressing mode 3.
+ */
+ @Test
+ public void testArmAddrMode3() {
+
+ System.out.println("\n================== ARM Addr Mode 3 ==================\n");
+ String[] insts = {
+ "E1 C1 01 B0", "strh r0,[r1,#0x10]",
+ "E1 41 01 B0", "strh r0,[r1,#-0x10]",
+ "E1 81 00 B2", "strh r0,[r1,r2]",
+ "E1 01 00 B2", "strh r0,[r1,-r2]",
+ "E1 E1 01 B0", "strh r0,[r1,#0x10]!",
+ "E1 61 01 B0", "strh r0,[r1,#-0x10]!",
+ "E1 A1 00 B2", "strh r0,[r1,r2]!",
+ "E1 21 00 B2", "strh r0,[r1,-r2]!",
+ "E0 C1 01 B0", "strh r0,[r1],#0x10",
+ "E0 41 01 B0", "strh r0,[r1],#-0x10",
+ "E0 81 00 B2", "strh r0,[r1],r2",
+ "E0 01 00 B2", "strh r0,[r1],-r2",
+ };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM addressing mode 4.
+ */
+ @Test
+ public void testArmAddrMode4() {
+
+ System.out.println("\n================== ARM Addr Mode 4 ==================\n");
+ String[] insts = {
+ "E8 90 00 06", "ldm r0,{r1,r2}",
+ "E9 90 00 06", "ldmib r0,{r1,r2}",
+ "E8 10 00 06", "ldmda r0,{r1,r2}",
+ "E9 10 00 06", "ldmdb r0,{r1,r2}", };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test for ARM addressing mode 5.
+ */
+ @Test
+ public void testArmAddrMode5() {
+
+ System.out.println("\n================== ARM Addr Mode 5 ==================\n");
+ String[] insts = {
+ "ED 92 10 04", "ldc p0,c1,[r2,#0x10]",
+ "ED 12 10 04", "ldc p0,c1,[r2,#-0x10]",
+ "ED B2 10 04", "ldc p0,c1,[r2,#0x10]!",
+ "ED 32 10 04", "ldc p0,c1,[r2,#-0x10]!",
+ "EC B2 10 04", "ldc p0,c1,[r2],#0x10",
+ "EC 32 10 04", "ldc p0,c1,[r2],#-0x10",
+ "EC 92 10 00", "ldc p0,c1,[r2],{0}", };
+
+ disassembleInstArray(insts, armOptions);
+ }
+
+ /**
+ * Test private method {@link InstructionParserARM#signExtend()}.
+ */
+ @Test
+ public void testSignExtend() {
+ Assert.assertEquals(0xff23, signExtend(0x123, 8, 16));
+ Assert.assertEquals(0xffff23, signExtend(0x123, 8, 24));
+ Assert.assertEquals(0x100, signExtend(0x100, 9, 16));
+ Assert.assertEquals(0x0, signExtend(0x100, 3, 16));
+ Assert.assertEquals(0x100, signExtend(0x100, 8, 7));
+ Assert.assertEquals(0xffffff00, signExtend(0x100, 8, 33));
+
+ Assert.assertEquals(0xffff3000, signExtend(0x13000, 16, 32));
+ Assert.assertEquals(0x00ff3000, signExtend(0x13000, 16, 24));
+ Assert.assertEquals(0x007f3000, signExtend(0x13000, 16, 23));
+ Assert.assertEquals(0xffff3000, signExtend(0x2213000, 16, 32));
+ Assert.assertEquals(0xfffff000, signExtend(0x13000, 12, 32));
+ Assert.assertEquals(0x0, signExtend(0x13000, 11, 32));
+ }
+
+ /**
+ * This is reflect access to private method {@link InstructionParserARM#signExtend()}.
+ *
+ * @param val
+ * @param signBitNo
+ * @param totalBitCount
+ * @return
+ */
+ private int signExtend(int val, int signBitNo, int totalBitCount) {
+ IAddress addr = new Addr32(0x0); // ignore
+ ByteBuffer codeBuf = ByteBuffer.wrap(new byte[] {1}); // ignore
+
+ InstructionParserARM disa = new InstructionParserARM(addr, codeBuf);
+ try {
+ Object r = TestReflectionHelper.objectFromPrivateFunctionWithArgs(disa,
+ "signExtend",
+ new Object[] {new Integer(val), new Integer(signBitNo), new Integer(totalBitCount)},
+ new Class<?>[] {Integer.TYPE, Integer.TYPE, Integer.TYPE} );
+ Assert.assertTrue(r instanceof Integer);
+ return (Integer)r;
+ } catch (Exception e) {
+ Assert.fail(e.getMessage() + "\n\t --" + e.getClass().getName());
+ }
+
+ return 0;
+ }
+
+ @Test
+ public void testBench() {
+ // A place holder for any new instruction trial & error.
+ // This will print out the disassembled instruction.
+ //
+ disassembleInst(0x0,
+ "F4 00 C0 3C",
+ null,
+ null,
+ thumbOptions);
+ }
+
+ /**
+ * Test for ARM branching instructions.
+ */
+ @Test
+ public void testArmBranches() {
+
+ armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
+ armOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
+ System.out.println("\n=================== ARM Branches ====================\n");
+ disassembleInst(0x00000000, "0a ff ff fe", new JumpToAddress(0x00000000, false, false),
+ "0: 0a ff ff fe beq 0x00000000", armOptions);
+ disassembleInst(0x00000000, "ea ff ff fe", new JumpToAddress(0x00000000, true, false),
+ "0: ea ff ff fe b 0x00000000", armOptions);
+ disassembleInst(0x00000000, "eb ff ff fe", new JumpToAddress(0x00000000, true, true),
+ "0: eb ff ff fe bl 0x00000000", armOptions);
+ disassembleInst(0x00000000, "fa ff ff fe", new JumpToAddress(0x00000000, true, true),
+ "0: fa ff ff fe blx 0x00000000", armOptions);
+ disassembleInst(0x00000000, "e1 2f ff 30", new JumpToAddress("r0", true, true),
+ "0: e1 2f ff 30 blx r0", armOptions);
+ disassembleInst(0x00000000, "e1 2f ff 10", new JumpToAddress("r0", true, false),
+ "0: e1 2f ff 10 bx r0", armOptions);
+ disassembleInst(0x00000000, "e1 a0 f0 0e", new JumpToAddress("lr", true, false),
+ "0: e1 a0 f0 0e mov pc,lr", armOptions);
+ }
+
+ /**
+ * Test if ARM instruction parser raises CodeBufferUnderflow
+ */
+ @Test
+ public void testArmBufferUnderflow() {
+ System.out.println("\n============= ARM CodeBufferUnderflow ===============\n");
+ catchCodeBufferUnderflowException(0x0, "ea ff", armOptions);
+ }
+
+ /**
+ * Test for Thumb instructions.
+ */
+ @Test
+ public void testThumbInstructions() {
+
+ System.out.println("\n======================= Thumb =======================\n");
+ String[] insts = {
+ "41 75", "adcs r5,r6",
+ "44 35", "add r5,r6",
+ "AD 1E", "add r5,sp,#0x78",
+ "B0 0E", "add sp,sp,#0x38",
+ "35 87", "adds r5,#0x87",
+ "1D F5", "adds r5,r6,#7",
+ "18 B5", "adds r5,r6,r2",
+ "A5 E1", "add r5,pc,#0x384",
+ "40 35", "ands r5,r6",
+ "41 35", "asrs r5,r6",
+ "17 F5", "asrs r5,r6,#0x1f",
+ "D1 FA", "bne 0xfffffff8",
+ "E7 F9", "b 0xfffffff6",
+ "43 B5", "bics r5,r6",
+ "BE 87", "bkpt #0x87",
+ "47 A8", "blx r5",
+ "47 28", "bx r5",
+ "B1 D5", "cbz r5,0x00000034",
+ "B9 CD", "cbnz r5,0x00000032",
+ "42 F5", "cmn r5,r6",
+ "2D 87", "cmp r5,#0x87",
+ "42 B5", "cmp r5,r6",
+ "42 B5", "cmp r5,r6",
+ "45 B1", "cmp r9,r6",
+ "B6 66", "cpsie ai",
+ "B6 73", "cpsid if",
+ "40 75", "eors r5,r6",
+ "BF 18", "it ne",
+ "BF 1C", "itt ne",
+ "BF 14", "ite ne",
+ "BF 1E", "ittt ne",
+ "BF 1A", "itte ne",
+ "BF 16", "itet ne",
+ "BF 12", "itee ne",
+ "BF 1F", "itttt ne",
+ "BF 1D", "ittte ne",
+ "BF 1B", "ittet ne",
+ "BF 19", "ittee ne",
+ "BF 17", "itett ne",
+ "BF 15", "itete ne",
+ "BF 13", "iteet ne",
+ "BF 11", "iteee ne",
+ "CD 81", "ldm r5!,{r0,r7}",
+ "CD A1", "ldm r5,{r0,r5,r7}",
+ "68 35", "ldr r5,[r6]",
+ "69 B5", "ldr r5,[r6,#0x18]",
+ "58 B5", "ldr r5,[r6,r2]",
+ "9D 00", "ldr r5,[sp]",
+ "9D 06", "ldr r5,[sp,#0x18]",
+ "4D 03", "ldr r5,[pc,#0xc] ; 0xc",
+ "5C B5", "ldrb r5,[r6,r2]",
+ "78 35", "ldrb r5,[r6]",
+ "7F F5", "ldrb r5,[r6,#0x1f]",
+ "5A B5", "ldrh r5,[r6,r2]",
+ "88 35", "ldrh r5,[r6]",
+ "8F 35", "ldrh r5,[r6,#0x38]",
+ "56 B5", "ldrsb r5,[r6,r2]",
+ "5E B5", "ldrsh r5,[r6,r2]",
+ "40 B5", "lsls r5,r6",
+ "06 F5", "lsls r5,r6,#27",
+ "40 F5", "lsrs r5,r6",
+ "0E F5", "lsrs r5,r6,#27",
+ "46 35", "mov r5,r6",
+ "25 87", "movs r5,#0x87",
+ "00 35", "movs r5,r6",
+ "43 7D", "muls r5,r7,r5",
+ "43 F5", "mvns r5,r6",
+ "BF 00", "nop",
+ "43 35", "orrs r5,r6",
+ "BD 81", "pop {r0,r7,pc}",
+ "B4 81", "push {r0,r7}",
+ "BA 35", "rev r5,r6",
+ "BA 75", "rev16 r5,r6",
+ "BA F5", "revsh r5,r6",
+ "41 F5", "rors r5,r6",
+ "42 75", "rsbs r5,r6,#0",
+ "41 B5", "sbcs r5,r6",
+ "B6 58", "setend be",
+ "B6 50", "setend le",
+ "BF 40", "sev",
+ "C5 81", "stm r5!,{r0,r7}",
+ "60 35", "str r5,[r6]",
+ "67 B5", "str r5,[r6,#0x78]",
+ "50 B5", "str r5,[r6,r2]",
+ "95 60", "str r5,[sp,#0x180]",
+ "75 F5", "strb r5,[r6,#0x17]",
+ "54 B5", "strb r5,[r6,r2]",
+ "52 B5", "strh r5,[r6,r2]",
+ "80 35", "strh r5,[r6]",
+ "87 75", "strh r5,[r6,#0x3a]",
+ "B0 AE", "sub sp,sp,#0xb8",
+ "3D 87", "subs r5,#0x87",
+ "1F F5", "subs r5,r6,#7",
+ "1A B5", "subs r5,r6,r2",
+ "DF 87", "svc #0x87",
+ "B2 75", "sxtb r5,r6",
+ "B2 35", "sxth r5,r6",
+ "42 35", "tst r5,r6",
+ "B2 F5", "uxtb r5,r6",
+ "B2 B5", "uxth r5,r6",
+ "BF 20", "wfe",
+ "BF 30", "wfi",
+ "BF 10", "yield",
+ "DE 80", "undefined",
+ };
+
+ disassembleInstArray(insts, thumbOptions);
+ }
+
+ /**
+ * Test for Thumb branching instructions.
+ */
+ @Test
+ public void testThumbBranches() {
+
+ thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, true);
+ thumbOptions.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, true);
+ System.out.println("\n=================== Thumb Branches ==================\n");
+ disassembleInst(0x00000000, "d0 fe", new JumpToAddress(0x00000000, false, false),
+ "0: d0 fe beq 0x00000000", thumbOptions);
+ disassembleInst(0x00000000, "e7 fe", new JumpToAddress(0x00000000, true, false),
+ "0: e7 fe b 0x00000000", thumbOptions);
+
+ disassembleInst(0x50019c,
+ "f7 ff ef 8c",
+ new JumpToAddress(0x005000b8, true, true),
+ "50019c: f7 ff ef 8c blx 0x005000b8",
+ thumbOptions);
+
+ // PC is at address with bit[1] != 0.
+ // JumpToAddress of BLX should have bit[1] == 0.
+ disassembleInst(0x50019a,
+ "f7 ff ef 8c",
+ new JumpToAddress(0x005000b4, true, true),
+ "50019a: f7 ff ef 8c blx 0x005000b4",
+ thumbOptions);
+
+ disassembleInst(0x00000000, "f7 ff ff fe", new JumpToAddress(0x00000000, true, true),
+ "0: f7 ff ff fe bl 0x00000000", thumbOptions);
+ disassembleInst(0x00000000, "f7 ff ef fe", new JumpToAddress(0x00000000, true, true),
+ "0: f7 ff ef fe blx 0x00000000", thumbOptions);
+
+ disassembleInst(0x00000000, "47 80", new JumpToAddress("r0", true, true),
+ "0: 47 80 blx r0", thumbOptions);
+ disassembleInst(0x00000000, "46 f7", new JumpToAddress("lr", true, false),
+ "0: 46 f7 mov pc,lr", thumbOptions);
+ }
+
+ /**
+ * Test if thumb instruction parser raises CodeBufferUnderflow
+ */
+ @Test
+ public void testThumbBufferUnderflow() {
+ System.out.println("\n============ Thumb CodeBufferUnderflow ==============\n");
+ catchCodeBufferUnderflowException(0x0, "f7", thumbOptions);
+ }
+
+
+ /**
+ */
+ @Test
+ public void test32BitArmV6KInstructions() {
+
+ System.out.println("\n================== ARMv6K Instructions ==================\n");
+
+ String[] insts = {
+ "F5 7F F0 1F", "clrex",
+ "E3 20 F0 FD", "nop", // dbg #13
+ "03 20 F0 FD", "nopeq", // dbgeq #13
+ "E3 20 F0 00", "nop", // nop
+ "03 20 F0 00", "nopeq", // nopeq
+ "E3 20 F0 04", "sev",
+ "03 20 F0 04", "seveq",
+ "E3 20 F0 02", "wfe",
+ "03 20 F0 02", "wfeeq",
+ "E3 20 F0 03", "wfi",
+ "03 20 F0 03", "wfieq",
+ "E3 20 F0 01", "yield",
+ "03 20 F0 01", "yieldeq",
+ };
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<String, Object> entry : armOptions.entrySet())
+ options.put(entry.getKey(), entry.getValue());
+ options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6K);
+ disassembleInstArray(insts, options);
+ }
+
+ /**
+ */
+ @Test
+ public void test32BitArmV6T2Instructions() {
+ System.out.println("\n================== ARMv6T2 Hint Instructions ==================\n");
+
+ String[] insts = {
+ "F5 7F F0 1F", "invalid opcode", // clrex
+ "E3 20 F0 FD", "nop", // dbg #13
+ "03 20 F0 FD", "nopeq", // dbgeq #13
+ "E3 20 F0 00", "nop", // nop
+ "03 20 F0 00", "nopeq", // nopeq
+ "E3 20 F0 04", "nop", // sev
+ "03 20 F0 04", "nopeq", // seveq
+ "E3 20 F0 02", "nop", // wfe
+ "03 20 F0 02", "nopeq", // wfeeq
+ "E3 20 F0 03", "nop", // wfi
+ "03 20 F0 03", "nopeq", // wfieq
+ "E3 20 F0 01", "nop", // yield
+ "03 20 F0 01", "nopeq", // yieldeq
+ };
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<String, Object> entry : armOptions.entrySet())
+ options.put(entry.getKey(), entry.getValue());
+ options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6T2);
+ disassembleInstArray(insts, options);
+ }
+
+ /**
+ */
+ @Test
+ public void test32BitArmV5Instructions() {
+
+ System.out.println("\n================== ARMv5 Instructions (Invalid) ==================\n");
+
+ String[] insts = {
+ "F5 7F F0 1F", "invalid opcode", // clrex
+ "E3 20 F0 FD", "invalid opcode", // dbg #13
+ "03 20 F0 FD", "invalid opcode", // dbgeq #13
+ "E3 20 F0 00", "invalid opcode", // nop
+ "03 20 F0 00", "invalid opcode", // nopeq
+ "E3 20 F0 04", "invalid opcode", // sev
+ "03 20 F0 04", "invalid opcode", // seveq
+ "E3 20 F0 02", "invalid opcode", // wfe
+ "03 20 F0 02", "invalid opcode", // wfeeq
+ "E3 20 F0 03", "invalid opcode", // wfi
+ "03 20 F0 03", "invalid opcode", // wfieq
+ "E3 20 F0 01", "invalid opcode", // yield
+ "03 20 F0 01", "invalid opcode", // yieldeq
+ };
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<String, Object> entry : armOptions.entrySet())
+ options.put(entry.getKey(), entry.getValue());
+ options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv5);
+ disassembleInstArray(insts, options);
+ }
+
+ /**
+ * Test for non-VFP, 32-bit THumb2 v6*, v7 instructions.
+ */
+ @Test
+ public void test32BitThumb2Instructions() {
+
+ System.out.println("\n===================== Thumb2 ========================\n");
+ String[] insts = {
+/// "E7 F1 23 F4", "undefined",
+/// "E7 F0 00 10", "undefined",
+ "F1 4A 05 71", "adc r5,r10,#0x71", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 4B 06 F7", "adc r6,r11,#0xf7", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 49 14 78", "adc r4,r9,#0x780078", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 48 13 FC", "adc r3,r8,#0xfc00fc", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 47 25 64", "adc r5,r7,#0x64006400", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 46 25 E3", "adc r5,r6,#0xe300e300", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 47 46 60", "adc r6,r7,#0xe0000000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 48 47 E0", "adc r7,r8,#0x70000000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 4A 05 60", "adc r5,r10,#0xe00000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 4A 45 60", "adc r5,r10,#0xe000", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 4A 65 60", "adc r5,r10,#0xe00", // 1111 0x01 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "EB 49 05 0A", "adc.w r5,r9,r10", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 48 14 A9", "adc.w r4,r8,r9,asr #6", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 47 03 48", "adc.w r3,r7,r8,lsl #1", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 46 02 17", "adc.w r2,r6,r7,lsr #32", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 49 75 F8", "adc.w r5,r9,r8,ror #31", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 48 05 39", "adc.w r5,r8,r9,rrx", // 1110 1011 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "F1 5A 05 71", "adcs r5,r10,#0x71", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 5B 06 F7", "adcs r6,r11,#0xf7", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 59 14 78", "adcs r4,r9,#0x780078", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 58 13 FC", "adcs r3,r8,#0xfc00fc", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 57 25 64", "adcs r5,r7,#0x64006400", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 56 25 E3", "adcs r5,r6,#0xe300e300", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 57 46 60", "adcs r6,r7,#0xe0000000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F1 58 47 E0", "adcs r7,r8,#0x70000000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 5A 05 60", "adcs r5,r10,#0xe00000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 5A 45 60", "adcs r5,r10,#0xe000", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "F5 5A 65 60", "adcs r5,r10,#0xe00", // 1111 0x01 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.1 T1
+ "EB 59 05 0A", "adcs.w r5,r9,r10", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 58 14 A9", "adcs.w r4,r8,r9,asr #6", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 57 03 48", "adcs.w r3,r7,r8,lsl #1", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 56 02 17", "adcs.w r2,r6,r7,lsr #32", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 59 75 F8", "adcs.w r5,r9,r8,ror #31", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "EB 58 05 39", "adcs.w r5,r8,r9,rrx", // 1110 1011 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.2 T2
+ "F2 0F 05 71", "add r5,pc,#0x71", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
+ "F2 0F 36 72", "add r6,pc,#0x372", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
+ "F6 0F 47 78", "add r7,pc,#0xc78", // 1111 0x10 0000 1111 0xxx xxxx xxxx xxxx // A8.6.10 T3
+ "F1 0A 05 71", "add.w r5,r10,#0x71", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 0B 06 F7", "add.w r6,r11,#0xf7", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 09 14 78", "add.w r4,r9,#0x780078", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 08 13 FC", "add.w r3,r8,#0xfc00fc", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 07 25 64", "add.w r5,r7,#0x64006400", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 06 25 E3", "add.w r5,r6,#0xe300e300", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 07 46 60", "add.w r6,r7,#0xe0000000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 08 47 E0", "add.w r7,r8,#0x70000000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 0A 05 60", "add.w r5,r10,#0xe00000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 0A 45 60", "add.w r5,r10,#0xe000", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 0A 65 60", "add.w r5,r10,#0xe00", // 1111 0x01 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "EB 09 05 0A", "add.w r5,r9,r10", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 08 14 A9", "add.w r4,r8,r9,asr #6", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 07 03 48", "add.w r3,r7,r8,lsl #1", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 06 02 17", "add.w r2,r6,r7,lsr #32", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 09 75 F8", "add.w r5,r9,r8,ror #31", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 08 05 39", "add.w r5,r8,r9,rrx", // 1110 1011 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.6 T3
+ "F1 0D 05 71", "add.w r5,sp,#0x71", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 06 F7", "add.w r6,sp,#0xf7", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 14 78", "add.w r4,sp,#0x780078", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 13 FC", "add.w r3,sp,#0xfc00fc", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 25 64", "add.w r5,sp,#0x64006400", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 25 E3", "add.w r5,sp,#0xe300e300", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 46 60", "add.w r6,sp,#0xe0000000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 0D 47 E0", "add.w r7,sp,#0x70000000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 0D 05 60", "add.w r5,sp,#0xe00000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 0D 45 60", "add.w r5,sp,#0xe000", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 0D 65 60", "add.w r5,sp,#0xe00", // 1111 0x01 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "EB 0D 05 0A", "add.w r5,sp,r10", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 0D 14 A9", "add.w r4,sp,r9,asr #6", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 0D 03 48", "add.w r3,sp,r8,lsl #1", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 0D 02 17", "add.w r2,sp,r7,lsr #32", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 0D 75 F8", "add.w r5,sp,r8,ror #31", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 0D 05 39", "add.w r5,sp,r9,rrx", // 1110 1011 0000 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "F1 1A 05 71", "adds.w r5,r10,#0x71", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 1B 06 F7", "adds.w r6,r11,#0xf7", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 19 14 78", "adds.w r4,r9,#0x780078", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 18 13 FC", "adds.w r3,r8,#0xfc00fc", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 17 25 64", "adds.w r5,r7,#0x64006400", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 16 25 E3", "adds.w r5,r6,#0xe300e300", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 17 46 60", "adds.w r6,r7,#0xe0000000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F1 18 47 E0", "adds.w r7,r8,#0x70000000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 1A 05 60", "adds.w r5,r10,#0xe00000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 1A 45 60", "adds.w r5,r10,#0xe000", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "F5 1A 65 60", "adds.w r5,r10,#0xe00", // 1111 0x01 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.4 T3
+ "EB 19 05 0A", "adds.w r5,r9,r10", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 18 14 A9", "adds.w r4,r8,r9,asr #6", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 17 03 48", "adds.w r3,r7,r8,lsl #1", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 16 02 17", "adds.w r2,r6,r7,lsr #32", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 19 75 F8", "adds.w r5,r9,r8,ror #31", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "EB 18 05 39", "adds.w r5,r8,r9,rrx", // 1110 1011 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.6 T3
+ "F1 1D 05 71", "adds.w r5,sp,#0x71", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 06 F7", "adds.w r6,sp,#0xf7", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 14 78", "adds.w r4,sp,#0x780078", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 13 FC", "adds.w r3,sp,#0xfc00fc", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 25 64", "adds.w r5,sp,#0x64006400", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 25 E3", "adds.w r5,sp,#0xe300e300", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 46 60", "adds.w r6,sp,#0xe0000000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F1 1D 47 E0", "adds.w r7,sp,#0x70000000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 1D 05 60", "adds.w r5,sp,#0xe00000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 1D 45 60", "adds.w r5,sp,#0xe000", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "F5 1D 65 60", "adds.w r5,sp,#0xe00", // 1111 0x01 0001 1101 0xxx xxxx xxxx xxxx // A8.6.8 T3
+ "EB 1D 05 0A", "adds.w r5,sp,r10", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 1D 14 A9", "adds.w r4,sp,r9,asr #6", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 1D 03 48", "adds.w r3,sp,r8,lsl #1", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 1D 02 17", "adds.w r2,sp,r7,lsr #32", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 1D 75 F8", "adds.w r5,sp,r8,ror #31", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "EB 1D 05 39", "adds.w r5,sp,r9,rrx", // 1110 1011 0001 1101 0xxx xxxx xxxx xxxx // A8.6.9 T3
+ "F2 0D 05 71", "addw r5,sp,#0x71", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
+ "F2 0D 36 72", "addw r6,sp,#0x372", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
+ "F6 0D 47 78", "addw r7,sp,#0xc78", // 1111 0x10 0000 1101 0xxx xxxx xxxx xxxx // A8.6.8 T4
+ "F0 0A 05 71", "and r5,r10,#0x71", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 0B 06 F7", "and r6,r11,#0xf7", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 09 14 78", "and r4,r9,#0x780078", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 08 13 FC", "and r3,r8,#0xfc00fc", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 07 25 64", "and r5,r7,#0x64006400", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 06 25 E3", "and r5,r6,#0xe300e300", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 07 46 60", "and r6,r7,#0xe0000000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 08 47 E0", "and r7,r8,#0x70000000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 0A 05 60", "and r5,r10,#0xe00000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 0A 45 60", "and r5,r10,#0xe000", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 0A 65 60", "and r5,r10,#0xe00", // 1111 0x00 0000 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "EA 09 05 0A", "and.w r5,r9,r10", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 08 14 A9", "and.w r4,r8,r9,asr #6", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 07 03 48", "and.w r3,r7,r8,lsl #1", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 06 02 17", "and.w r2,r6,r7,lsr #32", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 09 75 F8", "and.w r5,r9,r8,ror #31", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 08 05 39", "and.w r5,r8,r9,rrx", // 1110 1010 0000 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "F0 1A 05 71", "ands r5,r10,#0x71", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 1B 06 F7", "ands r6,r11,#0xf7", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 19 14 78", "ands r4,r9,#0x780078", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 18 13 FC", "ands r3,r8,#0xfc00fc", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 17 25 64", "ands r5,r7,#0x64006400", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 16 25 E3", "ands r5,r6,#0xe300e300", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 17 46 60", "ands r6,r7,#0xe0000000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F0 18 47 E0", "ands r7,r8,#0x70000000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 1A 05 60", "ands r5,r10,#0xe00000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 1A 45 60", "ands r5,r10,#0xe000", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "F4 1A 65 60", "ands r5,r10,#0xe00", // 1111 0x00 0001 xxxx 0xxx xxxx xxxx xxxx // A8.6.11 T1
+ "EA 19 05 0A", "ands.w r5,r9,r10", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 18 14 A9", "ands.w r4,r8,r9,asr #6", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 17 03 48", "ands.w r3,r7,r8,lsl #1", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 16 02 17", "ands.w r2,r6,r7,lsr #32", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 19 75 F8", "ands.w r5,r9,r8,ror #31", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 18 05 39", "ands.w r5,r8,r9,rrx", // 1110 1010 0001 xxxx .xxx xxxx xxxx xxxx // A8.6.12 T2
+ "EA 4F 45 69", "asr.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
+ "EA 4F 06 28", "asr.w r6,r8,#32", // 1110 1010 0100 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
+ "FA 49 F5 0A", "asr.w r5,r9,r10", // 1111 1010 0100 xxxx 1111 xxxx 0000 xxxx // A8.6.15 T2
+ "EA 5F 45 69", "asrs.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
+ "EA 5F 06 28", "asrs.w r6,r8,#32", // 1110 1010 0101 1111 .xxx xxxx xx10 xxxx // A8.6.14 T2
+ "FA 59 F5 0A", "asrs.w r5,r9,r10", // 1111 1010 0101 xxxx 1111 xxxx 0000 xxxx // A8.6.15 T2
+ "F7 FF BF FE", "b.w 0xfffffffc", // 1111 0xxx xxxx xxxx 10x1 xxxx xxxx xxxx // A8.6.16 T4
+ "F4 3F AF FE", "beq.w 0x000ffffc", // 1111 0xxx xxxx xxxx 10x0 xxxx xxxx xxxx // A8.6.16 T3
+ "F3 6F 05 1F", "bfc r5,#0,#32", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
+ "F3 6F 06 59", "bfc r6,#1,#25", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
+ "F3 6F 77 DF", "bfc r7,#31,#1", // 1111 0011 0110 1111 0xxx xxxx xx.x xxxx // A8.6.17 T1
+ "F3 67 05 1F", "bfi r5,r7,#0,#32", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
+ "F3 68 06 59", "bfi r6,r8,#1,#25", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
+ "F3 69 77 DF", "bfi r7,r9,#31,#1", // 1111 0011 0110 xxxx 0xxx xxxx xx.x xxxx // A8.6.18 T1
+ "F0 2A 05 71", "bic r5,r10,#0x71", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 2B 06 F7", "bic r6,r11,#0xf7", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 29 14 78", "bic r4,r9,#0x780078", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 28 13 FC", "bic r3,r8,#0xfc00fc", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 27 25 64", "bic r5,r7,#0x64006400", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 26 25 E3", "bic r5,r6,#0xe300e300", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 27 46 60", "bic r6,r7,#0xe0000000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 28 47 E0", "bic r7,r8,#0x70000000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 2A 05 60", "bic r5,r10,#0xe00000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 2A 45 60", "bic r5,r10,#0xe000", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 2A 65 60", "bic r5,r10,#0xe00", // 1111 0x00 0010 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "EA 29 05 0A", "bic.w r5,r9,r10", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 28 14 A9", "bic.w r4,r8,r9,asr #6", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 27 03 48", "bic.w r3,r7,r8,lsl #1", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 26 02 17", "bic.w r2,r6,r7,lsr #32", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 29 75 F8", "bic.w r5,r9,r8,ror #31", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 28 05 39", "bic.w r5,r8,r9,rrx", // 1110 1010 001x xxxx 0xxx xxxx xxxx xxxx // A8.6.20 T2
+ "F0 3A 05 71", "bics r5,r10,#0x71", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 3B 06 F7", "bics r6,r11,#0xf7", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 39 14 78", "bics r4,r9,#0x780078", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 38 13 FC", "bics r3,r8,#0xfc00fc", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 37 25 64", "bics r5,r7,#0x64006400", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 36 25 E3", "bics r5,r6,#0xe300e300", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 37 46 60", "bics r6,r7,#0xe0000000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F0 38 47 E0", "bics r7,r8,#0x70000000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 3A 05 60", "bics r5,r10,#0xe00000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 3A 45 60", "bics r5,r10,#0xe000", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "F4 3A 65 60", "bics r5,r10,#0xe00", // 1111 0x00 0011 xxxx 0xxx xxxx xxxx xxxx // A8.6.19 T1
+ "EA 39 05 0A", "bics.w r5,r9,r10", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 38 14 A9", "bics.w r4,r8,r9,asr #6", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 37 03 48", "bics.w r3,r7,r8,lsl #1", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 36 02 17", "bics.w r2,r6,r7,lsr #32", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 39 75 F8", "bics.w r5,r9,r8,ror #31", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "EA 38 05 39", "bics.w r5,r8,r9,rrx", // 1110 1010 0011 xxxx .xxx xxxx xxxx xxxx // A8.6.20 T2
+ "F7 FF FF FE", "bl 0x00000000", // 1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx // A8.6.23 T1
+ "F7 FF EF FE", "blx 0x00000000", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
+ "F4 00 C0 3C", "blx 0xff00007c", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
+ "F3 C9 AF 00", "bxj r9", // 1111 0011 1100 xxxx 10.0 :::: .... .... // A8.6.26 T1
+ "EE C9 59 EA", "cdp p9,0xc,c5,c9,c10,0x7", // 1110 1110 xxxx xxxx xxxx xxxx xxx0 xxxx // A8.6.28 T1/A1
+ "FE 19 57 6A", "cdp2 p7,0x1,c5,c9,c10,0x3", // 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx // A8.6.28 T2/A2
+ "F3 BF 8F 2F", "clrex", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
+ "FA B9 F5 89", "clz r5,r9", // 1111 1010 1011 xxxx 1111 xxxx 1000 xxxx // A8.6.31 T1
+ "F1 15 0F 71", "cmn r5,#0x71", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 16 0F F7", "cmn r6,#0xf7", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 14 1F 78", "cmn r4,#0x780078", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 13 1F FC", "cmn r3,#0xfc00fc", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 15 2F 64", "cmn r5,#0x64006400", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 15 2F E3", "cmn r5,#0xe300e300", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 16 4F 60", "cmn r6,#0xe0000000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F1 17 4F E0", "cmn r7,#0x70000000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F5 15 0F 60", "cmn r5,#0xe00000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F5 15 4F 60", "cmn r5,#0xe000", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "F5 15 6F 60", "cmn r5,#0xe00", // 1111 0x01 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.32 T1
+ "EB 15 0F 09", "cmn.w r5,r9", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "EB 14 1F A8", "cmn.w r4,r8,asr #6", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "EB 13 0F 47", "cmn.w r3,r7,lsl #1", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "EB 12 0F 16", "cmn.w r2,r6,lsr #32", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "EB 15 7F F9", "cmn.w r5,r9,ror #31", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "EB 15 0F 38", "cmn.w r5,r8,rrx", // 1110 1011 0001 xxxx .xxx 1111 xxxx xxxx // A8.6.33 T2
+ "F1 B5 0F 71", "cmp.w r5,#0x71", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B6 0F F7", "cmp.w r6,#0xf7", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B4 1F 78", "cmp.w r4,#0x780078", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B3 1F FC", "cmp.w r3,#0xfc00fc", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B5 2F 64", "cmp.w r5,#0x64006400", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B5 2F E3", "cmp.w r5,#0xe300e300", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B6 4F 60", "cmp.w r6,#0xe0000000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F1 B7 4F E0", "cmp.w r7,#0x70000000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F5 B5 0F 60", "cmp.w r5,#0xe00000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F5 B5 4F 60", "cmp.w r5,#0xe000", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "F5 B5 6F 60", "cmp.w r5,#0xe00", // 1111 1x11 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.35 T2
+ "EB B5 0F 09", "cmp.w r5,r9", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "EB B4 1F A8", "cmp.w r4,r8,asr #6", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "EB B3 0F 47", "cmp.w r3,r7,lsl #1", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "EB B2 0F 16", "cmp.w r2,r6,lsr #32", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "EB B5 7F F9", "cmp.w r5,r9,ror #31", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "EB B5 0F 38", "cmp.w r5,r8,rrx", // 1110 1011 1011 xxxx .xxx 1111 xxxx xxxx // A8.6.36 T3
+ "F3 AF 81 00", "cps #0",
+ "F3 AF 81 1F", "cps #31",
+ "F3 AF 86 A0", "cpsid af", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 87 FF", "cpsid aif,#31", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 87 61", "cpsid if,#1", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 84 A0", "cpsie af", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 85 FF", "cpsie aif,#31", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 85 61", "cpsie if,#1", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F3 AF 80 F0", "dbg #0", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 AF 80 FD", "dbg #13", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 BF 8F 50", "dmb #0", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 52", "dmb oshst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 53", "dmb osh", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 56", "dmb nshst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 57", "dmb nsh", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5A", "dmb ishst", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5B", "dmb ish", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5E", "dmb st", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5F", "dmb sy", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 42", "dsb oshst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 43", "dsb osh", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 46", "dsb nshst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 47", "dsb nsh", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4A", "dsb ishst", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4B", "dsb ish", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4D", "dsb #13", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4E", "dsb st", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4F", "dsb sy", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+/// "F3 BF 8F 1F", "enterx", // 1111 0011 1011 :::: 10.0 :::: 0001 :::: // A9.3.1 T1
+ "F0 8A 05 71", "eor r5,r10,#0x71", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 8B 06 F7", "eor r6,r11,#0xf7", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 89 14 78", "eor r4,r9,#0x780078", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 88 13 FC", "eor r3,r8,#0xfc00fc", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 87 25 64", "eor r5,r7,#0x64006400", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 86 25 E3", "eor r5,r6,#0xe300e300", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 87 46 60", "eor r6,r7,#0xe0000000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 88 47 E0", "eor r7,r8,#0x70000000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 8A 05 60", "eor r5,r10,#0xe00000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 8A 45 60", "eor r5,r10,#0xe000", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 8A 65 60", "eor r5,r10,#0xe00", // 1111 0x00 1000 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "EA 89 05 0A", "eor.w r5,r9,r10", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 88 14 A9", "eor.w r4,r8,r9,asr #6", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 87 03 48", "eor.w r3,r7,r8,lsl #1", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 86 02 17", "eor.w r2,r6,r7,lsr #32", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 89 75 F8", "eor.w r5,r9,r8,ror #31", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 88 05 39", "eor.w r5,r8,r9,rrx", // 1110 1010 1000 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "F0 9A 05 71", "eors r5,r10,#0x71", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 9B 06 F7", "eors r6,r11,#0xf7", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 99 14 78", "eors r4,r9,#0x780078", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 98 13 FC", "eors r3,r8,#0xfc00fc", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 97 25 64", "eors r5,r7,#0x64006400", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 96 25 E3", "eors r5,r6,#0xe300e300", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 97 46 60", "eors r6,r7,#0xe0000000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F0 98 47 E0", "eors r7,r8,#0x70000000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 9A 05 60", "eors r5,r10,#0xe00000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 9A 45 60", "eors r5,r10,#0xe000", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "F4 9A 65 60", "eors r5,r10,#0xe00", // 1111 0x00 1001 xxxx 0xxx xxxx xxxx xxxx // A8.6.44 T1
+ "EA 99 05 0A", "eors.w r5,r9,r10", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 98 14 A9", "eors.w r4,r8,r9,asr #6", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 97 03 48", "eors.w r3,r7,r8,lsl #1", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 96 02 17", "eors.w r2,r6,r7,lsr #32", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 99 75 F8", "eors.w r5,r9,r8,ror #31", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "EA 98 05 39", "eors.w r5,r8,r9,rrx", // 1110 1010 1001 xxxx .xxx xxxx xxxx xxxx // A8.6.45 T2
+ "F3 BF 8F 60", "isb #0", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
+ "F3 BF 8F 6d", "isb #13", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
+ "F3 BF 8F 6F", "isb sy", // 1111 0011 1011 :::: 10.0 :::: 0110 xxxx // A8.6.49 T1
+ "ED 1A B9 00", "ldc p9,c11,[r10,#-0x0]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 3A B9 00", "ldc p9,c11,[r10,#-0x0]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 1A B9 21", "ldc p9,c11,[r10,#-0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 3A B9 21", "ldc p9,c11,[r10,#-0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 9A B9 21", "ldc p9,c11,[r10,#0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED BA B9 21", "ldc p9,c11,[r10,#0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC 3A B9 00", "ldc p9,c11,[r10],#-0x0", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC 3A B9 21", "ldc p9,c11,[r10],#-0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC BA B9 21", "ldc p9,c11,[r10],#0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 1F B9 00", "ldc p9,c11,[pc,#-0x0]", // 1110 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T1
+ "FD 1A B9 21", "ldc2 p9,c11,[r10,#-0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD 3A B9 21", "ldc2 p9,c11,[r10,#-0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD 9A B9 21", "ldc2 p9,c11,[r10,#0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD BA B9 21", "ldc2 p9,c11,[r10,#0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FC 3A B9 21", "ldc2 p9,c11,[r10],#-0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FC BA B9 21", "ldc2 p9,c11,[r10],#0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD 1F B9 00", "ldc2 p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
+ "FD 5A B9 21", "ldc2l p9,c11,[r10,#-0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD 7A B9 21", "ldc2l p9,c11,[r10,#-0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD DA B9 21", "ldc2l p9,c11,[r10,#0x84]", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD FA B9 21", "ldc2l p9,c11,[r10,#0x84]!", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FC 7A B9 21", "ldc2l p9,c11,[r10],#-0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FC FA B9 21", "ldc2l p9,c11,[r10],#0x84", // 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T2
+ "FD 5F B9 00", "ldc2l p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
+ "ED 5A B9 00", "ldcl p9,c11,[r10,#-0x0]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 7A B9 00", "ldcl p9,c11,[r10,#-0x0]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 5A B9 21", "ldcl p9,c11,[r10,#-0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 7A B9 21", "ldcl p9,c11,[r10,#-0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED DA B9 21", "ldcl p9,c11,[r10,#0x84]", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED FA B9 21", "ldcl p9,c11,[r10,#0x84]!", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC 7A B9 00", "ldcl p9,c11,[r10],#-0x0", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC 7A B9 21", "ldcl p9,c11,[r10],#-0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "EC FA B9 21", "ldcl p9,c11,[r10],#0x84", // 1110 110x xxx1 xxxx xxxx xxxx xxxx xxxx // A8.6.51 T1
+ "ED 5F B9 00", "ldcl p9,c11,[pc,#-0x0]", // 1111 110x xxx1 1111 xxxx xxxx xxxx xxxx // A8.6.52 T2
+ "E8 BA 42 40", "ldm.w r10!,{r6,r9,lr}", // 1110 1000 10x1 xxxx xx.x xxxx xxxx xxxx // A8.6.53 T2
+ "E8 9A 82 40", "ldm.w r10,{r6,r9,pc}", // 1110 1000 10x1 xxxx xx.x xxxx xxxx xxxx // A8.6.53 T2
+ "E9 3A 42 40", "ldmdb r10!,{r6,r9,lr}", // 1110 1001 00x1 xxxx xx.x xxxx xxxx xxxx // A8.6.55 T1
+ "E9 1A 82 40", "ldmdb r10,{r6,r9,pc}", // 1110 1001 00x1 xxxx xx.x xxxx xxxx xxxx // A8.6.55 T1
+ "F8 DA 50 00", "ldr.w r5,[r10]", // 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx // A8.6.57 T3
+ "F8 D6 47 89", "ldr.w r4,[r6,#0x789]", // 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx // A8.6.57 T3
+ "F8 5A 5C 80", "ldr r5,[r10,#-0x80]", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
+ "F8 5A 5A 82", "ldr r5,[r10],#0x82", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
+ "F8 5A 58 84", "ldr r5,[r10],#-0x84", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
+ "F8 5A 5F 86", "ldr r5,[r10,#0x86]!", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
+ "F8 5A 5D 88", "ldr r5,[r10,#-0x88]!", // 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx // A8.6.57 T4
+ "F8 DF 57 89", "ldr.w r5,[pc,#0x789] ; 0x789", // 1111 1000 x101 1111 xxxx xxxx xxxx xxxx // A8.6.59 T2
+ "F8 5F 69 87", "ldr.w r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x101 1111 xxxx xxxx xxxx xxxx // A8.6.59 T2
+ "F8 5A 50 08", "ldr.w r5,[r10,r8]", // 1111 1000 0101 xxxx xxxx 0000 00xx xxxx // A8.6.60 T2
+ "F8 59 60 37", "ldr.w r6,[r9,r7,lsl #3]", // 1111 1000 0101 xxxx xxxx 0000 00xx xxxx // A8.6.60 T2
+ "F8 9A 50 00", "ldrb.w r5,[r10]", // 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.61 T3
+ "F8 96 47 89", "ldrb.w r4,[r6,#0x789]", // 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.61 T3
+ "F8 1A 5C 80", "ldrb r5,[r10,#-0x80]", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
+ "F8 1A 5A 82", "ldrb r5,[r10],#0x82", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
+ "F8 1A 58 84", "ldrb r5,[r10],#-0x84", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
+ "F8 1A 5F 86", "ldrb r5,[r10,#0x86]!", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
+ "F8 1A 5D 88", "ldrb r5,[r10,#-0x88]!", // 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.61 T4
+ "F8 9F 57 89", "ldrb r5,[pc,#0x789] ; 0x789", // 1111 1000 0001 1111 xxxx xxxx xxxx xxxx // A8.6.63 T1
+ "F8 1F 69 87", "ldrb r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x001 1111 xxxx xxxx xxxx xxxx // A8.6.63 T1
+ "F8 1A 50 08", "ldrb.w r5,[r10,r8]", // 1111 1000 0001 xxxx xxxx 0000 00xx xxxx // A8.6.64 T2
+ "F8 19 60 37", "ldrb.w r6,[r9,r7,lsl #3]", // 1111 1000 0001 xxxx xxxx 0000 00xx xxxx // A8.6.64 T2
+ "F8 1A 5E 00", "ldrbt r5,[r10]", // 1111 1000 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.65 T1
+ "F8 19 6E 84", "ldrbt r6,[r9,#0x84]", // 1111 1000 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.65 T1
+ "E9 5A 67 84", "ldrd r6,r7,[r10,#-0x210]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E9 7A 67 85", "ldrd r6,r7,[r10,#-0x214]!", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E9 DA 67 84", "ldrd r6,r7,[r10,#0x210]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E9 FA 67 85", "ldrd r6,r7,[r10,#0x214]!", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E9 5A 67 00", "ldrd r6,r7,[r10]", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E8 7A 67 84", "ldrd r6,r7,[r10],#-0x210", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E8 FA 67 85", "ldrd r6,r7,[r10],#0x214", // 1110 100p u1w1 xxxx xxxx xxxx xxxx xxxx // A8.6.66 T1
+ "E9 5F 67 00", "ldrd r6,r7,[pc,#-0x0]", // 1110 100p u1w1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
+ "E9 5F 67 84", "ldrd r6,r7,[pc,#-0x210]", // 1110 100x x1x1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
+ "E9 DF 67 85", "ldrd r6,r7,[pc,#0x214]", // 1110 100x x1x1 1111 xxxx xxxx xxxx xxxx // A8.6.67 T1
+ "E8 5A 5F 00", "ldrex r5,[r10]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.69 T1
+ "E8 59 6F 87", "ldrex r6,[r9,#0x21c]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.69 T1
+ "E8 DA 5F 4F", "ldrexb r5,[r10]", // 1110 1000 1101 xxxx xxxx :::: 0100 :::: // A8.6.70 T1
+ "E8 DA 56 7F", "ldrexd r5,r6,[r10]", // 1110 1000 1101 xxxx xxxx xxxx 0111 :::: // A8.6.71 T1
+ "E8 DA 5F 5F", "ldrexh r5,[r10]", // 1110 1000 1101 xxxx xxxx :::: 0101 :::: // A8.6.72 T1
+ "F8 BA 50 00", "ldrh.w r5,[r10]", // 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.73 T3
+ "F8 B6 47 89", "ldrh.w r4,[r6,#0x789]", // 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.73 T3
+ "F8 3A 5C 80", "ldrh r5,[r10,#-0x80]", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
+ "F8 3A 5A 82", "ldrh r5,[r10],#0x82", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
+ "F8 3A 58 84", "ldrh r5,[r10],#-0x84", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
+ "F8 3A 5F 86", "ldrh r5,[r10,#0x86]!", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
+ "F8 3A 5D 88", "ldrh r5,[r10,#-0x88]!", // 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.73 T4
+ "F8 BF 57 89", "ldrh r5,[pc,#0x789] ; 0x789", // 1111 1000 x011 1111 xxxx xxxx xxxx xxxx // A8.6.75 T1
+ "F8 3F 69 87", "ldrh r6,[pc,#-0x987] ; 0xfffff679", // 1111 1000 x011 1111 xxxx xxxx xxxx xxxx // A8.6.75 T1
+ "F8 3A 50 08", "ldrh.w r5,[r10,r8]", // 1111 1000 0011 xxxx xxxx 0000 00xx xxxx // A8.6.76 T2
+ "F8 39 60 37", "ldrh.w r6,[r9,r7,lsl #3]", // 1111 1000 0011 xxxx xxxx 0000 00xx xxxx // A8.6.76 T2
+ "F8 3A 5E 00", "ldrht r5,[r10]", // 1111 1000 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.77 T1
+ "F8 39 6E 84", "ldrht r6,[r9,#0x84]", // 1111 1000 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.77 T1
+ "F9 9A 50 00", "ldrsb r5,[r10]", // 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.78 T1
+ "F9 96 47 89", "ldrsb r4,[r6,#0x789]", // 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx // A8.6.78 T1
+ "F9 1A 5C 80", "ldrsb r5,[r10,#-0x80]", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
+ "F9 1A 5A 82", "ldrsb r5,[r10],#0x82", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
+ "F9 1A 58 84", "ldrsb r5,[r10],#-0x84", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
+ "F9 1A 5F 86", "ldrsb r5,[r10,#0x86]!", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
+ "F9 1A 5D 88", "ldrsb r5,[r10,#-0x88]!", // 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx // A8.6.78 T2
+ "F9 9F 57 89", "ldrsb r5,[pc,#0x789] ; 0x789", // 1111 1001 x001 1111 xxxx xxxx xxxx xxxx // A8.6.79 T1
+ "F9 1F 69 87", "ldrsb r6,[pc,#-0x987] ; 0xfffff679", // 1111 1001 x001 1111 xxxx xxxx xxxx xxxx // A8.6.79 T1
+ "F9 1A 50 08", "ldrsb.w r5,[r10,r8]", // 1111 1001 0001 xxxx xxxx 0000 00xx xxxx // A8.6.80 T2
+ "F9 19 60 37", "ldrsb.w r6,[r9,r7,lsl #3]", // 1111 1001 0001 xxxx xxxx 0000 00xx xxxx // A8.6.80 T2
+ "F9 1A 5E 00", "ldrsbt r5,[r10]", // 1111 1001 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.81 T1
+ "F9 19 6E 84", "ldrsbt r6,[r9,#0x84]", // 1111 1001 0001 xxxx xxxx 1110 xxxx xxxx // A8.6.81 T1
+ "F9 BA 50 00", "ldrsh r5,[r10]", // 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.82 T1
+ "F9 B6 47 89", "ldrsh r4,[r6,#0x789]", // 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx // A8.6.82 T1
+ "F9 3A 5C 80", "ldrsh r5,[r10,#-0x80]", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
+ "F9 3A 5A 82", "ldrsh r5,[r10],#0x82", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
+ "F9 3A 58 84", "ldrsh r5,[r10],#-0x84", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
+ "F9 3A 5F 86", "ldrsh r5,[r10,#0x86]!", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
+ "F9 3A 5D 88", "ldrsh r5,[r10,#-0x88]!", // 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx // A8.6.82 T2
+ "F9 BF 57 89", "ldrsh r5,[pc,#0x789] ; 0x789", // 1111 1001 x011 1111 xxxx xxxx xxxx xxxx // A8.6.83 T1
+ "F9 3F 69 87", "ldrsh r6,[pc,#-0x987] ; 0xfffff679", // 1111 1001 x011 1111 xxxx xxxx xxxx xxxx // A8.6.83 T1
+ "F9 3A 50 08", "ldrsh.w r5,[r10,r8]", // 1111 1001 0011 xxxx xxxx 0000 00xx xxxx // A8.6.84 T2
+ "F9 39 60 37", "ldrsh.w r6,[r9,r7,lsl #3]", // 1111 1001 0011 xxxx xxxx 0000 00xx xxxx // A8.6.84 T2
+ "F9 3A 5E 00", "ldrsht r5,[r10]", // 1111 1001 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.85 T1
+ "F9 36 4E 89", "ldrsht r4,[r6,#0x89]", // 1111 1001 0011 xxxx xxxx 1110 xxxx xxxx // A8.6.85 T1
+ "F8 5A 5E 00", "ldrt r5,[r10]", // 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx // A8.6.86 T3
+ "F8 56 4E 89", "ldrt r4,[r6,#0x89]", // 1111 1000 0101 xxxx xxxx 1110 xxxx xxxx // A8.6.86 T3
+/// "F3 BF 8F 0F", "leavex", // 1111 0011 1011 :::: 10.0 :::: 0000 :::: // A9.3.1 T1
+ "EA 4F 45 49", "lsl.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx00 xxxx // A8.6.88 T2
+ "EA 4F 06 48", "lsl.w r6,r8,#1", // 1110 1010 0100 1111 .xxx xxxx xx00 xxxx // A8.6.88 T2
+ "FA 09 F5 0A", "lsl.w r5,r9,r10", // 1111 1010 0000 xxxx 1111 xxxx 0000 xxxx // A8.6.89 T2
+ "EA 5F 45 49", "lsls.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx00 xxxx // A8.6.89 T2
+ "EA 5F 06 48", "lsls.w r6,r8,#1", // 1110 1010 0101 1111 .xxx xxxx xx00 xxxx // A8.6.89 T2
+ "FA 19 F5 0A", "lsls.w r5,r9,r10", // 1111 1010 0001 xxxx 1111 xxxx 0000 xxxx // A8.6.89 T2
+ "EA 4F 45 59", "lsr.w r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
+ "EA 4F 06 18", "lsr.w r6,r8,#32", // 1110 1010 0100 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
+ "FA 29 F5 0A", "lsr.w r5,r9,r10", // 1111 1010 0010 xxxx 1111 xxxx 0000 xxxx // A8.6.91 T2
+ "EA 5F 45 59", "lsrs.w r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
+ "EA 5F 06 18", "lsrs.w r6,r8,#32", // 1110 1010 0101 1111 .xxx xxxx xx01 xxxx // A8.6.90 T2
+ "FA 39 F5 0A", "lsrs.w r5,r9,r10", // 1111 1010 0011 xxxx 1111 xxxx 0000 xxxx // A8.6.91 T2
+ "EE C9 59 FA", "mcr p9,0x6,r5,c9,c10,0x7", // 1110 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx // A8.6.92 T1/A1
+ "FE C9 59 FA", "mcr2 p9,0x6,r5,c9,c10,0x7", // 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx // A8.6.92 T2/A2
+ "EC 46 59 C9", "mcrr p9,0xc,r5,r6,c9", // 1110 1100 0100 xxxx xxxx xxxx xxxx xxxx // A8.6.93 T1/A1
+ "FC 46 59 C9", "mcrr2 p9,0xc,r5,r6,c9", // 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx // A8.6.93 T2/A2
+ "FB 09 85 0A", "mla r5,r9,r10,r8", // 1111 1011 0000 xxxx xxxx xxxx 0000 xxxx // A8.6.94 T1
+ "FB 09 85 1A", "mls r5,r9,r10,r8", // 1111 1011 0000 xxxx xxxx xxxx 0001 xxxx // A8.6.95 T1
+ "F0 4F 05 71", "mov.w r5,#0x71", // 1111 0x00 010x 1111 0xxx xxxx xxxx xxxx // A8.6.96 T2
+ "EA 4F 05 0A", "mov.w r5,r10", // 1110 1010 010x 1111 .000 xxxx 0000 xxxx // A8.6.97 T3
+ "F0 5F 05 73", "movs.w r5,#0x73", // 1111 0x00 010x 1111 0xxx xxxx xxxx xxxx // A8.6.96 T2
+ "EA 5F 05 0A", "movs.w r5,r10", // 1110 1010 010x 1111 .000 xxxx 0000 xxxx // A8.6.97 T3
+ "F2 C0 25 87", "movt r5,#0x287", // 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.99 T1
+ "F6 C6 35 89", "movt r5,#0x6b89", // 1111 0x10 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.99 T1
+ "F2 40 25 87", "movw r5,#0x287", // 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.96 T3
+ "F6 46 35 89", "movw r5,#0x6b89", // 1111 0x10 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.96 T3
+ "EE D5 F9 B9", "mrc p9,0x6,apsr_nzcv,c5,c9,0x5", // 1110 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T1/A1
+ "EE F5 59 99", "mrc p9,0x7,r5,c5,c9,0x4", // 1110 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T1/A1
+ "FE 95 F9 F9", "mrc2 p9,0x4,apsr_nzcv,c5,c9,0x7", // 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T2/A2
+ "FE B5 59 D9", "mrc2 p9,0x5,r5,c5,c9,0x6", // 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx // A8.6.100 T2/A2
+ "EC 56 59 F9", "mrrc p9,0xf,r5,r6,c9", // 1110 1100 0101 xxxx xxxx xxxx xxxx xxxx // A8.6.101 T1/A1
+ "FC 56 59 39", "mrrc2 p9,0x3,r5,r6,c9", // 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx // A8.6.101 T2/A2
+ "F3 EF 85 00", "mrs r5,cpsr", // 1111 0011 1110 :::: 10.0 xxxx .... .... // A8.6.102 T1
+ "F3 FF 85 00", "mrs r5,spsr", // 1111 0011 1110 :::: 10.0 xxxx .... .... // B6.1.5 T1
+ "F3 8A 88 00", "msr cpsr_f,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
+ "F3 8A 84 00", "msr cpsr_s,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
+ "F3 8A 8C 00", "msr cpsr_fs,r10", // 1111 0011 100x xxxx 10.0 xx00 .... .... // A8.6.104 T1
+ "F3 8A 8F 00", "msr cpsr_cxfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
+ "F3 8A 8E 00", "msr cpsr_xfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
+ "F3 8A 8D 00", "msr cpsr_cfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
+ "F3 9A 8F 00", "msr spsr_cxfs,r10", // 1111 0011 100x xxxx 10.0 xxxx .... .... // B6.1.7 T1
+ "FB 09 F5 0A", "mul r5,r9,r10", // 1111 1011 0000 xxxx 1111 xxxx 0000 xxxx // A8.6.105 T2
+ "F0 6F 05 71", "mvn r5,#0x71", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 05 F7", "mvn r5,#0xf7", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 15 78", "mvn r5,#0x780078", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 15 FC", "mvn r5,#0xfc00fc", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 25 64", "mvn r5,#0x64006400", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 25 E3", "mvn r5,#0xe300e300", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 45 60", "mvn r5,#0xe0000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 6F 45 E0", "mvn r5,#0x70000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 6F 05 60", "mvn r5,#0xe00000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 6F 45 60", "mvn r5,#0xe000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 6F 65 60", "mvn r5,#0xe00", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "EA 6F 05 09", "mvn.w r5,r9", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 6F 14 A8", "mvn.w r4,r8,asr #6", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 6F 03 47", "mvn.w r3,r7,lsl #1", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 6F 02 16", "mvn.w r2,r6,lsr #32", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 6F 75 F9", "mvn.w r5,r9,ror #31", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 6F 05 38", "mvn.w r5,r8,rrx", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "F0 7F 05 71", "mvns r5,#0x71", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 05 F7", "mvns r5,#0xf7", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 15 78", "mvns r5,#0x780078", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 15 FC", "mvns r5,#0xfc00fc", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 25 64", "mvns r5,#0x64006400", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 25 E3", "mvns r5,#0xe300e300", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 45 60", "mvns r5,#0xe0000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F0 7F 45 E0", "mvns r5,#0x70000000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 7F 05 60", "mvns r5,#0xe00000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 7F 45 60", "mvns r5,#0xe000", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "F4 7F 65 60", "mvns r5,#0xe00", // 1111 0x00 011x 1111 0xxx xxxx xxxx xxxx // A8.6.106 T1
+ "EA 7F 05 09", "mvns.w r5,r9", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 7F 14 A8", "mvns.w r4,r8,asr #6", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 7F 03 47", "mvns.w r3,r7,lsl #1", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 7F 02 16", "mvns.w r2,r6,lsr #32", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 7F 75 F9", "mvns.w r5,r9,ror #31", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "EA 7F 05 38", "mvns.w r5,r8,rrx", // 1110 1010 011x 1111 0xxx xxxx xxxx xxxx // A8.6.107 T2
+ "F3 AF 80 00", "nop.w", // 1111 0011 0110 :::: 10.0 .xxx xxxx xxxx // B6.1.1 T2
+ "F0 6A 05 71", "orn r5,r10,#0x71", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 6B 06 F7", "orn r6,r11,#0xf7", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 69 14 78", "orn r4,r9,#0x780078", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 68 13 FC", "orn r3,r8,#0xfc00fc", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 67 25 64", "orn r5,r7,#0x64006400", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 66 25 E3", "orn r5,r6,#0xe300e300", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 67 46 60", "orn r6,r7,#0xe0000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 68 47 E0", "orn r7,r8,#0x70000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 6A 05 60", "orn r5,r10,#0xe00000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 6A 45 60", "orn r5,r10,#0xe000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 6A 65 60", "orn r5,r10,#0xe00", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "EA 69 05 0A", "orn r5,r9,r10", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 68 14 A9", "orn r4,r8,r9,asr #6", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 67 03 48", "orn r3,r7,r8,lsl #1", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 66 02 17", "orn r2,r6,r7,lsr #32", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 69 75 F8", "orn r5,r9,r8,ror #31", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 68 05 39", "orn r5,r8,r9,rrx", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "F0 7A 05 71", "orns r5,r10,#0x71", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 7B 06 F7", "orns r6,r11,#0xf7", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 79 14 78", "orns r4,r9,#0x780078", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 78 13 FC", "orns r3,r8,#0xfc00fc", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 77 25 64", "orns r5,r7,#0x64006400", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 76 25 E3", "orns r5,r6,#0xe300e300", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 77 46 60", "orns r6,r7,#0xe0000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F0 78 47 E0", "orns r7,r8,#0x70000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 7A 05 60", "orns r5,r10,#0xe00000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 7A 45 60", "orns r5,r10,#0xe000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "F4 7A 65 60", "orns r5,r10,#0xe00", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.111 T1
+ "EA 79 05 0A", "orns r5,r9,r10", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 78 14 A9", "orns r4,r8,r9,asr #6", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 77 03 48", "orns r3,r7,r8,lsl #1", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 76 02 17", "orns r2,r6,r7,lsr #32", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 79 75 F8", "orns r5,r9,r8,ror #31", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "EA 78 05 39", "orns r5,r8,r9,rrx", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.112 T2
+ "F0 4A 05 71", "orr r5,r10,#0x71", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 4B 06 F7", "orr r6,r11,#0xf7", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 49 14 78", "orr r4,r9,#0x780078", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 48 13 FC", "orr r3,r8,#0xfc00fc", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 47 25 64", "orr r5,r7,#0x64006400", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 46 25 E3", "orr r5,r6,#0xe300e300", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 47 46 60", "orr r6,r7,#0xe0000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 48 47 E0", "orr r7,r8,#0x70000000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 4A 05 60", "orr r5,r10,#0xe00000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 4A 45 60", "orr r5,r10,#0xe000", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 4A 65 60", "orr r5,r10,#0xe00", // 1111 0x00 0100 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "EA 49 05 0A", "orr.w r5,r9,r10", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 48 14 A9", "orr.w r4,r8,r9,asr #6", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 47 03 48", "orr.w r3,r7,r8,lsl #1", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 46 02 17", "orr.w r2,r6,r7,lsr #32", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 49 75 F8", "orr.w r5,r9,r8,ror #31", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 48 05 39", "orr.w r5,r8,r9,rrx", // 1110 1010 0100 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "F0 5A 05 71", "orrs r5,r10,#0x71", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 5B 06 F7", "orrs r6,r11,#0xf7", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 59 14 78", "orrs r4,r9,#0x780078", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 58 13 FC", "orrs r3,r8,#0xfc00fc", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 57 25 64", "orrs r5,r7,#0x64006400", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 56 25 E3", "orrs r5,r6,#0xe300e300", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 57 46 60", "orrs r6,r7,#0xe0000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F0 58 47 E0", "orrs r7,r8,#0x70000000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 5A 05 60", "orrs r5,r10,#0xe00000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 5A 45 60", "orrs r5,r10,#0xe000", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "F4 5A 65 60", "orrs r5,r10,#0xe00", // 1111 0x00 0101 xxxx 0xxx xxxx xxxx xxxx // A8.6.113 T1
+ "EA 59 05 0A", "orrs.w r5,r9,r10", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 58 14 A9", "orrs.w r4,r8,r9,asr #6", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 57 03 48", "orrs.w r3,r7,r8,lsl #1", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 56 02 17", "orrs.w r2,r6,r7,lsr #32", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 59 75 F8", "orrs.w r5,r9,r8,ror #31", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA 58 05 39", "orrs.w r5,r8,r9,rrx", // 1110 1010 0101 xxxx .xxx xxxx xxxx xxxx // A8.6.114 T2
+ "EA C9 05 0A", "pkhbt r5,r9,r10", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
+ "EA C7 03 48", "pkhbt r3,r7,r8,lsl #1", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
+ "EA C8 64 A9", "pkhtb r4,r8,r9,asr #26", // 1110 1010 1100 xxxx .xxx xxxx xxx0 xxxx // A8.6.116 T1
+ "F8 9A F9 87", "pld [r10,#0x987]", // 1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx // A8.6.117 T1
+ "F8 1A FC 71", "pld [r10,#-0x71]", // 1111 1000 00x1 xxxx 1111 1100 xxxx xxxx // A8.6.117 T2
+ "F8 1F F9 87", "pld [pc,#-0x987] ; 0xfffff679", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
+ "F8 9F F9 87", "pld [pc,#0x987] ; 0x987", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
+ "F8 1A F0 19", "pld [r10,r9,lsl #1]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F8 1A F0 39", "pld [r10,r9,lsl #3]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F8 1A F0 09", "pld [r10,r9]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F8 BA F9 87", "pldw [r10,#0x987]", // 1111 1000 10x1 xxxx 1111 xxxx xxxx xxxx // A8.6.117 T1
+ "F8 3A FC 71", "pldw [r10,#-0x71]", // 1111 1000 00x1 xxxx 1111 1100 xxxx xxxx // A8.6.117 T2
+ "F8 3F F9 87", "pld [pc,#-0x987] ; 0xfffff679", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
+ "F8 BF F9 87", "pld [pc,#0x987] ; 0x987", // 1111 1000 x0x1 1111 1111 xxxx xxxx xxxx // A8.6.118 T1
+ "F8 3A F0 19", "pldw [r10,r9,lsl #1]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F8 3A F0 39", "pldw [r10,r9,lsl #3]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F8 3A F0 09", "pldw [r10,r9]", // 1111 1000 00x1 xxxx 1111 0000 00xx xxxx // A8.6.119 T1
+ "F9 9A F9 87", "pli [r10,#0x987]", // 1111 1000 1001 xxxx 1111 xxxx xxxx xxxx // A8.6.120 T1
+ "F9 1A FC 71", "pli [r10,#-0x71]", // 1111 1001 0001 xxxx 1111 1100 xxxx xxxx // A8.6.120 T2
+ "F9 1F F9 87", "pli [pc,#-0x987] ; 0xfffff679", // 1111 1001 x001 1111 1111 xxxx xxxx xxxx // A8.6.120 T3
+ "F9 9F F9 87", "pli [pc,#0x987] ; 0x987", // 1111 1001 x001 1111 1111 xxxx xxxx xxxx // A8.6.120 T3
+ "F9 1A F0 19", "pli [r10,r9,lsl #1]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
+ "F9 1A F0 39", "pli [r10,r9,lsl #3]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
+ "F9 1A F0 09", "pli [r10,r9]", // 1111 1001 0001 xxxx 1111 0000 00xx xxxx // A8.6.121 T1
+ "E8 BD 82 40", "pop.w {r6,r9,pc}", // 1110 1000 1011 1101 xx.x xxxx xxxx xxxx // A8.6.122 T2
+ "F8 5D EB 04", "pop.w {lr}", // 1111 1000 0101 1101 xxxx 1011 0000 0100 // A8.6.122 T3
+ "E8 AD 12 40", "push.w {r6,r9,r12}", // 1110 1000 1010 1101 .x.x xxxx xxxx xxxx // A8.6.123 T2
+ "F8 4D ED 04", "push.w {lr}", // 1111 1000 0100 1101 xxxx 1101 0000 0100 // A8.6.123 T3
+ "FA 89 F5 8A", "qadd r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1000 xxxx // A8.6.124 T1
+ "FA 99 F5 1A", "qadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0001 xxxx // A8.6.125 T1
+ "FA 89 F5 1A", "qadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0001 xxxx // A8.6.126 T1
+ "FA A9 F5 1A", "qasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0001 xxxx // A8.6.127 T1
+ "FA 89 F5 9A", "qdadd r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1001 xxxx // A8.6.128 T1
+ "FA 89 F5 BA", "qdsub r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 1011 xxxx // A8.6.129 T1
+ "FA E9 F5 1A", "qsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0001 xxxx // A8.6.130 T1
+ "FA 89 F5 AA", "qsub r5,r10,r9", // 1111 1010 1000 xxxx 1111 xxxx 101A xxxx // A8.6.131 T1
+ "FA D9 F5 1A", "qsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0001 xxxx // A8.6.132 T1
+ "FA C9 F5 1A", "qsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0001 xxxx // A8.6.133 T1
+ "FA 99 F5 A9", "rbit r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1010 xxxx // A8.6.134 T1
+ "FA 99 F5 89", "rev.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1000 xxxx // A8.6.135 T1
+ "FA 99 F5 99", "rev16.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1001 xxxx // A8.6.136 T2
+ "FA 99 F5 B9", "revsh.w r5,r9", // 1111 1010 1001 xxxx 1111 xxxx 1011 xxxx // A8.6.137 T2
+ "E8 1A C0 00", "rfedb r10", // 1110 1000 00x1 xxxx ::.. .... .... .... // B6.1.8 T1
+ "E8 3A C0 00", "rfedb r10!", // 1110 1000 00x1 xxxx ::.. .... .... .... // B6.1.8 T1
+ "E9 9A C0 00", "rfeia r10", // 1110 1001 10x1 xxxx ::.. .... .... .... // B6.1.8 T1
+ "E9 BA C0 00", "rfeia r10!", // 1110 1001 10x1 xxxx ::.. .... .... .... // B6.1.8 T1
+ "EA 4F 45 79", "ror r5,r9,#17", // 1110 1010 0100 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
+ "EA 4F 06 B8", "ror r6,r8,#2", // 1110 1010 0100 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
+ "FA 69 F5 0A", "ror.w r5,r9,r10", // 1111 1010 0110 xxxx 1111 xxxx 0000 xxxx // A8.6.140 T2
+ "EA 5F 45 79", "rors r5,r9,#17", // 1110 1010 0101 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
+ "EA 5F 06 B8", "rors r6,r8,#2", // 1110 1010 0101 1111 .xxx xxxx xx11 xxxx // A8.6.139 T1
+ "FA 79 F5 0A", "rors.w r5,r9,r10", // 1111 1010 0111 xxxx 1111 xxxx 0000 xxxx // A8.6.140 T2
+ "EA 4F 06 38", "rrx r6,r8", // 1110 1010 0100 1111 .000 xxxx 0011 xxxx // A8.6.141 T1
+ "EA 5F 06 38", "rrxs r6,r8", // 1110 1010 0100 1111 .000 xxxx 0011 xxxx // A8.6.141 T1
+ "F1 CA 05 71", "rsb.w r5,r10,#0x71", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 CB 06 F7", "rsb.w r6,r11,#0xf7", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C9 14 78", "rsb.w r4,r9,#0x780078", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C8 13 FC", "rsb.w r3,r8,#0xfc00fc", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C7 25 64", "rsb.w r5,r7,#0x64006400", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C6 25 E3", "rsb.w r5,r6,#0xe300e300", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C7 46 60", "rsb.w r6,r7,#0xe0000000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 C8 47 E0", "rsb.w r7,r8,#0x70000000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 CA 05 60", "rsb.w r5,r10,#0xe00000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 CA 45 60", "rsb.w r5,r10,#0xe000", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 CA 65 60", "rsb.w r5,r10,#0xe00", // 1111 0x01 1100 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "EB C9 05 0A", "rsb r5,r9,r10", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB C8 14 A9", "rsb r4,r8,r9,asr #6", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB C7 03 48", "rsb r3,r7,r8,lsl #1", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB C6 02 17", "rsb r2,r6,r7,lsr #32", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB C9 75 F8", "rsb r5,r9,r8,ror #31", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB C8 05 39", "rsb r5,r8,r9,rrx", // 1110 1011 1100 xxxx .xxx xxxx xxxx xxxx // A8.6.143 T1
+ "F1 DA 05 71", "rsbs.w r5,r10,#0x71", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 DB 06 F7", "rsbs.w r6,r11,#0xf7", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D9 14 78", "rsbs.w r4,r9,#0x780078", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D8 13 FC", "rsbs.w r3,r8,#0xfc00fc", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D7 25 64", "rsbs.w r5,r7,#0x64006400", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D6 25 E3", "rsbs.w r5,r6,#0xe300e300", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D7 46 60", "rsbs.w r6,r7,#0xe0000000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F1 D8 47 E0", "rsbs.w r7,r8,#0x70000000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 DA 05 60", "rsbs.w r5,r10,#0xe00000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 DA 45 60", "rsbs.w r5,r10,#0xe000", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "F5 DA 65 60", "rsbs.w r5,r10,#0xe00", // 1111 0x01 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.142 T2
+ "EB D9 05 0A", "rsbs r5,r9,r10", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB D8 14 A9", "rsbs r4,r8,r9,asr #6", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB D7 03 48", "rsbs r3,r7,r8,lsl #1", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB D6 02 17", "rsbs r2,r6,r7,lsr #32", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB D9 75 F8", "rsbs r5,r9,r8,ror #31", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "EB D8 05 39", "rsbs r5,r8,r9,rrx", // 1110 1011 1101 xxxx 0xxx xxxx xxxx xxxx // A8.6.143 T1
+ "FA 99 F5 0A", "sadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0000 xxxx // A8.6.148 T1
+ "FA 89 F5 0A", "sadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0000 xxxx // A8.6.149 T1
+ "FA A9 F5 0A", "sasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0000 xxxx // A8.6.150 T1
+ "F1 6A 05 71", "sbc r5,r10,#0x71", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 6B 06 F7", "sbc r6,r11,#0xf7", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 69 14 78", "sbc r4,r9,#0x780078", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 68 13 FC", "sbc r3,r8,#0xfc00fc", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 67 25 64", "sbc r5,r7,#0x64006400", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 66 25 E3", "sbc r5,r6,#0xe300e300", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 67 46 60", "sbc r6,r7,#0xe0000000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 68 47 E0", "sbc r7,r8,#0x70000000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 6A 05 60", "sbc r5,r10,#0xe00000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 6A 45 60", "sbc r5,r10,#0xe000", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 6A 65 60", "sbc r5,r10,#0xe00", // 1111 0x01 0110 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "EB 69 05 0A", "sbc.w r5,r9,r10", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 68 14 A9", "sbc.w r4,r8,r9,asr #6", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 67 03 48", "sbc.w r3,r7,r8,lsl #1", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 66 02 17", "sbc.w r2,r6,r7,lsr #32", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 69 75 F8", "sbc.w r5,r9,r8,ror #31", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 68 05 39", "sbc.w r5,r8,r9,rrx", // 1110 1011 0110 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "F1 7A 05 71", "sbcs r5,r10,#0x71", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 7B 06 F7", "sbcs r6,r11,#0xf7", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 79 14 78", "sbcs r4,r9,#0x780078", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 78 13 FC", "sbcs r3,r8,#0xfc00fc", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 77 25 64", "sbcs r5,r7,#0x64006400", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 76 25 E3", "sbcs r5,r6,#0xe300e300", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 77 46 60", "sbcs r6,r7,#0xe0000000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F1 78 47 E0", "sbcs r7,r8,#0x70000000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 7A 05 60", "sbcs r5,r10,#0xe00000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 7A 45 60", "sbcs r5,r10,#0xe000", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "F5 7A 65 60", "sbcs r5,r10,#0xe00", // 1111 0x01 0111 xxxx 0xxx xxxx xxxx xxxx // A8.6.151 T1
+ "EB 79 05 0A", "sbcs.w r5,r9,r10", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 78 14 A9", "sbcs.w r4,r8,r9,asr #6", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 77 03 48", "sbcs.w r3,r7,r8,lsl #1", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 76 02 17", "sbcs.w r2,r6,r7,lsr #32", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 79 75 F8", "sbcs.w r5,r9,r8,ror #31", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "EB 78 05 39", "sbcs.w r5,r8,r9,rrx", // 1110 1011 0111 xxxx .xxx xxxx xxxx xxxx // A8.6.152 T2
+ "F3 47 05 1F", "sbfx r5,r7,#0,#32", // 1111 0.11 0100 xxxx 0xxx xxxx xx.x xxxx // A8.6.154 T1
+ "F3 48 06 59", "sbfx r6,r8,#1,#26", // 1111 0.11 0100 xxxx 0xxx xxxx xx.x xxxx // A8.6.154 T1
+ "FB 99 F5 FA", "sdiv r5,r9,r10", // 1111 1011 1001 xxxx :::: xxxx 1111 xxxx // A8.6.155 T1
+ "FA A9 F5 8A", "sel r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 1000 xxxx // A8.6.156 T1
+ "F3 AF 80 04", "sev.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
+ "FA 99 F5 2A", "shadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0010 xxxx // A8.6.159 T1
+ "FA 89 F5 2A", "shadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0010 xxxx // A8.6.160 T1
+ "FA A9 F5 2A", "shasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0010 xxxx // A8.6.161 T1
+ "FA E9 F5 2A", "shsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0010 xxxx // A8.6.162 T1
+ "FA D9 F5 2A", "shsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0010 xxxx // A8.6.163 T1
+ "FA C9 F5 2A", "shsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0010 xxxx // A8.6.164 T1
+ "F7 FE 80 00", "smc #0xe", // 1111 0111 1111 xxxx 1000 .... .... .... // B6.1.9 T1
+ "FB 19 85 0A", "smlabb r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
+ "FB 19 85 1A", "smlabt r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
+ "FB 19 85 2A", "smlatb r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
+ "FB 19 85 3A", "smlatt r5,r9,r10,r8", // 1111 1011 0001 xxxx xxxx xxxx 00xx xxxx // A8.6.166 T1
+ "FB 29 85 0A", "smlad r5,r9,r10,r8", // 1111 1011 0010 xxxx xxxx xxxx 00xx xxxx // A8.6.167 T1
+ "FB 29 85 1A", "smladx r5,r9,r10,r8", // 1111 1011 0010 xxxx xxxx xxxx 00xx xxxx // A8.6.167 T1
+ "FB CA 56 09", "smlal r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 0000 xxxx // A8.6.168 T1
+ "FB CA 56 89", "smlalbb r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
+ "FB CA 56 99", "smlalbt r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
+ "FB CA 56 A9", "smlaltb r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
+ "FB CA 56 B9", "smlaltt r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 10xx xxxx // A8.6.169 T1
+ "FB CA 56 C9", "smlald r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 110x xxxx // A8.6.170 T1
+ "FB CA 56 D9", "smlaldx r5,r6,r10,r9", // 1111 1011 1100 xxxx xxxx xxxx 110x xxxx // A8.6.170 T1
+ "FB 39 85 0A", "smlawb r5,r9,r10,r8", // 1111 1011 0011 xxxx xxxx xxxx 000x xxxx // A8.6.171 T1
+ "FB 39 85 1A", "smlawt r5,r9,r10,r8", // 1111 1011 0011 xxxx xxxx xxxx 000x xxxx // A8.6.171 T1
+ "FB 49 85 0A", "smlsd r5,r9,r10,r8", // 1111 1011 0100 xxxx xxxx xxxx 000x xxxx // A8.6.172 T1
+ "FB 49 85 1A", "smlsdx r5,r9,r10,r8", // 1111 1011 0100 xxxx xxxx xxxx 000x xxxx // A8.6.172 T1
+ "FB DA 56 C9", "smlsld r5,r6,r10,r9", // 1111 1011 1101 xxxx xxxx xxxx 110x xxxx // A8.6.173 T1
+ "FB DA 56 D9", "smlsldx r5,r6,r10,r9", // 1111 1011 1101 xxxx xxxx xxxx 110x xxxx // A8.6.173 T1
+ "FB 59 85 0A", "smmla r5,r9,r10,r8", // 1111 1011 0101 xxxx xxxx xxxx 000x xxxx // A8.6.174 T1
+ "FB 59 85 1A", "smmlar r5,r9,r10,r8", // 1111 1011 0101 xxxx xxxx xxxx 000x xxxx // A8.6.174 T1
+ "FB 69 85 0A", "smmls r5,r9,r10,r8", // 1111 1011 0110 xxxx xxxx xxxx 000x xxxx // A8.6.175 T1
+ "FB 69 85 1A", "smmlsr r5,r9,r10,r8", // 1111 1011 0110 xxxx xxxx xxxx 000x xxxx // A8.6.175 T1
+ "FB 59 F5 0A", "smmul r5,r9,r10", // 1111 1011 0101 xxxx 1111 xxxx 000x xxxx // A8.6.176 T1
+ "FB 59 F5 1A", "smmulr r5,r9,r10", // 1111 1011 0101 xxxx 1111 xxxx 000x xxxx // A8.6.176 T1
+ "FB 29 F5 0A", "smuad r5,r9,r10", // 1111 1011 0010 xxxx 1111 xxxx 000x xxxx // A8.6.177 T1
+ "FB 29 F5 1A", "smuadx r5,r9,r10", // 1111 1011 0010 xxxx 1111 xxxx 000x xxxx // A8.6.177 T1
+ "FB 19 F5 0A", "smulbb r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
+ "FB 19 F5 1A", "smulbt r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
+ "FB 19 F5 2A", "smultb r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
+ "FB 19 F5 3A", "smultt r5,r9,r10", // 1111 1011 0001 xxxx 1111 xxxx 00xx xxxx // A8.6.178 T1
+ "FB 8A 56 09", "smull r5,r6,r10,r9", // 1111 1011 1000 xxxx xxxx xxxx 0000 xxxx // A8.6.179 T1
+ "FB 39 F5 0A", "smulwb r5,r9,r10", // 1111 1011 0011 xxxx 1111 xxxx 000x xxxx // A8.6.180 T1
+ "FB 39 F5 1A", "smulwt r5,r9,r10", // 1111 1011 0011 xxxx 1111 xxxx 000x xxxx // A8.6.180 T1
+ "FB 49 F5 0A", "smusd r5,r9,r10", // 1111 1011 0100 xxxx 1111 xxxx 000x xxxx // A8.6.181 T1
+ "FB 49 F5 1A", "smusdx r5,r9,r10", // 1111 1011 0100 xxxx 1111 xxxx 000x xxxx // A8.6.181 T1
+ "E8 2D C0 13", "srsdb sp!,#0x13", // 1110 1000 00x0 ::.: ::.. .... ...x xxxx // B6.1.10 T1
+ "E8 0D C0 13", "srsdb sp,#0x13", // 1110 1000 00x0 ::.: ::.. .... ...x xxxx // B6.1.10 T1
+ "E9 AD C0 13", "srsia sp!,#0x13", // 1110 1001 10x0 ::.: ::.. .... ...x xxxx // B6.1.10 T2
+ "E9 8D C0 13", "srsia sp,#0x13", // 1110 1001 10x0 ::.: ::.. .... ...x xxxx // B6.1.10 T2
+ "F3 0A 05 1C", "ssat r5,#29,r10", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
+ "F3 2A 05 5C", "ssat r5,#29,r10,asr #1", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
+ "F3 2A 75 9C", "ssat r5,#29,r10,asr #30", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
+ "F3 0A 05 5C", "ssat r5,#29,r10,lsl #1", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
+ "F3 0A 75 DC", "ssat r5,#29,r10,lsl #31", // 1111 0.11 00x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.183 T1
+ "F3 2A 05 0C", "ssat16 r5,#13,r10", // 1111 0.11 0010 xxxx 0000 xxxx 00.. xxxx // A8.6.184 T1
+ "FA E9 F5 0A", "ssax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0000 xxxx // A8.6.185 T1
+ "FA D9 F5 0A", "ssub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0000 xxxx // A8.6.186 T1
+ "FA C9 F5 0A", "ssub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0000 xxxx // A8.6.187 T1
+ "ED 0A B9 21", "stc p9,c11,[r10,#-0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED 2A B9 21", "stc p9,c11,[r10,#-0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED 8A B9 21", "stc p9,c11,[r10,#0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED AA B9 21", "stc p9,c11,[r10,#0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC 2A B9 21", "stc p9,c11,[r10],#-0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC AA B9 21", "stc p9,c11,[r10],#0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC 8A B9 00", "stc p9,c11,[r10],{0}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC 8A B9 FF", "stc p9,c11,[r10],{255}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "FD 0A B9 21", "stc2 p9,c11,[r10,#-0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD 2A B9 21", "stc2 p9,c11,[r10,#-0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD 8A B9 21", "stc2 p9,c11,[r10,#0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD AA B9 21", "stc2 p9,c11,[r10,#0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC 2A B9 21", "stc2 p9,c11,[r10],#-0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC AA B9 21", "stc2 p9,c11,[r10],#0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC 8A B9 00", "stc2 p9,c11,[r10],{0}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC 8A B9 FF", "stc2 p9,c11,[r10],{255}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD 4A B9 21", "stc2l p9,c11,[r10,#-0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD 6A B9 21", "stc2l p9,c11,[r10,#-0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD CA B9 21", "stc2l p9,c11,[r10,#0x84]", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FD EA B9 21", "stc2l p9,c11,[r10,#0x84]!", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC 6A B9 21", "stc2l p9,c11,[r10],#-0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC EA B9 21", "stc2l p9,c11,[r10],#0x84", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC CA B9 00", "stc2l p9,c11,[r10],{0}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "FC CA B9 FF", "stc2l p9,c11,[r10],{255}", // 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T2
+ "ED 4A B9 21", "stcl p9,c11,[r10,#-0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED 6A B9 21", "stcl p9,c11,[r10,#-0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED CA B9 21", "stcl p9,c11,[r10,#0x84]", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "ED EA B9 21", "stcl p9,c11,[r10,#0x84]!", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC 6A B9 21", "stcl p9,c11,[r10],#-0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC EA B9 21", "stcl p9,c11,[r10],#0x84", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC CA B9 00", "stcl p9,c11,[r10],{0}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "EC CA B9 FF", "stcl p9,c11,[r10],{255}", // 1110 110x xxx0 xxxx xxxx xxxx xxxx xxxx // A8.6.188 T1
+ "E8 AA 42 40", "stm.w r10!,{r6,r9,lr}", // 1110 1000 10x0 xxxx xx.x xxxx xxxx xxxx // A8.6.189 T2
+ "E8 8A 42 40", "stm.w r10,{r6,r9,lr}", // 1110 1000 10x0 xxxx xx.x xxxx xxxx xxxx // A8.6.189 T2
+ "E9 2A 42 40", "stmdb r10!,{r6,r9,lr}", // 1110 1001 00x0 xxxx xx.x xxxx xxxx xxxx // A8.6.191 T1
+ "E9 0A 42 40", "stmdb r10,{r6,r9,lr}", // 1110 1001 00x0 xxxx xx.x xxxx xxxx xxxx // A8.6.191 T1
+ "F8 CA 50 00", "str.w r5,[r10]", // 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx // A8.6.193 T3
+ "F8 C6 47 89", "str.w r4,[r6,#0x789]", // 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx // A8.6.193 T3
+ "F8 4A 5C 80", "str r5,[r10,#-0x80]", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
+ "F8 4A 5A 82", "str r5,[r10],#0x82", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
+ "F8 4A 58 84", "str r5,[r10],#-0x84", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
+ "F8 4A 5F 86", "str r5,[r10,#0x86]!", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
+ "F8 4A 5D 88", "str r5,[r10,#-0x88]!", // 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx // A8.6.193 T4
+ "F8 4A 50 08", "str.w r5,[r10,r8]", // 1111 1000 0100 xxxx xxxx 0000 00xx xxxx // A8.6.195 T2
+ "F8 49 60 37", "str.w r6,[r9,r7,lsl #3]", // 1111 1000 0100 xxxx xxxx 0000 00xx xxxx // A8.6.195 T2
+ "F8 8A 50 00", "strb.w r5,[r10]", // 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx // A8.6.196 T2
+ "F8 86 47 89", "strb.w r4,[r6,#0x789]", // 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx // A8.6.196 T2
+ "F8 0A 5C 80", "strb r5,[r10,#-0x80]", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
+ "F8 0A 5A 82", "strb r5,[r10],#0x82", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
+ "F8 0A 58 84", "strb r5,[r10],#-0x84", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
+ "F8 0A 5F 86", "strb r5,[r10,#0x86]!", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
+ "F8 0A 5D 88", "strb r5,[r10,#-0x88]!", // 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx // A8.6.196 T3
+ "F8 0A 50 08", "strb.w r5,[r10,r8]", // 1111 1000 0000 xxxx xxxx 0000 00xx xxxx // A8.6.198 T2
+ "F8 09 60 37", "strb.w r6,[r9,r7,lsl #3]", // 1111 1000 0000 xxxx xxxx 0000 00xx xxxx // A8.6.198 T2
+ "F8 0A 5E 00", "strbt r5,[r10]", // 1111 1000 0000 xxxx xxxx 1110 xxxx xxxx // A8.6.199 T1
+ "F8 09 6E 84", "strbt r6,[r9,#0x84]", // 1111 1000 0000 xxxx xxxx 1110 xxxx xxxx // A8.6.199 T1
+ "E9 4A 67 84", "strd r6,r7,[r10,#-0x210]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E9 6A 67 85", "strd r6,r7,[r10,#-0x214]!", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E9 CA 67 84", "strd r6,r7,[r10,#0x210]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E9 EA 67 85", "strd r6,r7,[r10,#0x214]!", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E9 4A 67 00", "strd r6,r7,[r10]", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E8 6A 67 84", "strd r6,r7,[r10],#-0x210", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E8 EA 67 85", "strd r6,r7,[r10],#0x214", // 1110 100x x1x0 xxxx xxxx xxxx xxxx xxxx // A8.6.200 T1
+ "E8 4A 95 00", "strex r5,r9,[r10]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.202 T1
+ "E8 49 86 87", "strex r6,r8,[r9,#0x21c]", // 1110 1000 0101 xxxx xxxx :::: xxxx xxxx // A8.6.202 T1
+ "E8 CA 9F 45", "strexb r5,r9,[r10]", // 1110 1000 1100 xxxx xxxx :::: 0100 :::: // A8.6.203 T1
+ "E8 C8 67 74", "strexd r4,r6,r7,[r8]", // 1110 1000 1100 xxxx xxxx xxxx 0111 :::: // A8.6.204 T1
+ "E8 C9 8F 53", "strexh r3,r8,[r9]", // 1110 1000 1100 xxxx xxxx :::: 0101 :::: // A8.6.205 T1
+ "F8 AA 50 00", "strh.w r5,[r10]", // 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx // A8.6.206 T2
+ "F8 A6 47 89", "strh.w r4,[r6,#0x789]", // 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx // A8.6.206 T2
+ "F8 2A 5C 80", "strh r5,[r10,#-0x80]", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
+ "F8 2A 5A 82", "strh r5,[r10],#0x82", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
+ "F8 2A 58 84", "strh r5,[r10],#-0x84", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
+ "F8 2A 5F 86", "strh r5,[r10,#0x86]!", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
+ "F8 2A 5D 88", "strh r5,[r10,#-0x88]!", // 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx // A8.6.206 T3
+ "F8 2A 50 08", "strh.w r5,[r10,r8]", // 1111 1000 0010 xxxx xxxx 0000 00xx xxxx // A8.6.208 T2
+ "F8 29 60 37", "strh.w r6,[r9,r7,lsl #3]", // 1111 1000 0010 xxxx xxxx 0000 00xx xxxx // A8.6.208 T2
+ "F8 2A 5E 00", "strht r5,[r10]", // 1111 1000 0010 xxxx xxxx 1110 xxxx xxxx // A8.6.209 T1
+ "F8 29 6E 84", "strht r6,[r9,#0x84]", // 1111 1000 0010 xxxx xxxx 1110 xxxx xxxx // A8.6.209 T1
+ "F8 4A 5E 00", "strt r5,[r10]", // 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx // A8.6.210 T1
+ "F8 46 4E 89", "strt r4,[r6,#0x89]", // 1111 1000 0100 xxxx xxxx 1110 xxxx xxxx // A8.6.210 T1
+ "F2 AF 05 71", "sub r5,pc,#0x71", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
+ "F2 AF 36 72", "sub r6,pc,#0x372", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
+ "F6 AF 47 78", "sub r7,pc,#0xc78", // 1111 0x10 1010 1111 0xxx xxxx xxxx xxxx // A8.6.10 T2
+ "F1 AA 05 71", "sub.w r5,r10,#0x71", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 AB 06 F7", "sub.w r6,r11,#0xf7", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A9 14 78", "sub.w r4,r9,#0x780078", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A8 13 FC", "sub.w r3,r8,#0xfc00fc", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A7 25 64", "sub.w r5,r7,#0x64006400", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A6 25 E3", "sub.w r5,r6,#0xe300e300", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A7 46 60", "sub.w r6,r7,#0xe0000000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 A8 47 E0", "sub.w r7,r8,#0x70000000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 AA 05 60", "sub.w r5,r10,#0xe00000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 AA 45 60", "sub.w r5,r10,#0xe000", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 AA 65 60", "sub.w r5,r10,#0xe00", // 1111 0x01 1010 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "EB A9 05 0A", "sub.w r5,r9,r10", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB A8 14 A9", "sub.w r4,r8,r9,asr #6", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB A7 03 48", "sub.w r3,r7,r8,lsl #1", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB A6 02 17", "sub.w r2,r6,r7,lsr #32", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB A9 75 F8", "sub.w r5,r9,r8,ror #31", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB A8 05 39", "sub.w r5,r8,r9,rrx", // 1110 1011 1010 xxxx .xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 05 71", "sub.w r5,sp,#0x71", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 06 F7", "sub.w r6,sp,#0xf7", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 14 78", "sub.w r4,sp,#0x780078", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 13 FC", "sub.w r3,sp,#0xfc00fc", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 25 64", "sub.w r5,sp,#0x64006400", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 25 E3", "sub.w r5,sp,#0xe300e300", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 46 60", "sub.w r6,sp,#0xe0000000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 AD 47 E0", "sub.w r7,sp,#0x70000000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F5 AD 05 60", "sub.w r5,sp,#0xe00000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F5 AD 45 60", "sub.w r5,sp,#0xe000", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F5 AD 65 60", "sub.w r5,sp,#0xe00", // 1111 0x01 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 05 0A", "sub.w r5,sp,r10", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 14 A9", "sub.w r4,sp,r9,asr #6", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 03 48", "sub.w r3,sp,r8,lsl #1", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 02 17", "sub.w r2,sp,r7,lsr #32", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 75 F8", "sub.w r5,sp,r8,ror #31", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "EB AD 05 39", "sub.w r5,sp,r9,rrx", // 1110 1011 1010 1101 0xxx xxxx xxxx xxxx // A8.6.213 T3
+ "F1 BA 05 71", "subs.w r5,r10,#0x71", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 BB 06 F7", "subs.w r6,r11,#0xf7", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B9 14 78", "subs.w r4,r9,#0x780078", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B8 13 FC", "subs.w r3,r8,#0xfc00fc", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B7 25 64", "subs.w r5,r7,#0x64006400", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B6 25 E3", "subs.w r5,r6,#0xe300e300", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B7 46 60", "subs.w r6,r7,#0xe0000000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F1 B8 47 E0", "subs.w r7,r8,#0x70000000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 BA 05 60", "subs.w r5,r10,#0xe00000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 BA 45 60", "subs.w r5,r10,#0xe000", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "F5 BA 65 60", "subs.w r5,r10,#0xe00", // 1111 0x01 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.211 T3
+ "EB B9 05 0A", "subs.w r5,r9,r10", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "EB B8 14 A9", "subs.w r4,r8,r9,asr #6", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "EB B7 03 48", "subs.w r3,r7,r8,lsl #1", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "EB B6 02 17", "subs.w r2,r6,r7,lsr #32", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "EB B9 75 F8", "subs.w r5,r9,r8,ror #31", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "EB B8 05 39", "subs.w r5,r8,r9,rrx", // 1110 1011 1011 xxxx 0xxx xxxx xxxx xxxx // A8.6.213 T2
+ "F1 BD 05 71", "subs.w r5,sp,#0x71", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 06 F7", "subs.w r6,sp,#0xf7", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 14 78", "subs.w r4,sp,#0x780078", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 13 FC", "subs.w r3,sp,#0xfc00fc", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 25 64", "subs.w r5,sp,#0x64006400", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 25 E3", "subs.w r5,sp,#0xe300e300", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 46 60", "subs.w r6,sp,#0xe0000000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F1 BD 47 E0", "subs.w r7,sp,#0x70000000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F5 BD 05 60", "subs.w r5,sp,#0xe00000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F5 BD 45 60", "subs.w r5,sp,#0xe000", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "F5 BD 65 60", "subs.w r5,sp,#0xe00", // 1111 0x01 1011 1101 0xxx xxxx xxxx xxxx // A8.6.215 T2
+ "EB BD 05 0A", "subs.w r5,sp,r10", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "EB BD 14 A9", "subs.w r4,sp,r9,asr #6", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "EB BD 03 48", "subs.w r3,sp,r8,lsl #1", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "EB BD 02 17", "subs.w r2,sp,r7,lsr #32", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "EB BD 75 F8", "subs.w r5,sp,r8,ror #31", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "EB BD 05 39", "subs.w r5,sp,r9,rrx", // 1110 1011 1011 1101 0xxx xxxx xxxx xxxx // A8.6.216 T1
+ "F2 AD 05 71", "subw r5,sp,#0x71", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
+ "F2 AD 36 72", "subw r6,sp,#0x372", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
+ "F6 AD 47 78", "subw r7,sp,#0xc78", // 1111 0x10 1010 1101 0xxx xxxx xxxx xxxx // A8.6.215 T3
+ "FA 49 F5 8A", "sxtab r5,r9,r10", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 49 F5 9A", "sxtab r5,r9,r10,ror #8", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 49 F5 AA", "sxtab r5,r9,r10,ror #16", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 49 F5 BA", "sxtab r5,r9,r10,ror #24", // 1111 1010 0100 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 29 F5 8A", "sxtab16 r5,r9,r10", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 29 F5 9A", "sxtab16 r5,r9,r10,ror #8", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 29 F5 AA", "sxtab16 r5,r9,r10,ror #16", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 29 F5 BA", "sxtab16 r5,r9,r10,ror #24", // 1111 1010 0010 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 09 F5 8A", "sxtah r5,r9,r10", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 09 F5 9A", "sxtah r5,r9,r10,ror #8", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 09 F5 AA", "sxtah r5,r9,r10,ror #16", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 09 F5 BA", "sxtah r5,r9,r10,ror #24", // 1111 1010 0000 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 4F F5 89", "sxtb.w r5,r9", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 4F F5 99", "sxtb.w r5,r9,ror #8", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 4F F5 A9", "sxtb.w r5,r9,ror #16", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 4F F5 B9", "sxtb.w r5,r9,ror #24", // 1111 1010 0100 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 2F F5 89", "sxtb16 r5,r9", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 2F F5 99", "sxtb16 r5,r9,ror #8", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 2F F5 A9", "sxtb16 r5,r9,ror #16", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 2F F5 B9", "sxtb16 r5,r9,ror #24", // 1111 1010 0010 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 0F F5 8A", "sxth.w r5,r10", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 0F F5 9A", "sxth.w r5,r10,ror #8", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 0F F5 AA", "sxth.w r5,r10,ror #16", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 0F F5 BA", "sxth.w r5,r10,ror #24", // 1111 1010 0000 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "E8 D5 F0 0A", "tbb [r5,r10]", // 1110 1000 1101 xxxx :::: .... 000x xxxx // A8.6.226 T1
+ "E8 D5 F0 1A", "tbh [r5,r10,lsl #1]", // 1110 1000 1101 xxxx :::: .... 000x xxxx // A8.6.226 T1
+ "F0 95 0F 71", "teq r5,#0x71", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 0F F7", "teq r5,#0xf7", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 1F 78", "teq r5,#0x780078", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 1F FC", "teq r5,#0xfc00fc", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 2F 64", "teq r5,#0x64006400", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 2F E3", "teq r5,#0xe300e300", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 4F 60", "teq r5,#0xe0000000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F0 95 4F E0", "teq r5,#0x70000000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F4 95 0F 60", "teq r5,#0xe00000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F4 95 4F 60", "teq r5,#0xe000", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "F4 95 6F 60", "teq r5,#0xe00", // 1111 0x00 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.227 T1
+ "EA 95 0F 09", "teq r5,r9", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
+ "EA 94 1F A8", "teq r4,r8,asr #6", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
+ "EA 93 0F 47", "teq r3,r7,lsl #1", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
+ "EA 92 0F 16", "teq r2,r6,lsr #32", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
+ "EA 95 7F F9", "teq r5,r9,ror #31", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.228 T1
+ "EA 95 0F 38", "teq r5,r8,rrx", // 1110 1010 1001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 0F 71", "tst r5,#0x71", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 0F F7", "tst r5,#0xf7", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 1F 78", "tst r5,#0x780078", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 1F FC", "tst r5,#0xfc00fc", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 2F 64", "tst r5,#0x64006400", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 2F E3", "tst r5,#0xe300e300", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 4F 60", "tst r5,#0xe0000000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F0 15 4F E0", "tst r5,#0x70000000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F4 15 0F 60", "tst r5,#0xe00000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F4 15 4F 60", "tst r5,#0xe000", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "F4 15 6F 60", "tst r5,#0xe00", // 1111 0x00 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.230 T1
+ "EA 15 0F 09", "tst.w r5,r9", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T1
+ "EA 14 1F A8", "tst.w r4,r8,asr #6", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
+ "EA 13 0F 47", "tst.w r3,r7,lsl #1", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
+ "EA 12 0F 16", "tst.w r2,r6,lsr #32", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
+ "EA 15 7F F9", "tst.w r5,r9,ror #31", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
+ "EA 15 0F 38", "tst.w r5,r8,rrx", // 1110 1010 0001 xxxx 0xxx 1111 xxxx xxxx // A8.6.231 T2
+ "FA 99 F5 4A", "uadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0100 xxxx // A8.6.233 T1
+ "FA 89 F5 4A", "uadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0100 xxxx // A8.6.234 T1
+ "FA A9 F5 4A", "uasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0100 xxxx // A8.6.235 T1
+ "F3 C7 05 1F", "ubfx r5,r7,#0,#32", // 1111 0.11 1100 xxxx 0xxx xxxx xx.x xxxx // A8.6.236 T1
+ "F3 C8 06 59", "ubfx r6,r8,#1,#26", // 1111 0.11 1100 xxxx 0xxx xxxx xx.x xxxx // A8.6.236 T1
+ "FB B9 F5 FA", "udiv r5,r9,r10", // 1111 1011 1011 xxxx :::: xxxx 1111 xxxx // A8.6.237 T1
+ "FA 99 F5 6A", "uhadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0110 xxxx // A8.6.238 T1
+ "FA 89 F5 6A", "uhadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0110 xxxx // A8.6.239 T1
+ "FA A9 F5 6A", "uhasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0110 xxxx // A8.6.240 T1
+ "FA E9 F5 6A", "uhsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0110 xxxx // A8.6.241 T1
+ "FA D9 F5 6A", "uhsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0110 xxxx // A8.6.242 T1
+ "FA C9 F5 6A", "uhsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0110 xxxx // A8.6.243 T1
+ "FB EA 56 69", "umaal r5,r6,r10,r9", // 1111 1E10 1100 xxxx xxxx xxxx 0110 xxxx // A8.6.244 T1
+ "FB EA 56 09", "umlal r5,r6,r10,r9", // 1111 1E10 1100 xxxx xxxx xxxx 0000 xxxx // A8.6.245 T1
+ "FB AA 56 09", "umull r5,r6,r10,r9", // 1111 1011 1010 xxxx xxxx xxxx 0000 xxxx // A8.6.246 T1
+ "FA 99 F5 5A", "uqadd16 r5,r9,r10", // 1111 1010 1001 xxxx 1111 xxxx 0101 xxxx // A8.6.247 T1
+ "FA 89 F5 5A", "uqadd8 r5,r9,r10", // 1111 1010 1000 xxxx 1111 xxxx 0101 xxxx // A8.6.248 T1
+ "FA A9 F5 5A", "uqasx r5,r9,r10", // 1111 1010 1010 xxxx 1111 xxxx 0101 xxxx // A8.6.249 T1
+ "FA E9 F5 5A", "uqsax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0101 xxxx // A8.6.250 T1
+ "FA D9 F5 5A", "uqsub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0101 xxxx // A8.6.251 T1
+ "FA C9 F5 5A", "uqsub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0101 xxxx // A8.6.252 T1
+ "FB 79 F5 0A", "usad8 r5,r9,r10", // 1111 1011 0111 xxxx 1111 xxxx 0000 xxxx // A8.6.253 T1
+ "FB 79 85 0A", "usada8 r5,r9,r10,r8", // 1111 1011 0111 xxxx xxxx xxxx 0000 xxxx // A8.6.253 T1
+ "F3 8A 05 1C", "usat r5,#28,r10", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
+ "F3 AA 05 5C", "usat r5,#28,r10,asr #1", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
+ "F3 AA 75 9C", "usat r5,#28,r10,asr #30", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
+ "F3 8A 05 5C", "usat r5,#28,r10,lsl #1", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
+ "F3 8A 75 DC", "usat r5,#28,r10,lsl #31", // 1111 0.11 10x0 xxxx 0xxx xxxx xx.x xxxx // A8.6.255 T1
+ "F3 AA 05 0C", "usat16 r5,#12,r10", // 1111 0.11 1010 xxxx 0000 xxxx 00.. xxxx // A8.6.256 T1
+ "FA E9 F5 4A", "usax r5,r9,r10", // 1111 1010 1110 xxxx 1111 xxxx 0100 xxxx // A8.6.257 T1
+ "FA D9 F5 4A", "usub16 r5,r9,r10", // 1111 1010 1101 xxxx 1111 xxxx 0100 xxxx // A8.6.258 T1
+ "FA C9 F5 4A", "usub8 r5,r9,r10", // 1111 1010 1100 xxxx 1111 xxxx 0100 xxxx // A8.6.259 T1
+ "FA 59 F5 8A", "uxtab r5,r9,r10", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 59 F5 9A", "uxtab r5,r9,r10,ror #8", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 59 F5 AA", "uxtab r5,r9,r10,ror #16", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 59 F5 BA", "uxtab r5,r9,r10,ror #24", // 1111 1010 0101 xxxx 1111 xxxx 1.xx xxxx // A8.6.220 T1
+ "FA 39 F5 8A", "uxtab16 r5,r9,r10", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 39 F5 9A", "uxtab16 r5,r9,r10,ror #8", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 39 F5 AA", "uxtab16 r5,r9,r10,ror #16", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 39 F5 BA", "uxtab16 r5,r9,r10,ror #24", // 1111 1010 0011 xxxx 1111 xxxx 1.xx xxxx // A8.6.221 T1
+ "FA 19 F5 8A", "uxtah r5,r9,r10", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 19 F5 9A", "uxtah r5,r9,r10,ror #8", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 19 F5 AA", "uxtah r5,r9,r10,ror #16", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 19 F5 BA", "uxtah r5,r9,r10,ror #24", // 1111 1010 0001 xxxx 1111 xxxx 1.xx xxxx // A8.6.222 T1
+ "FA 5F F5 89", "uxtb.w r5,r9", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 5F F5 99", "uxtb.w r5,r9,ror #8", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 5F F5 A9", "uxtb.w r5,r9,ror #16", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 5F F5 B9", "uxtb.w r5,r9,ror #24", // 1111 1010 0101 1111 1111 xxxx 1.xx xxxx // A8.6.223 T2
+ "FA 3F F5 89", "uxtb16 r5,r9", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 3F F5 99", "uxtb16 r5,r9,ror #8", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 3F F5 A9", "uxtb16 r5,r9,ror #16", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 3F F5 B9", "uxtb16 r5,r9,ror #24", // 1111 1010 0011 1111 1111 xxxx 1.xx xxxx // A8.6.224 T1
+ "FA 1F F5 8A", "uxth.w r5,r10", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 1F F5 9A", "uxth.w r5,r10,ror #8", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 1F F5 AA", "uxth.w r5,r10,ror #16", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "FA 1F F5 BA", "uxth.w r5,r10,ror #24", // 1111 1010 0001 1111 1111 xxxx 1.xx xxxx // A8.6.225 T1
+ "F3 AF 80 02", "wfe.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411
+ "F3 AF 80 03", "wfi.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412
+ "F3 AF 80 01", "yield.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413
+ };
+
+ disassembleInstArray(insts, thumbOptions);
+ }
+
+ @Test
+ public void test32BitThumbVFPInstructions() {
+
+ System.out.println("\n====================== ARM VFP ======================\n");
+ String[] insts = {
+ "EF 49 57 BA", "vaba.s8 d21,d25,d26",
+ "EF 59 57 BA", "vaba.s16 d21,d25,d26",
+ "EF 69 57 BA", "vaba.s32 d21,d25,d26",
+ "FF 49 57 BA", "vaba.u8 d21,d25,d26",
+ "FF 59 57 BA", "vaba.u16 d21,d25,d26",
+ "FF 69 57 BA", "vaba.u32 d21,d25,d26",
+ "EF 4C 67 FE", "vaba.s8 q11,q14,q15",
+ "EF 5C 67 FE", "vaba.s16 q11,q14,q15",
+ "EF 6C 67 FE", "vaba.s32 q11,q14,q15",
+ "FF 4C 67 FE", "vaba.u8 q11,q14,q15",
+ "FF 5C 67 FE", "vaba.u16 q11,q14,q15",
+ "FF 6C 67 FE", "vaba.u32 q11,q14,q15",
+ "EF C9 65 AA", "vabal.s8 q11,d25,d26",
+ "EF D9 65 AA", "vabal.s16 q11,d25,d26",
+ "EF E9 65 AA", "vabal.s32 q11,d25,d26",
+ "FF C9 65 AA", "vabal.u8 q11,d25,d26",
+ "FF D9 65 AA", "vabal.u16 q11,d25,d26",
+ "FF E9 65 AA", "vabal.u32 q11,d25,d26",
+ "EF 49 57 AA", "vabd.s8 d21,d25,d26",
+ "EF 59 57 AA", "vabd.s16 d21,d25,d26",
+ "EF 69 57 AA", "vabd.s32 d21,d25,d26",
+ "FF 49 57 AA", "vabd.u8 d21,d25,d26",
+ "FF 59 57 AA", "vabd.u16 d21,d25,d26",
+ "FF 69 57 AA", "vabd.u32 d21,d25,d26",
+ "EF 4C 67 EE", "vabd.s8 q11,q14,q15",
+ "EF 5C 67 EE", "vabd.s16 q11,q14,q15",
+ "EF 6C 67 EE", "vabd.s32 q11,q14,q15",
+ "FF 4C 67 EE", "vabd.u8 q11,q14,q15",
+ "FF 5C 67 EE", "vabd.u16 q11,q14,q15",
+ "FF 6C 67 EE", "vabd.u32 q11,q14,q15",
+ "FF 69 5D AA", "vabd.f32 d21,d25,d26",
+ "FF 6C 6D EE", "vabd.f32 q11,q14,q15",
+ "EF C9 67 AA", "vabdl.s8 q11,d25,d26",
+ "EF D9 67 AA", "vabdl.s16 q11,d25,d26",
+ "EF E9 67 AA", "vabdl.s32 q11,d25,d26",
+ "FF C9 67 AA", "vabdl.u8 q11,d25,d26",
+ "FF D9 67 AA", "vabdl.u16 q11,d25,d26",
+ "FF E9 67 AA", "vabdl.u32 q11,d25,d26",
+ "FF F1 63 6E", "vabs.s8 q11,q15",
+ "FF F5 63 6E", "vabs.s16 q11,q15",
+ "FF F9 63 6E", "vabs.s32 q11,q15",
+ "FF F9 67 6E", "vabs.f32 q11,q15",
+ "FF F1 53 2A", "vabs.s8 d21,d26",
+ "FF F5 53 2A", "vabs.s16 d21,d26",
+ "FF F9 53 2A", "vabs.s32 d21,d26",
+ "FF F9 57 2A", "vabs.f32 d21,d26",
+ "EE F0 5B EA", "vabs.f64 d21,d26",
+ "EE F0 AA CD", "vabs.f32 s21,s26",
+ "EE F0 5B EA", "vabs.f64 d21,d26",
+ "FF 49 5E BA", "vacge.f32 d21,d25,d26",
+ "FF 4C 6E FE", "vacge.f32 q11,q14,q15",
+ "FF 69 5E BA", "vacgt.f32 d21,d25,d26",
+ "FF 6C 6E FE", "vacgt.f32 q11,q14,q15",
+ "EF 49 58 AA", "vadd.i8 d21,d25,d26",
+ "EF 59 58 AA", "vadd.i16 d21,d25,d26",
+ "EF 69 58 AA", "vadd.i32 d21,d25,d26",
+ "EF 79 58 AA", "vadd.i64 d21,d25,d26",
+ "EF 4C 68 EE", "vadd.i8 q11,q14,q15",
+ "EF 5C 68 EE", "vadd.i16 q11,q14,q15",
+ "EF 6C 68 EE", "vadd.i32 q11,q14,q15",
+ "EF 7C 68 EE", "vadd.i64 q11,q14,q15",
+ "EF 49 5D AA", "vadd.f32 d21,d25,d26",
+ "EF 4C 6D EE", "vadd.f32 q11,q14,q15",
+ "EE 7C AA 8D", "vadd.f32 s21,s25,s26",
+ "EE 79 5B AA", "vadd.f64 d21,d25,d26",
+ "EF CC 54 AE", "vaddhn.i16 d21,q14,q15",
+ "EF DC 54 AE", "vaddhn.i32 d21,q14,q15",
+ "EF EC 54 AE", "vaddhn.i64 d21,q14,q15",
+ "EF C9 60 AA", "vaddl.s8 q11,d25,d26",
+ "EF D9 60 AA", "vaddl.s16 q11,d25,d26",
+ "EF E9 60 AA", "vaddl.s32 q11,d25,d26",
+ "FF C9 60 AA", "vaddl.u8 q11,d25,d26",
+ "FF D9 60 AA", "vaddl.u16 q11,d25,d26",
+ "FF E9 60 AA", "vaddl.u32 q11,d25,d26",
+ "EF CC 61 AA", "vaddw.s8 q11,q14,d26",
+ "EF DC 61 AA", "vaddw.s16 q11,q14,d26",
+ "EF EC 61 AA", "vaddw.s32 q11,q14,d26",
+ "FF CC 61 AA", "vaddw.u8 q11,q14,d26",
+ "FF DC 61 AA", "vaddw.u16 q11,q14,d26",
+ "FF EC 61 AA", "vaddw.u32 q11,q14,d26",
+ "EF 49 51 BA", "vand d21,d25,d26",
+ "EF 4C 61 FE", "vand q11,q14,q15",
+ "EF 59 51 BA", "vbic d21,d25,d26",
+ "EF 5C 61 FE", "vbic q11,q14,q15",
+ "FF C0 59 39", "vbic.i16 d21,#0x89",
+ "FF C0 51 39", "vbic.i32 d21,#0x89",
+ "FF C0 69 79", "vbic.i16 q11,#0x89",
+ "FF C0 61 79", "vbic.i32 q11,#0x89",
+ "FF 79 51 BA", "vbif d21,d25,d26",
+ "FF 7C 61 FE", "vbif q11,q14,q15",
+ "FF 69 51 BA", "vbit d21,d25,d26",
+ "FF 6C 61 FE", "vbit q11,q14,q15",
+ "FF 59 51 BA", "vbsl d21,d25,d26",
+ "FF 5C 61 FE", "vbsl q11,q14,q15",
+ "FF 49 58 BA", "vceq.i8 d21,d25,d26",
+ "FF 59 58 BA", "vceq.i16 d21,d25,d26",
+ "FF 69 58 BA", "vceq.i32 d21,d25,d26",
+ "FF F1 51 2A", "vceq.i8 d21,d26,#0",
+ "FF F5 51 2A", "vceq.i16 d21,d26,#0",
+ "FF F9 51 2A", "vceq.i32 d21,d26,#0",
+ "FF F9 55 2A", "vceq.f32 d21,d26,#0",
+ "FF 4C 68 FE", "vceq.i8 q11,q14,q15",
+ "FF 5C 68 FE", "vceq.i16 q11,q14,q15",
+ "FF 6C 68 FE", "vceq.i32 q11,q14,q15",
+ "FF F1 61 6E", "vceq.i8 q11,q15,#0",
+ "FF F5 61 6E", "vceq.i16 q11,q15,#0",
+ "FF F9 61 6E", "vceq.i32 q11,q15,#0",
+ "FF F9 65 6E", "vceq.f32 q11,q15,#0",
+ "EF 49 5E AA", "vceq.f32 d21,d25,d26",
+ "EF 4C 6E EE", "vceq.f32 q11,q14,q15",
+ "EF 49 53 BA", "vcge.s8 d21,d25,d26",
+ "EF 59 53 BA", "vcge.s16 d21,d25,d26",
+ "EF 69 53 BA", "vcge.s32 d21,d25,d26",
+ "FF 49 53 BA", "vcge.u8 d21,d25,d26",
+ "FF 59 53 BA", "vcge.u16 d21,d25,d26",
+ "FF 69 53 BA", "vcge.u32 d21,d25,d26",
+ "FF F1 50 AA", "vcge.s8 d21,d26,#0",
+ "FF F5 50 AA", "vcge.s16 d21,d26,#0",
+ "FF F9 50 AA", "vcge.s32 d21,d26,#0",
+ "FF F9 54 AA", "vcge.f32 d21,d26,#0",
+ "EF 4C 63 FE", "vcge.s8 q11,q14,q15",
+ "EF 5C 63 FE", "vcge.s16 q11,q14,q15",
+ "EF 6C 63 FE", "vcge.s32 q11,q14,q15",
+ "FF 4C 63 FE", "vcge.u8 q11,q14,q15",
+ "FF 5C 63 FE", "vcge.u16 q11,q14,q15",
+ "FF 6C 63 FE", "vcge.u32 q11,q14,q15",
+ "FF F1 60 EE", "vcge.s8 q11,q15,#0",
+ "FF F5 60 EE", "vcge.s16 q11,q15,#0",
+ "FF F9 60 EE", "vcge.s32 q11,q15,#0",
+ "FF F9 64 EE", "vcge.f32 q11,q15,#0",
+ "FF 49 5E AA", "vcge.f32 d21,d25,d26",
+ "FF 4C 6E EE", "vcge.f32 q11,q14,q15",
+ "EF 49 53 AA", "vcgt.s8 d21,d25,d26",
+ "EF 59 53 AA", "vcgt.s16 d21,d25,d26",
+ "EF 69 53 AA", "vcgt.s32 d21,d25,d26",
+ "FF 49 53 AA", "vcgt.u8 d21,d25,d26",
+ "FF 59 53 AA", "vcgt.u16 d21,d25,d26",
+ "FF 69 53 AA", "vcgt.u32 d21,d25,d26",
+ "FF F1 50 2A", "vcgt.s8 d21,d26,#0",
+ "FF F5 50 2A", "vcgt.s16 d21,d26,#0",
+ "FF F9 50 2A", "vcgt.s32 d21,d26,#0",
+ "FF F9 54 2A", "vcgt.f32 d21,d26,#0",
+ "EF 4C 63 EE", "vcgt.s8 q11,q14,q15",
+ "EF 5C 63 EE", "vcgt.s16 q11,q14,q15",
+ "EF 6C 63 EE", "vcgt.s32 q11,q14,q15",
+ "FF 4C 63 EE", "vcgt.u8 q11,q14,q15",
+ "FF 5C 63 EE", "vcgt.u16 q11,q14,q15",
+ "FF 6C 63 EE", "vcgt.u32 q11,q14,q15",
+ "FF F1 60 6E", "vcgt.s8 q11,q15,#0",
+ "FF F5 60 6E", "vcgt.s16 q11,q15,#0",
+ "FF F9 60 6E", "vcgt.s32 q11,q15,#0",
+ "FF F9 64 6E", "vcgt.f32 q11,q15,#0",
+ "FF 69 5E AA", "vcgt.f32 d21,d25,d26",
+ "FF 6C 6E EE", "vcgt.f32 q11,q14,q15",
+ "FF F1 51 AA", "vcle.s8 d21,d26,#0",
+ "FF F5 51 AA", "vcle.s16 d21,d26,#0",
+ "FF F9 51 AA", "vcle.s32 d21,d26,#0",
+ "FF F9 55 AA", "vcle.f32 d21,d26,#0",
+ "FF F1 61 EE", "vcle.s8 q11,q15,#0",
+ "FF F5 61 EE", "vcle.s16 q11,q15,#0",
+ "FF F9 61 EE", "vcle.s32 q11,q15,#0",
+ "FF F9 65 EE", "vcle.f32 q11,q15,#0",
+ "FF F0 54 2A", "vcls.s8 d21,d26",
+ "FF F4 54 2A", "vcls.s16 d21,d26",
+ "FF F8 54 2A", "vcls.s32 d21,d26",
+ "FF F0 64 6E", "vcls.s8 q11,q15",
+ "FF F4 64 6E", "vcls.s16 q11,q15",
+ "FF F8 64 6E", "vcls.s32 q11,q15",
+ "FF F1 52 2A", "vclt.s8 d21,d26,#0",
+ "FF F5 52 2A", "vclt.s16 d21,d26,#0",
+ "FF F9 52 2A", "vclt.s32 d21,d26,#0",
+ "FF F9 56 2A", "vclt.f32 d21,d26,#0",
+ "FF F1 62 6E", "vclt.s8 q11,q15,#0",
+ "FF F5 62 6E", "vclt.s16 q11,q15,#0",
+ "FF F9 62 6E", "vclt.s32 q11,q15,#0",
+ "FF F9 66 6E", "vclt.f32 q11,q15,#0",
+ "FF F0 54 AA", "vclz.i8 d21,d26",
+ "FF F4 54 AA", "vclz.i16 d21,d26",
+ "FF F8 54 AA", "vclz.i32 d21,d26",
+ "FF F0 64 EE", "vclz.i8 q11,q15",
+ "FF F4 64 EE", "vclz.i16 q11,q15",
+ "FF F8 64 EE", "vclz.i32 q11,q15",
+ "EE F5 AA 40", "vcmp.f32 s21,#0.0",
+ "EE F4 AA 4D", "vcmp.f32 s21,s26",
+ "EE F5 5B 40", "vcmp.f64 d21,#0.0",
+ "EE F4 5B 6A", "vcmp.f64 d21,d26",
+ "EE F5 AA C0", "vcmpe.f32 s21,#0.0",
+ "EE F4 AA CD", "vcmpe.f32 s21,s26",
+ "EE F5 5B C0", "vcmpe.f64 d21,#0.0",
+ "EE F4 5B EA", "vcmpe.f64 d21,d26",
+ "FF F0 55 2A", "vcnt.8 d21,d26",
+ "FF F0 65 6E", "vcnt.8 q11,q15",
+ "FF FB 57 2A", "vcvt.s32.f32 d21,d26",
+ "FF FB 57 AA", "vcvt.u32.f32 d21,d26",
+ "FF FB 56 2A", "vcvt.f32.s32 d21,d26",
+ "FF FB 56 AA", "vcvt.f32.u32 d21,d26",
+ "EF E0 5F 3A", "vcvt.s32.f32 d21,d26,#32",
+ "FF E0 5F 3A", "vcvt.u32.f32 d21,d26,#32",
+ "EF E0 5E 3A", "vcvt.f32.s32 d21,d26,#32",
+ "FF E0 5E 3A", "vcvt.f32.u32 d21,d26,#32",
+ "FF FB 67 6E", "vcvt.s32.f32 q11,q15",
+ "FF FB 67 EE", "vcvt.u32.f32 q11,q15",
+ "FF FB 66 6E", "vcvt.f32.s32 q11,q15",
+ "FF FB 66 EE", "vcvt.f32.u32 q11,q15",
+ "EF E0 6F 7E", "vcvt.s32.f32 q11,q15,#32",
+ "FF E0 6F 7E", "vcvt.u32.f32 q11,q15,#32",
+ "EF E0 6E 7E", "vcvt.f32.s32 q11,q15,#32",
+ "FF E0 6E 7E", "vcvt.f32.u32 q11,q15,#32",
+ "EE FA AA E8", "vcvt.f32.s32 s21,s21,#15",
+ "EE FF AA 60", "vcvt.u16.f32 s21,s21,#15",
+ "EE FE AA E2", "vcvt.s32.f32 s21,s21,#27",
+ "EE FF AA E2", "vcvt.u32.f32 s21,s21,#27",
+ "EE FE 5B 60", "vcvt.s16.f64 d21,d21,#15",
+ "EE FF 5B 60", "vcvt.u16.f64 d21,d21,#15",
+ "EE FE 5B E2", "vcvt.s32.f64 d21,d21,#27",
+ "EE FF 5B E2", "vcvt.u32.f64 d21,d21,#27",
+ "FF F6 56 2E", "vcvt.f16.f32 d21,q15",
+ "EE FA AA 60", "vcvt.f32.s16 s21,s21,#15",
+ "EE FB AA 60", "vcvt.f32.u16 s21,s21,#15",
+ "EE FA AA E2", "vcvt.f32.s32 s21,s21,#27",
+ "EE FB AA E2", "vcvt.f32.u32 s21,s21,#27",
+ "EE F8 AA CD", "vcvt.f32.s32 s21,s26",
+ "EE F8 AA 4D", "vcvt.f32.u32 s21,s26",
+ "FF F6 67 2A", "vcvt.f32.f16 q11,d26",
+ "EE F7 AB EA", "vcvt.f32.f64 s21,d26",
+ "EE FA 5B 60", "vcvt.f64.s16 d21,d21,#15",
+ "EE FB 5B 60", "vcvt.f64.u16 d21,d21,#15",
+ "EE FA 5B E2", "vcvt.f64.s32 d21,d21,#27",
+ "EE FB 5B E2", "vcvt.f64.u32 d21,d21,#27",
+ "EE F8 5B CD", "vcvt.f64.s32 d21,s26",
+ "EE F8 5B 4D", "vcvt.f64.u32 d21,s26",
+ "EE F7 5A CD", "vcvt.f64.f32 d21,s26",
+ "EE FD AA CD", "vcvt.s32.f32 s21,s26",
+ "EE FD AB EA", "vcvt.s32.f64 s21,d26",
+ "EE FC AA CD", "vcvt.u32.f32 s21,s26",
+ "EE FC AB EA", "vcvt.u32.f64 s21,d26",
+ "EE F3 AA 4D", "vcvtb.f16.f32 s21,s26",
+ "EE F2 AA 4D", "vcvtb.f32.f16 s21,s26",
+ "EE F3 AA CD", "vcvtt.f16.f32 s21,s26",
+ "EE F2 AA CD", "vcvtt.f32.f16 s21,s26",
+ "EE FD AA 4D", "vcvtr.s32.f32 s21,s26",
+ "EE FD AB 6A", "vcvtr.s32.f64 s21,d26",
+ "EE FC AA 4D", "vcvtr.u32.f32 s21,s26",
+ "EE FC AB 6A", "vcvtr.u32.f64 s21,d26",
+ "EE CC AA 8D", "vdiv.f32 s21,s25,s26",
+ "EE C9 5B AA", "vdiv.f64 d21,d25,d26",
+ "FF F5 5C 26", "vdup.8 d21,d22[2]",
+ "FF FA 5C 26", "vdup.16 d21,d22[2]",
+ "FF FC 5C 26", "vdup.32 d21,d22[1]",
+ "EE C5 5B 90", "vdup.8 d21,r5",
+ "EE 85 5B B0", "vdup.16 d21,r5",
+ "EE 85 5B 90", "vdup.32 d21,r5",
+ "FF F5 6C 66", "vdup.8 q11,d22[2]",
+ "FF FA 6C 66", "vdup.16 q11,d22[2]",
+ "FF FC 6C 66", "vdup.32 q11,d22[1]",
+ "EE E6 5B 90", "vdup.8 q11,r5",
+ "EE A6 5B B0", "vdup.16 q11,r5",
+ "EE A6 5B 90", "vdup.32 q11,r5",
+ "FF 49 51 BA", "veor d21,d25,d26",
+ "FF 4C 61 FE", "veor q11,q14,q15",
+ "EF F9 55 AA", "vext.8 d21,d25,d26,#5",
+ "EF FC 6D EE", "vext.8 q11,q14,q15,#13",
+ "EF 49 50 AA", "vhadd.s8 d21,d25,d26",
+ "EF 59 50 AA", "vhadd.s16 d21,d25,d26",
+ "EF 69 50 AA", "vhadd.s32 d21,d25,d26",
+ "FF 49 50 AA", "vhadd.u8 d21,d25,d26",
+ "FF 59 50 AA", "vhadd.u16 d21,d25,d26",
+ "FF 69 50 AA", "vhadd.u32 d21,d25,d26",
+ "EF 4C 60 EE", "vhadd.s8 q11,q14,q15",
+ "EF 5C 60 EE", "vhadd.s16 q11,q14,q15",
+ "EF 6C 60 EE", "vhadd.s32 q11,q14,q15",
+ "FF 4C 60 EE", "vhadd.u8 q11,q14,q15",
+ "FF 5C 60 EE", "vhadd.u16 q11,q14,q15",
+ "FF 6C 60 EE", "vhadd.u32 q11,q14,q15",
+ "EF 49 52 AA", "vhsub.s8 d21,d25,d26",
+ "EF 59 52 AA", "vhsub.s16 d21,d25,d26",
+ "EF 69 52 AA", "vhsub.s32 d21,d25,d26",
+ "FF 49 52 AA", "vhsub.u8 d21,d25,d26",
+ "FF 59 52 AA", "vhsub.u16 d21,d25,d26",
+ "FF 69 52 AA", "vhsub.u32 d21,d25,d26",
+ "EF 4C 62 EE", "vhsub.s8 q11,q14,q15",
+ "EF 5C 62 EE", "vhsub.s16 q11,q14,q15",
+ "EF 6C 62 EE", "vhsub.s32 q11,q14,q15",
+ "FF 4C 62 EE", "vhsub.u8 q11,q14,q15",
+ "FF 5C 62 EE", "vhsub.u16 q11,q14,q15",
+ "FF 6C 62 EE", "vhsub.u32 q11,q14,q15",
+ "F9 6A B7 0F", "vld1.8 {d27},[r10]",
+ "F9 6A BA 0F", "vld1.8 {d27,d28},[r10]",
+ "F9 6A B6 0F", "vld1.8 {d27,d28,d29},[r10]",
+ "F9 6A B2 0F", "vld1.8 {d27,d28,d29,d30},[r10]",
+ "F9 6A B7 4F", "vld1.16 {d27},[r10]",
+ "F9 6A BA 4F", "vld1.16 {d27,d28},[r10]",
+ "F9 6A B6 4F", "vld1.16 {d27,d28,d29},[r10]",
+ "F9 6A B2 4F", "vld1.16 {d27,d28,d29,d30},[r10]",
+ "F9 6A B7 8F", "vld1.32 {d27},[r10]",
+ "F9 6A BA 8F", "vld1.32 {d27,d28},[r10]",
+ "F9 6A B6 8F", "vld1.32 {d27,d28,d29},[r10]",
+ "F9 6A B2 8F", "vld1.32 {d27,d28,d29,d30},[r10]",
+ "F9 6A B7 CF", "vld1.64 {d27},[r10]",
+ "F9 6A BA CF", "vld1.64 {d27,d28},[r10]",
+ "F9 6A B6 CF", "vld1.64 {d27,d28,d29},[r10]",
+ "F9 6A B2 CF", "vld1.64 {d27,d28,d29,d30},[r10]",
+ "F9 6A B7 1F", "vld1.8 {d27},[r10@64]",
+ "F9 6A BA 1F", "vld1.8 {d27,d28},[r10@64]",
+ "F9 6A BA 2F", "vld1.8 {d27,d28},[r10@128]",
+ "F9 6A B6 1F", "vld1.8 {d27,d28,d29},[r10@64]",
+ "F9 6A B2 1F", "vld1.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B2 2F", "vld1.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B2 3F", "vld1.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B7 5F", "vld1.16 {d27},[r10@64]",
+ "F9 6A BA 5F", "vld1.16 {d27,d28},[r10@64]",
+ "F9 6A BA 6F", "vld1.16 {d27,d28},[r10@128]",
+ "F9 6A B6 5F", "vld1.16 {d27,d28,d29},[r10@64]",
+ "F9 6A B2 5F", "vld1.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B2 6F", "vld1.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B2 7F", "vld1.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B7 9F", "vld1.32 {d27},[r10@64]",
+ "F9 6A BA 9F", "vld1.32 {d27,d28},[r10@64]",
+ "F9 6A BA AF", "vld1.32 {d27,d28},[r10@128]",
+ "F9 6A B6 9F", "vld1.32 {d27,d28,d29},[r10@64]",
+ "F9 6A B2 9F", "vld1.32 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B2 AF", "vld1.32 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B2 BF", "vld1.32 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B7 DF", "vld1.64 {d27},[r10@64]",
+ "F9 6A BA DF", "vld1.64 {d27,d28},[r10@64]",
+ "F9 6A BA EF", "vld1.64 {d27,d28},[r10@128]",
+ "F9 6A B6 DF", "vld1.64 {d27,d28,d29},[r10@64]",
+ "F9 6A B2 DF", "vld1.64 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B2 EF", "vld1.64 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B2 FF", "vld1.64 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B7 0D", "vld1.8 {d27},[r10]!",
+ "F9 6A BA 0D", "vld1.8 {d27,d28},[r10]!",
+ "F9 6A B6 0D", "vld1.8 {d27,d28,d29},[r10]!",
+ "F9 6A B2 0D", "vld1.8 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B7 4D", "vld1.16 {d27},[r10]!",
+ "F9 6A BA 4D", "vld1.16 {d27,d28},[r10]!",
+ "F9 6A B6 4D", "vld1.16 {d27,d28,d29},[r10]!",
+ "F9 6A B2 4D", "vld1.16 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B7 8D", "vld1.32 {d27},[r10]!",
+ "F9 6A BA 8D", "vld1.32 {d27,d28},[r10]!",
+ "F9 6A B6 8D", "vld1.32 {d27,d28,d29},[r10]!",
+ "F9 6A B2 8D", "vld1.32 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B7 CD", "vld1.64 {d27},[r10]!",
+ "F9 6A BA CD", "vld1.64 {d27,d28},[r10]!",
+ "F9 6A B6 CD", "vld1.64 {d27,d28,d29},[r10]!",
+ "F9 6A B2 CD", "vld1.64 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B7 1D", "vld1.8 {d27},[r10@64]!",
+ "F9 6A BA 1D", "vld1.8 {d27,d28},[r10@64]!",
+ "F9 6A BA 2D", "vld1.8 {d27,d28},[r10@128]!",
+ "F9 6A B6 1D", "vld1.8 {d27,d28,d29},[r10@64]!",
+ "F9 6A B2 1D", "vld1.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B2 2D", "vld1.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B2 3D", "vld1.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B7 5D", "vld1.16 {d27},[r10@64]!",
+ "F9 6A BA 5D", "vld1.16 {d27,d28},[r10@64]!",
+ "F9 6A BA 6D", "vld1.16 {d27,d28},[r10@128]!",
+ "F9 6A B6 5D", "vld1.16 {d27,d28,d29},[r10@64]!",
+ "F9 6A B2 5D", "vld1.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B2 6D", "vld1.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B2 7D", "vld1.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B7 9D", "vld1.32 {d27},[r10@64]!",
+ "F9 6A BA 9D", "vld1.32 {d27,d28},[r10@64]!",
+ "F9 6A BA AD", "vld1.32 {d27,d28},[r10@128]!",
+ "F9 6A B6 9D", "vld1.32 {d27,d28,d29},[r10@64]!",
+ "F9 6A B2 9D", "vld1.32 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B2 AD", "vld1.32 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B2 BD", "vld1.32 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B7 DD", "vld1.64 {d27},[r10@64]!",
+ "F9 6A BA DD", "vld1.64 {d27,d28},[r10@64]!",
+ "F9 6A BA ED", "vld1.64 {d27,d28},[r10@128]!",
+ "F9 6A B6 DD", "vld1.64 {d27,d28,d29},[r10@64]!",
+ "F9 6A B2 DD", "vld1.64 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B2 ED", "vld1.64 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B2 FD", "vld1.64 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B7 09", "vld1.8 {d27},[r10],r9",
+ "F9 6A BA 09", "vld1.8 {d27,d28},[r10],r9",
+ "F9 6A B6 09", "vld1.8 {d27,d28,d29},[r10],r9",
+ "F9 6A B2 09", "vld1.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B7 49", "vld1.16 {d27},[r10],r9",
+ "F9 6A BA 49", "vld1.16 {d27,d28},[r10],r9",
+ "F9 6A B6 49", "vld1.16 {d27,d28,d29},[r10],r9",
+ "F9 6A B2 49", "vld1.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B7 89", "vld1.32 {d27},[r10],r9",
+ "F9 6A BA 89", "vld1.32 {d27,d28},[r10],r9",
+ "F9 6A B6 89", "vld1.32 {d27,d28,d29},[r10],r9",
+ "F9 6A B2 89", "vld1.32 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B7 C9", "vld1.64 {d27},[r10],r9",
+ "F9 6A BA C9", "vld1.64 {d27,d28},[r10],r9",
+ "F9 6A B6 C9", "vld1.64 {d27,d28,d29},[r10],r9",
+ "F9 6A B2 C9", "vld1.64 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B7 19", "vld1.8 {d27},[r10@64],r9",
+ "F9 6A BA 19", "vld1.8 {d27,d28},[r10@64],r9",
+ "F9 6A BA 29", "vld1.8 {d27,d28},[r10@128],r9",
+ "F9 6A B6 19", "vld1.8 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B2 19", "vld1.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B2 29", "vld1.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B2 39", "vld1.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A B7 59", "vld1.16 {d27},[r10@64],r9",
+ "F9 6A BA 59", "vld1.16 {d27,d28},[r10@64],r9",
+ "F9 6A BA 69", "vld1.16 {d27,d28},[r10@128],r9",
+ "F9 6A B6 59", "vld1.16 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B2 59", "vld1.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B2 69", "vld1.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B2 79", "vld1.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A B7 99", "vld1.32 {d27},[r10@64],r9",
+ "F9 6A BA 99", "vld1.32 {d27,d28},[r10@64],r9",
+ "F9 6A BA A9", "vld1.32 {d27,d28},[r10@128],r9",
+ "F9 6A B6 99", "vld1.32 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B2 99", "vld1.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B2 A9", "vld1.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B2 B9", "vld1.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A B7 D9", "vld1.64 {d27},[r10@64],r9",
+ "F9 6A BA D9", "vld1.64 {d27,d28},[r10@64],r9",
+ "F9 6A BA E9", "vld1.64 {d27,d28},[r10@128],r9",
+ "F9 6A B6 D9", "vld1.64 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B2 D9", "vld1.64 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B2 E9", "vld1.64 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B2 F9", "vld1.64 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 EA B0 2F", "vld1.8 {d27[1]},[r10]",
+ "F9 EA B4 4F", "vld1.16 {d27[1]},[r10]",
+ "F9 EA B8 8F", "vld1.32 {d27[1]},[r10]",
+ "F9 EA B4 5F", "vld1.16 {d27[1]},[r10@16]",
+ "F9 EA B8 BF", "vld1.32 {d27[1]},[r10@32]",
+ "F9 EA B0 2D", "vld1.8 {d27[1]},[r10]!",
+ "F9 EA B4 4D", "vld1.16 {d27[1]},[r10]!",
+ "F9 EA B8 8D", "vld1.32 {d27[1]},[r10]!",
+ "F9 EA B4 5D", "vld1.16 {d27[1]},[r10@16]!",
+ "F9 EA B8 BD", "vld1.32 {d27[1]},[r10@32]!",
+ "F9 EA B0 29", "vld1.8 {d27[1]},[r10],r9",
+ "F9 EA B4 49", "vld1.16 {d27[1]},[r10],r9",
+ "F9 EA B8 89", "vld1.32 {d27[1]},[r10],r9",
+ "F9 EA B4 59", "vld1.16 {d27[1]},[r10@16],r9",
+ "F9 EA B8 B9", "vld1.32 {d27[1]},[r10@32],r9",
+ "F9 EA BC 0F", "vld1.8 {d27[]},[r10]",
+ "F9 EA BC 2F", "vld1.8 {d27[],d28[]},[r10]",
+ "F9 EA BC 4F", "vld1.16 {d27[]},[r10]",
+ "F9 EA BC 6F", "vld1.16 {d27[],d28[]},[r10]",
+ "F9 EA BC 8F", "vld1.32 {d27[]},[r10]",
+ "F9 EA BC AF", "vld1.32 {d27[],d28[]},[r10]",
+ "F9 EA BC 5F", "vld1.16 {d27[]},[r10@16]",
+ "F9 EA BC 7F", "vld1.16 {d27[],d28[]},[r10@16]",
+ "F9 EA BC 9F", "vld1.32 {d27[]},[r10@32]",
+ "F9 EA BC BF", "vld1.32 {d27[],d28[]},[r10@32]",
+ "F9 EA BC 0D", "vld1.8 {d27[]},[r10]!",
+ "F9 EA BC 2D", "vld1.8 {d27[],d28[]},[r10]!",
+ "F9 EA BC 4D", "vld1.16 {d27[]},[r10]!",
+ "F9 EA BC 6D", "vld1.16 {d27[],d28[]},[r10]!",
+ "F9 EA BC 8D", "vld1.32 {d27[]},[r10]!",
+ "F9 EA BC AD", "vld1.32 {d27[],d28[]},[r10]!",
+ "F9 EA BC 5D", "vld1.16 {d27[]},[r10@16]!",
+ "F9 EA BC 7D", "vld1.16 {d27[],d28[]},[r10@16]!",
+ "F9 EA BC 9D", "vld1.32 {d27[]},[r10@32]!",
+ "F9 EA BC BD", "vld1.32 {d27[],d28[]},[r10@32]!",
+ "F9 EA BC 09", "vld1.8 {d27[]},[r10],r9",
+ "F9 EA BC 29", "vld1.8 {d27[],d28[]},[r10],r9",
+ "F9 EA BC 49", "vld1.16 {d27[]},[r10],r9",
+ "F9 EA BC 69", "vld1.16 {d27[],d28[]},[r10],r9",
+ "F9 EA BC 89", "vld1.32 {d27[]},[r10],r9",
+ "F9 EA BC A9", "vld1.32 {d27[],d28[]},[r10],r9",
+ "F9 EA BC 59", "vld1.16 {d27[]},[r10@16],r9",
+ "F9 EA BC 79", "vld1.16 {d27[],d28[]},[r10@16],r9",
+ "F9 EA BC 99", "vld1.32 {d27[]},[r10@32],r9",
+ "F9 EA BC B9", "vld1.32 {d27[],d28[]},[r10@32],r9",
+ "F9 6A B8 0F", "vld2.8 {d27,d28},[r10]",
+ "F9 6A B9 0F", "vld2.8 {d27,d29},[r10]",
+ "F9 6A B3 0F", "vld2.8 {d27,d28,d29,d30},[r10]",
+ "F9 6A B8 4F", "vld2.16 {d27,d28},[r10]",
+ "F9 6A B9 4F", "vld2.16 {d27,d29},[r10]",
+ "F9 6A B3 4F", "vld2.16 {d27,d28,d29,d30},[r10]",
+ "F9 6A B8 8F", "vld2.32 {d27,d28},[r10]",
+ "F9 6A B9 8F", "vld2.32 {d27,d29},[r10]",
+ "F9 6A B3 8F", "vld2.32 {d27,d28,d29,d30},[r10]",
+ "F9 6A B8 1F", "vld2.8 {d27,d28},[r10@64]",
+ "F9 6A B8 2F", "vld2.8 {d27,d28},[r10@128]",
+ "F9 6A B9 1F", "vld2.8 {d27,d29},[r10@64]",
+ "F9 6A B9 2F", "vld2.8 {d27,d29},[r10@128]",
+ "F9 6A B3 1F", "vld2.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B3 2F", "vld2.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B3 3F", "vld2.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B8 5F", "vld2.16 {d27,d28},[r10@64]",
+ "F9 6A B8 6F", "vld2.16 {d27,d28},[r10@128]",
+ "F9 6A B9 5F", "vld2.16 {d27,d29},[r10@64]",
+ "F9 6A B9 6F", "vld2.16 {d27,d29},[r10@128]",
+ "F9 6A B3 5F", "vld2.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B3 6F", "vld2.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B3 7F", "vld2.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B8 9F", "vld2.32 {d27,d28},[r10@64]",
+ "F9 6A B8 AF", "vld2.32 {d27,d28},[r10@128]",
+ "F9 6A B9 9F", "vld2.32 {d27,d29},[r10@64]",
+ "F9 6A B9 AF", "vld2.32 {d27,d29},[r10@128]",
+ "F9 6A B3 9F", "vld2.32 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B3 AF", "vld2.32 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B3 BF", "vld2.32 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A B8 0D", "vld2.8 {d27,d28},[r10]!",
+ "F9 6A B9 0D", "vld2.8 {d27,d29},[r10]!",
+ "F9 6A B3 0D", "vld2.8 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B8 4D", "vld2.16 {d27,d28},[r10]!",
+ "F9 6A B9 4D", "vld2.16 {d27,d29},[r10]!",
+ "F9 6A B3 4D", "vld2.16 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B8 8D", "vld2.32 {d27,d28},[r10]!",
+ "F9 6A B9 8D", "vld2.32 {d27,d29},[r10]!",
+ "F9 6A B3 8D", "vld2.32 {d27,d28,d29,d30},[r10]!",
+ "F9 6A B8 1D", "vld2.8 {d27,d28},[r10@64]!",
+ "F9 6A B8 2D", "vld2.8 {d27,d28},[r10@128]!",
+ "F9 6A B9 1D", "vld2.8 {d27,d29},[r10@64]!",
+ "F9 6A B9 2D", "vld2.8 {d27,d29},[r10@128]!",
+ "F9 6A B3 1D", "vld2.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B3 2D", "vld2.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B3 3D", "vld2.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B8 5D", "vld2.16 {d27,d28},[r10@64]!",
+ "F9 6A B8 6D", "vld2.16 {d27,d28},[r10@128]!",
+ "F9 6A B9 5D", "vld2.16 {d27,d29},[r10@64]!",
+ "F9 6A B9 6D", "vld2.16 {d27,d29},[r10@128]!",
+ "F9 6A B3 5D", "vld2.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B3 6D", "vld2.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B3 7D", "vld2.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B8 9D", "vld2.32 {d27,d28},[r10@64]!",
+ "F9 6A B8 AD", "vld2.32 {d27,d28},[r10@128]!",
+ "F9 6A B9 9D", "vld2.32 {d27,d29},[r10@64]!",
+ "F9 6A B9 AD", "vld2.32 {d27,d29},[r10@128]!",
+ "F9 6A B3 9D", "vld2.32 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B3 AD", "vld2.32 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B3 BD", "vld2.32 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A B8 09", "vld2.8 {d27,d28},[r10],r9",
+ "F9 6A B9 09", "vld2.8 {d27,d29},[r10],r9",
+ "F9 6A B3 09", "vld2.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B8 49", "vld2.16 {d27,d28},[r10],r9",
+ "F9 6A B9 49", "vld2.16 {d27,d29},[r10],r9",
+ "F9 6A B3 49", "vld2.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B8 89", "vld2.32 {d27,d28},[r10],r9",
+ "F9 6A B9 89", "vld2.32 {d27,d29},[r10],r9",
+ "F9 6A B3 89", "vld2.32 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A B8 19", "vld2.8 {d27,d28},[r10@64],r9",
+ "F9 6A B8 29", "vld2.8 {d27,d28},[r10@128],r9",
+ "F9 6A B9 19", "vld2.8 {d27,d29},[r10@64],r9",
+ "F9 6A B9 29", "vld2.8 {d27,d29},[r10@128],r9",
+ "F9 6A B3 19", "vld2.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B3 29", "vld2.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B3 39", "vld2.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A B8 59", "vld2.16 {d27,d28},[r10@64],r9",
+ "F9 6A B8 69", "vld2.16 {d27,d28},[r10@128],r9",
+ "F9 6A B9 59", "vld2.16 {d27,d29},[r10@64],r9",
+ "F9 6A B9 69", "vld2.16 {d27,d29},[r10@128],r9",
+ "F9 6A B3 59", "vld2.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B3 69", "vld2.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B3 79", "vld2.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A B8 99", "vld2.32 {d27,d28},[r10@64],r9",
+ "F9 6A B8 A9", "vld2.32 {d27,d28},[r10@128],r9",
+ "F9 6A B9 99", "vld2.32 {d27,d29},[r10@64],r9",
+ "F9 6A B9 A9", "vld2.32 {d27,d29},[r10@128],r9",
+ "F9 6A B3 99", "vld2.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B3 A9", "vld2.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B3 B9", "vld2.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 EA B1 2F", "vld2.8 {d27[1],d28[1]},[r10]",
+ "F9 EA B5 4F", "vld2.16 {d27[1],d28[1]},[r10]",
+ "F9 EA B5 6F", "vld2.16 {d27[1],d29[1]},[r10]",
+ "F9 EA B9 8F", "vld2.32 {d27[1],d28[1]},[r10]",
+ "F9 EA B9 CF", "vld2.32 {d27[1],d29[1]},[r10]",
+ "F9 EA B1 3F", "vld2.8 {d27[1],d28[1]},[r10@16]",
+ "F9 EA B5 5F", "vld2.16 {d27[1],d28[1]},[r10@32]",
+ "F9 EA B5 7F", "vld2.16 {d27[1],d29[1]},[r10@32]",
+ "F9 EA B9 9F", "vld2.32 {d27[1],d28[1]},[r10@64]",
+ "F9 EA B9 DF", "vld2.32 {d27[1],d29[1]},[r10@64]",
+ "F9 EA B1 2D", "vld2.8 {d27[1],d28[1]},[r10]!",
+ "F9 EA B5 4D", "vld2.16 {d27[1],d28[1]},[r10]!",
+ "F9 EA B5 6D", "vld2.16 {d27[1],d29[1]},[r10]!",
+ "F9 EA B9 8D", "vld2.32 {d27[1],d28[1]},[r10]!",
+ "F9 EA B9 CD", "vld2.32 {d27[1],d29[1]},[r10]!",
+ "F9 EA B1 3D", "vld2.8 {d27[1],d28[1]},[r10@16]!",
+ "F9 EA B5 5D", "vld2.16 {d27[1],d28[1]},[r10@32]!",
+ "F9 EA B5 7D", "vld2.16 {d27[1],d29[1]},[r10@32]!",
+ "F9 EA B9 9D", "vld2.32 {d27[1],d28[1]},[r10@64]!",
+ "F9 EA B9 DD", "vld2.32 {d27[1],d29[1]},[r10@64]!",
+ "F9 EA B1 29", "vld2.8 {d27[1],d28[1]},[r10],r9",
+ "F9 EA B5 49", "vld2.16 {d27[1],d28[1]},[r10],r9",
+ "F9 EA B5 69", "vld2.16 {d27[1],d29[1]},[r10],r9",
+ "F9 EA B9 89", "vld2.32 {d27[1],d28[1]},[r10],r9",
+ "F9 EA B9 C9", "vld2.32 {d27[1],d29[1]},[r10],r9",
+ "F9 EA B1 39", "vld2.8 {d27[1],d28[1]},[r10@16],r9",
+ "F9 EA B5 59", "vld2.16 {d27[1],d28[1]},[r10@32],r9",
+ "F9 EA B5 79", "vld2.16 {d27[1],d29[1]},[r10@32],r9",
+ "F9 EA B9 99", "vld2.32 {d27[1],d28[1]},[r10@64],r9",
+ "F9 EA B9 D9", "vld2.32 {d27[1],d29[1]},[r10@64],r9",
+ "F9 EA BD 0F", "vld2.8 {d27[],d28[]},[r10]",
+ "F9 EA BD 2F", "vld2.8 {d27[],d29[]},[r10]",
+ "F9 EA BD 4F", "vld2.16 {d27[],d28[]},[r10]",
+ "F9 EA BD 6F", "vld2.16 {d27[],d29[]},[r10]",
+ "F9 EA BD 8F", "vld2.32 {d27[],d28[]},[r10]",
+ "F9 EA BD AF", "vld2.32 {d27[],d29[]},[r10]",
+ "F9 EA BD 1F", "vld2.8 {d27[],d28[]},[r10@16]",
+ "F9 EA BD 3F", "vld2.8 {d27[],d29[]},[r10@16]",
+ "F9 EA BD 5F", "vld2.16 {d27[],d28[]},[r10@32]",
+ "F9 EA BD 7F", "vld2.16 {d27[],d29[]},[r10@32]",
+ "F9 EA BD 9F", "vld2.32 {d27[],d28[]},[r10@64]",
+ "F9 EA BD BF", "vld2.32 {d27[],d29[]},[r10@64]",
+ "F9 EA BD 0D", "vld2.8 {d27[],d28[]},[r10]!",
+ "F9 EA BD 2D", "vld2.8 {d27[],d29[]},[r10]!",
+ "F9 EA BD 4D", "vld2.16 {d27[],d28[]},[r10]!",
+ "F9 EA BD 6D", "vld2.16 {d27[],d29[]},[r10]!",
+ "F9 EA BD 8D", "vld2.32 {d27[],d28[]},[r10]!",
+ "F9 EA BD AD", "vld2.32 {d27[],d29[]},[r10]!",
+ "F9 EA BD 1D", "vld2.8 {d27[],d28[]},[r10@16]!",
+ "F9 EA BD 3D", "vld2.8 {d27[],d29[]},[r10@16]!",
+ "F9 EA BD 5D", "vld2.16 {d27[],d28[]},[r10@32]!",
+ "F9 EA BD 7D", "vld2.16 {d27[],d29[]},[r10@32]!",
+ "F9 EA BD 9D", "vld2.32 {d27[],d28[]},[r10@64]!",
+ "F9 EA BD BD", "vld2.32 {d27[],d29[]},[r10@64]!",
+ "F9 EA BD 09", "vld2.8 {d27[],d28[]},[r10],r9",
+ "F9 EA BD 29", "vld2.8 {d27[],d29[]},[r10],r9",
+ "F9 EA BD 49", "vld2.16 {d27[],d28[]},[r10],r9",
+ "F9 EA BD 69", "vld2.16 {d27[],d29[]},[r10],r9",
+ "F9 EA BD 89", "vld2.32 {d27[],d28[]},[r10],r9",
+ "F9 EA BD A9", "vld2.32 {d27[],d29[]},[r10],r9",
+ "F9 EA BD 19", "vld2.8 {d27[],d28[]},[r10@16],r9",
+ "F9 EA BD 39", "vld2.8 {d27[],d29[]},[r10@16],r9",
+ "F9 EA BD 59", "vld2.16 {d27[],d28[]},[r10@32],r9",
+ "F9 EA BD 79", "vld2.16 {d27[],d29[]},[r10@32],r9",
+ "F9 EA BD 99", "vld2.32 {d27[],d28[]},[r10@64],r9",
+ "F9 EA BD B9", "vld2.32 {d27[],d29[]},[r10@64],r9",
+ "F9 6A B4 0F", "vld3.8 {d27,d28,d29},[r10]",
+ "F9 6A B5 0F", "vld3.8 {d27,d29,d31},[r10]",
+ "F9 6A B4 4F", "vld3.16 {d27,d28,d29},[r10]",
+ "F9 6A B5 4F", "vld3.16 {d27,d29,d31},[r10]",
+ "F9 6A B4 8F", "vld3.32 {d27,d28,d29},[r10]",
+ "F9 6A B5 8F", "vld3.32 {d27,d29,d31},[r10]",
+ "F9 6A B4 1F", "vld3.8 {d27,d28,d29},[r10@64]",
+ "F9 6A B5 1F", "vld3.8 {d27,d29,d31},[r10@64]",
+ "F9 6A B4 5F", "vld3.16 {d27,d28,d29},[r10@64]",
+ "F9 6A B5 5F", "vld3.16 {d27,d29,d31},[r10@64]",
+ "F9 6A B4 9F", "vld3.32 {d27,d28,d29},[r10@64]",
+ "F9 6A B5 9F", "vld3.32 {d27,d29,d31},[r10@64]",
+ "F9 6A B4 0D", "vld3.8 {d27,d28,d29},[r10]!",
+ "F9 6A B5 0D", "vld3.8 {d27,d29,d31},[r10]!",
+ "F9 6A B4 4D", "vld3.16 {d27,d28,d29},[r10]!",
+ "F9 6A B5 4D", "vld3.16 {d27,d29,d31},[r10]!",
+ "F9 6A B4 8D", "vld3.32 {d27,d28,d29},[r10]!",
+ "F9 6A B5 8D", "vld3.32 {d27,d29,d31},[r10]!",
+ "F9 6A B4 1D", "vld3.8 {d27,d28,d29},[r10@64]!",
+ "F9 6A B5 1D", "vld3.8 {d27,d29,d31},[r10@64]!",
+ "F9 6A B4 5D", "vld3.16 {d27,d28,d29},[r10@64]!",
+ "F9 6A B5 5D", "vld3.16 {d27,d29,d31},[r10@64]!",
+ "F9 6A B4 9D", "vld3.32 {d27,d28,d29},[r10@64]!",
+ "F9 6A B5 9D", "vld3.32 {d27,d29,d31},[r10@64]!",
+ "F9 6A B4 09", "vld3.8 {d27,d28,d29},[r10],r9",
+ "F9 6A B5 09", "vld3.8 {d27,d29,d31},[r10],r9",
+ "F9 6A B4 49", "vld3.16 {d27,d28,d29},[r10],r9",
+ "F9 6A B5 49", "vld3.16 {d27,d29,d31},[r10],r9",
+ "F9 6A B4 89", "vld3.32 {d27,d28,d29},[r10],r9",
+ "F9 6A B5 89", "vld3.32 {d27,d29,d31},[r10],r9",
+ "F9 6A B4 19", "vld3.8 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B5 19", "vld3.8 {d27,d29,d31},[r10@64],r9",
+ "F9 6A B4 59", "vld3.16 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B5 59", "vld3.16 {d27,d29,d31},[r10@64],r9",
+ "F9 6A B4 99", "vld3.32 {d27,d28,d29},[r10@64],r9",
+ "F9 6A B5 99", "vld3.32 {d27,d29,d31},[r10@64],r9",
+ "F9 EA B2 2F", "vld3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 EA B6 4F", "vld3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 EA B6 6F", "vld3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 EA BA 8F", "vld3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 EA BA CF", "vld3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 EA B2 2D", "vld3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 EA B6 4D", "vld3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 EA B6 6D", "vld3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 EA BA 8D", "vld3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 EA BA CD", "vld3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 EA B2 29", "vld3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 EA B6 49", "vld3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 EA B6 69", "vld3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 EA BA 89", "vld3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 EA BA C9", "vld3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 EA BE 0F", "vld3.8 {d27[],d28[],d29[]},[r10]",
+ "F9 EA BE 2F", "vld3.8 {d27[],d29[],d31[]},[r10]",
+ "F9 EA BE 4F", "vld3.16 {d27[],d28[],d29[]},[r10]",
+ "F9 EA BE 6F", "vld3.16 {d27[],d29[],d31[]},[r10]",
+ "F9 EA BE 8F", "vld3.32 {d27[],d28[],d29[]},[r10]",
+ "F9 EA BE AF", "vld3.32 {d27[],d29[],d31[]},[r10]",
+ "F9 EA BE 0D", "vld3.8 {d27[],d28[],d29[]},[r10]!",
+ "F9 EA BE 2D", "vld3.8 {d27[],d29[],d31[]},[r10]!",
+ "F9 EA BE 4D", "vld3.16 {d27[],d28[],d29[]},[r10]!",
+ "F9 EA BE 6D", "vld3.16 {d27[],d29[],d31[]},[r10]!",
+ "F9 EA BE 8D", "vld3.32 {d27[],d28[],d29[]},[r10]!",
+ "F9 EA BE AD", "vld3.32 {d27[],d29[],d31[]},[r10]!",
+ "F9 EA BE 09", "vld3.8 {d27[],d28[],d29[]},[r10],r9",
+ "F9 EA BE 29", "vld3.8 {d27[],d29[],d31[]},[r10],r9",
+ "F9 EA BE 49", "vld3.16 {d27[],d28[],d29[]},[r10],r9",
+ "F9 EA BE 69", "vld3.16 {d27[],d29[],d31[]},[r10],r9",
+ "F9 EA BE 89", "vld3.32 {d27[],d28[],d29[]},[r10],r9",
+ "F9 EA BE A9", "vld3.32 {d27[],d29[],d31[]},[r10],r9",
+ "F9 6A B0 0F", "vld4.8 {d27,d28,d29,d30},[r10]",
+ "F9 6A 91 0F", "vld4.8 {d25,d27,d29,d31},[r10]",
+ "F9 6A B0 4F", "vld4.16 {d27,d28,d29,d30},[r10]",
+ "F9 6A 91 4F", "vld4.16 {d25,d27,d29,d31},[r10]",
+ "F9 6A B0 8F", "vld4.32 {d27,d28,d29,d30},[r10]",
+ "F9 6A 91 8F", "vld4.32 {d25,d27,d29,d31},[r10]",
+ "F9 6A B0 1F", "vld4.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B0 2F", "vld4.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B0 3F", "vld4.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A 91 1F", "vld4.8 {d25,d27,d29,d31},[r10@64]",
+ "F9 6A 91 2F", "vld4.8 {d25,d27,d29,d31},[r10@128]",
+ "F9 6A 91 3F", "vld4.8 {d25,d27,d29,d31},[r10@256]",
+ "F9 6A B0 5F", "vld4.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B0 6F", "vld4.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B0 7F", "vld4.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A 91 5F", "vld4.16 {d25,d27,d29,d31},[r10@64]",
+ "F9 6A 91 6F", "vld4.16 {d25,d27,d29,d31},[r10@128]",
+ "F9 6A 91 7F", "vld4.16 {d25,d27,d29,d31},[r10@256]",
+ "F9 6A B0 9F", "vld4.32 {d27,d28,d29,d30},[r10@64]",
+ "F9 6A B0 AF", "vld4.32 {d27,d28,d29,d30},[r10@128]",
+ "F9 6A B0 BF", "vld4.32 {d27,d28,d29,d30},[r10@256]",
+ "F9 6A 91 9F", "vld4.32 {d25,d27,d29,d31},[r10@64]",
+ "F9 6A 91 AF", "vld4.32 {d25,d27,d29,d31},[r10@128]",
+ "F9 6A 91 BF", "vld4.32 {d25,d27,d29,d31},[r10@256]",
+ "F9 6A B0 0D", "vld4.8 {d27,d28,d29,d30},[r10]!",
+ "F9 6A 91 0D", "vld4.8 {d25,d27,d29,d31},[r10]!",
+ "F9 6A B0 4D", "vld4.16 {d27,d28,d29,d30},[r10]!",
+ "F9 6A 91 4D", "vld4.16 {d25,d27,d29,d31},[r10]!",
+ "F9 6A B0 8D", "vld4.32 {d27,d28,d29,d30},[r10]!",
+ "F9 6A 91 8D", "vld4.32 {d25,d27,d29,d31},[r10]!",
+ "F9 6A B0 1D", "vld4.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B0 2D", "vld4.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B0 3D", "vld4.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A 91 1D", "vld4.8 {d25,d27,d29,d31},[r10@64]!",
+ "F9 6A 91 2D", "vld4.8 {d25,d27,d29,d31},[r10@128]!",
+ "F9 6A 91 3D", "vld4.8 {d25,d27,d29,d31},[r10@256]!",
+ "F9 6A B0 5D", "vld4.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B0 6D", "vld4.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B0 7D", "vld4.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A 91 5D", "vld4.16 {d25,d27,d29,d31},[r10@64]!",
+ "F9 6A 91 6D", "vld4.16 {d25,d27,d29,d31},[r10@128]!",
+ "F9 6A 91 7D", "vld4.16 {d25,d27,d29,d31},[r10@256]!",
+ "F9 6A B0 9D", "vld4.32 {d27,d28,d29,d30},[r10@64]!",
+ "F9 6A B0 AD", "vld4.32 {d27,d28,d29,d30},[r10@128]!",
+ "F9 6A B0 BD", "vld4.32 {d27,d28,d29,d30},[r10@256]!",
+ "F9 6A 91 9D", "vld4.32 {d25,d27,d29,d31},[r10@64]!",
+ "F9 6A 91 AD", "vld4.32 {d25,d27,d29,d31},[r10@128]!",
+ "F9 6A 91 BD", "vld4.32 {d25,d27,d29,d31},[r10@256]!",
+ "F9 6A B0 09", "vld4.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A 91 09", "vld4.8 {d25,d27,d29,d31},[r10],r9",
+ "F9 6A B0 49", "vld4.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A 91 49", "vld4.16 {d25,d27,d29,d31},[r10],r9",
+ "F9 6A B0 89", "vld4.32 {d27,d28,d29,d30},[r10],r9",
+ "F9 6A 91 89", "vld4.32 {d25,d27,d29,d31},[r10],r9",
+ "F9 6A B0 19", "vld4.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B0 29", "vld4.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B0 39", "vld4.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A 91 19", "vld4.8 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 6A 91 29", "vld4.8 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 6A 91 39", "vld4.8 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 6A B0 59", "vld4.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B0 69", "vld4.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B0 79", "vld4.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A 91 59", "vld4.16 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 6A 91 69", "vld4.16 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 6A 91 79", "vld4.16 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 6A B0 99", "vld4.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 6A B0 A9", "vld4.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 6A B0 B9", "vld4.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 6A 91 99", "vld4.32 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 6A 91 A9", "vld4.32 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 6A 91 B9", "vld4.32 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 EA B3 2F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 EA B7 4F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 EA 97 6F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F9 EA BB 8F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 EA 9B CF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F9 EA B3 3F", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
+ "F9 EA B7 5F", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F9 EA 97 7F", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F9 EA BB 9F", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F9 EA BB AF", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
+ "F9 EA 9B DF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F9 EA 9B EF", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
+ "F9 EA B3 2D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 EA B7 4D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 EA 97 6D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F9 EA BB 8D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 EA 9B CD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F9 EA B3 3D", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
+ "F9 EA B7 5D", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F9 EA 97 7D", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F9 EA BB 9D", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F9 EA BB AD", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
+ "F9 EA 9B DD", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F9 EA 9B ED", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
+ "F9 EA B3 29", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 EA B7 49", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 EA 97 69", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 EA BB 89", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 EA 9B C9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 EA B3 39", "vld4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
+ "F9 EA B7 59", "vld4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F9 EA 97 79", "vld4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F9 EA BB 99", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F9 EA BB A9", "vld4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
+ "F9 EA 9B D9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F9 EA 9B E9", "vld4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
+ "F9 EA BF 0F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]",
+ "F9 EA 9F 2F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]",
+ "F9 EA BF 4F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]",
+ "F9 EA 9F 6F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]",
+ "F9 EA BF 8F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]",
+ "F9 EA 9F AF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]",
+ "F9 EA BF 1F", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]",
+ "F9 EA 9F 3F", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]",
+ "F9 EA BF 5F", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]",
+ "F9 EA 9F 7F", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]",
+ "F9 EA BF 9F", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]",
+ "F9 EA BF DF", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]",
+ "F9 EA 9F BF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]",
+ "F9 EA 9F FF", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]",
+ "F9 EA BF 0D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F9 EA 9F 2D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F9 EA BF 4D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F9 EA 9F 6D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F9 EA BF 8D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10]!",
+ "F9 EA 9F AD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10]!",
+ "F9 EA BF 1D", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32]!",
+ "F9 EA 9F 3D", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32]!",
+ "F9 EA BF 5D", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64]!",
+ "F9 EA 9F 7D", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64]!",
+ "F9 EA BF 9D", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64]!",
+ "F9 EA BF DD", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128]!",
+ "F9 EA 9F BD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64]!",
+ "F9 EA 9F FD", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128]!",
+ "F9 EA BF 09", "vld4.8 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F9 EA 9F 29", "vld4.8 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F9 EA BF 49", "vld4.16 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F9 EA 9F 69", "vld4.16 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F9 EA BF 89", "vld4.32 {d27[],d28[],d29[],d30[]},[r10],r9",
+ "F9 EA 9F A9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10],r9",
+ "F9 EA BF 19", "vld4.8 {d27[],d28[],d29[],d30[]},[r10@32],r9",
+ "F9 EA 9F 39", "vld4.8 {d25[],d27[],d29[],d31[]},[r10@32],r9",
+ "F9 EA BF 59", "vld4.16 {d27[],d28[],d29[],d30[]},[r10@64],r9",
+ "F9 EA 9F 79", "vld4.16 {d25[],d27[],d29[],d31[]},[r10@64],r9",
+ "F9 EA BF 99", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@64],r9",
+ "F9 EA BF D9", "vld4.32 {d27[],d28[],d29[],d30[]},[r10@128],r9",
+ "F9 EA 9F B9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@64],r9",
+ "F9 EA 9F F9", "vld4.32 {d25[],d27[],d29[],d31[]},[r10@128],r9",
+ "EC BA AA 03", "vldmia r10!,{s20-s22}",
+ "ED 3A AA 03", "vldmdb r10!,{s20-s22}",
+ "EC FA 4B 06", "vldmia r10!,{d20-d22}",
+ "ED 7A 4B 06", "vldmdb r10!,{d20-d22}",
+ "EC 9A AA 03", "vldmia r10,{s20-s22}",
+ "EC DA 4B 06", "vldmia r10,{d20-d22}",
+ "ED 5F 5B 21", "vldr.64 d21,[pc,#-0x84]",
+ "ED DF 5B 21", "vldr.64 d21,[pc,#0x84]",
+ "ED DA 5B 00", "vldr.64 d21,[r10]",
+ "ED 5A 5B 21", "vldr.64 d21,[r10,#-0x84]",
+ "ED DA 5B 00", "vldr.64 d21,[r10]",
+ "ED DA 5B 21", "vldr.64 d21,[r10,#0x84]",
+ "ED 5F AA 21", "vldr.32 s21,[pc,#-0x84]",
+ "ED DF AA 21", "vldr.32 s21,[pc,#0x84]",
+ "ED DA AA 00", "vldr.32 s21,[r10]",
+ "ED 5A AA 21", "vldr.32 s21,[r10,#-0x84]",
+ "ED DA AA 00", "vldr.32 s21,[r10]",
+ "ED DA AA 21", "vldr.32 s21,[r10,#0x84]",
+ "EF 49 56 AA", "vmax.s8 d21,d25,d26",
+ "EF 59 56 AA", "vmax.s16 d21,d25,d26",
+ "EF 69 56 AA", "vmax.s32 d21,d25,d26",
+ "FF 49 56 AA", "vmax.u8 d21,d25,d26",
+ "FF 59 56 AA", "vmax.u16 d21,d25,d26",
+ "FF 69 56 AA", "vmax.u32 d21,d25,d26",
+ "EF 4C 66 EE", "vmax.s8 q11,q14,q15",
+ "EF 5C 66 EE", "vmax.s16 q11,q14,q15",
+ "EF 6C 66 EE", "vmax.s32 q11,q14,q15",
+ "FF 4C 66 EE", "vmax.u8 q11,q14,q15",
+ "FF 5C 66 EE", "vmax.u16 q11,q14,q15",
+ "FF 6C 66 EE", "vmax.u32 q11,q14,q15",
+ "EF 49 5F AA", "vmax.f32 d21,d25,d26",
+ "EF 4C 6F EE", "vmax.f32 q11,q14,q15",
+ "EF 49 56 BA", "vmin.s8 d21,d25,d26",
+ "EF 59 56 BA", "vmin.s16 d21,d25,d26",
+ "EF 69 56 BA", "vmin.s32 d21,d25,d26",
+ "FF 49 56 BA", "vmin.u8 d21,d25,d26",
+ "FF 59 56 BA", "vmin.u16 d21,d25,d26",
+ "FF 69 56 BA", "vmin.u32 d21,d25,d26",
+ "EF 4C 66 FE", "vmin.s8 q11,q14,q15",
+ "EF 5C 66 FE", "vmin.s16 q11,q14,q15",
+ "EF 6C 66 FE", "vmin.s32 q11,q14,q15",
+ "FF 4C 66 FE", "vmin.u8 q11,q14,q15",
+ "FF 5C 66 FE", "vmin.u16 q11,q14,q15",
+ "FF 6C 66 FE", "vmin.u32 q11,q14,q15",
+ "EF 69 5F AA", "vmin.f32 d21,d25,d26",
+ "EF 6C 6F EE", "vmin.f32 q11,q14,q15",
+ "EF D9 50 CF", "vmla.i16 d21,d25,d7[1]",
+ "EF E9 50 EF", "vmla.i32 d21,d25,d15[1]",
+ "EF E9 51 EF", "vmla.f32 d21,d25,d15[1]",
+ "EF 49 59 AA", "vmla.i8 d21,d25,d26",
+ "EF 59 59 AA", "vmla.i16 d21,d25,d26",
+ "EF 69 59 AA", "vmla.i32 d21,d25,d26",
+ "FF DC 60 CF", "vmla.i16 q11,q14,d7[1]",
+ "FF EC 60 EF", "vmla.i32 q11,q14,d15[1]",
+ "EF 4C 69 EE", "vmla.i8 q11,q14,q15",
+ "EF 5C 69 EE", "vmla.i16 q11,q14,q15",
+ "EF 6C 69 EE", "vmla.i32 q11,q14,q15",
+ "EF 49 5D BA", "vmla.f32 d21,d25,d26",
+ "EF 4C 6D FE", "vmla.f32 q11,q14,q15",
+ "EE 4C AA 8D", "vmla.f32 s21,s25,s26",
+ "EE 49 5B AA", "vmla.f64 d21,d25,d26",
+ "EF D9 62 CF", "vmlal.s16 q11,d25,d7[1]",
+ "EF E9 62 EF", "vmlal.s32 q11,d25,d15[1]",
+ "FF D9 62 CF", "vmlal.u16 q11,d25,d7[1]",
+ "FF E9 62 EF", "vmlal.u32 q11,d25,d15[1]",
+ "EF C9 68 AA", "vmlal.s8 q11,d25,d26",
+ "EF D9 68 AA", "vmlal.s16 q11,d25,d26",
+ "EF E9 68 AA", "vmlal.s32 q11,d25,d26",
+ "FF C9 68 AA", "vmlal.u8 q11,d25,d26",
+ "FF D9 68 AA", "vmlal.u16 q11,d25,d26",
+ "FF E9 68 AA", "vmlal.u32 q11,d25,d26",
+ "EF D9 54 CF", "vmls.i16 d21,d25,d7[1]",
+ "EF E9 54 EF", "vmls.i32 d21,d25,d15[1]",
+ "EF E9 55 EF", "vmls.f32 d21,d25,d15[1]",
+ "FF 49 59 AA", "vmls.i8 d21,d25,d26",
+ "FF 59 59 AA", "vmls.i16 d21,d25,d26",
+ "FF 69 59 AA", "vmls.i32 d21,d25,d26",
+ "FF DC 64 CF", "vmls.i16 q11,q14,d7[1]",
+ "FF EC 64 EF", "vmls.i32 q11,q14,d15[1]",
+ "FF EC 65 EF", "vmls.f32 q11,q14,d15[1]",
+ "FF 4C 69 EE", "vmls.i8 q11,q14,q15",
+ "FF 5C 69 EE", "vmls.i16 q11,q14,q15",
+ "FF 6C 69 EE", "vmls.i32 q11,q14,q15",
+ "EF 69 5D BA", "vmls.f32 d21,d25,d26",
+ "EF 6C 6D FE", "vmls.f32 q11,q14,q15",
+ "EE 4C AA CD", "vmls.f32 s21,s25,s26",
+ "EE 49 5B EA", "vmls.f64 d21,d25,d26",
+ "EF D9 66 CF", "vmlsl.s16 q11,d25,d7[1]",
+ "EF E9 66 EF", "vmlsl.s32 q11,d25,d15[1]",
+ "FF D9 66 CF", "vmlsl.u16 q11,d25,d7[1]",
+ "FF E9 66 EF", "vmlsl.u32 q11,d25,d15[1]",
+ "EF C9 6A AA", "vmlsl.s8 q11,d25,d26",
+ "EF D9 6A AA", "vmlsl.s16 q11,d25,d26",
+ "EF E9 6A AA", "vmlsl.s32 q11,d25,d26",
+ "FF C9 6A AA", "vmlsl.u8 q11,d25,d26",
+ "FF D9 6A AA", "vmlsl.u16 q11,d25,d26",
+ "FF E9 6A AA", "vmlsl.u32 q11,d25,d26",
+ "EF 6A 51 BA", "vmov d21,d26",
+ "EF 6E 61 FE", "vmov q11,q15",
+ "EC 46 5B 3A", "vmov d26,r5,r6",
+ "EC 56 5B 3A", "vmov r5,r6,d26",
+ "EC 56 5A 1D", "vmov r5,r6,s26,s27",
+ "EE 1C 5A 90", "vmov r5,s25",
+ "EE 0C 5A 90", "vmov s25,r5",
+ "EE 0C 5A 90", "vmov s25,r5",
+ "EC 46 5A 1D", "vmov s26,s27,r5,r6",
+ "FF C0 5E 19", "vmov.i8 d21,#0x89",
+ "FF C0 58 19", "vmov.i16 d21,#0x89",
+ "FF C0 50 19", "vmov.i32 d21,#0x89",
+ "EF C0 5E 30", "vmov.i64 d21,#0x0",
+ "FF C0 6E 59", "vmov.i8 q11,#0x89",
+ "FF C0 68 59", "vmov.i16 q11,#0x89",
+ "FF C0 60 59", "vmov.i32 q11,#0x89",
+ "EF C0 6E 70", "vmov.i64 q11,#0x0",
+ "EE 5B 5B B0", "vmov.s8 r5,d27[1]",
+ "EE 1B 5B F0", "vmov.s16 r5,d27[1]",
+ "EE DB 5B B0", "vmov.u8 r5,d27[1]",
+ "EE 9B 5B F0", "vmov.u16 r5,d27[1]",
+ "EE 3B 5B 90", "vmov.32 r5,d27[1]",
+ "EE 4B 5B B0", "vmov.8 d27[1],r5",
+ "EE 0B 5B F0", "vmov.16 d27[1],r5",
+ "EE 2B 5B 90", "vmov.32 d27[1],r5",
+ "EE B7 BA 00", "vmov.f32 s22,#0x70", // originally "vmov.f32 s22,#1.0"
+ "EE F0 AA 4D", "vmov.f32 s21,s26",
+ "EE F7 6B 00", "vmov.f64 d22,#0x70", // originally "vmov.f64 d22,#1.0"
+ "EE F0 5B 6A", "vmov.f64 d21,d26",
+ "EF C8 6A 3A", "vmovl.s8 q11,d26",
+ "EF D0 6A 3A", "vmovl.s16 q11,d26",
+ "EF E0 6A 3A", "vmovl.s32 q11,d26",
+ "FF C8 6A 3A", "vmovl.u8 q11,d26",
+ "FF D0 6A 3A", "vmovl.u16 q11,d26",
+ "FF E0 6A 3A", "vmovl.u32 q11,d26",
+ "FF F2 52 2E", "vmovn.i16 d21,q15",
+ "FF F6 52 2E", "vmovn.i32 d21,q15",
+ "FF FA 52 2E", "vmovn.i64 d21,q15",
+ "EE F0 5A 10", "vmrs r5,fpsid",
+ "EE F1 5A 10", "vmrs r5,fpscr",
+ "EE F6 5A 10", "vmrs r5,mvfr1",
+ "EE F7 5A 10", "vmrs r5,mvfr0",
+ "EE F8 5A 10", "vmrs r5,fpexc",
+ "EE F9 5A 10", "vmrs r5,fpinst",
+ "EE FA 5A 10", "vmrs r5,fpinst2",
+ "EE E0 5A 10", "vmsr fpsid,r5",
+ "EE E1 5A 10", "vmsr fpscr,r5",
+ "EE E8 5A 10", "vmsr fpexc,r5",
+ "EE E9 5A 10", "vmsr fpinst,r5",
+ "EE EA 5A 10", "vmsr fpinst2,r5",
+ "EF D9 58 CF", "vmul.i16 d21,d25,d7[1]",
+ "EF E9 58 EF", "vmul.i32 d21,d25,d15[1]",
+ "EF E9 59 EF", "vmul.f32 d21,d25,d15[1]",
+ "EF 49 59 BA", "vmul.i8 d21,d25,d26",
+ "EF 49 59 BA", "vmul.i8 d21,d25,d26",
+ "EF 59 59 BA", "vmul.i16 d21,d25,d26",
+ "EF 69 59 BA", "vmul.i32 d21,d25,d26",
+ "FF 49 59 BA", "vmul.p8 d21,d25,d26",
+ "FF DC 68 CF", "vmul.i16 q11,q14,d7[1]",
+ "FF EC 68 EF", "vmul.i32 q11,q14,d15[1]",
+ "FF EC 69 EF", "vmul.f32 q11,q14,d15[1]",
+ "EF 4C 69 FE", "vmul.i8 q11,q14,q15",
+ "EF 5C 69 FE", "vmul.i16 q11,q14,q15",
+ "EF 6C 69 FE", "vmul.i32 q11,q14,q15",
+ "FF 4C 69 FE", "vmul.p8 q11,q14,q15",
+ "FF 49 5D BA", "vmul.f32 d21,d25,d26",
+ "FF 4C 6D FE", "vmul.f32 q11,q14,q15",
+ "EE 6C AA 8D", "vmul.f32 s21,s25,s26",
+ "EE 69 5B AA", "vmul.f64 d21,d25,d26",
+ "EF D9 6A CF", "vmull.s16 q11,d25,d7[1]",
+ "EF E9 6A EF", "vmull.s32 q11,d25,d15[1]",
+ "FF D9 6A CF", "vmull.u16 q11,d25,d7[1]",
+ "FF E9 6A EF", "vmull.u32 q11,d25,d15[1]",
+ "EF C9 6C AA", "vmull.s8 q11,d25,d26",
+ "EF D9 6C AA", "vmull.s16 q11,d25,d26",
+ "EF E9 6C AA", "vmull.s32 q11,d25,d26",
+ "FF C9 6C AA", "vmull.u8 q11,d25,d26",
+ "FF D9 6C AA", "vmull.u16 q11,d25,d26",
+ "FF E9 6C AA", "vmull.u32 q11,d25,d26",
+ "EF C9 6E AA", "vmull.p8 q11,d25,d26",
+ "FF F0 55 AA", "vmvn d21,d26",
+ "FF F0 65 EE", "vmvn q11,q15",
+ "FF C0 58 37", "vmvn.i16 d21,#0x87",
+ "FF C0 50 37", "vmvn.i32 d21,#0x87",
+ "FF C0 68 77", "vmvn.i16 q11,#0x87",
+ "FF C0 60 77", "vmvn.i32 q11,#0x87",
+ "FF F1 53 AA", "vneg.s8 d21,d26",
+ "FF F5 53 AA", "vneg.s16 d21,d26",
+ "FF F9 53 AA", "vneg.s32 d21,d26",
+ "FF F9 57 AA", "vneg.f32 d21,d26",
+ "EE F1 5B 6A", "vneg.f64 d21,d26",
+ "FF F1 63 EE", "vneg.s8 q11,q15",
+ "FF F5 63 EE", "vneg.s16 q11,q15",
+ "FF F9 63 EE", "vneg.s32 q11,q15",
+ "FF F9 67 EE", "vneg.f32 q11,q15",
+ "EE F1 AA 4D", "vneg.f32 s21,s26",
+ "EE 5C AA CD", "vnmla.f32 s21,s25,s26",
+ "EE 59 5B EA", "vnmla.f64 d21,d25,d26",
+ "EE 5C AA 8D", "vnmls.f32 s21,s25,s26",
+ "EE 59 5B AA", "vnmls.f64 d21,d25,d26",
+ "EE 6C AA CD", "vnmul.f32 s21,s25,s26",
+ "EE 69 5B EA", "vnmul.f64 d21,d25,d26",
+ "EF 79 51 BA", "vorn d21,d25,d26",
+ "EF 7C 61 FE", "vorn q11,q14,q15",
+ "EF 69 51 BA", "vorr d21,d25,d26",
+ "EF 6C 61 FE", "vorr q11,q14,q15",
+ "FF C0 59 17", "vorr.i16 d21,#0x87",
+ "FF C0 51 17", "vorr.i32 d21,#0x87",
+ "FF C0 69 57", "vorr.i16 q11,#0x87",
+ "FF C0 61 57", "vorr.i32 q11,#0x87",
+ "FF F0 56 2A", "vpadal.s8 d21,d26",
+ "FF F4 56 2A", "vpadal.s16 d21,d26",
+ "FF F8 56 2A", "vpadal.s32 d21,d26",
+ "FF F0 56 AA", "vpadal.u8 d21,d26",
+ "FF F4 56 AA", "vpadal.u16 d21,d26",
+ "FF F8 56 AA", "vpadal.u32 d21,d26",
+ "FF F0 66 6E", "vpadal.s8 q11,q15",
+ "FF F4 66 6E", "vpadal.s16 q11,q15",
+ "FF F8 66 6E", "vpadal.s32 q11,q15",
+ "FF F0 66 EE", "vpadal.u8 q11,q15",
+ "FF F4 66 EE", "vpadal.u16 q11,q15",
+ "FF F8 66 EE", "vpadal.u32 q11,q15",
+ "EF 49 5B BA", "vpadd.i8 d21,d25,d26",
+ "EF 59 5B BA", "vpadd.i16 d21,d25,d26",
+ "EF 69 5B BA", "vpadd.i32 d21,d25,d26",
+ "FF 49 5D AA", "vpadd.f32 d21,d25,d26",
+ "FF F0 52 2A", "vpaddl.s8 d21,d26",
+ "FF F4 52 2A", "vpaddl.s16 d21,d26",
+ "FF F8 52 2A", "vpaddl.s32 d21,d26",
+ "FF F0 52 AA", "vpaddl.u8 d21,d26",
+ "FF F4 52 AA", "vpaddl.u16 d21,d26",
+ "FF F8 52 AA", "vpaddl.u32 d21,d26",
+ "FF F0 62 6E", "vpaddl.s8 q11,q15",
+ "FF F4 62 6E", "vpaddl.s16 q11,q15",
+ "FF F8 62 6E", "vpaddl.s32 q11,q15",
+ "FF F0 62 EE", "vpaddl.u8 q11,q15",
+ "FF F4 62 EE", "vpaddl.u16 q11,q15",
+ "FF F8 62 EE", "vpaddl.u32 q11,q15",
+ "EF 49 5A AA", "vpmax.s8 d21,d25,d26",
+ "EF 59 5A AA", "vpmax.s16 d21,d25,d26",
+ "EF 69 5A AA", "vpmax.s32 d21,d25,d26",
+ "FF 49 5A AA", "vpmax.u8 d21,d25,d26",
+ "FF 59 5A AA", "vpmax.u16 d21,d25,d26",
+ "FF 69 5A AA", "vpmax.u32 d21,d25,d26",
+ "FF 49 5F AA", "vpmax.f32 d21,d25,d26",
+ "EF 49 5A BA", "vpmin.s8 d21,d25,d26",
+ "EF 59 5A BA", "vpmin.s16 d21,d25,d26",
+ "EF 69 5A BA", "vpmin.s32 d21,d25,d26",
+ "FF 49 5A BA", "vpmin.u8 d21,d25,d26",
+ "FF 59 5A BA", "vpmin.u16 d21,d25,d26",
+ "FF 69 5A BA", "vpmin.u32 d21,d25,d26",
+ "FF 69 5F AA", "vpmin.f32 d21,d25,d26",
+ "EC FD DA 02", "vpop {s27-s28}",
+ "EC FD BB 04", "vpop {d27-d28}",
+ "ED 6D DA 02", "vpush {s27-s28}",
+ "ED 6D BB 04", "vpush {d27-d28}",
+ "FF F0 57 2A", "vqabs.s8 d21,d26",
+ "FF F4 57 2A", "vqabs.s16 d21,d26",
+ "FF F8 57 2A", "vqabs.s32 d21,d26",
+ "FF F0 67 6E", "vqabs.s8 q11,q15",
+ "FF F4 67 6E", "vqabs.s16 q11,q15",
+ "FF F8 67 6E", "vqabs.s32 q11,q15",
+ "EF 49 50 BA", "vqadd.s8 d21,d25,d26",
+ "EF 59 50 BA", "vqadd.s16 d21,d25,d26",
+ "EF 69 50 BA", "vqadd.s32 d21,d25,d26",
+ "EF 79 50 BA", "vqadd.s64 d21,d25,d26",
+ "FF 49 50 BA", "vqadd.u8 d21,d25,d26",
+ "FF 59 50 BA", "vqadd.u16 d21,d25,d26",
+ "FF 69 50 BA", "vqadd.u32 d21,d25,d26",
+ "FF 79 50 BA", "vqadd.u64 d21,d25,d26",
+ "EF 4C 60 FE", "vqadd.s8 q11,q14,q15",
+ "EF 5C 60 FE", "vqadd.s16 q11,q14,q15",
+ "EF 6C 60 FE", "vqadd.s32 q11,q14,q15",
+ "EF 7C 60 FE", "vqadd.s64 q11,q14,q15",
+ "FF 4C 60 FE", "vqadd.u8 q11,q14,q15",
+ "FF 5C 60 FE", "vqadd.u16 q11,q14,q15",
+ "FF 6C 60 FE", "vqadd.u32 q11,q14,q15",
+ "FF 7C 60 FE", "vqadd.u64 q11,q14,q15",
+ "EF D9 63 CF", "vqdmlal.s16 q11,d25,d7[1]",
+ "EF E9 63 EF", "vqdmlal.s32 q11,d25,d15[1]",
+ "EF D9 69 AA", "vqdmlal.s16 q11,d25,d26",
+ "EF E9 69 AA", "vqdmlal.s32 q11,d25,d26",
+ "EF D9 67 CF", "vqdmlsl.s16 q11,d25,d7[1]",
+ "EF E9 67 EF", "vqdmlsl.s32 q11,d25,d15[1]",
+ "EF D9 6B AA", "vqdmlsl.s16 q11,d25,d26",
+ "EF E9 6B AA", "vqdmlsl.s32 q11,d25,d26",
+ "EF D9 5C CA", "vqdmulh.s16 d21,d25,d2[1]",
+ "EF E9 5C EF", "vqdmulh.s32 d21,d25,d15[1]",
+ "EF 59 5B AA", "vqdmulh.s16 d21,d25,d26",
+ "EF 69 5B AA", "vqdmulh.s32 d21,d25,d26",
+ "FF DC 6C CA", "vqdmulh.s16 q11,q14,d2[1]",
+ "FF EC 6C EF", "vqdmulh.s32 q11,q14,d15[1]",
+ "EF 5C 6B EE", "vqdmulh.s16 q11,q14,q15",
+ "EF 6C 6B EE", "vqdmulh.s32 q11,q14,q15",
+ "EF D9 6B CA", "vqdmull.s16 q11,d25,d2[1]",
+ "EF E9 6B EF", "vqdmull.s32 q11,d25,d15[1]",
+ "EF D9 6D AA", "vqdmull.s16 q11,d25,d26",
+ "EF E9 6D AA", "vqdmull.s32 q11,d25,d26",
+ "EF D9 6D AA", "vqdmull.s16 q11,d25,d26",
+ "EF E9 6D AA", "vqdmull.s32 q11,d25,d26",
+ "FF F2 52 AE", "vqmovn.s16 d21,q15",
+ "FF F6 52 AE", "vqmovn.s32 d21,q15",
+ "FF FA 52 AE", "vqmovn.s64 d21,q15",
+ "FF F2 52 EE", "vqmovn.u16 d21,q15",
+ "FF F6 52 EE", "vqmovn.u32 d21,q15",
+ "FF FA 52 EE", "vqmovn.u64 d21,q15",
+ "FF F2 52 6E", "vqmovun.s16 d21,q15",
+ "FF F6 52 6E", "vqmovun.s32 d21,q15",
+ "FF FA 52 6E", "vqmovun.s64 d21,q15",
+ "FF F0 57 AA", "vqneg.s8 d21,d26",
+ "FF F4 57 AA", "vqneg.s16 d21,d26",
+ "FF F8 57 AA", "vqneg.s32 d21,d26",
+ "FF F0 67 EE", "vqneg.s8 q11,q15",
+ "FF F4 67 EE", "vqneg.s16 q11,q15",
+ "FF F8 67 EE", "vqneg.s32 q11,q15",
+ "EF D9 5D CF", "vqrdmulh.s16 d21,d25,d7[1]",
+ "EF E9 5D EF", "vqrdmulh.s32 d21,d25,d15[1]",
+ "FF 59 5B AA", "vqrdmulh.s16 d21,d25,d26",
+ "FF 69 5B AA", "vqrdmulh.s32 d21,d25,d26",
+ "FF DC 6D CF", "vqrdmulh.s16 q11,q14,d7[1]",
+ "FF EC 6D EF", "vqrdmulh.s32 q11,q14,d15[1]",
+ "FF 5C 6B EE", "vqrdmulh.s16 q11,q14,q15",
+ "FF 6C 6B EE", "vqrdmulh.s32 q11,q14,q15",
+ "EF 49 55 BA", "vqrshl.s8 d21,d26,d25",
+ "EF 59 55 BA", "vqrshl.s16 d21,d26,d25",
+ "EF 69 55 BA", "vqrshl.s32 d21,d26,d25",
+ "EF 79 55 BA", "vqrshl.s64 d21,d26,d25",
+ "FF 49 55 BA", "vqrshl.u8 d21,d26,d25",
+ "FF 59 55 BA", "vqrshl.u16 d21,d26,d25",
+ "FF 69 55 BA", "vqrshl.u32 d21,d26,d25",
+ "FF 79 55 BA", "vqrshl.u64 d21,d26,d25",
+ "EF 4C 65 FE", "vqrshl.s8 q11,q15,q14",
+ "EF 5C 65 FE", "vqrshl.s16 q11,q15,q14",
+ "EF 6C 65 FE", "vqrshl.s32 q11,q15,q14",
+ "EF 7C 65 FE", "vqrshl.s64 q11,q15,q14",
+ "FF 4C 65 FE", "vqrshl.u8 q11,q15,q14",
+ "FF 5C 65 FE", "vqrshl.u16 q11,q15,q14",
+ "FF 6C 65 FE", "vqrshl.u32 q11,q15,q14",
+ "FF 7C 65 FE", "vqrshl.u64 q11,q15,q14",
+ "EF CF 59 7E", "vqrshrn.s16 d21,q15,#1",
+ "FF CF 59 7E", "vqrshrn.u16 d21,q15,#1",
+ "EF CF 59 7E", "vqrshrn.s16 d21,q15,#1",
+ "EF C8 59 7E", "vqrshrn.s16 d21,q15,#8",
+ "FF CF 59 7E", "vqrshrn.u16 d21,q15,#1",
+ "FF C8 59 7E", "vqrshrn.u16 d21,q15,#8",
+ "EF DF 59 7E", "vqrshrn.s32 d21,q15,#1",
+ "EF D0 59 7E", "vqrshrn.s32 d21,q15,#16",
+ "FF DF 59 7E", "vqrshrn.u32 d21,q15,#1",
+ "FF D0 59 7E", "vqrshrn.u32 d21,q15,#16",
+ "EF FF 59 7E", "vqrshrn.s64 d21,q15,#1",
+ "EF E0 59 7E", "vqrshrn.s64 d21,q15,#32",
+ "FF FF 59 7E", "vqrshrn.u64 d21,q15,#1",
+ "FF E0 59 7E", "vqrshrn.u64 d21,q15,#32",
+ "FF CF 58 7E", "vqrshrun.s16 d21,q15,#1",
+ "FF C8 58 7E", "vqrshrun.s16 d21,q15,#8",
+ "FF DF 58 7E", "vqrshrun.s32 d21,q15,#1",
+ "FF D0 58 7E", "vqrshrun.s32 d21,q15,#16",
+ "FF FF 58 7E", "vqrshrun.s64 d21,q15,#1",
+ "FF E0 58 7E", "vqrshrun.s64 d21,q15,#32",
+ "EF C8 57 3A", "vqshl.s8 d21,d26,#0",
+ "EF CF 57 3A", "vqshl.s8 d21,d26,#7",
+ "FF C8 57 3A", "vqshl.u8 d21,d26,#0",
+ "FF CF 57 3A", "vqshl.u8 d21,d26,#7",
+ "EF D0 57 3A", "vqshl.s16 d21,d26,#0",
+ "EF DF 57 3A", "vqshl.s16 d21,d26,#15",
+ "FF D0 57 3A", "vqshl.u16 d21,d26,#0",
+ "FF DF 57 3A", "vqshl.u16 d21,d26,#15",
+ "EF E0 57 3A", "vqshl.s32 d21,d26,#0",
+ "EF FF 57 3A", "vqshl.s32 d21,d26,#31",
+ "FF E0 57 3A", "vqshl.u32 d21,d26,#0",
+ "FF FF 57 3A", "vqshl.u32 d21,d26,#31",
+ "EF C0 57 BA", "vqshl.s64 d21,d26,#0",
+ "EF FF 57 BA", "vqshl.s64 d21,d26,#63",
+ "FF C0 57 BA", "vqshl.u64 d21,d26,#0",
+ "FF FF 57 BA", "vqshl.u64 d21,d26,#63",
+ "EF 49 54 BA", "vqshl.s8 d21,d26,d25",
+ "EF 59 54 BA", "vqshl.s16 d21,d26,d25",
+ "EF 69 54 BA", "vqshl.s32 d21,d26,d25",
+ "EF 79 54 BA", "vqshl.s64 d21,d26,d25",
+ "FF 49 54 BA", "vqshl.u8 d21,d26,d25",
+ "FF 59 54 BA", "vqshl.u16 d21,d26,d25",
+ "FF 69 54 BA", "vqshl.u32 d21,d26,d25",
+ "FF 79 54 BA", "vqshl.u64 d21,d26,d25",
+ "EF C8 67 7E", "vqshl.s8 q11,q15,#0",
+ "EF CF 67 7E", "vqshl.s8 q11,q15,#7",
+ "FF C8 67 7E", "vqshl.u8 q11,q15,#0",
+ "FF CF 67 7E", "vqshl.u8 q11,q15,#7",
+ "EF D0 67 7E", "vqshl.s16 q11,q15,#0",
+ "EF DF 67 7E", "vqshl.s16 q11,q15,#15",
+ "FF D0 67 7E", "vqshl.u16 q11,q15,#0",
+ "FF DF 67 7E", "vqshl.u16 q11,q15,#15",
+ "EF E0 67 7E", "vqshl.s32 q11,q15,#0",
+ "EF FF 67 7E", "vqshl.s32 q11,q15,#31",
+ "FF E0 67 7E", "vqshl.u32 q11,q15,#0",
+ "FF FF 67 7E", "vqshl.u32 q11,q15,#31",
+ "EF C0 67 FE", "vqshl.s64 q11,q15,#0",
+ "EF FF 67 FE", "vqshl.s64 q11,q15,#63",
+ "FF C0 67 FE", "vqshl.u64 q11,q15,#0",
+ "FF FF 67 FE", "vqshl.u64 q11,q15,#63",
+ "EF 4C 64 FE", "vqshl.s8 q11,q15,q14",
+ "EF 5C 64 FE", "vqshl.s16 q11,q15,q14",
+ "EF 6C 64 FE", "vqshl.s32 q11,q15,q14",
+ "EF 7C 64 FE", "vqshl.s64 q11,q15,q14",
+ "FF 4C 64 FE", "vqshl.u8 q11,q15,q14",
+ "FF 5C 64 FE", "vqshl.u16 q11,q15,q14",
+ "FF 6C 64 FE", "vqshl.u32 q11,q15,q14",
+ "FF 7C 64 FE", "vqshl.u64 q11,q15,q14",
+ "FF C8 56 3A", "vqshlu.s8 d21,d26,#0",
+ "FF CF 56 3A", "vqshlu.s8 d21,d26,#7",
+ "FF D0 56 3A", "vqshlu.s16 d21,d26,#0",
+ "FF DF 56 3A", "vqshlu.s16 d21,d26,#15",
+ "FF E0 56 3A", "vqshlu.s32 d21,d26,#0",
+ "FF FF 56 3A", "vqshlu.s32 d21,d26,#31",
+ "FF C0 56 BA", "vqshlu.s64 d21,d26,#0",
+ "FF FF 56 BA", "vqshlu.s64 d21,d26,#63",
+ "FF C8 66 7E", "vqshlu.s8 q11,q15,#0",
+ "FF CF 66 7E", "vqshlu.s8 q11,q15,#7",
+ "FF D0 66 7E", "vqshlu.s16 q11,q15,#0",
+ "FF DF 66 7E", "vqshlu.s16 q11,q15,#15",
+ "FF E0 66 7E", "vqshlu.s32 q11,q15,#0",
+ "FF FF 66 7E", "vqshlu.s32 q11,q15,#31",
+ "FF C0 66 FE", "vqshlu.s64 q11,q15,#0",
+ "FF FF 66 FE", "vqshlu.s64 q11,q15,#63",
+ "EF CF 59 3E", "vqshrn.s16 d21,q15,#1",
+ "EF C8 59 3E", "vqshrn.s16 d21,q15,#8",
+ "FF CF 59 3E", "vqshrn.u16 d21,q15,#1",
+ "FF C8 59 3E", "vqshrn.u16 d21,q15,#8",
+ "EF DF 59 3E", "vqshrn.s32 d21,q15,#1",
+ "EF D0 59 3E", "vqshrn.s32 d21,q15,#16",
+ "FF DF 59 3E", "vqshrn.u32 d21,q15,#1",
+ "FF D0 59 3E", "vqshrn.u32 d21,q15,#16",
+ "EF FF 59 3E", "vqshrn.s64 d21,q15,#1",
+ "EF E0 59 3E", "vqshrn.s64 d21,q15,#32",
+ "FF FF 59 3E", "vqshrn.u64 d21,q15,#1",
+ "FF E0 59 3E", "vqshrn.u64 d21,q15,#32",
+ "FF CF 58 3E", "vqshrun.s16 d21,q15,#1",
+ "FF C8 58 3E", "vqshrun.s16 d21,q15,#8",
+ "FF DF 58 3E", "vqshrun.s32 d21,q15,#1",
+ "FF D0 58 3E", "vqshrun.s32 d21,q15,#16",
+ "FF FF 58 3E", "vqshrun.s64 d21,q15,#1",
+ "FF E0 58 3E", "vqshrun.s64 d21,q15,#32",
+ "EF 49 52 BA", "vqsub.s8 d21,d25,d26",
+ "EF 59 52 BA", "vqsub.s16 d21,d25,d26",
+ "EF 69 52 BA", "vqsub.s32 d21,d25,d26",
+ "EF 79 52 BA", "vqsub.s64 d21,d25,d26",
+ "FF 49 52 BA", "vqsub.u8 d21,d25,d26",
+ "FF 59 52 BA", "vqsub.u16 d21,d25,d26",
+ "FF 69 52 BA", "vqsub.u32 d21,d25,d26",
+ "FF 79 52 BA", "vqsub.u64 d21,d25,d26",
+ "EF 4C 62 FE", "vqsub.s8 q11,q14,q15",
+ "EF 5C 62 FE", "vqsub.s16 q11,q14,q15",
+ "EF 6C 62 FE", "vqsub.s32 q11,q14,q15",
+ "EF 7C 62 FE", "vqsub.s64 q11,q14,q15",
+ "FF 4C 62 FE", "vqsub.u8 q11,q14,q15",
+ "FF 5C 62 FE", "vqsub.u16 q11,q14,q15",
+ "FF 6C 62 FE", "vqsub.u32 q11,q14,q15",
+ "FF 7C 62 FE", "vqsub.u64 q11,q14,q15",
+ "FF CC 54 AE", "vraddhn.i16 d21,q14,q15",
+ "FF DC 54 AE", "vraddhn.i32 d21,q14,q15",
+ "FF EC 54 AE", "vraddhn.i64 d21,q14,q15",
+ "FF FB 54 2A", "vrecpe.u32 d21,d26",
+ "FF FB 55 2A", "vrecpe.f32 d21,d26",
+ "FF FB 64 6E", "vrecpe.u32 q11,q15",
+ "FF FB 65 6E", "vrecpe.f32 q11,q15",
+ "EF 49 5F BA", "vrecps.f32 d21,d25,d26",
+ "EF 4C 6F FE", "vrecps.f32 q11,q14,q15",
+ "FF F0 51 2A", "vrev16.8 d21,d26",
+ "FF F0 61 6E", "vrev16.8 q11,q15",
+ "FF F0 50 AA", "vrev32.8 d21,d26",
+ "FF F4 50 AA", "vrev32.16 d21,d26",
+ "FF F0 60 EE", "vrev32.8 q11,q15",
+ "FF F4 60 EE", "vrev32.16 q11,q15",
+ "FF F0 50 2A", "vrev64.8 d21,d26",
+ "FF F4 50 2A", "vrev64.16 d21,d26",
+ "FF F8 50 2A", "vrev64.32 d21,d26",
+ "FF F0 60 6E", "vrev64.8 q11,q15",
+ "FF F4 60 6E", "vrev64.16 q11,q15",
+ "FF F8 60 6E", "vrev64.32 q11,q15",
+ "EF 49 51 AA", "vrhadd.s8 d21,d25,d26",
+ "EF 59 51 AA", "vrhadd.s16 d21,d25,d26",
+ "EF 69 51 AA", "vrhadd.s32 d21,d25,d26",
+ "FF 49 51 AA", "vrhadd.u8 d21,d25,d26",
+ "FF 59 51 AA", "vrhadd.u16 d21,d25,d26",
+ "FF 69 51 AA", "vrhadd.u32 d21,d25,d26",
+ "EF 4C 61 EE", "vrhadd.s8 q11,q14,q15",
+ "EF 5C 61 EE", "vrhadd.s16 q11,q14,q15",
+ "EF 6C 61 EE", "vrhadd.s32 q11,q14,q15",
+ "FF 4C 61 EE", "vrhadd.u8 q11,q14,q15",
+ "FF 5C 61 EE", "vrhadd.u16 q11,q14,q15",
+ "FF 6C 61 EE", "vrhadd.u32 q11,q14,q15",
+ "EF 49 55 AA", "vrshl.s8 d21,d26,d25",
+ "EF 59 55 AA", "vrshl.s16 d21,d26,d25",
+ "EF 69 55 AA", "vrshl.s32 d21,d26,d25",
+ "EF 79 55 AA", "vrshl.s64 d21,d26,d25",
+ "FF 49 55 AA", "vrshl.u8 d21,d26,d25",
+ "FF 59 55 AA", "vrshl.u16 d21,d26,d25",
+ "FF 69 55 AA", "vrshl.u32 d21,d26,d25",
+ "FF 79 55 AA", "vrshl.u64 d21,d26,d25",
+ "EF 4C 65 EE", "vrshl.s8 q11,q15,q14",
+ "EF 5C 65 EE", "vrshl.s16 q11,q15,q14",
+ "EF 6C 65 EE", "vrshl.s32 q11,q15,q14",
+ "EF 7C 65 EE", "vrshl.s64 q11,q15,q14",
+ "FF 4C 65 EE", "vrshl.u8 q11,q15,q14",
+ "FF 5C 65 EE", "vrshl.u16 q11,q15,q14",
+ "FF 6C 65 EE", "vrshl.u32 q11,q15,q14",
+ "FF 7C 65 EE", "vrshl.u64 q11,q15,q14",
+ "EF CF 52 3A", "vrshr.s8 d21,d26,#1",
+ "EF C8 52 3A", "vrshr.s8 d21,d26,#8",
+ "FF CF 52 3A", "vrshr.u8 d21,d26,#1",
+ "FF C8 52 3A", "vrshr.u8 d21,d26,#8",
+ "EF DF 52 3A", "vrshr.s16 d21,d26,#1",
+ "EF D0 52 3A", "vrshr.s16 d21,d26,#16",
+ "FF DF 52 3A", "vrshr.u16 d21,d26,#1",
+ "FF D0 52 3A", "vrshr.u16 d21,d26,#16",
+ "EF FF 52 3A", "vrshr.s32 d21,d26,#1",
+ "EF E0 52 3A", "vrshr.s32 d21,d26,#32",
+ "FF FF 52 3A", "vrshr.u32 d21,d26,#1",
+ "FF E0 52 3A", "vrshr.u32 d21,d26,#32",
+ "EF FF 52 BA", "vrshr.s64 d21,d26,#1",
+ "EF C0 52 BA", "vrshr.s64 d21,d26,#64",
+ "FF FF 52 BA", "vrshr.u64 d21,d26,#1",
+ "FF C0 52 BA", "vrshr.u64 d21,d26,#64",
+ "EF CF 62 7E", "vrshr.s8 q11,q15,#1",
+ "EF C8 62 7E", "vrshr.s8 q11,q15,#8",
+ "FF CF 62 7E", "vrshr.u8 q11,q15,#1",
+ "FF C8 62 7E", "vrshr.u8 q11,q15,#8",
+ "EF DF 62 7E", "vrshr.s16 q11,q15,#1",
+ "EF D0 62 7E", "vrshr.s16 q11,q15,#16",
+ "FF DF 62 7E", "vrshr.u16 q11,q15,#1",
+ "FF D0 62 7E", "vrshr.u16 q11,q15,#16",
+ "EF FF 62 7E", "vrshr.s32 q11,q15,#1",
+ "EF E0 62 7E", "vrshr.s32 q11,q15,#32",
+ "FF FF 62 7E", "vrshr.u32 q11,q15,#1",
+ "FF E0 62 7E", "vrshr.u32 q11,q15,#32",
+ "EF FF 62 FE", "vrshr.s64 q11,q15,#1",
+ "EF C0 62 FE", "vrshr.s64 q11,q15,#64",
+ "FF FF 62 FE", "vrshr.u64 q11,q15,#1",
+ "FF C0 62 FE", "vrshr.u64 q11,q15,#64",
+ "EF CF 58 7E", "vrshrn.i16 d21,q15,#1",
+ "EF C8 58 7E", "vrshrn.i16 d21,q15,#8",
+ "EF DF 58 7E", "vrshrn.i32 d21,q15,#1",
+ "EF D0 58 7E", "vrshrn.i32 d21,q15,#16",
+ "EF FF 58 7E", "vrshrn.i64 d21,q15,#1",
+ "EF E0 58 7E", "vrshrn.i64 d21,q15,#32",
+ "FF FB 54 AA", "vrsqrte.u32 d21,d26",
+ "FF FB 55 AA", "vrsqrte.f32 d21,d26",
+ "FF FB 64 EE", "vrsqrte.u32 q11,q15",
+ "FF FB 65 EE", "vrsqrte.f32 q11,q15",
+ "EF 69 5F BA", "vrsqrts.f32 d21,d25,d26",
+ "EF 6C 6F FE", "vrsqrts.f32 q11,q14,q15",
+ "EF CF 53 3A", "vrsra.s8 d21,d26,#1",
+ "EF C8 53 3A", "vrsra.s8 d21,d26,#8",
+ "FF CF 53 3A", "vrsra.u8 d21,d26,#1",
+ "FF C8 53 3A", "vrsra.u8 d21,d26,#8",
+ "EF DF 53 3A", "vrsra.s16 d21,d26,#1",
+ "EF D0 53 3A", "vrsra.s16 d21,d26,#16",
+ "FF DF 53 3A", "vrsra.u16 d21,d26,#1",
+ "FF D0 53 3A", "vrsra.u16 d21,d26,#16",
+ "EF FF 53 3A", "vrsra.s32 d21,d26,#1",
+ "EF E0 53 3A", "vrsra.s32 d21,d26,#32",
+ "FF FF 53 3A", "vrsra.u32 d21,d26,#1",
+ "FF E0 53 3A", "vrsra.u32 d21,d26,#32",
+ "EF FF 53 BA", "vrsra.s64 d21,d26,#1",
+ "EF C0 53 BA", "vrsra.s64 d21,d26,#64",
+ "FF FF 53 BA", "vrsra.u64 d21,d26,#1",
+ "FF C0 53 BA", "vrsra.u64 d21,d26,#64",
+ "EF CF 63 7E", "vrsra.s8 q11,q15,#1",
+ "EF C8 63 7E", "vrsra.s8 q11,q15,#8",
+ "FF CF 63 7E", "vrsra.u8 q11,q15,#1",
+ "FF C8 63 7E", "vrsra.u8 q11,q15,#8",
+ "EF DF 63 7E", "vrsra.s16 q11,q15,#1",
+ "EF D0 63 7E", "vrsra.s16 q11,q15,#16",
+ "FF DF 63 7E", "vrsra.u16 q11,q15,#1",
+ "FF D0 63 7E", "vrsra.u16 q11,q15,#16",
+ "EF FF 63 7E", "vrsra.s32 q11,q15,#1",
+ "EF E0 63 7E", "vrsra.s32 q11,q15,#32",
+ "FF FF 63 7E", "vrsra.u32 q11,q15,#1",
+ "FF E0 63 7E", "vrsra.u32 q11,q15,#32",
+ "EF FF 63 FE", "vrsra.s64 q11,q15,#1",
+ "EF C0 63 FE", "vrsra.s64 q11,q15,#64",
+ "FF FF 63 FE", "vrsra.u64 q11,q15,#1",
+ "FF C0 63 FE", "vrsra.u64 q11,q15,#64",
+ "FF CC 56 AE", "vrsubhn.i16 d21,q14,q15",
+ "FF DC 56 AE", "vrsubhn.i32 d21,q14,q15",
+ "FF EC 56 AE", "vrsubhn.i64 d21,q14,q15",
+ "EF C8 55 3A", "vshl.i8 d21,d26,#0",
+ "EF CF 55 3A", "vshl.i8 d21,d26,#7",
+ "EF D0 55 3A", "vshl.i16 d21,d26,#0",
+ "EF DF 55 3A", "vshl.i16 d21,d26,#15",
+ "EF E0 55 3A", "vshl.i32 d21,d26,#0",
+ "EF FF 55 3A", "vshl.i32 d21,d26,#31",
+ "EF C0 55 BA", "vshl.i64 d21,d26,#0",
+ "EF FF 55 BA", "vshl.i64 d21,d26,#63",
+ "EF C8 65 7E", "vshl.i8 q11,q15,#0",
+ "EF CF 65 7E", "vshl.i8 q11,q15,#7",
+ "EF D0 65 7E", "vshl.i16 q11,q15,#0",
+ "EF DF 65 7E", "vshl.i16 q11,q15,#15",
+ "EF E0 65 7E", "vshl.i32 q11,q15,#0",
+ "EF FF 65 7E", "vshl.i32 q11,q15,#31",
+ "EF C0 65 FE", "vshl.i64 q11,q15,#0",
+ "EF FF 65 FE", "vshl.i64 q11,q15,#63",
+ "EF 49 54 AA", "vshl.s8 d21,d26,d25",
+ "EF 59 54 AA", "vshl.s16 d21,d26,d25",
+ "EF 69 54 AA", "vshl.s32 d21,d26,d25",
+ "EF 79 54 AA", "vshl.s64 d21,d26,d25",
+ "FF 49 54 AA", "vshl.u8 d21,d26,d25",
+ "FF 59 54 AA", "vshl.u16 d21,d26,d25",
+ "FF 69 54 AA", "vshl.u32 d21,d26,d25",
+ "FF 79 54 AA", "vshl.u64 d21,d26,d25",
+ "EF 4C 64 EE", "vshl.s8 q11,q15,q14",
+ "EF 5C 64 EE", "vshl.s16 q11,q15,q14",
+ "EF 6C 64 EE", "vshl.s32 q11,q15,q14",
+ "EF 7C 64 EE", "vshl.s64 q11,q15,q14",
+ "FF 4C 64 EE", "vshl.u8 q11,q15,q14",
+ "FF 5C 64 EE", "vshl.u16 q11,q15,q14",
+ "FF 6C 64 EE", "vshl.u32 q11,q15,q14",
+ "FF 7C 64 EE", "vshl.u64 q11,q15,q14",
+ "EF C9 6A 3A", "vshll.s8 q11,d26,#1",
+ "EF CF 6A 3A", "vshll.s8 q11,d26,#7",
+ "FF C9 6A 3A", "vshll.u8 q11,d26,#1",
+ "FF CF 6A 3A", "vshll.u8 q11,d26,#7",
+ "EF D1 6A 3A", "vshll.s16 q11,d26,#1",
+ "EF DF 6A 3A", "vshll.s16 q11,d26,#15",
+ "FF D1 6A 3A", "vshll.u16 q11,d26,#1",
+ "FF DF 6A 3A", "vshll.u16 q11,d26,#15",
+ "EF E1 6A 3A", "vshll.s32 q11,d26,#1",
+ "EF FF 6A 3A", "vshll.s32 q11,d26,#31",
+ "FF E1 6A 3A", "vshll.u32 q11,d26,#1",
+ "FF FF 6A 3A", "vshll.u32 q11,d26,#31",
+ "FF F2 63 2A", "vshll.i8 q11,d26,#8",
+ "FF F6 63 2A", "vshll.i16 q11,d26,#16",
+ "FF FA 63 2A", "vshll.i32 q11,d26,#32",
+ "EF CF 50 3A", "vshr.s8 d21,d26,#1",
+ "EF C8 50 3A", "vshr.s8 d21,d26,#8",
+ "FF CF 50 3A", "vshr.u8 d21,d26,#1",
+ "FF C8 50 3A", "vshr.u8 d21,d26,#8",
+ "EF DF 50 3A", "vshr.s16 d21,d26,#1",
+ "EF D0 50 3A", "vshr.s16 d21,d26,#16",
+ "FF DF 50 3A", "vshr.u16 d21,d26,#1",
+ "FF D0 50 3A", "vshr.u16 d21,d26,#16",
+ "EF FF 50 3A", "vshr.s32 d21,d26,#1",
+ "EF E0 50 3A", "vshr.s32 d21,d26,#32",
+ "FF FF 50 3A", "vshr.u32 d21,d26,#1",
+ "FF E0 50 3A", "vshr.u32 d21,d26,#32",
+ "EF FF 50 BA", "vshr.s64 d21,d26,#1",
+ "EF C0 50 BA", "vshr.s64 d21,d26,#64",
+ "FF FF 50 BA", "vshr.u64 d21,d26,#1",
+ "FF C0 50 BA", "vshr.u64 d21,d26,#64",
+ "EF CF 60 7E", "vshr.s8 q11,q15,#1",
+ "EF C8 60 7E", "vshr.s8 q11,q15,#8",
+ "FF CF 60 7E", "vshr.u8 q11,q15,#1",
+ "FF C8 60 7E", "vshr.u8 q11,q15,#8",
+ "EF DF 60 7E", "vshr.s16 q11,q15,#1",
+ "EF D0 60 7E", "vshr.s16 q11,q15,#16",
+ "FF DF 60 7E", "vshr.u16 q11,q15,#1",
+ "FF D0 60 7E", "vshr.u16 q11,q15,#16",
+ "EF FF 60 7E", "vshr.s32 q11,q15,#1",
+ "EF E0 60 7E", "vshr.s32 q11,q15,#32",
+ "FF FF 60 7E", "vshr.u32 q11,q15,#1",
+ "FF E0 60 7E", "vshr.u32 q11,q15,#32",
+ "EF FF 60 FE", "vshr.s64 q11,q15,#1",
+ "EF C0 60 FE", "vshr.s64 q11,q15,#64",
+ "FF FF 60 FE", "vshr.u64 q11,q15,#1",
+ "FF C0 60 FE", "vshr.u64 q11,q15,#64",
+ "EF CF 58 3E", "vshrn.i16 d21,q15,#1",
+ "EF C8 58 3E", "vshrn.i16 d21,q15,#8",
+ "EF DF 58 3E", "vshrn.i32 d21,q15,#1",
+ "EF D0 58 3E", "vshrn.i32 d21,q15,#16",
+ "EF FF 58 3E", "vshrn.i64 d21,q15,#1",
+ "EF E0 58 3E", "vshrn.i64 d21,q15,#32",
+ "FF C8 55 3A", "vsli.8 d21,d26,#0",
+ "FF CF 55 3A", "vsli.8 d21,d26,#7",
+ "FF D0 55 3A", "vsli.16 d21,d26,#0",
+ "FF DF 55 3A", "vsli.16 d21,d26,#15",
+ "FF E0 55 3A", "vsli.32 d21,d26,#0",
+ "FF FF 55 3A", "vsli.32 d21,d26,#31",
+ "FF C0 55 BA", "vsli.64 d21,d26,#0",
+ "FF FF 55 BA", "vsli.64 d21,d26,#63",
+ "FF C8 65 7E", "vsli.8 q11,q15,#0",
+ "FF CF 65 7E", "vsli.8 q11,q15,#7",
+ "FF D0 65 7E", "vsli.16 q11,q15,#0",
+ "FF DF 65 7E", "vsli.16 q11,q15,#15",
+ "FF E0 65 7E", "vsli.32 q11,q15,#0",
+ "FF FF 65 7E", "vsli.32 q11,q15,#31",
+ "FF C0 65 FE", "vsli.64 q11,q15,#0",
+ "FF FF 65 FE", "vsli.64 q11,q15,#63",
+ "EE F1 AA CD", "vsqrt.f32 s21,s26",
+ "EE F1 5B EA", "vsqrt.f64 d21,d26",
+ "EF CF 51 3A", "vsra.s8 d21,d26,#1",
+ "EF C8 51 3A", "vsra.s8 d21,d26,#8",
+ "FF CF 51 3A", "vsra.u8 d21,d26,#1",
+ "FF C8 51 3A", "vsra.u8 d21,d26,#8",
+ "EF DF 51 3A", "vsra.s16 d21,d26,#1",
+ "EF D0 51 3A", "vsra.s16 d21,d26,#16",
+ "FF DF 51 3A", "vsra.u16 d21,d26,#1",
+ "FF D0 51 3A", "vsra.u16 d21,d26,#16",
+ "EF FF 51 3A", "vsra.s32 d21,d26,#1",
+ "EF E0 51 3A", "vsra.s32 d21,d26,#32",
+ "FF FF 51 3A", "vsra.u32 d21,d26,#1",
+ "FF E0 51 3A", "vsra.u32 d21,d26,#32",
+ "EF FF 51 BA", "vsra.s64 d21,d26,#1",
+ "EF C0 51 BA", "vsra.s64 d21,d26,#64",
+ "FF FF 51 BA", "vsra.u64 d21,d26,#1",
+ "FF C0 51 BA", "vsra.u64 d21,d26,#64",
+ "EF CF 61 7E", "vsra.s8 q11,q15,#1",
+ "EF C8 61 7E", "vsra.s8 q11,q15,#8",
+ "FF CF 61 7E", "vsra.u8 q11,q15,#1",
+ "FF C8 61 7E", "vsra.u8 q11,q15,#8",
+ "EF DF 61 7E", "vsra.s16 q11,q15,#1",
+ "EF D0 61 7E", "vsra.s16 q11,q15,#16",
+ "FF DF 61 7E", "vsra.u16 q11,q15,#1",
+ "FF D0 61 7E", "vsra.u16 q11,q15,#16",
+ "EF FF 61 7E", "vsra.s32 q11,q15,#1",
+ "EF E0 61 7E", "vsra.s32 q11,q15,#32",
+ "FF FF 61 7E", "vsra.u32 q11,q15,#1",
+ "FF E0 61 7E", "vsra.u32 q11,q15,#32",
+ "EF FF 61 FE", "vsra.s64 q11,q15,#1",
+ "EF C0 61 FE", "vsra.s64 q11,q15,#64",
+ "FF FF 61 FE", "vsra.u64 q11,q15,#1",
+ "FF C0 61 FE", "vsra.u64 q11,q15,#64",
+ "FF CF 54 3A", "vsri.8 d21,d26,#1",
+ "FF C8 54 3A", "vsri.8 d21,d26,#8",
+ "FF DF 54 3A", "vsri.16 d21,d26,#1",
+ "FF D0 54 3A", "vsri.16 d21,d26,#16",
+ "FF FF 54 3A", "vsri.32 d21,d26,#1",
+ "FF E0 54 3A", "vsri.32 d21,d26,#32",
+ "FF FF 54 BA", "vsri.64 d21,d26,#1",
+ "FF C0 54 BA", "vsri.64 d21,d26,#64",
+ "FF CF 64 7E", "vsri.8 q11,q15,#1",
+ "FF C8 64 7E", "vsri.8 q11,q15,#8",
+ "FF DF 64 7E", "vsri.16 q11,q15,#1",
+ "FF D0 64 7E", "vsri.16 q11,q15,#16",
+ "FF FF 64 7E", "vsri.32 q11,q15,#1",
+ "FF E0 64 7E", "vsri.32 q11,q15,#32",
+ "FF FF 64 FE", "vsri.64 q11,q15,#1",
+ "FF C0 64 FE", "vsri.64 q11,q15,#64",
+ "F9 4A B7 0F", "vst1.8 {d27},[r10]",
+ "F9 4A BA 0F", "vst1.8 {d27,d28},[r10]",
+ "F9 4A B6 0F", "vst1.8 {d27,d28,d29},[r10]",
+ "F9 4A B2 0F", "vst1.8 {d27,d28,d29,d30},[r10]",
+ "F9 4A B7 4F", "vst1.16 {d27},[r10]",
+ "F9 4A BA 4F", "vst1.16 {d27,d28},[r10]",
+ "F9 4A B6 4F", "vst1.16 {d27,d28,d29},[r10]",
+ "F9 4A B2 4F", "vst1.16 {d27,d28,d29,d30},[r10]",
+ "F9 4A B7 8F", "vst1.32 {d27},[r10]",
+ "F9 4A BA 8F", "vst1.32 {d27,d28},[r10]",
+ "F9 4A B6 8F", "vst1.32 {d27,d28,d29},[r10]",
+ "F9 4A B2 8F", "vst1.32 {d27,d28,d29,d30},[r10]",
+ "F9 4A B7 CF", "vst1.64 {d27},[r10]",
+ "F9 4A BA CF", "vst1.64 {d27,d28},[r10]",
+ "F9 4A B6 CF", "vst1.64 {d27,d28,d29},[r10]",
+ "F9 4A B2 CF", "vst1.64 {d27,d28,d29,d30},[r10]",
+ "F9 4A B7 1F", "vst1.8 {d27},[r10@64]",
+ "F9 4A BA 1F", "vst1.8 {d27,d28},[r10@64]",
+ "F9 4A BA 2F", "vst1.8 {d27,d28},[r10@128]",
+ "F9 4A B6 1F", "vst1.8 {d27,d28,d29},[r10@64]",
+ "F9 4A B2 1F", "vst1.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B2 2F", "vst1.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B2 3F", "vst1.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B7 5F", "vst1.16 {d27},[r10@64]",
+ "F9 4A BA 5F", "vst1.16 {d27,d28},[r10@64]",
+ "F9 4A BA 6F", "vst1.16 {d27,d28},[r10@128]",
+ "F9 4A B6 5F", "vst1.16 {d27,d28,d29},[r10@64]",
+ "F9 4A B2 5F", "vst1.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B2 6F", "vst1.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B2 7F", "vst1.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B7 9F", "vst1.32 {d27},[r10@64]",
+ "F9 4A BA 9F", "vst1.32 {d27,d28},[r10@64]",
+ "F9 4A BA AF", "vst1.32 {d27,d28},[r10@128]",
+ "F9 4A B6 9F", "vst1.32 {d27,d28,d29},[r10@64]",
+ "F9 4A B2 9F", "vst1.32 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B2 AF", "vst1.32 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B2 BF", "vst1.32 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B7 DF", "vst1.64 {d27},[r10@64]",
+ "F9 4A BA DF", "vst1.64 {d27,d28},[r10@64]",
+ "F9 4A BA EF", "vst1.64 {d27,d28},[r10@128]",
+ "F9 4A B6 DF", "vst1.64 {d27,d28,d29},[r10@64]",
+ "F9 4A B2 DF", "vst1.64 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B2 EF", "vst1.64 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B2 FF", "vst1.64 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B7 0D", "vst1.8 {d27},[r10]!",
+ "F9 4A BA 0D", "vst1.8 {d27,d28},[r10]!",
+ "F9 4A B6 0D", "vst1.8 {d27,d28,d29},[r10]!",
+ "F9 4A B2 0D", "vst1.8 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B7 4D", "vst1.16 {d27},[r10]!",
+ "F9 4A BA 4D", "vst1.16 {d27,d28},[r10]!",
+ "F9 4A B6 4D", "vst1.16 {d27,d28,d29},[r10]!",
+ "F9 4A B2 4D", "vst1.16 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B7 8D", "vst1.32 {d27},[r10]!",
+ "F9 4A BA 8D", "vst1.32 {d27,d28},[r10]!",
+ "F9 4A B6 8D", "vst1.32 {d27,d28,d29},[r10]!",
+ "F9 4A B2 8D", "vst1.32 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B7 CD", "vst1.64 {d27},[r10]!",
+ "F9 4A BA CD", "vst1.64 {d27,d28},[r10]!",
+ "F9 4A B6 CD", "vst1.64 {d27,d28,d29},[r10]!",
+ "F9 4A B2 CD", "vst1.64 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B7 1D", "vst1.8 {d27},[r10@64]!",
+ "F9 4A BA 1D", "vst1.8 {d27,d28},[r10@64]!",
+ "F9 4A BA 2D", "vst1.8 {d27,d28},[r10@128]!",
+ "F9 4A B6 1D", "vst1.8 {d27,d28,d29},[r10@64]!",
+ "F9 4A B2 1D", "vst1.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B2 2D", "vst1.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B2 3D", "vst1.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B7 5D", "vst1.16 {d27},[r10@64]!",
+ "F9 4A BA 5D", "vst1.16 {d27,d28},[r10@64]!",
+ "F9 4A BA 6D", "vst1.16 {d27,d28},[r10@128]!",
+ "F9 4A B6 5D", "vst1.16 {d27,d28,d29},[r10@64]!",
+ "F9 4A B2 5D", "vst1.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B2 6D", "vst1.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B2 7D", "vst1.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B7 9D", "vst1.32 {d27},[r10@64]!",
+ "F9 4A BA 9D", "vst1.32 {d27,d28},[r10@64]!",
+ "F9 4A BA AD", "vst1.32 {d27,d28},[r10@128]!",
+ "F9 4A B6 9D", "vst1.32 {d27,d28,d29},[r10@64]!",
+ "F9 4A B2 9D", "vst1.32 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B2 AD", "vst1.32 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B2 BD", "vst1.32 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B7 DD", "vst1.64 {d27},[r10@64]!",
+ "F9 4A BA DD", "vst1.64 {d27,d28},[r10@64]!",
+ "F9 4A BA ED", "vst1.64 {d27,d28},[r10@128]!",
+ "F9 4A B6 DD", "vst1.64 {d27,d28,d29},[r10@64]!",
+ "F9 4A B2 DD", "vst1.64 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B2 ED", "vst1.64 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B2 FD", "vst1.64 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B7 09", "vst1.8 {d27},[r10],r9",
+ "F9 4A BA 09", "vst1.8 {d27,d28},[r10],r9",
+ "F9 4A B6 09", "vst1.8 {d27,d28,d29},[r10],r9",
+ "F9 4A B2 09", "vst1.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B7 49", "vst1.16 {d27},[r10],r9",
+ "F9 4A BA 49", "vst1.16 {d27,d28},[r10],r9",
+ "F9 4A B6 49", "vst1.16 {d27,d28,d29},[r10],r9",
+ "F9 4A B2 49", "vst1.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B7 89", "vst1.32 {d27},[r10],r9",
+ "F9 4A BA 89", "vst1.32 {d27,d28},[r10],r9",
+ "F9 4A B6 89", "vst1.32 {d27,d28,d29},[r10],r9",
+ "F9 4A B2 89", "vst1.32 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B7 C9", "vst1.64 {d27},[r10],r9",
+ "F9 4A BA C9", "vst1.64 {d27,d28},[r10],r9",
+ "F9 4A B6 C9", "vst1.64 {d27,d28,d29},[r10],r9",
+ "F9 4A B2 C9", "vst1.64 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B7 19", "vst1.8 {d27},[r10@64],r9",
+ "F9 4A BA 19", "vst1.8 {d27,d28},[r10@64],r9",
+ "F9 4A BA 29", "vst1.8 {d27,d28},[r10@128],r9",
+ "F9 4A B6 19", "vst1.8 {d27,d28,d29},[r10@64],r9",
+ "F9 4A B2 19", "vst1.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B2 29", "vst1.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B2 39", "vst1.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A B7 59", "vst1.16 {d27},[r10@64],r9",
+ "F9 4A BA 59", "vst1.16 {d27,d28},[r10@64],r9",
+ "F9 4A BA 69", "vst1.16 {d27,d28},[r10@128],r9",
+ "F9 4A B6 59", "vst1.16 {d27,d28,d29},[r10@64],r9",
+ "F9 4A B2 59", "vst1.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B2 69", "vst1.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B2 79", "vst1.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A B7 99", "vst1.32 {d27},[r10@64],r9",
+ "F9 4A BA 99", "vst1.32 {d27,d28},[r10@64],r9",
+ "F9 4A BA A9", "vst1.32 {d27,d28},[r10@128],r9",
+ "F9 4A B6 99", "vst1.32 {d27,d28,d29},[r10@64],r9",
+ "F9 4A B2 99", "vst1.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B2 A9", "vst1.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B2 B9", "vst1.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A B7 D9", "vst1.64 {d27},[r10@64],r9",
+ "F9 4A BA D9", "vst1.64 {d27,d28},[r10@64],r9",
+ "F9 4A BA E9", "vst1.64 {d27,d28},[r10@128],r9",
+ "F9 4A B6 D9", "vst1.64 {d27,d28,d29},[r10@64],r9",
+ "F9 4A B2 D9", "vst1.64 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B2 E9", "vst1.64 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B2 F9", "vst1.64 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 CA B0 2F", "vst1.8 {d27[1]},[r10]",
+ "F9 CA B4 4F", "vst1.16 {d27[1]},[r10]",
+ "F9 CA B8 8F", "vst1.32 {d27[1]},[r10]",
+ "F9 CA B4 5F", "vst1.16 {d27[1]},[r10@16]",
+ "F9 CA B8 BF", "vst1.32 {d27[1]},[r10@32]",
+ "F9 CA B0 2D", "vst1.8 {d27[1]},[r10]!",
+ "F9 CA B4 4D", "vst1.16 {d27[1]},[r10]!",
+ "F9 CA B8 8D", "vst1.32 {d27[1]},[r10]!",
+ "F9 CA B4 5D", "vst1.16 {d27[1]},[r10@16]!",
+ "F9 CA B8 BD", "vst1.32 {d27[1]},[r10@32]!",
+ "F9 CA B0 29", "vst1.8 {d27[1]},[r10],r9",
+ "F9 CA B4 49", "vst1.16 {d27[1]},[r10],r9",
+ "F9 CA B8 89", "vst1.32 {d27[1]},[r10],r9",
+ "F9 CA B4 59", "vst1.16 {d27[1]},[r10@16],r9",
+ "F9 CA B8 B9", "vst1.32 {d27[1]},[r10@32],r9",
+ "F9 4A B8 0F", "vst2.8 {d27,d28},[r10]",
+ "F9 4A B9 0F", "vst2.8 {d27,d29},[r10]",
+ "F9 4A B3 0F", "vst2.8 {d27,d28,d29,d30},[r10]",
+ "F9 4A B8 4F", "vst2.16 {d27,d28},[r10]",
+ "F9 4A B9 4F", "vst2.16 {d27,d29},[r10]",
+ "F9 4A B3 4F", "vst2.16 {d27,d28,d29,d30},[r10]",
+ "F9 4A B8 1F", "vst2.8 {d27,d28},[r10@64]",
+ "F9 4A B8 2F", "vst2.8 {d27,d28},[r10@128]",
+ "F9 4A B9 1F", "vst2.8 {d27,d29},[r10@64]",
+ "F9 4A B9 2F", "vst2.8 {d27,d29},[r10@128]",
+ "F9 4A B3 1F", "vst2.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B3 2F", "vst2.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B3 3F", "vst2.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B8 5F", "vst2.16 {d27,d28},[r10@64]",
+ "F9 4A B8 6F", "vst2.16 {d27,d28},[r10@128]",
+ "F9 4A B9 5F", "vst2.16 {d27,d29},[r10@64]",
+ "F9 4A B9 6F", "vst2.16 {d27,d29},[r10@128]",
+ "F9 4A B3 5F", "vst2.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B3 6F", "vst2.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B3 7F", "vst2.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A B8 0D", "vst2.8 {d27,d28},[r10]!",
+ "F9 4A B9 0D", "vst2.8 {d27,d29},[r10]!",
+ "F9 4A B3 0D", "vst2.8 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B8 4D", "vst2.16 {d27,d28},[r10]!",
+ "F9 4A B9 4D", "vst2.16 {d27,d29},[r10]!",
+ "F9 4A B3 4D", "vst2.16 {d27,d28,d29,d30},[r10]!",
+ "F9 4A B8 1D", "vst2.8 {d27,d28},[r10@64]!",
+ "F9 4A B8 2D", "vst2.8 {d27,d28},[r10@128]!",
+ "F9 4A B9 1D", "vst2.8 {d27,d29},[r10@64]!",
+ "F9 4A B9 2D", "vst2.8 {d27,d29},[r10@128]!",
+ "F9 4A B3 1D", "vst2.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B3 2D", "vst2.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B3 3D", "vst2.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B8 5D", "vst2.16 {d27,d28},[r10@64]!",
+ "F9 4A B8 6D", "vst2.16 {d27,d28},[r10@128]!",
+ "F9 4A B9 5D", "vst2.16 {d27,d29},[r10@64]!",
+ "F9 4A B9 6D", "vst2.16 {d27,d29},[r10@128]!",
+ "F9 4A B3 5D", "vst2.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B3 6D", "vst2.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B3 7D", "vst2.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A B8 09", "vst2.8 {d27,d28},[r10],r9",
+ "F9 4A B9 09", "vst2.8 {d27,d29},[r10],r9",
+ "F9 4A B3 09", "vst2.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B8 49", "vst2.16 {d27,d28},[r10],r9",
+ "F9 4A B9 49", "vst2.16 {d27,d29},[r10],r9",
+ "F9 4A B3 49", "vst2.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A B8 19", "vst2.8 {d27,d28},[r10@64],r9",
+ "F9 4A B8 29", "vst2.8 {d27,d28},[r10@128],r9",
+ "F9 4A B9 19", "vst2.8 {d27,d29},[r10@64],r9",
+ "F9 4A B9 29", "vst2.8 {d27,d29},[r10@128],r9",
+ "F9 4A B3 19", "vst2.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B3 29", "vst2.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B3 39", "vst2.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A B8 59", "vst2.16 {d27,d28},[r10@64],r9",
+ "F9 4A B8 69", "vst2.16 {d27,d28},[r10@128],r9",
+ "F9 4A B9 59", "vst2.16 {d27,d29},[r10@64],r9",
+ "F9 4A B9 69", "vst2.16 {d27,d29},[r10@128],r9",
+ "F9 4A B3 59", "vst2.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B3 69", "vst2.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B3 79", "vst2.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 CA B1 2F", "vst2.8 {d27[1],d28[1]},[r10]",
+ "F9 CA B5 4F", "vst2.16 {d27[1],d28[1]},[r10]",
+ "F9 CA B5 6F", "vst2.16 {d27[1],d29[1]},[r10]",
+ "F9 CA B9 8F", "vst2.32 {d27[1],d28[1]},[r10]",
+ "F9 CA B9 CF", "vst2.32 {d27[1],d29[1]},[r10]",
+ "F9 CA B1 3F", "vst2.8 {d27[1],d28[1]},[r10@16]",
+ "F9 CA B5 5F", "vst2.16 {d27[1],d28[1]},[r10@32]",
+ "F9 CA B5 7F", "vst2.16 {d27[1],d29[1]},[r10@32]",
+ "F9 CA B9 9F", "vst2.32 {d27[1],d28[1]},[r10@64]",
+ "F9 CA B9 DF", "vst2.32 {d27[1],d29[1]},[r10@64]",
+ "F9 CA B1 2D", "vst2.8 {d27[1],d28[1]},[r10]!",
+ "F9 CA B5 4D", "vst2.16 {d27[1],d28[1]},[r10]!",
+ "F9 CA B5 6D", "vst2.16 {d27[1],d29[1]},[r10]!",
+ "F9 CA B9 8D", "vst2.32 {d27[1],d28[1]},[r10]!",
+ "F9 CA B9 CD", "vst2.32 {d27[1],d29[1]},[r10]!",
+ "F9 CA B1 3D", "vst2.8 {d27[1],d28[1]},[r10@16]!",
+ "F9 CA B5 5D", "vst2.16 {d27[1],d28[1]},[r10@32]!",
+ "F9 CA B5 7D", "vst2.16 {d27[1],d29[1]},[r10@32]!",
+ "F9 CA B9 9D", "vst2.32 {d27[1],d28[1]},[r10@64]!",
+ "F9 CA B9 DD", "vst2.32 {d27[1],d29[1]},[r10@64]!",
+ "F9 CA B1 29", "vst2.8 {d27[1],d28[1]},[r10],r9",
+ "F9 CA B5 49", "vst2.16 {d27[1],d28[1]},[r10],r9",
+ "F9 CA B5 69", "vst2.16 {d27[1],d29[1]},[r10],r9",
+ "F9 CA B9 89", "vst2.32 {d27[1],d28[1]},[r10],r9",
+ "F9 CA B9 C9", "vst2.32 {d27[1],d29[1]},[r10],r9",
+ "F9 CA B1 39", "vst2.8 {d27[1],d28[1]},[r10@16],r9",
+ "F9 CA B5 59", "vst2.16 {d27[1],d28[1]},[r10@32],r9",
+ "F9 CA B5 79", "vst2.16 {d27[1],d29[1]},[r10@32],r9",
+ "F9 CA B9 99", "vst2.32 {d27[1],d28[1]},[r10@64],r9",
+ "F9 CA B9 D9", "vst2.32 {d27[1],d29[1]},[r10@64],r9",
+ "F9 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 CA B2 2F", "vst3.8 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA B6 4F", "vst3.16 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA B6 6F", "vst3.16 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA BA 8F", "vst3.32 {d27[1],d28[1],d29[1]},[r10]",
+ "F9 CA BA CF", "vst3.32 {d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA B2 2D", "vst3.8 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA B6 4D", "vst3.16 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA B6 6D", "vst3.16 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA BA 8D", "vst3.32 {d27[1],d28[1],d29[1]},[r10]!",
+ "F9 CA BA CD", "vst3.32 {d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA B2 29", "vst3.8 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA B6 49", "vst3.16 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA B6 69", "vst3.16 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 CA BA 89", "vst3.32 {d27[1],d28[1],d29[1]},[r10],r9",
+ "F9 CA BA C9", "vst3.32 {d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 4A B0 0F", "vst4.8 {d27,d28,d29,d30},[r10]",
+ "F9 4A 91 0F", "vst4.8 {d25,d27,d29,d31},[r10]",
+ "F9 4A B0 4F", "vst4.16 {d27,d28,d29,d30},[r10]",
+ "F9 4A 91 4F", "vst4.16 {d25,d27,d29,d31},[r10]",
+ "F9 4A B0 8F", "vst4.32 {d27,d28,d29,d30},[r10]",
+ "F9 4A 91 8F", "vst4.32 {d25,d27,d29,d31},[r10]",
+ "F9 4A B0 1F", "vst4.8 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B0 2F", "vst4.8 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B0 3F", "vst4.8 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A 91 1F", "vst4.8 {d25,d27,d29,d31},[r10@64]",
+ "F9 4A 91 2F", "vst4.8 {d25,d27,d29,d31},[r10@128]",
+ "F9 4A 91 3F", "vst4.8 {d25,d27,d29,d31},[r10@256]",
+ "F9 4A B0 5F", "vst4.16 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B0 6F", "vst4.16 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B0 7F", "vst4.16 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A 91 5F", "vst4.16 {d25,d27,d29,d31},[r10@64]",
+ "F9 4A 91 6F", "vst4.16 {d25,d27,d29,d31},[r10@128]",
+ "F9 4A 91 7F", "vst4.16 {d25,d27,d29,d31},[r10@256]",
+ "F9 4A B0 9F", "vst4.32 {d27,d28,d29,d30},[r10@64]",
+ "F9 4A B0 AF", "vst4.32 {d27,d28,d29,d30},[r10@128]",
+ "F9 4A B0 BF", "vst4.32 {d27,d28,d29,d30},[r10@256]",
+ "F9 4A 91 9F", "vst4.32 {d25,d27,d29,d31},[r10@64]",
+ "F9 4A 91 AF", "vst4.32 {d25,d27,d29,d31},[r10@128]",
+ "F9 4A 91 BF", "vst4.32 {d25,d27,d29,d31},[r10@256]",
+ "F9 4A B0 0D", "vst4.8 {d27,d28,d29,d30},[r10]!",
+ "F9 4A 91 0D", "vst4.8 {d25,d27,d29,d31},[r10]!",
+ "F9 4A B0 4D", "vst4.16 {d27,d28,d29,d30},[r10]!",
+ "F9 4A 91 4D", "vst4.16 {d25,d27,d29,d31},[r10]!",
+ "F9 4A B0 8D", "vst4.32 {d27,d28,d29,d30},[r10]!",
+ "F9 4A 91 8D", "vst4.32 {d25,d27,d29,d31},[r10]!",
+ "F9 4A B0 1D", "vst4.8 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B0 2D", "vst4.8 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B0 3D", "vst4.8 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A 91 1D", "vst4.8 {d25,d27,d29,d31},[r10@64]!",
+ "F9 4A 91 2D", "vst4.8 {d25,d27,d29,d31},[r10@128]!",
+ "F9 4A 91 3D", "vst4.8 {d25,d27,d29,d31},[r10@256]!",
+ "F9 4A B0 5D", "vst4.16 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B0 6D", "vst4.16 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B0 7D", "vst4.16 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A 91 5D", "vst4.16 {d25,d27,d29,d31},[r10@64]!",
+ "F9 4A 91 6D", "vst4.16 {d25,d27,d29,d31},[r10@128]!",
+ "F9 4A 91 7D", "vst4.16 {d25,d27,d29,d31},[r10@256]!",
+ "F9 4A B0 9D", "vst4.32 {d27,d28,d29,d30},[r10@64]!",
+ "F9 4A B0 AD", "vst4.32 {d27,d28,d29,d30},[r10@128]!",
+ "F9 4A B0 BD", "vst4.32 {d27,d28,d29,d30},[r10@256]!",
+ "F9 4A 91 9D", "vst4.32 {d25,d27,d29,d31},[r10@64]!",
+ "F9 4A 91 AD", "vst4.32 {d25,d27,d29,d31},[r10@128]!",
+ "F9 4A 91 BD", "vst4.32 {d25,d27,d29,d31},[r10@256]!",
+ "F9 4A B0 09", "vst4.8 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A 91 09", "vst4.8 {d25,d27,d29,d31},[r10],r9",
+ "F9 4A B0 49", "vst4.16 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A 91 49", "vst4.16 {d25,d27,d29,d31},[r10],r9",
+ "F9 4A B0 89", "vst4.32 {d27,d28,d29,d30},[r10],r9",
+ "F9 4A 91 89", "vst4.32 {d25,d27,d29,d31},[r10],r9",
+ "F9 4A B0 19", "vst4.8 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B0 29", "vst4.8 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B0 39", "vst4.8 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A 91 19", "vst4.8 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 4A 91 29", "vst4.8 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 4A 91 39", "vst4.8 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 4A B0 59", "vst4.16 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B0 69", "vst4.16 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B0 79", "vst4.16 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A 91 59", "vst4.16 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 4A 91 69", "vst4.16 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 4A 91 79", "vst4.16 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 4A B0 99", "vst4.32 {d27,d28,d29,d30},[r10@64],r9",
+ "F9 4A B0 A9", "vst4.32 {d27,d28,d29,d30},[r10@128],r9",
+ "F9 4A B0 B9", "vst4.32 {d27,d28,d29,d30},[r10@256],r9",
+ "F9 4A 91 99", "vst4.32 {d25,d27,d29,d31},[r10@64],r9",
+ "F9 4A 91 A9", "vst4.32 {d25,d27,d29,d31},[r10@128],r9",
+ "F9 4A 91 B9", "vst4.32 {d25,d27,d29,d31},[r10@256],r9",
+ "F9 CA B3 2F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 CA B7 4F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 CA 97 6F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA BB 8F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]",
+ "F9 CA 9B CF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]",
+ "F9 CA B3 3F", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]",
+ "F9 CA B7 5F", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F9 CA 97 7F", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F9 CA BB 9F", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]",
+ "F9 CA BB AF", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]",
+ "F9 CA 9B DF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]",
+ "F9 CA 9B EF", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]",
+ "F9 CA B3 2D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 CA B7 4D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 CA 97 6D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA BB 8D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10]!",
+ "F9 CA 9B CD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10]!",
+ "F9 CA B3 3D", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32]!",
+ "F9 CA B7 5D", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F9 CA 97 7D", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F9 CA BB 9D", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64]!",
+ "F9 CA BB AD", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128]!",
+ "F9 CA 9B DD", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64]!",
+ "F9 CA 9B ED", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128]!",
+ "F9 CA B3 29", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 CA B7 49", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 CA 97 69", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 CA BB 89", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10],r9",
+ "F9 CA 9B C9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10],r9",
+ "F9 CA B3 39", "vst4.8 {d27[1],d28[1],d29[1],d30[1]},[r10@32],r9",
+ "F9 CA B7 59", "vst4.16 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F9 CA 97 79", "vst4.16 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F9 CA BB 99", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@64],r9",
+ "F9 CA BB A9", "vst4.32 {d27[1],d28[1],d29[1],d30[1]},[r10@128],r9",
+ "F9 CA 9B D9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@64],r9",
+ "F9 CA 9B E9", "vst4.32 {d25[1],d27[1],d29[1],d31[1]},[r10@128],r9",
+ "EC CA BB 04", "vstmia r10,{d27-d28}",
+ "EC CA DA 02", "vstmia r10,{s27-s28}",
+ "EC EA BB 04", "vstmia r10!,{d27-d28}",
+ "ED 6A BB 04", "vstmdb r10!,{d27-d28}",
+ "EC EA DA 02", "vstmia r10!,{s27-s28}",
+ "ED 6A DA 02", "vstmdb r10!,{s27-s28}",
+ "ED 4A 5B FF", "vstr.64 d21,[r10,#-0x3fc]",
+ "ED CA 5B FF", "vstr.64 d21,[r10,#0x3fc]",
+ "ED CA 5B 00", "vstr.64 d21,[r10]",
+ "ED 4A AA FF", "vstr.32 s21,[r10,#-0x3fc]",
+ "ED CA AA FF", "vstr.32 s21,[r10,#0x3fc]",
+ "ED CA AA 00", "vstr.32 s21,[r10]",
+ "FF 49 58 AA", "vsub.i8 d21,d25,d26",
+ "FF 59 58 AA", "vsub.i16 d21,d25,d26",
+ "FF 69 58 AA", "vsub.i32 d21,d25,d26",
+ "FF 79 58 AA", "vsub.i64 d21,d25,d26",
+ "FF 4C 68 EE", "vsub.i8 q11,q14,q15",
+ "FF 5C 68 EE", "vsub.i16 q11,q14,q15",
+ "FF 6C 68 EE", "vsub.i32 q11,q14,q15",
+ "FF 7C 68 EE", "vsub.i64 q11,q14,q15",
+ "EF 69 5D AA", "vsub.f32 d21,d25,d26",
+ "EF 6C 6D EE", "vsub.f32 q11,q14,q15",
+ "EE 7C AA CD", "vsub.f32 s21,s25,s26",
+ "EE 79 5B EA", "vsub.f64 d21,d25,d26",
+ "EF CC 56 AE", "vsubhn.i16 d21,q14,q15",
+ "EF DC 56 AE", "vsubhn.i32 d21,q14,q15",
+ "EF EC 56 AE", "vsubhn.i64 d21,q14,q15",
+ "EF C9 62 AA", "vsubl.s8 q11,d25,d26",
+ "EF D9 62 AA", "vsubl.s16 q11,d25,d26",
+ "EF E9 62 AA", "vsubl.s32 q11,d25,d26",
+ "FF C9 62 AA", "vsubl.u8 q11,d25,d26",
+ "FF D9 62 AA", "vsubl.u16 q11,d25,d26",
+ "FF E9 62 AA", "vsubl.u32 q11,d25,d26",
+ "EF CC 63 AA", "vsubw.s8 q11,q14,d26",
+ "EF DC 63 AA", "vsubw.s16 q11,q14,d26",
+ "EF EC 63 AA", "vsubw.s32 q11,q14,d26",
+ "FF CC 63 AA", "vsubw.u8 q11,q14,d26",
+ "FF DC 63 AA", "vsubw.u16 q11,q14,d26",
+ "FF EC 63 AA", "vsubw.u32 q11,q14,d26",
+ "FF F2 50 2A", "vswp d21,d26",
+ "FF F2 60 6E", "vswp q11,q15",
+ "FF FB 58 AA", "vtbl.8 d21,{d27},d26",
+ "FF FB 59 AA", "vtbl.8 d21,{d27,d28},d26",
+ "FF FB 5A AA", "vtbl.8 d21,{d27,d28,d29},d26",
+ "FF FB 5B AA", "vtbl.8 d21,{d27,d28,d29,d30},d26",
+ "FF FB 58 EA", "vtbx.8 d21,{d27},d26",
+ "FF FB 59 EA", "vtbx.8 d21,{d27,d28},d26",
+ "FF FB 5A EA", "vtbx.8 d21,{d27,d28,d29},d26",
+ "FF FB 5B EA", "vtbx.8 d21,{d27,d28,d29,d30},d26",
+ "FF F2 50 AA", "vtrn.8 d21,d26",
+ "FF F6 50 AA", "vtrn.16 d21,d26",
+ "FF FA 50 AA", "vtrn.32 d21,d26",
+ "FF F2 60 EE", "vtrn.8 q11,q15",
+ "FF F6 60 EE", "vtrn.16 q11,q15",
+ "FF FA 60 EE", "vtrn.32 q11,q15",
+ "EF 49 58 BA", "vtst.8 d21,d25,d26",
+ "EF 59 58 BA", "vtst.16 d21,d25,d26",
+ "EF 69 58 BA", "vtst.32 d21,d25,d26",
+ "EF 4C 68 FE", "vtst.8 q11,q14,q15",
+ "EF 5C 68 FE", "vtst.16 q11,q14,q15",
+ "EF 6C 68 FE", "vtst.32 q11,q14,q15",
+ "FF F2 51 2A", "vuzp.8 d21,d26",
+ "FF F6 51 2A", "vuzp.16 d21,d26",
+ "FF F2 61 6E", "vuzp.8 q11,q15",
+ "FF F6 61 6E", "vuzp.16 q11,q15",
+ "FF FA 61 6E", "vuzp.32 q11,q15",
+ "FF F2 51 AA", "vzip.8 d21,d26",
+ "FF F6 51 AA", "vzip.16 d21,d26",
+ "FF F2 61 EE", "vzip.8 q11,q15",
+ "FF F6 61 EE", "vzip.16 q11,q15",
+ "FF FA 61 EE", "vzip.32 q11,q15",
+ };
+
+ disassembleInstArray(insts, thumbOptions);
+ }
+
+
+ /**
+ * Test for Thumb 32-bit Imm12
+ * see reference manual algorithm for ThumbExpandImm
+ */
+ @Test
+ public void testThumb2ExpandImm12() {
+
+ System.out.println("\n================== Thumb2 Expand Imm12 Mode ==================\n");
+
+ // A6.3.2 Modified Immediate constants in Thumb 32-bit instructions
+
+ String[] insts = {
+ "F1 0A 05 71", "add.w r5,r10,#0x71",
+ "F1 0B 06 F7", "add.w r6,r11,#0xf7",
+ "F1 09 14 78", "add.w r4,r9,#0x780078",
+ "F1 08 13 FC", "add.w r3,r8,#0xfc00fc",
+ "F1 07 25 64", "add.w r5,r7,#0x64006400",
+ "F1 06 25 E3", "add.w r5,r6,#0xe300e300",
+ "F1 07 46 60", "add.w r6,r7,#0xe0000000",
+ "F1 08 47 E0", "add.w r7,r8,#0x70000000",
+ "F5 0A 05 60", "add.w r5,r10,#0xe00000",
+ "F5 0A 45 60", "add.w r5,r10,#0xe000",
+ "F5 0A 65 60", "add.w r5,r10,#0xe00",
+ "F1 1A 05 71", "adds.w r5,r10,#0x71",
+ "F1 1B 06 F7", "adds.w r6,r11,#0xf7",
+ "F1 19 14 78", "adds.w r4,r9,#0x780078",
+ "F1 18 13 FC", "adds.w r3,r8,#0xfc00fc",
+ "F1 17 25 64", "adds.w r5,r7,#0x64006400",
+ "F1 16 25 E3", "adds.w r5,r6,#0xe300e300",
+ "F1 17 46 60", "adds.w r6,r7,#0xe0000000",
+ "F1 18 47 E0", "adds.w r7,r8,#0x70000000",
+ "F5 1A 05 60", "adds.w r5,r10,#0xe00000",
+ "F5 1A 45 60", "adds.w r5,r10,#0xe000",
+ "F5 1A 65 60", "adds.w r5,r10,#0xe00",
+ };
+
+ disassembleInstArray(insts, thumbOptions);
+ }
+
+ /**
+ * Test for Thumb2 shifter operand).
+ */
+ @Test
+ public void testThumb2ShifterOperand() {
+
+ System.out.println("\n================== Thumb2 Shifter Operand ==================\n");
+ String[] insts = {
+ "EB 09 05 0A", "add.w r5,r9,r10",
+ "EB 08 14 A9", "add.w r4,r8,r9,asr #6",
+ "EB 07 03 48", "add.w r3,r7,r8,lsl #1",
+ "EB 06 02 17", "add.w r2,r6,r7,lsr #32",
+ "EB 09 75 F8", "add.w r5,r9,r8,ror #31",
+ "EB 08 05 39", "add.w r5,r8,r9,rrx",
+ };
+ disassembleInstArray(insts, thumbOptions);
+ }
+
+ /**
+ * check for instructions that will only get disassembled
+ * a certain way for ARMv6T2
+ */
+ @Test
+ public void testThumb2V6T2Instructions() {
+ System.out.println("\n================== ARMv6T2 Hint Instructions ==================\n");
+
+ String[] insts = {
+ "F3 BF 8F 2F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
+ "F3 AF 80 F0", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 AF 80 FD", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 BF 8F 50", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 52", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 53", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 56", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 57", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5A", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5B", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5E", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 5F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0101 xxxx // A8.6.41 T1
+ "F3 BF 8F 42", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 43", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 46", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 47", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4A", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4B", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4D", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4E", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 BF 8F 4F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0100 xxxx // A8.6.42 T1
+ "F3 AF 80 04", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
+ "F3 AF 80 02", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411 T1
+ "F3 AF 80 03", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412 T1
+ "F3 AF 80 01", "nop.w", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413 T1
+ };
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<String, Object> entry : thumbOptions.entrySet())
+ options.put(entry.getKey(), entry.getValue());
+ options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv6T2);
+ disassembleInstArray(insts, options);
+ }
+
+
+ /**
+ * only BL & BLX with the J1 & J2 bits both set to 1 are allowed
+ * for thumb2; everything else should produce "invalid opcode"
+ */
+ @Test
+ public void testThumb2V4TInstructions() {
+
+ System.out.println("\n================== Thumb2 V4T Instructions ==================\n");
+
+ String[] insts = {
+// "Fx xx xx 0x", "bl 0x________", // 1111 0xxx xxxx xxxx 11x1 xxxx xxxx xxxx // A8.6.23 T1
+// ARM "0B FF FF FE", "bleq 0x00000000",
+// ARM "EB 00 00 1C", "bl 0x00000078",
+// ARM "EB FF FF 00", "bl 0xfffffc08",
+//
+// "Fx xx xx 0x", "blx 0x________", // 1111 0xxx xxxx xxxx 11x0 xxxx xxxx xxxx // A8.6.23 T2
+// ARM "FA FF FF FE", "blx 0x00000000",
+// ARM "01 2F FF 39", "blxeq r9",
+ "F3 BF 8F 2F", "invalid opcode", // 1111 0011 1011 :::: 10.0 :::: 0010 :::: // A8.6.30 T1
+ "F3 AF 80 F0", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 AF 80 FD", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.40 T1
+ "F3 AF 80 04", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.158 T1
+ "F3 AF 80 02", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.411 T1
+ "F3 AF 80 03", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.412 T1
+ "F3 AF 80 01", "invalid opcode", // 1111 0011 1010 :::: 10.0 .xxx xxxx xxxx // A8.6.413 T1
+ };
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<String, Object> entry : thumbOptions.entrySet())
+ options.put(entry.getKey(), entry.getValue());
+ options.put(DisassemblerARM.IDisassemblerOptionsARM.VERSION_MODE, InstructionParserARM.ARMv4T);
+ disassembleInstArray(insts, options);
+ }
+
+ /**
+ * Convert hex string into byte array.
+ */
+ private static byte[] getByteArray(String byteHexString) {
+ byteHexString = byteHexString.replaceAll("0x", "");
+ StringTokenizer tn = new StringTokenizer(byteHexString);
+
+ int cnt = tn.countTokens();
+ byte[] ret = new byte[cnt];
+ for (int i = 0; i < cnt; i++) {
+ ret[i] = (byte) Integer.parseInt(tn.nextToken(), 16);
+ }
+
+ return ret;
+ }
+
+ /**
+ * Disassemble a single instruction and verify the output.
+ */
+ private void disassembleInst(long address, String code, IJumpToAddress expectedJumpAddr, String expectedMnemonics,
+ Map<String, Object> options) {
+ if (options == null)
+ options = armOptions;
+
+ IAddress addr = new Addr32(address);
+ ByteBuffer codeBuf = ByteBuffer.wrap(getByteArray(code));
+ String msg;
+
+ InstructionParserARM disa = new InstructionParserARM(addr, codeBuf);
+
+ IDisassembledInstruction output = null;
+ try {
+ output = disa.disassemble(options);
+ } catch (CoreException e) {
+ Assert.fail(e.getLocalizedMessage());
+ }
+
+ Assert.assertEquals(codeBuf.capacity(), output.getSize());
+ Assert.assertEquals(address, output.getAddress().getValue().longValue());
+
+ if (expectedJumpAddr != null) {
+ Assert.assertNotNull(output.getJumpToAddress());
+ Assert.assertEquals(expectedJumpAddr, output.getJumpToAddress());
+ }
+
+ if (expectedMnemonics != null) {
+ msg = "Mnemonics\n " + output.getMnemonics() + "\n not match expected\n " + expectedMnemonics;
+ Assert
+ .assertTrue(msg, TestUtils.stringCompare(expectedMnemonics, output.getMnemonics(), false, true,
+ true));
+ }
+
+ System.out.println(output.getMnemonics());
+ }
+
+ /**
+ * Disassemble a single instruction and verify the output.
+ */
+ private void catchCodeBufferUnderflowException(long address, String code,
+ Map<String, Object> options) {
+ if (options == null)
+ options = armOptions;
+
+ IAddress addr = new Addr32(address);
+ ByteBuffer codeBuf = ByteBuffer.wrap(getByteArray(code));
+
+ InstructionParserARM disa = new InstructionParserARM(addr, codeBuf);
+
+ try {
+ disa.disassemble(options);
+ Assert.fail("expected disa.disassemble() to throw CodeBufferUnderflowException");
+ } catch (CodeBufferUnderflowException e) {
+ System.out.println("properly caught CodeBufferUnderflowException");
+ } catch (CoreException e) {
+ Assert.fail(e.getLocalizedMessage());
+ }
+ }
+
+ /**
+ * Disassemble an array of instructions and verify the output.
+ */
+ private void disassembleInstArray(String[] insts, Map<String, Object> options) {
+ if (insts.length % 2 != 0)
+ throw new IllegalArgumentException();
+
+ // Don't show address nor bytes
+ options.put(IDisassemblerOptions.MNEMONICS_SHOW_ADDRESS, false);
+ options.put(IDisassemblerOptions.MNEMONICS_SHOW_BYTES, false);
+
+ int cnt = insts.length;
+
+ for (int i = 0; i < cnt; i += 2) {
+ disassembleInst(0 /* don't care */, insts[i], null /* don't care */, insts[i + 1], options);
+ }
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfCompileUnitChildren.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfCompileUnitChildren.java
new file mode 100644
index 0000000..16c3033
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfCompileUnitChildren.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ * Nokia - renamed and moved to package org.eclipse.cdt.debug.edc.tests
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.junit.Test;
+
+public class TestDwarfCompileUnitChildren extends AbstractDwarfReaderTest {
+
+ @Test
+ public void checkChildrenParsed() {
+ for (TestInfo info : testInfos.values()) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ if (symbolReader != null) {
+ doCheckChildrenParsed(symbolReader.getModuleScope());
+ }
+ }
+ }
+
+ private void doCheckChildrenParsed(IScope scope) {
+ Collection<IScope> originalChildren = scope.getChildren();
+ if (scope instanceof ICompileUnitScope) {
+ ((ICompileUnitScope) scope).getFunctions();
+ }
+ Collection<IScope> newChildren = scope.getChildren();
+ assertFalse("Should be different unmodifiable collections", newChildren == originalChildren);
+ assertEquals("Size should be identical", newChildren.size(), originalChildren.size());
+ assertEquals("Same degree of emptiness", newChildren.isEmpty(), originalChildren.isEmpty());
+ checkChildrenEqual(newChildren,originalChildren);
+
+ // Recurse into children
+ for (IScope child : newChildren) {
+ doCheckChildrenParsed(child);
+ }
+ }
+
+ private void checkChildrenEqual(Collection<IScope> newChildren, Collection<IScope> originalChildren) {
+ Iterator<IScope> newChildrenIter = newChildren.iterator();
+ Iterator<IScope> origChildrenIter = originalChildren.iterator();
+ while (newChildrenIter.hasNext() && origChildrenIter.hasNext()){
+ IScope newChild = newChildrenIter.next();
+ IScope origChild = origChildrenIter.next();
+ assertEquals(newChild,origChild);
+ }
+ assertFalse(newChildrenIter.hasNext());
+ assertFalse(origChildrenIter.hasNext());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfReader.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfReader.java
index 8e713b3..6db3025 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfReader.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestDwarfReader.java
@@ -1,2196 +1,1912 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-package org.eclipse.cdt.debug.edc.tests;
-
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.arm.IARMSymbol;
-import org.eclipse.cdt.debug.edc.internal.HostOS;
-import org.eclipse.cdt.debug.edc.internal.PathUtils;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
-import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ConstType;
-import org.eclipse.cdt.debug.edc.internal.symbols.FieldType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IEnumeration;
-import org.eclipse.cdt.debug.edc.internal.symbols.IField;
-import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
-import org.eclipse.cdt.debug.edc.internal.symbols.IInheritance;
-import org.eclipse.cdt.debug.edc.internal.symbols.ILexicalBlockScope;
-import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IQualifierType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ITemplateParam;
-import org.eclipse.cdt.debug.edc.internal.symbols.ITypedef;
-import org.eclipse.cdt.debug.edc.internal.symbols.InheritanceType;
-import org.eclipse.cdt.debug.edc.internal.symbols.SubroutineType;
-import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.PublicNameInfo;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfInfoReader;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.EDCSymbolReader;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationExpression;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationList;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.ExecutableSymbolicsReaderFactory;
-import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
-import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
-import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
-import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
-import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
-import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
-import org.eclipse.cdt.debug.edc.symbols.IScope;
-import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.symbols.IVariable;
-import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.IPath;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- *
- */
-public class TestDwarfReader extends BaseDwarfTestCase {
- protected static final String[] symFilesToTest = {
- "BlackFlagMinGW.exe",
- "BlackFlag_gcce.sym",
- "BlackFlag_linuxgcc.exe",
- "BlackFlag_rvct.sym",
- "BlackFlag_gcce_343.sym",
- "HelloWorld_rvct_2_2.exe.sym",
- "HelloWorld_rvct_4_0.exe.sym",
- "QtConsole_gcce_343.sym",
- "SimpleCpp_rvct_22.sym",
- "SimpleCpp_rvct_40.sym",
- "SimpleCpp_gcce_432.sym",
- "SimpleCpp_gcc_x86.exe",
- };
-
- /** Bag of data for testing sym files. The key is 'symFile' and other
- * elements are used by specific tests.
- */
- protected static class TestInfo {
- IPath symFile;
- IPath exeFile;
- int numberOfSources;
- int numberOfModuleScopeChildren;
- int numberOfVariables;
- Map<String, Map<String, VariableInfo>> cuVarMap = new HashMap<String, Map<String,VariableInfo>>();
- int numberOfTypes;
- IPath blackFlagMainFilePath;
- int numberOfSymbols;
- int numberOfPubFuncNames;
- int numberOfPubFuncEntries;
- int numberOfPubVarNames;
- int numberOfPubVarEntries;
- List<String> pubVars = new ArrayList<String>();
- List<String> pubFuncs = new ArrayList<String>();
- Map<String, List<ScopeInfo>> scopeInfos = new LinkedHashMap<String, List<ScopeInfo>>();
- }
-
- protected static Map<String, TestInfo> testInfos = new LinkedHashMap<String, TestInfo>();
-
- static {
- for (String sym : symFilesToTest) {
- TestInfo info = new TestInfo();
- info.symFile = getFile(sym);
- testInfos.put(sym, info);
- }
- }
-
- protected static TestInfo lookupInfo(String sym) {
- return testInfos.get(sym);
- }
-
- protected static void setExe(String sym, String exe) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.exeFile = getFile(exe);
- }
-
- // not all the *.exes really exist; used to test mapping from *.exe to *.sym
- static {
- setExe("BlackFlagMinGW.exe", "BlackFlagMinGW.exe");
- setExe("BlackFlag_gcce.sym", "BlackFlag_gcce.exe");
- setExe("BlackFlag_linuxgcc.exe", "BlackFlag_linuxgcc.exe");
- setExe("BlackFlag_rvct.sym", "BlackFlag_rvct.exe");
- setExe("HelloWorld_rvct_2_2.exe.sym", "HelloWorld_rvct_2_2.exe");
- setExe("HelloWorld_rvct_4_0.exe.sym", "HelloWorld_rvct_4_0.exe");
- setExe("QtConsole_gcce_343.sym", "QtConsole_gcce_343.exe");
- }
- protected static void setSources(String sym, int i) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.numberOfSources = i;
- }
- static {
- // TODO: this differs in Win and Lin
-
- setSources("BlackFlagMinGW.exe", 121);
- setSources("BlackFlag_gcce.sym", 108);
- setSources("BlackFlag_linuxgcc.exe", 139);
- setSources("BlackFlag_rvct.sym", HostOS.IS_WIN32 ? 207 : 172);
- setSources("HelloWorld_rvct_2_2.exe.sym", HostOS.IS_WIN32 ? 323 : 320);
- setSources("HelloWorld_rvct_4_0.exe.sym", 315);
- setSources("QtConsole_gcce_343.sym", 434);
- }
- protected static void setModuleScopeChilden(String sym, int i) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.numberOfModuleScopeChildren = i;
- }
-
- static {
- setModuleScopeChilden("BlackFlagMinGW.exe", 29);
- setModuleScopeChilden("BlackFlag_gcce.sym", 27);
- setModuleScopeChilden("BlackFlag_linuxgcc.exe", 25);
- setModuleScopeChilden("BlackFlag_rvct.sym", 693);
- setModuleScopeChilden("HelloWorld_rvct_2_2.exe.sym", 1579);
- setModuleScopeChilden("HelloWorld_rvct_4_0.exe.sym", 1014);
- setModuleScopeChilden("QtConsole_gcce_343.sym", 3);
- }
-
- protected static void setVariableCount(String sym, int i) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.numberOfVariables = i;
- }
- static {
- setVariableCount("BlackFlagMinGW.exe", 52);
- setVariableCount("BlackFlag_gcce.sym", 105);
- setVariableCount("BlackFlag_linuxgcc.exe", 48);
- setVariableCount("BlackFlag_rvct.sym", 61);
- setVariableCount("HelloWorld_rvct_2_2.exe.sym", 1);
- setVariableCount("HelloWorld_rvct_4_0.exe.sym", 1);
- setVariableCount("QtConsole_gcce_343.sym", 2);
- }
-
- static class VariableInfo {
- String name;
- String typeName;
-
- public VariableInfo(String name, String typeName) {
- this.name = name;
- this.typeName = typeName;
- }
-
- }
- protected static void setCUVariableInfo(String sym, String cu, String var, String type) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- VariableInfo vi = new VariableInfo(var, type);
- Map<String, VariableInfo> varMap = info.cuVarMap.get(cu);
- if (varMap == null) {
- varMap = new HashMap<String, VariableInfo>();
- info.cuVarMap.put(cu, varMap);
- }
- varMap.put(var, vi);
- }
- }
- static {
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KBase", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KDer1", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KDer2", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KDerDer", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KIFace1", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/dbg_namespaceRealms.h", "KIFace2", "const class TLitC8");
- setCUVariableInfo("BlackFlag_rvct.sym", "M:/sf/os/kernelhwsrv/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp", "KLitUser", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "KTxtEPOC32EX", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "KTxtExampleCode", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "KFormatFailed", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "KTxtOK", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "KTxtPressAnyKey", "const class TLitC");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/INC/CommonFramework.h", "console", "class CConsoleBase *");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgchar", "char");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgdouble", "double");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgfloat", "float");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgint", "int");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sglong", "long");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sglongdouble", "long double");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgschar", "SCHAR");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgshort", "short");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgsint", "SINT");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgslong", "SLONG");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgslonglong", "SLONGLONG");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgsshort", "SSHORT");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sguchar", "UCHAR");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sguint", "UINT");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgulong", "ULONG");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgulonglong", "ULONGLONG");
- setCUVariableInfo("BlackFlag_rvct.sym", "/BlackFlag/SRC/dbg_simple_types.cpp", "sgushort", "USHORT");
- setCUVariableInfo("HelloWorld_rvct_2_2.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/inc/ArmTestApplication.h", "KUidArmTestApp", "const class TUid");
- setCUVariableInfo("HelloWorld_rvct_2_2.exe.sym", "/src/cedar/generic/base/e32/compsupp/symaehabi/callfirstprocessfn.cpp", "KLitUser", "const class TLitC");
- setCUVariableInfo("HelloWorld_rvct_2_2.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp", "KFileName", "const class TLitC");
- setCUVariableInfo("HelloWorld_rvct_2_2.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp", "KText", "const class TLitC");
- setCUVariableInfo("HelloWorld_rvct_4_0.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestApplication.cpp", "KUidArmTestApp", "const struct TUid");
- setCUVariableInfo("HelloWorld_rvct_4_0.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestDocument.cpp", "mylit", "char[5]");
- setCUVariableInfo("HelloWorld_rvct_4_0.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp", "KFileName", "const struct TLitC");
- setCUVariableInfo("HelloWorld_rvct_4_0.exe.sym", "/home/eswartz/source/runtime-New_configuration/ArmTest/src/ArmTestAppUi.cpp", "KText", "const struct TLitC");
- setCUVariableInfo("HelloWorld_rvct_4_0.exe.sym", "M:/dev2/sf/os/kernelhwsrv/kernel/eka/compsupp/symaehabi/callfirstprocessfn.cpp", "KLitUser", "const struct TLitC");
- setCUVariableInfo("QtConsole_gcce_343.sym", "/Source/GCCE3/GCCE3/main.cpp", "myGlobalInt", "int");
- }
-
- protected static void setTypeCount(String sym, int i) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.numberOfTypes = i;
- }
- static {
- setTypeCount("BlackFlagMinGW.exe", 1378);
- setTypeCount("BlackFlag_gcce.sym", 3419);
- setTypeCount("BlackFlag_linuxgcc.exe", 1104);
- setTypeCount("BlackFlag_rvct.sym", 33699);
- setTypeCount("HelloWorld_rvct_2_2.exe.sym", 84681);
- setTypeCount("HelloWorld_rvct_4_0.exe.sym", 31560);
- setTypeCount("QtConsole_gcce_343.sym", 1434);
- }
-
-
- protected static void setMainBlackFlagFilePath(String sym, String path) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.blackFlagMainFilePath = PathUtils.createPath(path);
- }
-
- static {
- setMainBlackFlagFilePath("BlackFlagMinGW.exe", "C:/wascana/workspace/BlackFlagWascana/src/BlackFlagWascana.cpp");
- setMainBlackFlagFilePath("BlackFlag_gcce.sym", "/BlackFlag/SRC/main.cpp");
- setMainBlackFlagFilePath("BlackFlag_linuxgcc.exe", "/mydisk/myprog/BlackFlag/src/BlackFlagWascana.cpp");
- setMainBlackFlagFilePath("BlackFlag_rvct.sym", "\\BlackFlag\\SRC\\main.cpp");
- }
-
- private static void setSymbolCount(String sym, int i) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.numberOfSymbols = i;
- }
- static {
- setSymbolCount("BlackFlagMinGW.exe", 2520);
- setSymbolCount("BlackFlag_gcce.sym", 2372);
- setSymbolCount("BlackFlag_linuxgcc.exe", 429);
- setSymbolCount("BlackFlag_rvct.sym", 626);
- setSymbolCount("HelloWorld_rvct_2_2.exe.sym", 151);
- setSymbolCount("HelloWorld_rvct_4_0.exe.sym", 227);
- setSymbolCount("QtConsole_gcce_343.sym", 509);
- }
-
-
- protected static void setPubCount(String sym, int funcnames, int funcentries, int varnames, int varentries) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- info.numberOfPubFuncNames = funcnames;
- info.numberOfPubFuncEntries = funcentries;
- info.numberOfPubVarNames = varnames;
- info.numberOfPubVarEntries = varentries;
- }
- }
- static {
- setPubCount("BlackFlagMinGW.exe", 209, 241, 52, 52);
- setPubCount("BlackFlag_gcce.sym", 217, 286, 87, 105);
- setPubCount("BlackFlag_linuxgcc.exe", 174, 206, 48, 48);
- setPubCount("BlackFlag_rvct.sym", 100, 101, 51, 87);
- setPubCount("HelloWorld_rvct_2_2.exe.sym", 11, 14, 2, 4);
- setPubCount("HelloWorld_rvct_4_0.exe.sym", 958, 978, 1, 1);
- }
-
- protected static void addPubFuncs(String sym, Object... names) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- for (Object o : names) {
- info.pubFuncs.add(o.toString());
- }
- }
- }
- static {
- addPubFuncs("BlackFlagMinGW.exe", "main", "dbg_watchpoints", "Base01::~Base01");
- addPubFuncs("BlackFlag_gcce.sym", "E32Main", "dbg_watchpoints", "Base01::~Base01");
- addPubFuncs("BlackFlag_gcce_343.sym", "E32Main", "dbg_watchpoints", "Base01::~Base01");
- addPubFuncs("BlackFlag_linuxgcc.exe", "main", "dbg_watchpoints", "Base01::~Base01");
- addPubFuncs("BlackFlag_rvct.sym", "E32Main", "dbg_watchpoints", "globalDestructorFunc");
- addPubFuncs("HelloWorld_rvct_2_2.exe.sym", "E32Main", "CallThrdProcEntry", "CleanupClosePushL");
- addPubFuncs("HelloWorld_rvct_4_0.exe.sym", "E32Main", "CallThrdProcEntry", "CleanupClosePushL");
- addPubFuncs("QtConsole_gcce_343.sym", "main", "__gxx_personality_v0", "__gnu_unwind_frame");
- }
-
- protected static void addPubVars(String sym, Object... names) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- for (Object o : names) {
- info.pubVars.add(o.toString());
- }
- }
- }
- static {
- addPubVars("BlackFlagMinGW.exe", "vgushort", "gulong", "char_wp");
- addPubVars("BlackFlag_gcce.sym", "vgushort", "gulong", "g_char");
- addPubVars("BlackFlag_gcce_343.sym", "vgushort", "gulong", "g_char");
- addPubVars("BlackFlag_linuxgcc.exe", "vgushort", "gulong", "gchar");
- addPubVars("BlackFlag_rvct.sym", "vgushort", "gulong", "g_char");
- addPubVars("HelloWorld_rvct_2_2.exe.sym", "mylit");
- addPubVars("HelloWorld_rvct_4_0.exe.sym", "mylit");
- addPubVars("QtConsole_gcce_343.sym", "myGlobalInt");
- }
-
- @Test
- public void testSymFromExeDetect() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (info.exeFile == null) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.exeFile);
- assertNotNull(symbolReader);
- System.out.println("Sym for exe " + info.exeFile + " is " + symbolReader.getSymbolFile());
- assertEquals(info.symFile, symbolReader.getSymbolFile());
- }
- }
-
- @Before
- public void setup() throws Exception {
- // each test relies on starting from scratch
- Symbols.releaseReaderCache();
- }
-
- /**
- * This should be a quick check, not a slow one
- * @throws Exception
- */
- @Test
- public void testSymDetect() throws Exception {
- long time = System.currentTimeMillis();
- _testSymDetect();
- long span = System.currentTimeMillis() - time;
- System.out.println(span + " ms (testSymDetect)");
- }
-
- private void _testSymDetect() {
- for (TestInfo info : testInfos.values()) {
- System.out.println("Checking sym for " + info.symFile);
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- assertNotNull(info.symFile.toString(), symbolReader);
- assertTrue(info.symFile.toString(), symbolReader.hasRecognizedDebugInformation());
- }
- }
-
- @Test
- public void testSourceFiles() throws Exception {
- long time = System.currentTimeMillis();
- _testSourceFiles();
- long span = System.currentTimeMillis() - time;
- System.out.println(span + " ms (testSourceFiles)");
- }
-
- private void _testSourceFiles() {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfSources == 0) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- String[] sources= symbolReader.getSourceFiles();
- assertNotNull(sources);
- //System.out.println(info.symFile.toString() + " : " + sources.length);
- assertEquals(info.symFile.toString(), info.numberOfSources, sources.length);
- }
- }
-
- @Test
- public void testCompileUnits() throws Exception {
- long time = System.currentTimeMillis();
- _testCompileUnits();
- long span = System.currentTimeMillis() - time;
- System.out.println(span + " ms (testCompileUnits)");
- }
-
- private void _testCompileUnits() {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfModuleScopeChildren == 0) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- Collection<IScope> scopes= symbolReader.getModuleScope().getChildren();
- assertNotNull(scopes);
- //System.out.println(info.symFile.toString() + ": " + scopes.size());
- //for (IScope kid : scopes)
- // System.out.println("\t" + kid.getName());
- assertEquals(info.symFile.toString(), info.numberOfModuleScopeChildren, scopes.size());
- }
- }
-
- @Test
- public void testGlobalVariables() throws Exception {
- long time = System.currentTimeMillis();
- _testGlobalVariables();
- long span = System.currentTimeMillis() - time;
- System.out.println(span + " ms (testGlobalVariables)");
- }
-
- private void _testGlobalVariables() {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfVariables == 0) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- Collection<IVariable> variables = symbolReader.getModuleScope().getVariables();
- assertNotNull(variables);
- //System.out.println(info.symFile.toString() + ": " + variables.size());
- assertEquals(info.symFile.toString(), info.numberOfVariables, variables.size());
- }
- }
-
- /**
- * Test that we can find and get types for globals in compilation units
- * @throws Exception
- */
- @Test
- public void testPerCUGlobals() throws Exception {
- long time = System.currentTimeMillis();
- _testPerCUGlobals();
- long span = System.currentTimeMillis() - time;
- System.out.println(span + " ms (testPerCUGlobals)");
- }
-
- private void _testPerCUGlobals() {
- for (TestInfo info : testInfos.values()) {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- boolean discover = false;
-
- if (discover) {
- // DISCOVERY (rerun if reader gets better and paste into static block at top)
- //System.out.println(info.symFile);
- boolean any = false;
- for (String srcFile : symbolReader.getSourceFiles()) {
- List<ICompileUnitScope> cusList = symbolReader.getModuleScope().getCompileUnitsForFile(PathUtils.createPath(srcFile));
- any = true;
- for (ICompileUnitScope cus : cusList) {
- Collection<IVariable> vars = cus.getVariables();
- if (!vars.isEmpty()) {
- //System.out.println(srcFile +" : # vars = " + vars.size());
- for (IVariable var : vars) {
- //System.out.println(var.getName() + " : " + getTypeName(var.getType()));
- System.out.println(MessageFormat.format(
- "setCUVariableInfo(\"{0}\", \"{1}\", \"{2}\", \"{3}\");",
- info.symFile.lastSegment(),
- srcFile,
- var.getName(),
- getTypeName(var.getType())));
- }
- }
- }
- }
- assertTrue("Any CUs in " + info.symFile, any);
- } else {
- if (info.cuVarMap == null)
- continue;
-
- for (Map.Entry<String, Map<String, VariableInfo>> entry : info.cuVarMap.entrySet()) {
- String cu = entry.getKey();
- List<ICompileUnitScope> cusList = symbolReader.getModuleScope().getCompileUnitsForFile(PathUtils.createPath(cu));
- assertNotNull(info.symFile + " : " + cu, cusList);
- for (Map.Entry<String, VariableInfo> varEntry : entry.getValue().entrySet()) {
- // TODO: getter by name
- boolean found = false;
- for (ICompileUnitScope cus : cusList) {
- for (IVariable var : cus.getVariables()) {
- if (var.getName().equals(varEntry.getKey())) {
- found = true;
- VariableInfo varInfo = varEntry.getValue();
- assertNotNull(var.getType());
- String theTypeName = getTypeName(var.getType());
- System.out.println(info.symFile + " : " + cu + " : " + var.getName() + " = " + theTypeName);
- assertEquals(info.symFile + " : " + cu + " : " + var.getName(),
- varInfo.typeName, theTypeName);
- }
- }
- }
- assertTrue(info.symFile + " : " + cu + " : " + entry.getKey(), found);
- }
- }
- }
- }
- }
-
- private String getTypeName(IType type) {
- return TypeUtils.getFullTypeName(type);
- }
-
- /**
- * Test that we can find and resolve all types. The lazy type evaluator only
- * is lazy as far as dereferenced types go, so we don't check anything but names
- * and type trees here.
- *
- * This test isn't exhaustive; it just ferrets out assertion errors and null pointer references.
- * @throws Exception
- */
- @Test
- public void testTypes() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfTypes == 0) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- boolean discover = false;
-
- if (discover) {
- // DISCOVERY
- //System.out.println(info.symFile);
- int cnt = symbolReader.getModuleScope().getTypes().size();
- //for (IType type : symbolReader.getModuleScope().getTypes()) {
- // System.out.println(getTypeName(type));
- //}
- System.out.println(info.symFile + " : " + cnt);
- }
- else {
- Collection<IType> types = symbolReader.getModuleScope().getTypes();
- assertNotNull(types);
- System.out.println("Initial: " + types.size());
-
- // this should trigger expansion of subtypes
- int idx = 1;
- for (IType type : types) {
- doTestType(idx, type);
- idx++;
- }
-
- types = symbolReader.getModuleScope().getTypes();
- System.out.println("After: " + types.size());
- assertEquals(info.symFile.toString(), info.numberOfTypes, types.size());
-
- // now, ensure the types are still there in a new reader
- symbolReader = Symbols.getSymbolReader(info.symFile);
- assertEquals(info.symFile.toString(), info.numberOfTypes, symbolReader.getModuleScope().getTypes().size());
- }
- }
- }
-
- /**
- * @param idx
- * @param type
- */
- private void doTestType(int idx, IType type) {
- String name = getTypeName(type);
- if (type.getByteSize() == 0) {
- IType checkType = type;
- while (checkType != null) {
- if (checkType instanceof IQualifierType || checkType instanceof TypedefType)
- checkType = checkType.getType();
- else
- break;
- }
- if (checkType == null)
- return;
- if (checkType instanceof ICompositeType)
- return; // this is allowed, even though the spec says it should be here.
- // we can't fix it up, because even if we sum up the field sizes, we can't predict the extra space used by alignment
- if (checkType instanceof SubroutineType || checkType instanceof InheritanceType)
- return; // this is allowed
-
- if (checkType instanceof FieldType) {
- doTestType(idx, ((FieldType) checkType).getType());
- return;
- }
- if (checkType instanceof ICompositeType)
- return; // this is allowed, even though the spec says it should be here.
- // we can't fix it up, because even if we sum up the field sizes, we can't predict the extra space used by alignment
- if (checkType instanceof ArrayType) {
- for (IArrayBoundType bound : ((ArrayType) checkType).getBounds()) {
- if (bound.getElementCount() == 0)
- return;
- }
- // else, should have more
- }
-
- if (checkType == DwarfDebugInfoProvider.ForwardTypeReference.NULL_TYPE_ENTRY)
- return; // should not get here, but something else tests this
- if (checkType instanceof ICPPBasicType && ((ICPPBasicType) checkType).getBaseType() == ICPPBasicType.t_void)
- return; // yup
- if (checkType instanceof ITemplateParam)
- return; // no inherent size
- if (checkType instanceof IArrayBoundType)
- return; // no inherent size
- fail(name + " has zero size");
- }
- if (idx % 1000 == 0) System.out.print(".");
- }
-
- /**
- * This method is useful for dumping the types actually parsed and comparing them with each other.
- */
- /*
- public void testTypesXX() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (!info.symFile.lastSegment().contains("gcce"))
- continue;
-
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- Collection<IType> types = symbolReader.getModuleScope().getTypes();
- assertNotNull(types);
-
- // force expansion
- for (IType type : types) {
- //String name =
- getTypeName(type);
- }
-
- // start again
- types = symbolReader.getModuleScope().getTypes();
- List<String> names = new ArrayList<String>();
- for (IType type : types) {
- names.add(getTypeName(type));
- }
- //Collections.sort(names);
- String fname = "true".equals(System.getProperty(Symbols.DWARF_USE_NEW_READER)) ? "new.txt" : "old.txt";
- PrintStream dump = new PrintStream(new File("/tmp/" + fname));
- for (String name : names) {
- dump.println(name);
- }
- dump.close();
- }
- }
- */
-
- /**
- * Get a low-level DWARF reader for the symbol reader for testing
- * @param symbolReader
- * @return
- */
- private DwarfDebugInfoProvider getDwarfDebugInfoProvider(IEDCSymbolReader symbolReader) {
-
- if (!(symbolReader instanceof EDCSymbolReader))
- return null;
-
- IDebugInfoProvider debugInfoProvider = ((EDCSymbolReader) symbolReader).getDebugInfoProvider();
- if (!(debugInfoProvider instanceof DwarfDebugInfoProvider))
- return null;
-
- DwarfDebugInfoProvider dip = (DwarfDebugInfoProvider) debugInfoProvider;
-
- // do initial parse (so forward types are detected)
- DwarfInfoReader reader = new DwarfInfoReader(dip);
- dip.setParsedInitially();
- reader.parseInitial();
- dip.setParsedForAddresses();
- reader.parseForAddresses(true);
-
- return dip;
- }
-
-
- /**
- * Test case(s) for specific type parses
- * @throws Exception
- */
- @Test
- public void testSpecificTypes1a() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
- List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
- if (cuList.isEmpty())
- cuList = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
- assertFalse(cuList.isEmpty());
- List<ICompileUnitScope> cuhList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.h");
- assertFalse(cuhList.isEmpty());
-
- // multipleInheritance
- IFunctionScope function = null;
- for (ICompileUnitScope cu : cuList) {
- function = cu.getFunctionAtAddress(new Addr32(0xa940));
- if (function != null)
- break;
- }
- assertNotNull(function);
- assertEquals("multipleInheritance", function.getName());
- for (IVariable var : function.getVariablesInTree()) {
- if (var.getName().equals("pdv1")) {
- IType type = var.getType();
- assertFalse(type instanceof IForwardTypeReference); // should not peek through interface
- assertNotNull(type);
- assertEquals(function, var.getScope());
- _testSpecificTypePointerToDerv1(type);
- }
- }
- }
-
- /**
- * Test case(s) for specific type parses, from a focused parse
- * @throws Exception
- */
- @Test
- public void testSpecificTypes1b() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
- DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- // DW_TAG_pointer_type -> Derv1
- IType type = provider.readType(0x1cb139);
- _testSpecificTypePointerToDerv1(type);
-
- }
- /**
- * @param function
- * @param headerScope
- * @param var
- */
- private void _testSpecificTypePointerToDerv1(IType type) {
- assertTrue(type.getName(), type instanceof IPointerType);
-
- IType derv1 = ((IPointerType) type).getType();
- assertFalse(derv1 instanceof IForwardTypeReference); // should not peek through interface
- assertNotNull(derv1);
- assertTrue(derv1.getName(), derv1 instanceof ICompositeType);
-
- ICompositeType derv1Comp = (ICompositeType) derv1;
- assertEquals("class Derv1", derv1Comp.getName());
- assertEquals(1, derv1Comp.fieldCount());
- assertEquals(2, derv1Comp.inheritanceCount());
- IField vptrField = derv1Comp.findFields("__vptr")[0];
- assertNotNull("__vptr", vptrField);
-
- // inherited fields also visible
- IField xField = derv1Comp.findFields("x")[0];
- assertNotNull("x", xField);
-
- // x is in an inherited type
- IInheritance[] inhs = derv1Comp.getInheritances();
- assertEquals(2, inhs.length);
-
- IType base1 = inhs[0].getType();
- assertNotNull(base1);
- assertEquals("class Base1", base1.getName());
- assertTrue(base1.getName(), base1 instanceof ICompositeType);
-
- ICompositeType base1Comp = (ICompositeType) base1;
- assertEquals(1, base1Comp.fieldCount());
- assertEquals(0, base1Comp.inheritanceCount());
- xField = base1Comp.findFields("x")[0];
- assertNotNull("x", xField);
-
- IType base2 = inhs[1].getType();
- assertNotNull(base2);
- assertEquals("class Base2", base2.getName());
- assertTrue(base2.getName(), base2 instanceof ICompositeType);
-
- ICompositeType base2Comp = (ICompositeType) base2;
- assertEquals(0, base2Comp.fieldCount());
- assertEquals(0, base2Comp.inheritanceCount());
-
- // watch for side effects (late adding of inherited fields)
- assertEquals(1, derv1Comp.fieldCount());
- assertEquals(2, derv1Comp.inheritanceCount());
- assertEquals(1, base1Comp.fieldCount());
- assertEquals(0, base1Comp.inheritanceCount());
- assertEquals(0, base2Comp.fieldCount());
- assertEquals(0, base2Comp.inheritanceCount());
-
-
- // the class is in the header
- IScope classScope = ((IPointerType)type).getType().getScope();
- assertTrue(classScope instanceof ICompileUnitScope);
- IPath path = ((ICompileUnitScope) classScope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.h"));
-
- // the pointer type is declared in a function (either "show3", due to "this", or the one we looked in)
- assertTrue(type.getScope() instanceof IFunctionScope);
- //assertEquals(((IFunctionScope) type.getScope()).getName(), "show3");
- IScope fileScope = type.getScope().getParent();
- assertTrue(fileScope instanceof ICompileUnitScope);
- path = ((ICompileUnitScope) fileScope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
- }
-
-
- /**
- * Test case(s) for specific type parses
- * @throws Exception
- */
- @Test
- public void testSpecificTypes2() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
- List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
- if (cuList.isEmpty())
- cuList = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
- assertFalse(cuList.isEmpty());
- List<ICompileUnitScope> cuhList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.h");
- assertFalse(cuhList.isEmpty());
-
- // Base2::show2
- IFunctionScope function = null;
- for (ICompileUnitScope cu : cuList) {
- function = cu.getFunctionAtAddress(new Addr32(0xa916));
- if (function != null)
- break;
- }
- if (function == null)
- for (ICompileUnitScope cu : cuhList) {
- function = cu.getFunctionAtAddress(new Addr32(0xa916));
- if (function != null)
- break;
- }
-
- assertNotNull(function);
- assertEquals("show2", function.getName());
- for (IVariable var : function.getVariablesInTree()) {
- if (var.getName().equals("Base2Show"))
- _testSpecificTypeCharArray(function, cuhList.get(0), var);
- }
- }
- /**
- * @param function
- * @param headerScope
- * @param var
- */
- private void _testSpecificTypeCharArray(IFunctionScope function, ICompileUnitScope headerScope, IVariable var) {
- IType type = var.getType();
- assertFalse(type instanceof IForwardTypeReference); // should not peek through interface
- assertNotNull(type);
- assertTrue(type.getName(), type instanceof IArrayType);
- assertEquals(function, var.getScope());
-
- IType baseType = ((IArrayType) type).getType();
- assertNotNull(baseType);
- assertTrue(baseType.getName(), baseType instanceof IBasicType);
-
- // FIXME: this should be null for a primitive type, but is the previous function in the old reader
- //assertEquals(randomFunction, baseType.getScope());
-
- IBasicType charType = (IBasicType) baseType;
- assertEquals("char", charType.getName());
- assertEquals(1, charType.getByteSize());
- }
-
- /**
- * Test case(s) for specific type parses, from the whole module scope
- * @throws Exception
- */
- @Test
- public void testSpecificTypes3a() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlagMinGW.exe"));
- List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_expressions.cpp");
-
- // TODO: lookup by name
- for (ICompileUnitScope cu : cuList) {
- for (IVariable var : cu.getVariables()) {
- if (var.getName().equals("genum")) {
- assertEquals(cu, var.getScope());
- _testSpecificTypeEnum(var.getType(), "dbg_typedefs.h");
- break;
- }
- }
- }
-
- ////////
-
- symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
- cuList = getCompileUnitsFor(symbolReader, "dbg_typedefs.h");
-
- // TODO: lookup by name
- for (ICompileUnitScope cu : cuList) {
- for (IVariable var : cu.getVariables()) {
- if (var.getName().equals("genum")) {
- assertEquals(cu, var.getScope());
- _testSpecificTypeEnum(var.getType(), "dbg_typedefs.h");
- break;
- }
- }
- }
- }
-
- /**
- * Test case(s) for specific type parses, from a focused scope
- * @throws Exception
- */
- @Test
- public void testSpecificTypes3b() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlagMinGW.exe"));
- DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- // DW_TAG_enumeration_type : enum_type
- IType type = provider.readType(0x6a65);
- _testSpecificTypeEnum(type, "dbg_expressions.cpp");
-
- ///////
-
- // defined in different place here
- symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
- provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- // DW_TAG_enumeration_type : enum_type
- type = provider.readType(0x1a6a3d);
- _testSpecificTypeEnum(type, "dbg_typedefs.h");
- }
-
- private void _testSpecificTypeEnum(IType type, String file) {
- assertTrue(getTypeName(type), type instanceof IEnumeration);
- IEnumeration enumType = (IEnumeration) type;
- assertEquals("enum_type", enumType.getName());
- assertEquals(5, enumType.enumeratorCount());
-
- assertEquals("zero", enumType.getEnumerators()[0].getName());
- assertEquals("one", enumType.getEnumerators()[1].getName());
- assertEquals("two", enumType.getEnumerators()[2].getName());
- assertEquals("three", enumType.getEnumerators()[3].getName());
- assertEquals("four", enumType.getEnumerators()[4].getName());
-
- IScope scope = type.getScope();
- assertTrue(scope instanceof ICompileUnitScope);
- ICompileUnitScope cus = (ICompileUnitScope) scope;
- assertTrue(cus.getFilePath().toString(), cus.getFilePath().lastSegment().equals(file));
- }
-
- @Test
- public void testStaticLocals1() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (info.blackFlagMainFilePath != null) {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, info.blackFlagMainFilePath.lastSegment());
- assertFalse(cuList.isEmpty());
-
- for (ICompileUnitScope cu : cuList) {
- for (IFunctionScope func : cu.getFunctions()) {
- if (func.getName().equals("doExampleL")) {
- for (IVariable var : func.getVariablesInTree()) {
- if (var.getName().equals("KHelloWorldText")) {
- IScope vScope = var.getScope();
- if (vScope instanceof ILexicalBlockScope)
- vScope = vScope.getParent();
- assertEquals(func, vScope);
-
- _testStaticLocal(var.getType());
- }
- }
- }
- }
- }
- }
- }
- }
-
-
- @Test
- public void testStaticLocals2() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce.sym"));
-
- DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- IType type = provider.readType(0x7e11);
- _testStaticLocal(type);
-
- ///////////
-
- symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
-
- provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- type = provider.readType(0x1dc89a);
- _testStaticLocal(type);
-
- }
-
- /**
- * @param func
- * @param scope
- */
- private void _testStaticLocal(IType type) {
- assertTrue(getTypeName(type), type instanceof ConstType);
- type = type.getType();
- assertTrue(getTypeName(type), type instanceof ICompositeType);
- ICompositeType comp = (ICompositeType) type;
- // differs in RVCT and GCCE
- assertTrue(getTypeName(type), "struct TLitC<14>".equals(comp.getName())
- || "class TLitC".equals(comp.getName()));
-
- assertEquals(2, comp.fieldCount());
- assertEquals(0, comp.inheritanceCount());
-
- IField f = comp.getFields()[0];
- assertEquals("iTypeLength", f.getName());
- assertTrue(getTypeName(f.getType()), f.getType() instanceof ITypedef);
- type = f.getType().getType();
- assertTrue(getTypeName(type), type instanceof IBasicType);
-
- f = comp.getFields()[1];
- assertEquals("iBuf", f.getName());
- assertTrue(getTypeName(f.getType()), f.getType() instanceof IArrayType);
- IArrayType arr = (IArrayType) f.getType();
- assertNotNull(arr.getBounds());
- assertEquals(1, arr.getBoundsCount());
- IArrayBoundType bound = arr.getBound(0);
- assertEquals(0, bound.getDimensionIndex());
- assertEquals(14, bound.getBoundCount());
- assertEquals(1, bound.getElementCount());
- type = arr.getType();
- assertTrue(getTypeName(type), type instanceof ITypedef);
- type = type.getType();
- assertTrue(getTypeName(type), type instanceof ICPPBasicType);
-
- }
-
- /**
- * Discovered while testing GCC-E
- * @throws Exception
- */
- @Test
- public void testSpecificTypes4() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce.sym"));
-
- DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- IType type = provider.readType(0x36104);
- _testSpecificTypeGCCEDerv1(type);
- }
-
- /**
- * @param function
- * @param headerScope
- * @param var
- */
- private void _testSpecificTypeGCCEDerv1(IType type) {
- assertTrue(type.getName(), type instanceof ICompositeType);
-
- ICompositeType derv1Comp = (ICompositeType) type;
- assertEquals("struct Derv1", derv1Comp.getName());
- assertEquals(1, derv1Comp.fieldCount());
- assertEquals(2, derv1Comp.inheritanceCount());
- IField vptrField = derv1Comp.findFields("_vptr$Derv1")[0]; // renamed by parser to avoid having an invalid expression-like field
- assertNotNull("_vptr$Derv1", vptrField);
-
- // inherited fields also visible
- IField xField = derv1Comp.findFields("x")[0];
- assertNotNull("x", xField);
-
- // x is in an inherited type
- IInheritance[] inhs = derv1Comp.getInheritances();
- assertEquals(2, inhs.length);
-
- IType base1 = inhs[0].getType();
- assertNotNull(base1);
- assertEquals("struct Base1", base1.getName());
- assertTrue(base1.getName(), base1 instanceof ICompositeType);
-
- ICompositeType base1Comp = (ICompositeType) base1;
- assertEquals(1, base1Comp.fieldCount());
- assertEquals(0, base1Comp.inheritanceCount());
- xField = base1Comp.findFields("x")[0];
- assertNotNull("x", xField);
-
- IType base2 = inhs[1].getType();
- assertNotNull(base2);
- assertEquals("struct Base2", base2.getName());
- assertTrue(base2.getName(), base2 instanceof ICompositeType);
-
- ICompositeType base2Comp = (ICompositeType) base2;
- assertEquals(0, base2Comp.fieldCount());
- assertEquals(0, base2Comp.inheritanceCount());
-
- // watch for side effects (late adding of inherited fields)
- assertEquals(1, derv1Comp.fieldCount());
- assertEquals(2, derv1Comp.inheritanceCount());
- assertEquals(1, base1Comp.fieldCount());
- assertEquals(0, base1Comp.inheritanceCount());
- assertEquals(0, base2Comp.fieldCount());
- assertEquals(0, base2Comp.inheritanceCount());
-
-
- IScope scope = type.getScope();
- assertTrue(scope instanceof ICompileUnitScope);
- IPath path = ((ICompileUnitScope) scope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
- }
-
- /**
- * Test that we do not have multiple entries for the same symbol with a zero size.
- * @throws Exception
- */
- @Test
- public void testSymbols() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfSymbols == 0) continue;
- IEDCSymbolReader reader = Symbols.getSymbolReader(info.symFile);
- Collection<ISymbol> symbols = reader.getSymbols();
- int numSymbols = symbols.size();
- //System.out.println(info.symFile.lastSegment() + " : " + numSymbols);
- assertEquals(info.symFile.lastSegment(), info.numberOfSymbols, numSymbols);
- Map<IAddress, ISymbol> zeroSymbols = new HashMap<IAddress, ISymbol>();
- for (ISymbol symbol : symbols) {
- if (symbol.getSize() == 0) {
- // you may have more than one zero-sized symbol at the same address
- // in ARM. But they should not be the same mode, e.g. both ARM or
- // both Thumb.
- if (symbol instanceof IARMSymbol) {
- IARMSymbol sameAddress = (IARMSymbol)zeroSymbols.get(symbol.getAddress());
- if (sameAddress != null) {
- assertFalse(((IARMSymbol)symbol).isThumbAddress() == sameAddress.isThumbAddress());
- }
- } else {
- assertFalse(symbol.getName(), zeroSymbols.containsKey(symbol.getAddress()));
- }
- zeroSymbols.put(symbol.getAddress(), symbol);
- }
- }
- }
- }
-
- /**
- * Test some type lookup edge cases
- */
- @Test
- public void testSpecificTypes4a() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
-
- List<ICompileUnitScope> scopes = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
- if (scopes.isEmpty())
- scopes = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
- assertFalse(scopes.isEmpty());
- /*
- if (Symbols.useNewReader())
- // TODO: along with other filepath lookup issues:
- // what happens here is, there are three CUs for dbg_multipleInheritance.cpp,
- // but one has no DW_AT_comp_dir. All of their names are \BlackFlags\SRC\dbg_multipleInheritance.cpp,
- // which (once canonicalized) looks like an absolute path in Linux, thus comes in as
- // three distinct CUs for the same path. In Win32, though, the comp dir is prepended
- // in two cases, since the name is not considered absolute.
- assertEquals(HostOS.IS_WIN32 ? 2 : 3, scopes.size());
- else
- assertEquals(1, scopes.size());
- */
-
- IFunctionScope functionScope = null;
- for (ICompileUnitScope scope : scopes) {
- functionScope = scope.getFunctionAtAddress(new Addr32(0xaa4e));
- if (functionScope != null)
- break;
- }
- assertNotNull(functionScope);
-
- Collection<IVariable> vars = functionScope.getVariablesInTree();
- assertEquals(2, vars.size());
-
- java.util.Iterator<IVariable> vit = vars.iterator();
- assertEquals("FromBase2", vit.next().getName());
- assertEquals("a", vit.next().getName());
-
- vars = functionScope.getParameters();
- assertEquals(1, vars.size());
- vit = vars.iterator();
- IVariable thisVar = vit.next();
- assertEquals("this", thisVar.getName());
-
- assertNotNull(thisVar.getType());
- _testSpecificTypes4(thisVar.getType());
- }
-
- /**
- * Test some type lookup edge cases
- */
- @Test
- public void testSpecificTypes4b() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
-
- DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
- if (provider == null)
- return;
-
- // 0x1cb0c6: subprogram
- // 0x1cb0de: this
- // 0x1cb098: Base2*
-
- IType type = provider.readType(0x1cb098);
- assertNotNull(type);
- _testSpecificTypes4(type);
- }
-
- /**
- * @param type
- */
- private void _testSpecificTypes4(IType type) {
- assertTrue(type.getName(), type instanceof IPointerType);
-
- IType base2 = ((IPointerType) type).getType();
- assertFalse(base2 instanceof IForwardTypeReference); // should not peek through interface
- assertNotNull(base2);
- assertTrue(base2.getName(), base2 instanceof ICompositeType);
-
- ICompositeType base2Comp = (ICompositeType) base2;
- assertEquals("class Base2", base2Comp.getName());
- assertEquals(0, base2Comp.fieldCount());
- assertEquals(0, base2Comp.inheritanceCount());
-
- // the class is in the header
- IScope classScope = ((IPointerType)type).getType().getScope();
- assertTrue(classScope instanceof ICompileUnitScope);
- IPath path = ((ICompileUnitScope) classScope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.h"));
-
- // the pointer type is declared in a function
- assertTrue(type.getScope() instanceof IFunctionScope);
- IScope fileScope = type.getScope().getParent();
- assertTrue(fileScope instanceof ICompileUnitScope);
- path = ((ICompileUnitScope) fileScope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
- }
-
- /**
- * Test some type lookup edge cases
- */
- @Test
- public void testSpecificTypes5a() throws Exception {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
-
- // inlined Der1::Der1()
- IScope scope = symbolReader.getModuleScope().getScopeAtAddress(new Addr32(0x8cda));
- assertTrue(scope instanceof IFunctionScope);
-
- IFunctionScope functionScope = (IFunctionScope) scope;
-
- // two locals __func_local__0 and __result are optimized out
- Collection<IVariable> vars = functionScope.getVariablesInTree();
- assertEquals(0, vars.size());
-
- java.util.Iterator<IVariable> vit;
- /*
- vit = vars.iterator();
- IVariable var = vit.next();
- assertEquals("__func_local__0", var.getName());
- var = vit.next();
- assertEquals("__result", var.getName());
- */
-
- vars = functionScope.getParameters();
- assertEquals(1, vars.size());
- vit = vars.iterator();
- IVariable thisVar = vit.next();
- assertEquals("this", thisVar.getName());
-
- assertNotNull(thisVar.getType());
- _testSpecificTypes5(thisVar.getType());
- }
-
-
- /**
- * @param type
- */
- private void _testSpecificTypes5(IType type) {
- assertTrue(type.getName(), type instanceof IPointerType);
-
- IType der1 = ((IPointerType) type).getType();
- assertFalse(der1 instanceof IForwardTypeReference); // should not peek through interface
- assertNotNull(der1);
- assertTrue(der1.getName(), der1 instanceof ICompositeType);
-
- ICompositeType der1Comp = (ICompositeType) der1;
- assertEquals("struct Der1", der1Comp.getName());
- assertEquals(1, der1Comp.fieldCount());
- assertEquals(1, der1Comp.inheritanceCount());
-
- IField field = der1Comp.findFields("b1")[0];
- assertNotNull("b1", field);
-
- field = der1Comp.findFields("__vptr")[0];
- assertNotNull("__vptr", field);
-
- // inherited fields also visible
- field = der1Comp.findFields("a")[0];
- assertNotNull("a", field);
-
- // x is in an inherited type
- IInheritance[] inhs = der1Comp.getInheritances();
- assertEquals(1, inhs.length);
-
- IType base01 = inhs[0].getType();
- assertNotNull(base01);
- assertEquals("struct Base01", base01.getName());
- assertTrue(base01.getName(), base01 instanceof ICompositeType);
-
- ICompositeType base01Comp = (ICompositeType) base01;
- assertEquals(2, base01Comp.fieldCount());
- assertEquals(0, base01Comp.inheritanceCount());
-
- field = base01Comp.findFields("a")[0];
- assertNotNull("a", field);
-
-
- field = der1Comp.findFields("__vptr")[0];
- assertNotNull("__vptr", field);
-
- // the class is in the header
- IScope classScope = ((IPointerType)type).getType().getScope();
- assertTrue(classScope instanceof ICompileUnitScope);
- IPath path = ((ICompileUnitScope) classScope).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equals("dbg_rtti.cpp"));
-
- // the pointer type is declared in a function
- assertTrue(type.getScope() instanceof ICompileUnitScope);
- path = ((ICompileUnitScope) type.getScope()).getFilePath();
- assertTrue(path.toString(), path.lastSegment().equals("dbg_rtti.cpp"));
- }
-
-
- /**
- * Look for DWARF files with bad scopes and make sure we fix them up properly.
- * Use full scanning to populate the content.
- */
- @Test
- public void testScopes1a() {
- for (TestInfo info : testInfos.values()) {
- System.out.println("Scopes for " + info.symFile.lastSegment());
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- if (symbolReader != null) {
- readFully(symbolReader);
- doTestScopes(symbolReader);
- }
- }
- }
-
- /**
- * @param symbolReader
- */
- private void readFully(IEDCSymbolReader symbolReader) {
- IModuleScope moduleScope = symbolReader.getModuleScope();
- moduleScope.getChildren();
- moduleScope.getVariablesByName(null, false);
- moduleScope.getFunctionsByName(null);
- }
-
- /**
- * Look for DWARF files with bad scopes and make sure we fix them up properly.
- * Use random scanning to populate the content.
- */
- @Test
- public void testScopes1b() {
- for (TestInfo info : testInfos.values()) {
- System.out.println("Scopes for " + info.symFile.lastSegment());
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- if (symbolReader != null) {
- readRandomly(symbolReader);
- doTestScopes(symbolReader);
- }
- }
- }
-
- /**
- * @param symbolReader
- */
- private void readRandomly(IEDCSymbolReader symbolReader) {
- IModuleScope moduleScope = symbolReader.getModuleScope();
- IAddress low = moduleScope.getLowAddress();
- IAddress high = moduleScope.getHighAddress();
-
- long range = high.getValue().subtract(low.getValue()).longValue();
- assertTrue(range > 0);
-
- Random random = new Random(0x120044ff);
-
- for (int cnt = 0; cnt < 1000; cnt++) {
- switch (random.nextInt() % 4) {
- case 0: {
- IAddress addr = low.add(random.nextLong() % range);
- moduleScope.getScopeAtAddress(addr);
- break;
- }
- case 1: {
- ICompileUnitScope scope = getRandomCU(symbolReader, random, true);
- if (scope != null) {
- long curange = scope.getHighAddress().getValue().subtract(scope.getLowAddress().getValue()).longValue();
- IAddress addr = scope.getLowAddress().add(random.nextLong() % curange);
- scope.getFunctionAtAddress(addr);
- }
- break;
- }
- case 2: {
- ICompileUnitScope scope = getRandomCU(symbolReader, random, false);
- if (scope != null) {
- scope.getVariables();
- }
- break;
- }
- case 3: {
- ICompileUnitScope scope = getRandomCU(symbolReader, random, false);
- if (scope != null) {
- scope.getEnumerators();
- }
- break;
- }
- }
- }
- }
-
- /**
- * @param symbolReader
- * @return
- */
- private ICompileUnitScope getRandomCU(IEDCSymbolReader symbolReader, Random random, boolean withCode) {
- String[] srcs = symbolReader.getSourceFiles();
- int tries = 10;
- Collection<ICompileUnitScope> scopes = null;
- while (tries-- > 0) {
- IPath src = PathUtils.createPath(srcs[(random.nextInt() & 0xfffff) % srcs.length]);
- scopes = symbolReader.getModuleScope().getCompileUnitsForFile(src);
- if (!scopes.isEmpty())
- break;
- }
- if (scopes == null)
- return null;
-
- ICompileUnitScope last = null;
- for (ICompileUnitScope scope : scopes) {
- if (withCode) {
- long curange = scope.getHighAddress().getValue().subtract(scope.getLowAddress().getValue()).longValue();
- if (curange > 0) {
- last = scope;
- if (random.nextBoolean()) {
- return scope;
- }
- }
- }
- else if (random.nextInt(5) == 0) {
- return scope;
- }
- }
- return last;
- }
-
- /**
- * @param symbolReader
- */
- private void doTestScopes(IEDCSymbolReader symbolReader) {
- IModuleScope moduleScope = symbolReader.getModuleScope();
- IAddress low = moduleScope.getLowAddress();
- IAddress high = moduleScope.getHighAddress();
- assertTrue(low.compareTo(high) < 0);
-
- checkChildScopes(moduleScope, low, high);
- }
-
- /**
- * @param moduleScope
- * @param low
- * @param high
- */
- private void checkChildScopes(IScope scope, IAddress low,
- IAddress high) {
- for (IScope kid : scope.getChildren()) {
- IAddress kidlo = kid.getLowAddress();
- IAddress kidhi = kid.getHighAddress();
-
- if (!kid.hasEmptyRange()) {
- if (!(kidlo.compareTo(kidhi) <= 0)) {
- fail(describeScope(kid));
- }
- if (!(low.compareTo(kidlo) <= 0)) {
- fail(describeScope(kid));
- }
- if (!(kidhi.compareTo(high) <= 0)) {
- fail(describeScope(kid));
- }
- }
-
- if (!(kid instanceof ILexicalBlockScope) && !(scope instanceof ILexicalBlockScope)) {
- checkChildScopes(kid, kidlo, kidhi);
- } else {
- // lexical blocks are not constrained to be within other lexical blocks,
- // but they should be within the function.
- checkChildScopes(kid, low, high);
-
- }
- }
-
- }
-
- /**
- * @return
- */
- private String describeScope(IScope scope) {
- if (scope == null)
- return "";
- String myscope = scope.getClass().getSimpleName() + "[" + scope.getName() +"]";
- return describeScope(scope.getParent()) + ": " + myscope;
- }
-
- /**
- * Make sure our fixing up of CU scopes makes sense. In old GCC-E (e.g. 3.4.3), the
- * compile units do not have low_pc and high_pc, which makes it hard to find functions.
- */
- @Test
- public void testScopes3() {
- for (TestInfo info : testInfos.values()) {
- String label = info.symFile.lastSegment();
- System.out.println("Address->Function mapping for "+ label);
-
- // explicitly read the functions
- IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(info.symFile);
- if (exeReader == null)
- continue;
-
- DwarfDebugInfoProvider debugInfoProvider = new DwarfDebugInfoProvider(exeReader);
- IEDCSymbolReader explicitSymbolReader = new EDCSymbolReader(
- exeReader,
- debugInfoProvider);
-
- // this is NOT guaranteed: GCC-E at link time will share function definitions among CUs,
- // so two CUs can "overlap" if you consider only their raw Lo and Hi PCs.
- /*
- // make sure the CUs are proper
- ArrayList<IScope> cuList= new ArrayList<IScope>(explicitSymbolReader.getModuleScope().getChildren());
- Collections.sort(cuList);
- long low = 0, high = 0;
-
- for (IScope cu : cuList) {
- String culabel = label + ":" + cu;
- long start = cu.getLowAddress().getValue().longValue();
- long end = cu.getHighAddress().getValue().longValue();
- if (start != end) {
- assertTrue(culabel, start < end);
- assertTrue(culabel, start >= low);
- if (high > 0)
- assertTrue(culabel, end > high);
- high = end;
- }
- }
- */
-
- // remember all the functions
- List<IFunctionScope> allFuncs = new ArrayList<IFunctionScope>(
- explicitSymbolReader.getModuleScope().getFunctionsByName(null));
- assertTrue(allFuncs.size() >= 10);
-
- debugInfoProvider.dispose();
-
- // now, make sure we can find all those functions with a random scan
- debugInfoProvider = new DwarfDebugInfoProvider(exeReader);
- IEDCSymbolReader testSymbolReader = new EDCSymbolReader(
- exeReader,
- debugInfoProvider);
-
- StringBuilder missing = new StringBuilder();
- Random random = new Random(0x12145895);
- int count = allFuncs.size();
- while (count-- > 0) {
- IFunctionScope allFunc = allFuncs.get(random.nextInt(allFuncs.size()));
- doTestScope3Func(label, missing, testSymbolReader, allFunc);
- }
- debugInfoProvider.dispose();
-
-
- if(missing.length() > 0)
- fail(missing.toString());
- }
- }
-
- /**
- * Make sure our fixing up of CU scopes makes sense. In old GCC-E (e.g. 3.4.3), the
- * compile units do not have low_pc and high_pc, which makes it hard to find functions.
- */
- @Test
- public void testScopes3b() {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce_343.sym"));
- IScope scope = symbolReader.getModuleScope().getScopeAtAddress(new Addr32(0xad32));
- assertTrue(scope instanceof IFunctionScope || scope instanceof ILexicalBlockScope);
- }
-
- /**
- * @param label
- * @param missing
- * @param symbolReader
- * @param allFunc
- */
- private void doTestScope3Func(String label, StringBuilder missing,
- IEDCSymbolReader symbolReader, IFunctionScope allFunc) {
- IScope scope1 = symbolReader.getModuleScope().getScopeAtAddress(allFunc.getLowAddress().add(1));
- IScope scope2 = symbolReader.getModuleScope().getScopeAtAddress(allFunc.getHighAddress().add(-1));
-
- if (scope1 == null || scope2 == null) {
- missing.append(label + ":"+ allFunc +" missing\n");
-
- }
- // skip if the function is defined over a range, because this may mean interleaved runtime code
- else if (allFunc.getRangeList() == null){
- // one of both may be inlined
- while (scope1 instanceof ILexicalBlockScope || scope1.getParent() instanceof IFunctionScope)
- scope1 = scope1.getParent();
- while (scope2 instanceof ILexicalBlockScope || scope2.getParent() instanceof IFunctionScope)
- scope2 = scope2.getParent();
- if (scope1 != scope2) {
- missing.append(label + ":"+ allFunc +" did not find same function at low and high: " + scope1 + " / "+ scope2 + "\n");
- }
- }
- }
-
-
- @Test
- public void testPubnames1() {
- for (TestInfo info : testInfos.values()) {
- if (info.numberOfPubFuncNames == 0) continue;
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- DwarfDebugInfoProvider debugInfoProvider = (DwarfDebugInfoProvider) ((EDCSymbolReader) symbolReader).getDebugInfoProvider();
- Map<String, List<PublicNameInfo>> pubs;
- pubs = debugInfoProvider.getPublicFunctions();
-
- boolean discover = false;
- int total = 0;
- for (String pub : pubs.keySet()) {
- total += pubs.get(pub).size();
- }
- if (discover) {
- System.out.println(info.symFile + ": " + pubs.size() + " / "+ total);
- } else {
- assertEquals(info.numberOfPubFuncNames, pubs.size());
- assertEquals(info.numberOfPubFuncEntries, total);
- }
-
- pubs = debugInfoProvider.getPublicVariables();
-
- total = 0;
- for (String pub : pubs.keySet()) {
- total += pubs.get(pub).size();
- }
- if (discover) {
- System.out.println(info.symFile + ": " + pubs.size() + " / "+ total);
- } else {
- assertEquals(info.numberOfPubVarNames, pubs.size());
- assertEquals(info.numberOfPubVarEntries, total);
- }
-
- }
- }
-
- @Test
- public void testPubnames2() {
- for (TestInfo info : testInfos.values()) {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
-
- for (String name : info.pubFuncs) {
- String simpleName = stripName(name);
- Collection<IFunctionScope> funcs = symbolReader.getModuleScope().getFunctionsByName(simpleName);
- assertNotNull(info.symFile.lastSegment() + ":" + name, funcs);
- assertTrue(info.symFile.lastSegment() + ":" + name, !funcs.isEmpty());
- for (IFunctionScope func : funcs) {
- assertEquals(func.getName(), simpleName);
- }
- }
- for (String name : info.pubVars) {
- String simpleName = stripName(name);
- Collection<IVariable> vars = symbolReader.getModuleScope().getVariablesByName(simpleName, false);
- assertNotNull(info.symFile.lastSegment() + ":" + name, vars);
- assertTrue(info.symFile.lastSegment() + ":" + name, !vars.isEmpty());
- for (IVariable var : vars) {
- assertEquals(var.getName(), simpleName);
- }
- }
- }
- }
-
- /**
- * @param name
- * @return
- */
- private String stripName(String name) {
- int idx = name.lastIndexOf(':');
- if (idx > 0)
- return name.substring(idx+1);
- else
- return name;
- }
-
-
- static class ScopeInfo {
- int address;
- String[] names;
- public ScopeInfo(int address, String[] names) {
- super();
- this.address = address;
- this.names = names;
- }
-
- }
-
- protected static void addScopeVars(String sym, String srcFile, String function, String className, int address, String... names) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- ScopeInfo scope = new ScopeInfo(address, names);
- List<ScopeInfo> scopes;
- String key = srcFile + "|" + function + "|" + className;
- scopes = info.scopeInfos.get(key);
- if (scopes == null) {
- scopes = new ArrayList<ScopeInfo>();
- info.scopeInfos.put(key, scopes);
- }
- scopes.add(scope);
- }
- }
- static {
- /*
- * The address information for the unit test is gathered like this:
- *
- * 1) Find a function of interest, usually with DW_TAG_lexical_block entries inside
- * DW_TAG_subroutine.
- *
- * 2) Add a PC for the entry point (DW_AT_low_pc for that subroutine).
- * Usually DW_TAG_formal_parameter entries are live here. Any DW_TAG_variable
- * entries with DW_AT_scope==0 (or unspecified) are also live.
- *
- * 3) Find some interesting points where lexical blocks open and add the variables
- * from there.
- *
- * 4) Referencing the original source code is useful too, to avoid getting confused.
- *
- * 5) Finally, ALSO check the DW_AT_location entries for the variables. If
- * it references a location list (rather than a static expression), then the
- * compiler is indicating that the variable has a narrower scope than otherwise
- * indicated. But, that location list may specify locations *outside* the
- * advertised lexical block scope. So those should not be considered.
- * Note that RVCT may have bogus lexical block ranges, but the location lists
- * are useful. GCC-E, on the other hand, has better lexical block ranges, but
- * never uses location lists.
- */
-
- // RVCT has totally broken scope info; all lexical scopes go backwards, so
- // we clamp them to the end of the function
-
- // entry to function
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3e0);
-
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3e4,
- "stackArray");
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3ee,
- "stackArray" /*, "pstackArray" */);
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3f0,
- "stackArray", "pstackArray");
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3f0+2,
- "stackArray", "pstackArray");
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb3f4,
- "stackArray", "pstackArray", "i", "value");
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "ptrToArray", null, 0xb40a,
- "stackArray", "pstackArray", "pheapArray", "value");
-
- // GCCE has valid scope info
-
- // entry to function
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x10854);
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x1085a,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj");
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x10876,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj", "i");
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x108ac+2,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj");
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x108b8+4,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj", "j");
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x108f2 + 2,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj", "k");
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x10970+2,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj", "m");
- // show all variables at end of function, but not variable of last for loop scope
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x10a2a,
- "stackArray", "pstackArray", "value", "pheapArray", "objArray", "pobj");
- // but not past, in case instruction stepping at end of function
- addScopeVars("BlackFlag_gcce.sym", "dbg_pointers.cpp", "ptrToArray", null, 0x10a2a + 2);
-
-
-
- // entry to function
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "arrayOfPtrs", null, 0xb802);
-
- addScopeVars("BlackFlag_rvct.sym", "dbg_pointers.cpp", "arrayOfPtrs", null, 0xb808,
- "parray", "pClass2", "i" );
-
- // entry to function
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "dlist", 0xa82a,
- "this", "k");
-
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "dlist", 0xa82e,
- "this", "k");
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "dlist", 0xa830,
- "this", "found", "k", "search_node");
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "dlist", 0xa83c,
- "this", "found", "k", "search_node","__result");
-
- // entry to function
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "list", 0xa652,
- "this", "k" );
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "list", 0xa656,
- "this", "k");
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "list", 0xa658,
- "this", "k", "found", "aux");
- addScopeVars("BlackFlag_rvct.sym", "dbg_linked_lists.cpp", "find", "list", 0xa666,
- "this", "k", "__result", "found", "aux");
-
- // good lexical scopes here
-
- // entry to function
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa07a,
- "this", "key");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa080,
- "this", "key", "direction", "previous");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa082,
- "this", "key", "direction", "previous");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa082,
- "this", "key", "direction", "previous");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa092,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa098,
- "this", "key", "__result", "direction", "previous", "theNode" );
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa0f2,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa0f8,
- "this", "key", "direction", "previous", "theNode", "subtree");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa11e,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa138,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa164,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa166,
- "this", "key", "direction", "previous", "theNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa16c,
- "this", "key", "direction", "previous", "theNode", "pcurrentNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa1ea,
- "this", "key", "direction", "previous", "theNode", "next", "pcurrentNode");
- addScopeVars("BlackFlag_rvct.sym", "dbg_binary_tree.cpp", "DeleteFromTree", "binary_tree", 0xa21e,
- "this", "key", "direction", "previous", "theNode");
-
- // enty to function
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x8386,
- "this", "item");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x8394,
- "this", "item");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x8398,
- "this", "item", "newmax");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x83a6,
- "this", "item", "newmax", "copy");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x83a8,
- "this", "item", "newmax", "copy", "i");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x83b0,
- "this", "item", "newmax", "copy", "i");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x83bc,
- "this", "item", "newmax", "copy");
- addScopeVars("SimpleCpp_rvct_22.sym", "Templates.h", "add", "List", 0x83cc);
-
-
- // enty to function
- addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List", 0x835a,
- "this", "item", "__result$$1$$_Znaj");
- addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List", 0x836c,
- "this", "item", "newmax", "__result$$1$$_Znaj");
- addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List", 0x837a,
- "this", "item", "newmax", "copy", "__result$$1$$_Znaj");
- addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List", 0x837c,
- "this", "item", "newmax", "copy", "i", "__result$$1$$_Znaj");
- addScopeVars("SimpleCpp_rvct_40.sym", "Templates.cpp", "add", "List", 0x83a0,
- "this", "item", "__result$$1$$_Znaj");
-
-
- // entry to function
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x80487a6,
- "this", "item");
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x80487c0,
- "this", "item", "newmax", "copy");
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x80487e9,
- "this", "item", "newmax", "copy", "i");
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x804881e + 1,
- "this", "item", "newmax", "copy");
- // show all locals at end of function
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x8048854,
- "this", "item", "newmax", "copy");
- // but not past
- addScopeVars("SimpleCpp_gcc_x86.exe", "Templates.cpp", "add", "List", 0x8048854 + 1,
- "this", "item");
- }
-
-
- /**
- * Test that, for a given PC, we know which locals are in scope.
- */
- @Test
- public void testLocalScopes1() {
- StringBuilder errors = new StringBuilder();
- for (TestInfo info : testInfos.values()) {
- for (String key : info.scopeInfos.keySet()) {
- String[] split = key.split("\\|");
- String file = split[0];
- String func = split[1];
- String className = split[2];
- if (className.equals("null"))
- className = null;
-
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, file);
- boolean found = false;
- for (ICompileUnitScope cu : cuList) {
- for (IFunctionScope scope : cu.getFunctions()) {
- if (scope.getName().equals(func)) {
-
- if (className != null) {
- String theClassName = getClassFor(scope);
- if (!theClassName.matches("(class|struct) " +className + "(<.*>)?"))
- continue;
- }
-
- found = true;
-
- String label = info.symFile.lastSegment() + ":" + file + (className!= null ? ":" + className : "") + ":" + func;
-
- boolean discover = false;
- if (discover) {
- System.out.println(label);
- Collection<IVariable> vars = scope.getVariables();
- for (IVariable var : vars) System.out.println(var.getName());
- vars = scope.getParameters();
- for (IVariable var : vars) System.out.println(var.getName());
- } else {
- doTestLocalScopes1(errors, label, info.scopeInfos.get(key), scope);
- }
- }
- }
- }
- assertTrue(info.symFile.lastSegment() + ":" + key, found);
- }
- }
- if (errors.length() > 0)
- fail(errors.toString());
- }
-
- /**
- * @param scope
- * @return
- */
- private String getClassFor(IFunctionScope scope) {
- for (IVariable arg : scope.getParameters()) {
- if (arg.getName().equals("this")) {
- ICompositeType ct = (ICompositeType) TypeUtils.getBaseType(arg.getType());
- return ct.getName();
- }
- }
- return null;
- }
-
- /**
- * @param errors
- * @param scopes
- * @param scope
- */
- private void doTestLocalScopes1(StringBuilder errors, String label, List<ScopeInfo> scopeInfos, IFunctionScope scope) {
- // TODO: watch out for template functions, which are named the same
- Addr32 startAddr = new Addr32(scopeInfos.get(0).address);
- if (scope.getLowAddress().compareTo(startAddr) > 0
- || scope.getHighAddress().compareTo(startAddr) <= 0) {
- return;
- }
-
- for (ScopeInfo scopeInfo : scopeInfos) {
- try {
- doTestScopeInfo(label, scope, scopeInfo);
- } catch (AssertionError e) {
- errors.append(e.getMessage());
- errors.append('\n');
- }
- }
- }
-
- private void doTestScopeInfo(String label, IFunctionScope scope,
- ScopeInfo scopeInfo) {
- label += ":" + Integer.toHexString(scopeInfo.address);
- Collection<IVariable> vars = scope.getScopedVariables(new Addr32(scopeInfo.address));
- StringBuilder missing = new StringBuilder();
- for (String name : scopeInfo.names) {
- boolean found = false;
- for (IVariable var : vars) {
- if (var.getName().equals(name)) {
- found = true;
- break;
- }
- }
- if (!found)
- missing.append(name + ", ");
- }
- if (missing.length() > 0)
- fail(label + ": missing "+ missing);
-
- StringBuilder extra = new StringBuilder();
- for (IVariable var : vars) {
- boolean found = false;
- for (String name : scopeInfo.names) {
- if (name.equals(var.getName())) {
- found = true;
- break;
- }
- }
- if (!found) {
- extra.append(var.getName());
- extra.append(", ");
- }
- }
- if (extra.length() > 0)
- fail(label +": found extra variables: " + extra);
- }
-
- /**
- * Test that, for a given PC, we know which locals are in scope.
- */
- @Test
- public void testLocalLocations() {
- StringBuilder errors = new StringBuilder();
- for (TestInfo info : testInfos.values()) {
- IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
- for (IScope cuscope : symbolReader.getModuleScope().getChildren()) {
- ICompileUnitScope cu = (ICompileUnitScope) cuscope;
- for (IFunctionScope scope : cu.getFunctions()) {
- String label = info.symFile.lastSegment() + ":" + scope;
-
- for (IVariable var : scope.getVariablesInTree()) {
- checkVariableLocation(errors, label, scope, var);
- }
- }
- }
- }
- if (errors.length() > 0)
- fail(errors.toString());
- }
-
- /**
- * @param errors
- * @param label
- * @param var
- */
- private void checkVariableLocation(StringBuilder errors, String label,
- IScope scope, IVariable var) {
- ILocationProvider locationProvider = var.getLocationProvider();
- if (locationProvider instanceof LocationExpression) {
- LocationExpression expr = (LocationExpression) locationProvider;
- IScope varScope = expr.getScope();
- while (varScope instanceof ILexicalBlockScope ||
- (varScope != null && varScope.getParent() instanceof IFunctionScope))
- varScope = varScope.getParent();
- if (!(varScope instanceof IFunctionScope)) {
- errors.append("Wrong scope for " + var + ": " + varScope + "\n");
- }
- }
-
- }
-
-
- /**
- * Be sure we zero extend when reading short DWARF attributes.
- * One place this is quite important is in array bounds.
- * Other cases in the reader are line tables, scope ranges, etc. which
- * are unsigned. Enum values, though, must remain signed.
- * @throws Exception
- */
- @Test
- public void testAttributePromotion() throws Exception {
- // In here, we have a tmp[256] array, with DW_AT_upper_bound == 255.
- // This validates some lazy code that always cast this stuff to a long
- // without considering the sign extension.
-
- // (BTW, this bug was logged for something else, and is not the bug being tested here)
- IEDCSymbolReader reader = Symbols.getSymbolReader(getFile("bug303066.exe"));
- assertNotNull(reader);
- Collection<IFunctionScope> scopes = reader.getModuleScope().getFunctionsByName("main");
- assertNotNull(scopes);
- assertEquals(1, scopes.size());
- boolean found = false;
- int enumcnt = 0;
- for (IVariable var : scopes.iterator().next().getVariables()) {
- if (var.getName().equals("tmp")) {
- IType type = var.getType();
- assertTrue(type instanceof IArrayType);
- IArrayBoundType bound = ((IArrayType) type).getBound(0);
- assertEquals(256, bound.getBoundCount());
- found = true;
- }
-
- // these attributes *should* be sign extended
- if (var.getName().equals("val")) {
- IType type = TypeUtils.getBaseType(var.getType());
- for (IEnumerator enumr : ((IEnumeration)type).getEnumerators()) {
- if (enumr.getName().equals("Val1")) {
- assertEquals(255, enumr.getValue());
- enumcnt++;
- } else if (enumr.getName().equals("Val2")) {
- assertEquals(65535, enumr.getValue());
- enumcnt++;
- } else if (enumr.getName().equals("Val3")) {
- assertEquals(-255, enumr.getValue());
- enumcnt++;
- } else if (enumr.getName().equals("Val4")) {
- assertEquals(-65535, enumr.getValue());
- enumcnt++;
- }
- }
- }
- }
- assertEquals("Found all Val enums", 4, enumcnt);
- assertTrue("Did not find 'tmp'", found);
-
- found = false;
- for (IVariable var : reader.getModuleScope().getVariablesByName("bigbuffer", false)) {
- IType type = var.getType();
- assertTrue(type instanceof IArrayType);
- IArrayBoundType bound = ((IArrayType) type).getBound(0);
- assertEquals(65536, bound.getBoundCount());
- found = true;
- break;
- }
- assertTrue("Did not find 'bigbuffer'", found);
-
- }
-
- /**
- * RVCT generates location lists with two duplicate address ranges, where
- * the latter is the one to trust. Be sure we filter out the earlier ones.
- * @throws Exception
- */
- @Test
- public void testBrokenLocationLists() throws Exception {
- IPath file = getFile("BlackFlag_rvct.sym");
- IEDCSymbolReader reader = Symbols.getSymbolReader(file);
- // show_Const_Arguments
- IFunctionScope func = (IFunctionScope) reader.getModuleScope().getScopeAtAddress(new Addr32(0x9648));
- Collection<IVariable> variables = func.getParameters();
- boolean found = false;
- for (IVariable var : variables) {
- if (var.getName().equals("aArg1")) {
- found = true;
- LocationEntry[] entries = ((LocationList)var.getLocationProvider()).getLocationEntries();
- assertEquals(2, entries.length);
- assertEquals(0x9648, entries[0].getLowPC());
- assertEquals(1, entries[0].getBytes().length);
- assertEquals((byte)0x50, entries[0].getBytes()[0]);
- break;
- }
- }
- assertTrue(found);
- }
-}
+/*************************************************************************
+ * Copyright (c) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ * Broadcom - use newly created top-level ForwardReference type
+ *
+ * Description:
+ *
+ *************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+
+import java.math.BigInteger;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.arm.IARMSymbol;
+import org.eclipse.cdt.debug.edc.debugger.tests.SimpleDebuggerTest;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.PathUtils;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCSymbolReader;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ConstType;
+import org.eclipse.cdt.debug.edc.internal.symbols.FieldType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IEnumeration;
+import org.eclipse.cdt.debug.edc.internal.symbols.IField;
+import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
+import org.eclipse.cdt.debug.edc.internal.symbols.IInheritance;
+import org.eclipse.cdt.debug.edc.internal.symbols.ILexicalBlockScope;
+import org.eclipse.cdt.debug.edc.internal.symbols.IMayBeQualifedType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IQualifierType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ITemplateParam;
+import org.eclipse.cdt.debug.edc.internal.symbols.ITypedef;
+import org.eclipse.cdt.debug.edc.internal.symbols.InheritanceType;
+import org.eclipse.cdt.debug.edc.internal.symbols.SubroutineType;
+import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfCompileUnit;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AttributeList;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.PublicNameInfo;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.DefCFAExpressionInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.DefCFAInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.ExpressionInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.FrameDescriptionEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.InstructionState;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.NopInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.RegisterInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.RememberStateInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.RestoreInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.RestoreStateInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.SameValueInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.UndefinedInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.ValueExpressionInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.ValueOffsetInstruction;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfInfoReader;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfMessages;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfVariable;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.ForwardTypeReference;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationExpression;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.LocationList;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.RangeList;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.ExecutableSymbolicsReaderFactory;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.FileStatistics;
+import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
+import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.cdt.utils.Addr64;
+import org.eclipse.core.runtime.IPath;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class TestDwarfReader extends AbstractDwarfReaderTest {
+
+ private static class DwarfFrameRegisterAlbum extends SimpleDebuggerTest {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.debugger.tests.SimpleDebuggerTest#getRequiredLaunchConfigurationType()
+ */
+ @Override
+ protected String getRequiredLaunchConfigurationType() {
+ return "com.nokia.cdt.debug.launch.systemTRKLaunch";
+ }
+ @Override
+ public String getAlbumName() {
+ return "RegisterFrameTestsBlackFlagRVCT.dsa";
+ }
+
+ public EDCLaunch getLaunch() {
+ return launch;
+ }
+
+ public DsfSession getSession() {
+ return session;
+ }
+
+ static DwarfFrameRegisterAlbum openAlbum() {
+ return new DwarfFrameRegisterAlbum();
+ }
+ }
+
+ private DwarfFrameRegisterAlbum dwarfAlbum;
+
+ @Test
+ public void testSymFromExeDetect() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (info.exeFile == null) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.exeFile);
+ assertNotNull(symbolReader);
+ System.out.println("Sym for exe " + info.exeFile + " is " + symbolReader.getSymbolFile());
+ assertEquals(info.symFile, symbolReader.getSymbolFile());
+ assertNotNull(symbolReader.getExecutableSections());
+ IExecutableSection dsect = symbolReader.findExecutableSection(DwarfInfoReader.DWARF_DEBUG_INFO);
+ assertNotNull(dsect);
+ assertEquals(".debug_info", dsect.getName());
+ System.out.println(" Dwarf section: " + dsect.toString());
+ dsect.dispose();
+ }
+ }
+
+ /**
+ * This should be a quick check, not a slow one
+ * @throws Exception
+ */
+ @Test
+ public void testSymDetect() throws Exception {
+ long time = System.currentTimeMillis();
+ _testSymDetect();
+ long span = System.currentTimeMillis() - time;
+ System.out.println(span + " ms (testSymDetect)");
+ }
+
+ private void _testSymDetect() {
+ for (TestInfo info : testInfos.values()) {
+ System.out.println("Checking sym for " + info.symFile);
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ assertNotNull(info.symFile.lastSegment(), symbolReader);
+ assertTrue(info.symFile.lastSegment(), symbolReader.hasRecognizedDebugInformation());
+ }
+ }
+
+ @Test
+ public void testSourceFiles() throws Exception {
+ long time = System.currentTimeMillis();
+ _testSourceFiles();
+ long span = System.currentTimeMillis() - time;
+ System.out.println(span + " ms (testSourceFiles)");
+ }
+
+ private void _testSourceFiles() {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfSources == 0) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ String[] sources= symbolReader.getSourceFiles();
+ assertNotNull(sources);
+ //System.out.println(info.symFile.lastSegment() + " : " + sources.length);
+ assertEquals(info.symFile.lastSegment(), info.numberOfSources, sources.length);
+ }
+ }
+
+ @Test
+ public void testCompileUnits() throws Exception {
+ long time = System.currentTimeMillis();
+ _testCompileUnits();
+ long span = System.currentTimeMillis() - time;
+ System.out.println(span + " ms (testCompileUnits)");
+
+ // This is for information.
+ new FileStatistics(); // nothing but for code coverage.
+ FileStatistics.dump();
+ }
+
+ private void _testCompileUnits() {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfModuleScopeChildren == 0) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ Collection<IScope> scopes= symbolReader.getModuleScope().getChildren();
+ assertNotNull(scopes);
+ //System.out.println(info.symFile.lastSegment() + ": " + scopes.size());
+ //for (IScope kid : scopes)
+ // System.out.println("\t" + kid.getName());
+ assertEquals(info.symFile.lastSegment(), info.numberOfModuleScopeChildren, scopes.size());
+ }
+ }
+
+ @Test
+ public void testGlobalVariables() throws Exception {
+ long time = System.currentTimeMillis();
+ _testGlobalVariables();
+ long span = System.currentTimeMillis() - time;
+ System.out.println(span + " ms (testGlobalVariables)");
+ }
+
+ private void _testGlobalVariables() {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfVariables == 0) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ Collection<IVariable> variables = symbolReader.getModuleScope().getVariables();
+ assertNotNull(variables);
+ //System.out.println(info.symFile.lastSegment() + ": " + variables.size());
+ assertEquals(info.symFile.lastSegment(), info.numberOfVariables, variables.size());
+ }
+ }
+
+ /**
+ * Test that we can find and get types for globals in compilation units
+ * @throws Exception
+ */
+ @Test
+ public void testPerCUGlobals() throws Exception {
+ long time = System.currentTimeMillis();
+ _testPerCUGlobals();
+ long span = System.currentTimeMillis() - time;
+ System.out.println(span + " ms (testPerCUGlobals)");
+ }
+
+ private void _testPerCUGlobals() {
+ // check all globals
+ for (TestInfo info : testInfos.values()) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ boolean discover = false;
+
+ if (discover) {
+ // DISCOVERY (rerun if reader gets better and paste into static block at top)
+ //System.out.println(info.symFile);
+ boolean any = false;
+ for (String srcFile : symbolReader.getSourceFiles()) {
+ List<ICompileUnitScope> cusList = symbolReader.getModuleScope().getCompileUnitsForFile(PathUtils.createPath(srcFile));
+ any = true;
+ for (ICompileUnitScope cus : cusList) {
+ Collection<IVariable> vars = cus.getVariables();
+ if (!vars.isEmpty()) {
+ //System.out.println(srcFile +" : # vars = " + vars.size());
+ for (IVariable var : vars) {
+ //System.out.println(var.getName() + " : " + getTypeName(var.getType()));
+ System.out.println(MessageFormat.format(
+ "setCUVariableInfo(\"{0}\", \"{1}\", \"{2}\", \"{3}\");",
+ info.symFile.lastSegment(),
+ srcFile,
+ var.getName(),
+ getTypeName(var.getType())));
+ }
+ }
+ }
+ }
+ assertTrue("Any CUs in " + info.symFile, any);
+ } else {
+ if (info.cuVarMap == null)
+ continue;
+
+ for (Map.Entry<String, Map<String, VariableInfo>> entry : info.cuVarMap.entrySet()) {
+ String cu = entry.getKey();
+ List<ICompileUnitScope> cusList = symbolReader.getModuleScope().getCompileUnitsForFile(PathUtils.createPath(cu));
+ assertNotNull(info.symFile + " : " + cu, cusList);
+ for (Map.Entry<String, VariableInfo> varEntry : entry.getValue().entrySet()) {
+ // TODO: getter by name
+ boolean found = false;
+ for (ICompileUnitScope cus : cusList) {
+ for (IVariable var : cus.getVariables()) {
+ if (var.getName().equals(varEntry.getKey())) {
+ found = true;
+ VariableInfo varInfo = varEntry.getValue();
+ assertNotNull(var.getType());
+ String theTypeName = getTypeName(var.getType());
+ System.out.println(info.symFile + " : " + cu + " : " + var.getName() + " = " + theTypeName);
+ assertEquals(info.symFile + " : " + cu + " : " + var.getName(),
+ varInfo.typeName, theTypeName);
+ }
+ }
+ }
+ assertTrue(info.symFile + " : " + cu + " : " + entry.getKey(), found);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Test that we can find and resolve all types. The lazy type evaluator only
+ * is lazy as far as dereferenced types go, so we don't check anything but names
+ * and type trees here.
+ *
+ * This test isn't exhaustive; it just ferrets out assertion errors and null pointer references.
+ * @throws Exception
+ */
+ @Test
+ public void testTypes() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfTypes == 0) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ boolean discover = false;
+
+ if (discover) {
+ // DISCOVERY
+ //System.out.println(info.symFile);
+ int cnt = symbolReader.getModuleScope().getTypes().size();
+ //for (IType type : symbolReader.getModuleScope().getTypes()) {
+ // System.out.println(getTypeName(type));
+ //}
+ System.out.println(info.symFile + " : " + cnt);
+ }
+ else {
+ Collection<IType> types = symbolReader.getModuleScope().getTypes();
+ assertNotNull(types);
+ System.out.println("Initial: " + types.size());
+
+ // this should trigger expansion of subtypes
+ int idx = 1;
+ for (IType type : types) {
+ doTestType(idx, type);
+ idx++;
+ }
+
+ types = symbolReader.getModuleScope().getTypes();
+ System.out.println("After: " + types.size());
+ assertEquals(info.symFile.lastSegment(), info.numberOfTypes, types.size());
+
+ // now, ensure the types are still there in a new reader
+ symbolReader = Symbols.getSymbolReader(info.symFile);
+ assertEquals(info.symFile.lastSegment(), info.numberOfTypes, symbolReader.getModuleScope().getTypes().size());
+ }
+ }
+ }
+
+ /**
+ * @param idx
+ * @param type
+ */
+ private void doTestType(int idx, IType type) {
+ String name = getTypeName(type);
+ if (type.getByteSize() == 0) {
+ IType checkType = type;
+ while (checkType != null) {
+ if (checkType instanceof IQualifierType || checkType instanceof TypedefType)
+ checkType = checkType.getType();
+ else
+ break;
+ }
+ if (checkType == null)
+ return;
+ if (checkType instanceof ICompositeType) {
+ return; // this is allowed, even though the spec says it should be here.
+ // we can't fix it up, because even if we sum up the field sizes, we can't predict the extra space used by alignment
+ }
+ if (checkType instanceof SubroutineType || checkType instanceof InheritanceType)
+ return; // this is allowed
+
+ if (checkType instanceof FieldType) {
+ doTestType(idx, ((FieldType) checkType).getType());
+ return;
+ }
+ if (checkType instanceof ArrayType) {
+ for (IArrayBoundType bound : ((ArrayType) checkType).getBounds()) {
+ if (bound.getElementCount() == 0)
+ return;
+ }
+ // else, should have more
+ }
+
+ if (checkType == ForwardTypeReference.NULL_TYPE_ENTRY)
+ return; // should not get here, but something else tests this
+ if (checkType instanceof ICPPBasicType && ((ICPPBasicType) checkType).getBaseType() == ICPPBasicType.t_void)
+ return; // yup
+ if (checkType instanceof ITemplateParam) {
+ if (checkType.getType().getName().equals("class TModelEntry")) {
+ assertNull(((ITemplateParam)checkType).getProperties());
+ assertNull(((ITemplateParam)checkType).getScope());
+ assertTrue(((ITemplateParam)checkType).getType() instanceof ICompositeType);
+
+ // following is not quite meaningful but to beef up method coverage.
+ checkType.setType(null);
+ checkType.dispose();
+ }
+ return; // no inherent size
+ }
+ if (checkType instanceof IArrayBoundType)
+ return; // no inherent size
+ fail(name + " has zero size");
+ }
+ if (idx % 1000 == 0) System.out.print(".");
+ }
+
+ /**
+ * This method is useful for dumping the types actually parsed and comparing them with each other.
+ */
+ /*
+ public void testTypesXX() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (!info.symFile.lastSegment().contains("gcce"))
+ continue;
+
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ Collection<IType> types = symbolReader.getModuleScope().getTypes();
+ assertNotNull(types);
+
+ // force expansion
+ for (IType type : types) {
+ //String name =
+ getTypeName(type);
+ }
+
+ // start again
+ types = symbolReader.getModuleScope().getTypes();
+ List<String> names = new ArrayList<String>();
+ for (IType type : types) {
+ names.add(getTypeName(type));
+ }
+ //Collections.sort(names);
+ String fname = "true".equals(System.getProperty(Symbols.DWARF_USE_NEW_READER)) ? "new.txt" : "old.txt";
+ PrintStream dump = new PrintStream(new File("/tmp/" + fname));
+ for (String name : names) {
+ dump.println(name);
+ }
+ dump.close();
+ }
+ }
+ */
+
+ /**
+ * Test case(s) for specific type parses
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes1a() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+ List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
+ if (cuList.isEmpty())
+ cuList = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
+ assertFalse(cuList.isEmpty());
+ List<ICompileUnitScope> cuhList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.h");
+ assertFalse(cuhList.isEmpty());
+
+ // multipleInheritance
+ IFunctionScope function = null;
+ for (ICompileUnitScope cu : cuList) {
+ function = cu.getFunctionAtAddress(new Addr32(0xa940));
+ if (function != null)
+ break;
+ }
+ assertNotNull(function);
+ assertEquals("multipleInheritance", function.getName());
+ for (IVariable var : function.getVariablesInTree()) {
+ if (var.getName().equals("pdv1")) {
+ // check forward reference behavior
+ if ( var instanceof DwarfVariable
+ && (((DwarfVariable)var).getRawType() instanceof IForwardTypeReference)) {
+ IForwardTypeReference forward = (IForwardTypeReference)(((DwarfVariable)var).getRawType());
+ assertEquals("", forward.getName());
+ assertEquals(4, forward.getByteSize());
+ assertNull(forward.getProperties());
+ assertNotNull(forward.getScope());
+ IType resolvedType = forward.getType();
+ assertEquals("class Derv1", resolvedType.getName());
+ forward.setType(resolvedType);
+ assertEquals("class Derv1", forward.getType().getName());
+ }
+
+ IType type = var.getType();
+ assertFalse(type instanceof IForwardTypeReference); // should not peek through interface
+ assertNotNull(type);
+ assertEquals(function, var.getScope());
+ _testSpecificTypePointerToDerv1(type);
+ }
+ }
+
+ // okay place to check accessibility of base link address & provider string
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ // ensure placeholder null type has correct fields
+ IType nullEntryType = ForwardTypeReference.NULL_TYPE_ENTRY;
+ assertEquals(0, nullEntryType.getByteSize());
+ assertEquals(DwarfMessages.DwarfDebugInfoProvider_UnhandledType, nullEntryType.getName());
+ assertEquals(0, nullEntryType.getProperties().size());
+ assertNull(nullEntryType.getScope());
+ assertNull(nullEntryType.getType());
+ boolean throwException = false;
+ try {
+ nullEntryType.setType(null);
+ } catch (IllegalStateException ise) {
+ throwException = true;
+ }
+ assertTrue(throwException);
+ nullEntryType.dispose(); // should do nothing
+ assertEquals(0, nullEntryType.getProperties().size()); // still alive
+
+ assertEquals(provider.getBaseLinkAddress().toString(), "32768");
+ IModuleScope moduleScope = provider.getModuleScope();
+ assertNotNull(moduleScope);
+ assertTrue(moduleScope.getEnumerators().size() == 0);
+ assertTrue(moduleScope.getSymbolFile().toPortableString().contains("BlackFlag_rvct.sym"));
+
+ ICompileUnitScope cuScope = provider.getCompileUnitForAddress(new Addr64("32768"));
+ assertNotNull(cuScope);
+ assertTrue(cuScope instanceof DwarfCompileUnit);
+ DwarfCompileUnit cu = (DwarfCompileUnit)cuScope;
+ cu.setParsedForVariables(false);
+ assertFalse(cu.isParsedForVariables());
+ cu.setParsedForVariables(true);
+ assertTrue(cu.isParsedForVariables());
+ AttributeList attrList = cu.getAttributeList();
+ cu.setAttributes(null);
+ assertNull(cu.getAttributeList());
+ cu.setAttributes(attrList);
+ assertNotNull(cu.getAttributeList());
+ assertNotNull(cu.toString());
+ assertNotNull(provider.toString());
+ }
+
+ /**
+ * Test case(s) for specific type parses, from a focused parse
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes1b() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ // DW_TAG_pointer_type -> Derv1
+ IType type = provider.readType(0x1cb139);
+ _testSpecificTypePointerToDerv1(type);
+
+ }
+
+ /**
+ * @param type
+ */
+ private void _testSpecificTypePointerToDerv1(IType type) {
+ assertTrue(type.getName(), type instanceof IPointerType);
+
+ IType derv1 = ((IPointerType) type).getType();
+ assertFalse(derv1 instanceof IForwardTypeReference); // should not peek through interface
+ assertNotNull(derv1);
+ assertTrue(derv1.getName(), derv1 instanceof ICompositeType);
+
+ ICompositeType derv1Comp = (ICompositeType) derv1;
+ assertEquals("class Derv1", derv1Comp.getName());
+ assertEquals(1, derv1Comp.fieldCount());
+ assertEquals(2, derv1Comp.inheritanceCount());
+ IField vptrField = derv1Comp.findFields("__vptr")[0];
+ assertNotNull("__vptr", vptrField);
+ assertEquals(0, derv1Comp.getTemplateParams().length);
+ assertEquals(ICompositeType.k_class, derv1Comp.getKey());
+
+ // inherited fields also visible
+ IField xField = derv1Comp.findFields("x")[0];
+ assertNotNull("x", xField);
+
+ // x is in an inherited type
+ IInheritance[] inhs = derv1Comp.getInheritances();
+ assertEquals(2, inhs.length);
+
+ IType base1 = inhs[1].getType();
+ assertNotNull(base1);
+ assertEquals("class Base1", base1.getName());
+ assertTrue(base1.getName(), base1 instanceof ICompositeType);
+
+ ICompositeType base1Comp = (ICompositeType) base1;
+ assertEquals(1, base1Comp.fieldCount());
+ assertEquals(0, base1Comp.inheritanceCount());
+ xField = base1Comp.findFields("x")[0];
+ assertNotNull("x", xField);
+
+ IType base2 = inhs[0].getType();
+ assertNotNull(base2);
+ assertEquals("class Base2", base2.getName());
+ assertTrue(base2.getName(), base2 instanceof ICompositeType);
+
+ ICompositeType base2Comp = (ICompositeType) base2;
+ assertEquals(0, base2Comp.fieldCount());
+ assertEquals(0, base2Comp.inheritanceCount());
+
+ // watch for side effects (late adding of inherited fields)
+ assertEquals(1, derv1Comp.fieldCount());
+ assertEquals(2, derv1Comp.inheritanceCount());
+ assertEquals(1, base1Comp.fieldCount());
+ assertEquals(0, base1Comp.inheritanceCount());
+ assertEquals(0, base2Comp.fieldCount());
+ assertEquals(0, base2Comp.inheritanceCount());
+
+
+ // the class is in the header
+ IScope classScope = ((IPointerType)type).getType().getScope();
+ assertTrue(classScope instanceof ICompileUnitScope);
+ IPath path = ((ICompileUnitScope) classScope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.h"));
+
+ // the pointer type is declared in a function (either "show3", due to "this", or the one we looked in)
+ assertTrue(type.getScope() instanceof IFunctionScope);
+ //assertEquals(((IFunctionScope) type.getScope()).getName(), "show3");
+ IScope fileScope = type.getScope().getParent();
+ assertTrue(fileScope instanceof ICompileUnitScope);
+ path = ((ICompileUnitScope) fileScope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
+ }
+
+ /**
+ * Test case(s) for specific type parses
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes2() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+ List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
+ if (cuList.isEmpty())
+ cuList = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
+ assertFalse(cuList.isEmpty());
+ List<ICompileUnitScope> cuhList = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.h");
+ assertFalse(cuhList.isEmpty());
+
+ // Base2::show2
+ IFunctionScope function = null;
+ for (ICompileUnitScope cu : cuList) {
+ function = cu.getFunctionAtAddress(new Addr32(0xa916));
+ if (function != null)
+ break;
+ }
+ if (function == null)
+ for (ICompileUnitScope cu : cuhList) {
+ function = cu.getFunctionAtAddress(new Addr32(0xa916));
+ if (function != null)
+ break;
+ }
+
+ assertNotNull(function);
+ assertEquals("show2", function.getName());
+ for (IVariable var : function.getVariablesInTree()) {
+ if (var.getName().equals("Base2Show"))
+ _testSpecificTypeCharArray(function, cuhList.get(0), var);
+ }
+ }
+
+ /**
+ * @param function
+ * @param headerScope
+ * @param var
+ */
+ private void _testSpecificTypeCharArray(IFunctionScope function, ICompileUnitScope headerScope, IVariable var) {
+ IType type = var.getType();
+ assertFalse(type instanceof IForwardTypeReference); // should not peek through interface
+ assertNotNull(type);
+ assertTrue(type.getName(), type instanceof IArrayType);
+ assertEquals(function, var.getScope());
+
+ IType baseType = ((IArrayType) type).getType();
+ assertNotNull(baseType);
+ assertTrue(baseType.getName(), baseType instanceof IBasicType);
+
+ // FIXME: this should be null for a primitive type, but is the previous function in the old reader
+ //assertEquals(randomFunction, baseType.getScope());
+
+ IBasicType charType = (IBasicType) baseType;
+ assertEquals("char", charType.getName());
+ assertEquals(1, charType.getByteSize());
+ }
+
+ /**
+ * Test case(s) for specific type parses, from the whole module scope
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes3a() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlagMinGW.exe"));
+ List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, "dbg_expressions.cpp");
+
+ // TODO: lookup by name
+ for (ICompileUnitScope cu : cuList) {
+ for (IVariable var : cu.getVariables()) {
+ if (var.getName().equals("genum")) {
+ assertEquals(cu, var.getScope());
+ _testSpecificTypeEnum(var.getType(), "dbg_typedefs.h");
+ break;
+ }
+ }
+ }
+
+ ////////
+
+ symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+ cuList = getCompileUnitsFor(symbolReader, "dbg_typedefs.h");
+
+ // TODO: lookup by name
+ for (ICompileUnitScope cu : cuList) {
+ for (IVariable var : cu.getVariables()) {
+ if (var.getName().equals("genum")) {
+ assertEquals(cu, var.getScope());
+ _testSpecificTypeEnum(var.getType(), "dbg_typedefs.h");
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Test case(s) for specific type parses, from a focused scope
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes3b() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlagMinGW.exe"));
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ // DW_TAG_enumeration_type : enum_type
+ IType type = provider.readType(0x6a65);
+ _testSpecificTypeEnum(type, "dbg_expressions.cpp");
+
+ ///////
+
+ // defined in different place here
+ symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+ provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ // DW_TAG_enumeration_type : enum_type
+ type = provider.readType(0x1a6a3d);
+ _testSpecificTypeEnum(type, "dbg_typedefs.h");
+ }
+
+ private void _testSpecificTypeEnum(IType type, String file) {
+ assertTrue(getTypeName(type), type instanceof IEnumeration);
+ IEnumeration enumType = (IEnumeration) type;
+ assertEquals("enum_type", enumType.getName());
+ assertEquals(5, enumType.enumeratorCount());
+
+ assertEquals("zero", enumType.getEnumerators()[0].getName());
+ assertEquals("one", enumType.getEnumerators()[1].getName());
+ assertEquals("two", enumType.getEnumerators()[2].getName());
+ assertEquals("three", enumType.getEnumerators()[3].getName());
+ assertEquals("four", enumType.getEnumerators()[4].getName());
+
+ IScope scope = type.getScope();
+ assertTrue(scope instanceof ICompileUnitScope);
+ ICompileUnitScope cus = (ICompileUnitScope) scope;
+ assertTrue(cus.getFilePath().toString(), cus.getFilePath().lastSegment().equals(file));
+ }
+
+ @Test
+ public void testStaticLocals1() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (info.blackFlagMainFilePath != null) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, info.blackFlagMainFilePath.lastSegment());
+ assertFalse(cuList.isEmpty());
+
+ for (ICompileUnitScope cu : cuList) {
+ for (IFunctionScope func : cu.getFunctions()) {
+ if (func.getName().equals("doExampleL")) {
+ for (IVariable var : func.getVariablesInTree()) {
+ if (var.getName().equals("KHelloWorldText")) {
+ IScope vScope = var.getScope();
+ if (vScope instanceof ILexicalBlockScope)
+ vScope = vScope.getParent();
+ assertEquals(func, vScope);
+
+ _testStaticLocal(var.getType());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testStaticLocals2() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce.sym"));
+
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ IType type = provider.readType(0x7e11);
+ _testStaticLocal(type);
+
+ ///////////
+
+ symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+
+ provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ type = provider.readType(0x1dc89a);
+ _testStaticLocal(type);
+
+ }
+
+ /**
+ * @param type
+ */
+ private void _testStaticLocal(IType type) {
+ assertTrue(getTypeName(type), type instanceof ConstType);
+ type = type.getType();
+ assertTrue(getTypeName(type), type instanceof ICompositeType);
+ ICompositeType comp = (ICompositeType) type;
+ // differs in RVCT and GCCE
+ assertTrue(getTypeName(type), "struct TLitC<14>".equals(comp.getName())
+ || "class TLitC".equals(comp.getName()));
+
+ assertEquals(2, comp.fieldCount());
+ assertEquals(0, comp.inheritanceCount());
+
+ IField f = comp.getFields()[0];
+ assertEquals("iTypeLength", f.getName());
+ assertTrue(getTypeName(f.getType()), f.getType() instanceof ITypedef);
+ type = f.getType().getType();
+ assertTrue(getTypeName(type), type instanceof IBasicType);
+
+ f = comp.getFields()[1];
+ assertEquals("iBuf", f.getName());
+ assertTrue(getTypeName(f.getType()), f.getType() instanceof IArrayType);
+ IArrayType arr = (IArrayType) f.getType();
+ assertNotNull(arr.getBounds());
+ assertEquals(1, arr.getBoundsCount());
+ IArrayBoundType bound = arr.getBound(0);
+ assertEquals(0, bound.getDimensionIndex());
+ assertEquals(14, bound.getBoundCount());
+ assertEquals(1, bound.getElementCount());
+ type = arr.getType();
+ assertTrue(getTypeName(type), type instanceof ITypedef);
+
+ type = type.getType();
+ assertTrue(getTypeName(type), type instanceof ICPPBasicType);
+ assertEquals(8, ((ICPPBasicType)type).getQualifierBits());
+ assertTrue(((ICPPBasicType)type).isUnsigned());
+ assertTrue(type instanceof IMayBeQualifedType);
+ assertFalse(((IMayBeQualifedType)type).isConst());
+ assertFalse(((IMayBeQualifedType)type).isVolatile());
+ }
+
+ /**
+ * Discovered while testing GCC-E
+ * @throws Exception
+ */
+ @Test
+ public void testSpecificTypes4() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce.sym"));
+
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ IType type = provider.readType(0x36104);
+ _testSpecificTypeGCCEDerv1(type);
+ }
+
+ /**
+ * @param type
+ */
+ private void _testSpecificTypeGCCEDerv1(IType type) {
+ assertTrue(type.getName(), type instanceof ICompositeType);
+
+ ICompositeType derv1Comp = (ICompositeType) type;
+ assertEquals("struct Derv1", derv1Comp.getName());
+ assertEquals(1, derv1Comp.fieldCount());
+ assertEquals(2, derv1Comp.inheritanceCount());
+ IField vptrField = derv1Comp.findFields("_vptr$Derv1")[0]; // renamed by parser to avoid having an invalid expression-like field
+ assertNotNull("_vptr$Derv1", vptrField);
+
+ // inherited fields also visible
+ IField xField = derv1Comp.findFields("x")[0];
+ assertNotNull("x", xField);
+
+ // x is in an inherited type
+ IInheritance[] inhs = derv1Comp.getInheritances();
+ assertEquals(2, inhs.length);
+
+ IType base1 = inhs[1].getType();
+ assertNotNull(base1);
+ assertEquals("struct Base1", base1.getName());
+ assertTrue(base1.getName(), base1 instanceof ICompositeType);
+
+ ICompositeType base1Comp = (ICompositeType) base1;
+ assertEquals(1, base1Comp.fieldCount());
+ assertEquals(0, base1Comp.inheritanceCount());
+ xField = base1Comp.findFields("x")[0];
+ assertNotNull("x", xField);
+
+ IType base2 = inhs[0].getType();
+ assertNotNull(base2);
+ assertEquals("struct Base2", base2.getName());
+ assertTrue(base2.getName(), base2 instanceof ICompositeType);
+
+ ICompositeType base2Comp = (ICompositeType) base2;
+ assertEquals(0, base2Comp.fieldCount());
+ assertEquals(0, base2Comp.inheritanceCount());
+
+ // watch for side effects (late adding of inherited fields)
+ assertEquals(1, derv1Comp.fieldCount());
+ assertEquals(2, derv1Comp.inheritanceCount());
+ assertEquals(1, base1Comp.fieldCount());
+ assertEquals(0, base1Comp.inheritanceCount());
+ assertEquals(0, base2Comp.fieldCount());
+ assertEquals(0, base2Comp.inheritanceCount());
+
+
+ IScope scope = type.getScope();
+ assertTrue(scope instanceof ICompileUnitScope);
+ IPath path = ((ICompileUnitScope) scope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
+ }
+
+ private boolean isExecutable(ISymbol symbol) {
+ Boolean executable = (Boolean)symbol.getProperties().get(ISymbol.PROPERTY_EXECUTABLE);
+ // for testing purposes, if the property doesn't exist, assume true
+ return executable == null || executable;
+ }
+
+ /**
+ * Test that we do not have multiple entries for the same symbol with a zero size.
+ * @throws Exception
+ */
+ @Test
+ public void testSymbols() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfSymbols == 0) continue;
+ IEDCSymbolReader reader = Symbols.getSymbolReader(info.symFile);
+ Collection<ISymbol> symbols = reader.getSymbols();
+ int numSymbols = symbols.size();
+ //System.out.println(info.symFile.lastSegment() + " : " + numSymbols);
+ assertEquals(info.symFile.lastSegment(), info.numberOfSymbols, numSymbols);
+ Map<IAddress, List<ISymbol>> zeroSymbols = new HashMap<IAddress, List<ISymbol>>();
+ for (ISymbol symbol : symbols) {
+ if (symbol.getSize() == 0) {
+ IAddress symAddr = symbol.getAddress();
+ List<ISymbol> sameAddrList = zeroSymbols.get(symAddr);
+ if (sameAddrList != null && !symAddr.getValue().equals(BigInteger.ZERO)) {
+ // with the addition of multiple zero-sized symbols,
+ // the criterion is that there should not now be
+ // duplicate executable symbols at the same address
+ if (isExecutable(symbol)) {
+ for (ISymbol sameAddr : sameAddrList) {
+ if (symbol.getClass().equals(sameAddr) && isExecutable(sameAddr)) {
+ if (symbol instanceof IARMSymbol) {
+ // you may have more than one zero-sized executable
+ // symbol at the same address in ARM. But they should
+ // not be the same mode, e.g. both ARM or both Thumb.
+ assertFalse("multiple zero-size symbols" + symbol.getName() + " & "+ sameAddr.getName(),
+ ((IARMSymbol)symbol).isThumbAddress() == ((IARMSymbol)sameAddr).isThumbAddress());
+ } else {
+ assertFalse("multiple zero-size symbols" + symbol.getName() + " & "+ sameAddr.getName(), true);
+ }
+ }
+ }
+ }
+ } else {
+ sameAddrList = new ArrayList<ISymbol>();
+ }
+ sameAddrList.add(symbol);
+ zeroSymbols.put(symbol.getAddress(), sameAddrList);
+ }
+ }
+ }
+ }
+
+ /**
+ * Test some type lookup edge cases
+ */
+ @Test
+ public void testSpecificTypes4a() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+
+ List<ICompileUnitScope> scopes = getCompileUnitsFor(symbolReader, "dbg_multipleInheritance.cpp");
+ if (scopes.isEmpty())
+ scopes = getCompileUnitsFor(symbolReader, "dbg_multipleinheritance.cpp");
+ assertFalse(scopes.isEmpty());
+ /*
+ if (Symbols.useNewReader())
+ // TODO: along with other filepath lookup issues:
+ // what happens here is, there are three CUs for dbg_multipleInheritance.cpp,
+ // but one has no DW_AT_comp_dir. All of their names are \BlackFlags\SRC\dbg_multipleInheritance.cpp,
+ // which (once canonicalized) looks like an absolute path in Linux, thus comes in as
+ // three distinct CUs for the same path. In Win32, though, the comp dir is prepended
+ // in two cases, since the name is not considered absolute.
+ assertEquals(HostOS.IS_WIN32 ? 2 : 3, scopes.size());
+ else
+ assertEquals(1, scopes.size());
+ */
+
+ IFunctionScope functionScope = null;
+ for (ICompileUnitScope scope : scopes) {
+ functionScope = scope.getFunctionAtAddress(new Addr32(0xaa4e));
+ if (functionScope != null)
+ break;
+ }
+ assertNotNull(functionScope);
+
+ Collection<IVariable> vars = functionScope.getVariablesInTree();
+ assertEquals(2, vars.size());
+
+ java.util.Iterator<IVariable> vit = vars.iterator();
+ assertEquals("FromBase2", vit.next().getName());
+ assertEquals("a", vit.next().getName());
+
+ vars = functionScope.getParameters();
+ assertEquals(1, vars.size());
+ vit = vars.iterator();
+ IVariable thisVar = vit.next();
+ assertEquals("this", thisVar.getName());
+
+ assertNotNull(thisVar.getType());
+ _testSpecificTypes4(thisVar.getType());
+ }
+
+ /**
+ * Test some type lookup edge cases
+ */
+ @Test
+ public void testSpecificTypes4b() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+
+ DwarfDebugInfoProvider provider = getDwarfDebugInfoProvider(symbolReader);
+ if (provider == null)
+ return;
+
+ // 0x1cb0c6: subprogram
+ // 0x1cb0de: this
+ // 0x1cb098: Base2*
+
+ IType type = provider.readType(0x1cb098);
+ assertNotNull(type);
+ _testSpecificTypes4(type);
+ }
+
+ /**
+ * @param type
+ */
+ private void _testSpecificTypes4(IType type) {
+ assertTrue(type.getName(), type instanceof IPointerType);
+
+ IType base2 = ((IPointerType) type).getType();
+ assertFalse(base2 instanceof IForwardTypeReference); // should not peek through interface
+ assertNotNull(base2);
+ assertTrue(base2.getName(), base2 instanceof ICompositeType);
+
+ ICompositeType base2Comp = (ICompositeType) base2;
+ assertEquals("class Base2", base2Comp.getName());
+ assertEquals(0, base2Comp.fieldCount());
+ assertEquals(0, base2Comp.inheritanceCount());
+
+ // the class is in the header
+ IScope classScope = ((IPointerType)type).getType().getScope();
+ assertTrue(classScope instanceof ICompileUnitScope);
+ IPath path = ((ICompileUnitScope) classScope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.h"));
+
+ // the pointer type is declared in a function
+ assertTrue(type.getScope() instanceof IFunctionScope);
+ IScope fileScope = type.getScope().getParent();
+ assertTrue(fileScope instanceof ICompileUnitScope);
+ path = ((ICompileUnitScope) fileScope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equalsIgnoreCase("dbg_multipleInheritance.cpp"));
+ }
+
+ /**
+ * Test some type lookup edge cases
+ */
+ @Test
+ public void testSpecificTypes5a() throws Exception {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_rvct.sym"));
+
+ // inlined Der1::Der1()
+ IScope scope = symbolReader.getModuleScope().getScopeAtAddress(new Addr32(0x8cda));
+ assertTrue(scope instanceof IFunctionScope);
+
+ IFunctionScope functionScope = (IFunctionScope) scope;
+
+ // two locals __func_local__0 and __result are optimized out
+ Collection<IVariable> vars = functionScope.getVariablesInTree();
+ assertEquals(0, vars.size());
+
+ java.util.Iterator<IVariable> vit;
+ /*
+ vit = vars.iterator();
+ IVariable var = vit.next();
+ assertEquals("__func_local__0", var.getName());
+ var = vit.next();
+ assertEquals("__result", var.getName());
+ */
+
+ vars = functionScope.getParameters();
+ assertEquals(1, vars.size());
+ vit = vars.iterator();
+ IVariable thisVar = vit.next();
+ assertEquals("this", thisVar.getName());
+
+ assertNotNull(thisVar.getType());
+ _testSpecificTypes5(thisVar.getType());
+ }
+
+ /**
+ * @param type
+ */
+ private void _testSpecificTypes5(IType type) {
+ assertTrue(type.getName(), type instanceof IPointerType);
+
+ IType der1 = ((IPointerType) type).getType();
+ assertFalse(der1 instanceof IForwardTypeReference); // should not peek through interface
+ assertNotNull(der1);
+ assertTrue(der1.getName(), der1 instanceof ICompositeType);
+
+ ICompositeType der1Comp = (ICompositeType) der1;
+ assertEquals("struct Der1", der1Comp.getName());
+ assertEquals(1, der1Comp.fieldCount());
+ assertEquals(1, der1Comp.inheritanceCount());
+
+ IField field = der1Comp.findFields("b1")[0];
+ assertNotNull("b1", field);
+
+ field = der1Comp.findFields("__vptr")[0];
+ assertNotNull("__vptr", field);
+
+ // inherited fields also visible
+ field = der1Comp.findFields("a")[0];
+ assertNotNull("a", field);
+
+ // x is in an inherited type
+ IInheritance[] inhs = der1Comp.getInheritances();
+ assertEquals(1, inhs.length);
+
+ IType base01 = inhs[0].getType();
+ assertNotNull(base01);
+ assertEquals("struct Base01", base01.getName());
+ assertTrue(base01.getName(), base01 instanceof ICompositeType);
+
+ ICompositeType base01Comp = (ICompositeType) base01;
+ assertEquals(2, base01Comp.fieldCount());
+ assertEquals(0, base01Comp.inheritanceCount());
+
+ field = base01Comp.findFields("a")[0];
+ assertNotNull("a", field);
+
+
+ field = der1Comp.findFields("__vptr")[0];
+ assertNotNull("__vptr", field);
+
+ // the class is in the header
+ IScope classScope = ((IPointerType)type).getType().getScope();
+ assertTrue(classScope instanceof ICompileUnitScope);
+ IPath path = ((ICompileUnitScope) classScope).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equals("dbg_rtti.cpp"));
+
+ // the pointer type is declared in a function
+ assertTrue(type.getScope() instanceof ICompileUnitScope);
+ path = ((ICompileUnitScope) type.getScope()).getFilePath();
+ assertTrue(path.toString(), path.lastSegment().equals("dbg_rtti.cpp"));
+ }
+
+ /**
+ * Look for DWARF files with bad scopes and make sure we fix them up properly.
+ * Use full scanning to populate the content.
+ */
+ @Test
+ public void testScopes1a() {
+ for (TestInfo info : testInfos.values()) {
+ System.out.println("Scopes for " + info.symFile.lastSegment());
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ if (symbolReader != null) {
+ readFully(symbolReader);
+ doTestScopes(symbolReader);
+ }
+ }
+ }
+
+ /**
+ * Look for DWARF files with bad scopes and make sure we fix them up properly.
+ * Use random scanning to populate the content.
+ */
+ @Test
+ public void testScopes1b() {
+ for (TestInfo info : testInfos.values()) {
+ System.out.println("Scopes for " + info.symFile.lastSegment());
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ if (symbolReader != null) {
+ readRandomly(symbolReader);
+ doTestScopes(symbolReader);
+ }
+ }
+ }
+
+ /**
+ * @param symbolReader
+ */
+ private void doTestScopes(IEDCSymbolReader symbolReader) {
+ IModuleScope moduleScope = symbolReader.getModuleScope();
+ IAddress low = moduleScope.getLowAddress();
+ IAddress high = moduleScope.getHighAddress();
+ assertTrue(low.compareTo(high) < 0);
+
+ checkChildScopes(moduleScope, low, high);
+ }
+
+ /**
+ * @param scope
+ * @param low
+ * @param high
+ */
+ private void checkChildScopes(IScope scope, IAddress low, IAddress high) {
+ for (IScope kid : scope.getChildren()) {
+ IAddress kidlo = kid.getLowAddress();
+ IAddress kidhi = kid.getHighAddress();
+
+ if (!kid.hasEmptyRange()) {
+ if (!(kidlo.compareTo(kidhi) <= 0)) {
+ fail(describeScope(kid));
+ }
+ if (!(low.compareTo(kidlo) <= 0)) {
+ fail(describeScope(kid));
+ }
+ if (!(kidhi.compareTo(high) <= 0)) {
+ fail(describeScope(kid));
+ }
+ }
+
+ if (!(kid instanceof ILexicalBlockScope) && !(scope instanceof ILexicalBlockScope)) {
+ checkChildScopes(kid, kidlo, kidhi);
+ } else {
+ // lexical blocks are not constrained to be within other lexical blocks,
+ // but they should be within the function.
+ checkChildScopes(kid, low, high);
+
+ }
+ }
+
+ }
+
+ /**
+ * Make sure our fixing up of CU scopes makes sense. In old GCC-E (e.g. 3.4.3), the
+ * compile units do not have low_pc and high_pc, which makes it hard to find functions.
+ */
+ @Test
+ public void testScopes3() {
+ for (TestInfo info : testInfos.values()) {
+ String label = info.symFile.lastSegment();
+ System.out.println("Address->Function mapping for "+ label);
+
+ // explicitly read the functions
+ IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(info.symFile);
+ if (exeReader == null)
+ continue;
+
+ DwarfDebugInfoProvider debugInfoProvider = new DwarfDebugInfoProvider(exeReader);
+ IEDCSymbolReader explicitSymbolReader = new EDCSymbolReader(
+ exeReader,
+ debugInfoProvider);
+
+ // this is NOT guaranteed: GCC-E at link time will share function definitions among CUs,
+ // so two CUs can "overlap" if you consider only their raw Lo and Hi PCs.
+ /*
+ // make sure the CUs are proper
+ ArrayList<IScope> cuList= new ArrayList<IScope>(explicitSymbolReader.getModuleScope().getChildren());
+ Collections.sort(cuList);
+ long low = 0, high = 0;
+
+ for (IScope cu : cuList) {
+ String culabel = label + ":" + cu;
+ long start = cu.getLowAddress().getValue().longValue();
+ long end = cu.getHighAddress().getValue().longValue();
+ if (start != end) {
+ assertTrue(culabel, start < end);
+ assertTrue(culabel, start >= low);
+ if (high > 0)
+ assertTrue(culabel, end > high);
+ high = end;
+ }
+ }
+ */
+
+ // remember all the functions
+ List<IFunctionScope> allFuncs = new ArrayList<IFunctionScope>(
+ explicitSymbolReader.getModuleScope().getFunctionsByName(null));
+ assertTrue(allFuncs.size() >= 10);
+
+ debugInfoProvider.dispose();
+
+ // now, make sure we can find all those functions with a random scan
+ debugInfoProvider = new DwarfDebugInfoProvider(exeReader);
+ IEDCSymbolReader testSymbolReader = new EDCSymbolReader(
+ exeReader,
+ debugInfoProvider);
+
+ StringBuilder missing = new StringBuilder();
+ Random random = new Random(0x12145895);
+ int count = allFuncs.size();
+ while (count-- > 0) {
+ IFunctionScope allFunc = allFuncs.get(random.nextInt(allFuncs.size()));
+ doTestScope3Func(label, missing, testSymbolReader, allFunc);
+ }
+ debugInfoProvider.dispose();
+
+
+ if(missing.length() > 0)
+ fail(missing.toString());
+ }
+
+ // as good a place as any to test the fields of the static EDCSymbolReader.EMPTY_MODULE_SCOPE
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.compareTo(new Object()) == 0);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.equals(new Object()) == false);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getChildren().isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getCompileUnitForAddress(null) == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getCompileUnitsForFile(null).isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getEnumerators().isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getFrameRegisterProvider() == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getFunctionsByName(null).isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getHighAddress().isZero());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getLowAddress().isZero());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getModuleLineEntryProvider() != null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getName().length() == 0);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getParent() == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getRangeList() == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getScopeAtAddress(null) == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getSymbolFile() == null);
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getTypes().isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getVariables().isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getVariablesByName(null, false).isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.getVariablesByName(null, true).isEmpty());
+ assertTrue(EDCSymbolReader.EMPTY_MODULE_SCOPE.hasEmptyRange());
+ }
+
+ /**
+ * Make sure our fixing up of CU scopes makes sense. In old GCC-E (e.g. 3.4.3), the
+ * compile units do not have low_pc and high_pc, which makes it hard to find functions.
+ */
+ @Test
+ public void testScopes3b() {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(getFile("BlackFlag_gcce_343.sym"));
+ IScope scope = symbolReader.getModuleScope().getScopeAtAddress(new Addr32(0xad32));
+ assertTrue(scope instanceof IFunctionScope || scope instanceof ILexicalBlockScope);
+ }
+
+ /**
+ * @param label
+ * @param missing
+ * @param symbolReader
+ * @param allFunc
+ */
+ private void doTestScope3Func(String label, StringBuilder missing,
+ IEDCSymbolReader symbolReader, IFunctionScope allFunc) {
+ IScope scope1 = symbolReader.getModuleScope().getScopeAtAddress(allFunc.getLowAddress().add(1));
+ IScope scope2 = symbolReader.getModuleScope().getScopeAtAddress(allFunc.getHighAddress().add(-1));
+
+ if (scope1 == null || scope2 == null) {
+ missing.append(label + ":"+ allFunc +" missing\n");
+
+ }
+ // skip if the function is defined over a range, because this may mean interleaved runtime code
+ else if (allFunc.getRangeList() == null){
+ // one of both may be inlined
+ while (scope1 instanceof ILexicalBlockScope || scope1.getParent() instanceof IFunctionScope)
+ scope1 = scope1.getParent();
+ while (scope2 instanceof ILexicalBlockScope || scope2.getParent() instanceof IFunctionScope)
+ scope2 = scope2.getParent();
+ if (scope1 != scope2) {
+ missing.append(label + ":"+ allFunc +" did not find same function at low and high: " + scope1 + " / "+ scope2 + "\n");
+ }
+ }
+ }
+
+ @Test
+ public void testRangeList() {
+ TestInfo info = testInfos.get("BlackFlagMinGW.exe");
+
+ // explicitly read the functions
+ IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(info.symFile);
+ DwarfDebugInfoProvider debugInfoProvider = new DwarfDebugInfoProvider(exeReader);
+ IEDCSymbolReader reader = new EDCSymbolReader(exeReader, debugInfoProvider);
+
+ List<ICompileUnitScope> scopes = new ArrayList<ICompileUnitScope>();
+ for (IScope scope : reader.getModuleScope().getChildren()) {
+ if (scope instanceof ICompileUnitScope) {
+ scopes.add((ICompileUnitScope) scope);
+ }
+ }
+
+ // check and manipulate range list
+ for (ICompileUnitScope cuScope : scopes) {
+ if (cuScope.getRangeList() != null) {
+ RangeList rangeList = (RangeList) cuScope.getRangeList();
+ long low = rangeList.getLowAddress();
+ long high = rangeList.getHighAddress();
+ rangeList.addLowRange(low - 1);
+ rangeList.addHighRange(high + 1);
+ assertTrue(rangeList.isInRange(low));
+ assertTrue(low > rangeList.getLowAddress());
+ assertTrue(high < rangeList.getHighAddress());
+ assertTrue(rangeList.toString().
+ contains(Long.toHexString(rangeList.getLowAddress())));
+ break;
+ }
+ }
+ }
+
+ @Test
+ public void testFrameRegInstructions() {
+ EDCServicesTracker edcTracker = null;
+ try {
+ TestUtils.showDebugPerspective();
+ dwarfAlbum = DwarfFrameRegisterAlbum.openAlbum();
+ dwarfAlbum.launchAndWaitForSuspendedContext();
+ if (dwarfAlbum.getLaunch() == null) return;
+ edcTracker = new EDCServicesTracker(EDCDebugger.getBundleContext(), dwarfAlbum.getSession().getId());
+ Assert.assertNotNull(edcTracker);
+ } catch (Exception e) {
+ Assert.fail(e.getLocalizedMessage());
+ }
+
+ TestInfo info = testInfos.get("BlackFlag_rvct.sym");
+
+ // explicitly read the types to parse the file
+ IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(info.symFile);
+ DwarfDebugInfoProvider provider = new DwarfDebugInfoProvider(exeReader);
+ provider.getTypes();
+ FrameDescriptionEntry fde = provider.findFrameDescriptionEntry(new Addr64("32768"));
+ InstructionState dummyState;
+
+ // Can remove try blocks when all AbstractInstruction#applyInstruction()'s are implemented
+ dummyState = new InstructionState(edcTracker, null, null, fde);
+ try {
+ DefCFAExpressionInstruction defCFAEI = new DefCFAExpressionInstruction(null);
+ assertNotNull(defCFAEI.toString());
+ defCFAEI.applyInstruction(dummyState);
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // save an expression
+ ExpressionInstruction ei = new ExpressionInstruction(0, null);
+ assertNotNull(ei.toString());
+ ei.applyInstruction(dummyState);
+ assertTrue(dummyState.regRules.containsKey(0));
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // save a register
+ RegisterInstruction re = new RegisterInstruction(0, 1);
+ assertNotNull(re.toString());
+ re.applyInstruction(dummyState);
+ assertTrue(dummyState.regRules.containsKey(0));
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // nop
+ NopInstruction nop = new NopInstruction();
+ assertNotNull(nop.toString());
+ int hash = dummyState.hashCode();
+ nop.applyInstruction(dummyState);
+ assertTrue(dummyState.hashCode() == hash);
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // save an expression for a register
+ ValueExpressionInstruction vei = new ValueExpressionInstruction(0, null);
+ assertNotNull(vei.toString());
+ vei.applyInstruction(dummyState);
+ assertTrue(dummyState.regRules.containsKey(0));
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // save a register offset
+ ValueOffsetInstruction voi = new ValueOffsetInstruction(0, 12);
+ assertNotNull(voi.toString());
+ voi.applyInstruction(dummyState);
+ assertTrue(dummyState.regRules.containsKey(0));
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // push a state on the state stack
+ RememberStateInstruction rsi = new RememberStateInstruction();
+ assertNotNull(rsi.toString());
+ int i = dummyState.stateStack.size();
+ rsi.applyInstruction(dummyState);
+ assertTrue(dummyState.stateStack.size() == i + 1);
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ // remove rule for instruction
+ RestoreInstruction ri = new RestoreInstruction(0);
+ assertNotNull(ri.toString());
+ ri.applyInstruction(dummyState);
+ assertFalse(dummyState.regRules.containsKey(0));
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ RememberStateInstruction rsi1 = new RememberStateInstruction();
+ rsi1.applyInstruction(dummyState);
+ // remove rule for instruction
+ RestoreStateInstruction rsi = new RestoreStateInstruction();
+ assertNotNull(rsi.toString());
+ rsi.applyInstruction(dummyState);
+ assertFalse(dummyState.regRules.isEmpty());
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ DefCFAInstruction defCFA = new DefCFAInstruction(0, 12);
+ assertNotNull(defCFA.toString());
+ defCFA.applyInstruction(dummyState);
+ assertTrue(dummyState.getCFARegister() == 0);
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ SameValueInstruction svi = new SameValueInstruction(0);
+ assertNotNull(svi.toString());
+ svi.applyInstruction(dummyState);
+ assertFalse(dummyState.regRules.isEmpty());
+ } catch (Throwable t) {
+ }
+
+ dummyState = new InstructionState(null, null, null, fde);
+ try {
+ UndefinedInstruction svi = new UndefinedInstruction(0);
+ assertNotNull(svi.toString());
+ svi.applyInstruction(dummyState);
+ assertFalse(dummyState.regRules.isEmpty());
+ } catch (Throwable t) {
+ }
+ }
+
+ @Test
+ public void testModuleScopeStartEnd() {
+ for (TestInfo info : testInfos.values()) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ assertNotNull(symbolReader);
+ IScope moduleScope = symbolReader.getModuleScope();
+ if (info.lowAddress != null) {
+ assertEquals(info.lowAddress, moduleScope.getLowAddress());
+ assertEquals(info.highAddress, moduleScope.getHighAddress());
+ }
+ }
+ }
+
+ @Test
+ public void testPubnames1() {
+ for (TestInfo info : testInfos.values()) {
+ if (info.numberOfPubFuncNames == 0) continue;
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ DwarfDebugInfoProvider debugInfoProvider = (DwarfDebugInfoProvider) ((EDCSymbolReader) symbolReader).getDebugInfoProvider();
+ Map<String, List<PublicNameInfo>> pubs;
+ pubs = debugInfoProvider.getPublicFunctions();
+
+ boolean discover = false;
+ int total = 0;
+ for (String pub : pubs.keySet()) {
+ total += pubs.get(pub).size();
+ }
+ if (discover) {
+ System.out.println(info.symFile + ": " + pubs.size() + " / "+ total);
+ } else {
+ assertEquals(info.numberOfPubFuncNames, pubs.size());
+ assertEquals(info.numberOfPubFuncEntries, total);
+ }
+
+ pubs = debugInfoProvider.getPublicVariables();
+
+ total = 0;
+ for (String pub : pubs.keySet()) {
+ total += pubs.get(pub).size();
+ }
+ if (discover) {
+ System.out.println(info.symFile + ": " + pubs.size() + " / "+ total);
+ } else {
+ assertEquals(info.numberOfPubVarNames, pubs.size());
+ assertEquals(info.numberOfPubVarEntries, total);
+ }
+ }
+ }
+
+ @Test
+ public void testPubnames2() {
+ for (TestInfo info : testInfos.values()) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+
+ for (String name : info.pubFuncs) {
+ String simpleName = stripName(name);
+ Collection<IFunctionScope> funcs = symbolReader.getModuleScope().getFunctionsByName(simpleName);
+ assertNotNull(info.symFile.lastSegment() + ":" + name, funcs);
+ assertTrue(info.symFile.lastSegment() + ":" + name, !funcs.isEmpty());
+ for (IFunctionScope func : funcs) {
+ assertEquals(func.getName(), simpleName);
+ }
+ }
+ for (String name : info.pubVars) {
+ String simpleName = stripName(name);
+ Collection<IVariable> vars = symbolReader.getModuleScope().getVariablesByName(simpleName, false);
+ assertNotNull(info.symFile.lastSegment() + ":" + name, vars);
+ assertTrue(info.symFile.lastSegment() + ":" + name, !vars.isEmpty());
+ for (IVariable var : vars) {
+ assertEquals(var.getName(), simpleName);
+ }
+ }
+ }
+ }
+
+ /**
+ * Test that, for a given PC, we know which locals are in scope.
+ */
+ @Test
+ public void testLocalScopes1() {
+ StringBuilder errors = new StringBuilder();
+ for (TestInfo info : testInfos.values()) {
+ for (String key : info.scopeInfos.keySet()) {
+ String[] split = key.split("\\|");
+ String file = split[0];
+ String func = split[1];
+ String className = split[2];
+ if (className.equals("null"))
+ className = null;
+
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ List<ICompileUnitScope> cuList = getCompileUnitsFor(symbolReader, file);
+ boolean found = false;
+ for (ICompileUnitScope cu : cuList) {
+ for (IFunctionScope scope : cu.getFunctions()) {
+ if (scope.getName().equals(func)) {
+
+ if (className != null) {
+ String theClassName = getClassFor(scope);
+ if (!theClassName.matches("(class|struct) " +className + "(<.*>)?"))
+ continue;
+ }
+
+ found = true;
+
+ String label = info.symFile.lastSegment() + ":" + file + (className!= null ? ":" + className : "") + ":" + func;
+
+ boolean discover = false;
+ if (discover) {
+ System.out.println(label);
+ Collection<IVariable> vars = scope.getVariables();
+ for (IVariable var : vars) System.out.println(var.getName());
+ vars = scope.getParameters();
+ for (IVariable var : vars) System.out.println(var.getName());
+ } else {
+ doTestLocalScopes1(errors, label, info.scopeInfos.get(key), scope);
+ }
+ }
+ }
+ }
+ assertTrue(info.symFile.lastSegment() + ":" + key, found);
+ }
+ }
+ if (errors.length() > 0)
+ fail(errors.toString());
+ }
+
+ /**
+ * @param errors
+ * @param scopeInfos
+ * @param scope
+ */
+ private void doTestLocalScopes1(StringBuilder errors, String label, List<ScopeInfo> scopeInfos, IFunctionScope scope) {
+ // TODO: watch out for template functions, which are named the same
+ Addr32 startAddr = new Addr32(scopeInfos.get(0).address);
+ if (scope.getLowAddress().compareTo(startAddr) > 0
+ || scope.getHighAddress().compareTo(startAddr) <= 0) {
+ return;
+ }
+
+ for (ScopeInfo scopeInfo : scopeInfos) {
+ try {
+ doTestScopeInfo(label, scope, scopeInfo);
+ } catch (AssertionError e) {
+ errors.append(e.getMessage());
+ errors.append('\n');
+ }
+ }
+ }
+
+ private void doTestScopeInfo(String label, IFunctionScope scope,
+ ScopeInfo scopeInfo) {
+ label += ":" + Integer.toHexString(scopeInfo.address);
+ Collection<IVariable> vars = scope.getScopedVariables(new Addr32(scopeInfo.address));
+ StringBuilder missing = new StringBuilder();
+ for (String name : scopeInfo.names) {
+ boolean found = false;
+ for (IVariable var : vars) {
+ if (var.getName().equals(name)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ missing.append(name + ", ");
+ }
+ if (missing.length() > 0)
+ fail(label + ": missing "+ missing);
+
+ StringBuilder extra = new StringBuilder();
+ for (IVariable var : vars) {
+ boolean found = false;
+ for (String name : scopeInfo.names) {
+ if (name.equals(var.getName())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ extra.append(var.getName());
+ extra.append(", ");
+ }
+ }
+ if (extra.length() > 0)
+ fail(label +": found extra variables: " + extra);
+ }
+
+ /**
+ * Test that, for a given PC, we know which locals are in scope.
+ */
+ @Test
+ public void testLocalLocations() {
+ StringBuilder errors = new StringBuilder();
+ for (TestInfo info : testInfos.values()) {
+ IEDCSymbolReader symbolReader = Symbols.getSymbolReader(info.symFile);
+ for (IScope cuscope : symbolReader.getModuleScope().getChildren()) {
+ ICompileUnitScope cu = (ICompileUnitScope) cuscope;
+ for (IFunctionScope scope : cu.getFunctions()) {
+ String label = info.symFile.lastSegment() + ":" + scope;
+
+ for (IVariable var : scope.getVariablesInTree()) {
+ checkVariableLocation(errors, label, scope, var);
+ }
+ }
+ }
+ }
+ if (errors.length() > 0)
+ fail(errors.toString());
+ }
+
+ /**
+ * @param errors
+ * @param label
+ * @param scope
+ * @param var
+ */
+ private void checkVariableLocation(StringBuilder errors, String label,
+ IScope scope, IVariable var) {
+ ILocationProvider locationProvider = var.getLocationProvider();
+ if (locationProvider instanceof LocationExpression) {
+ LocationExpression expr = (LocationExpression) locationProvider;
+ IScope varScope = expr.getScope();
+ while (varScope instanceof ILexicalBlockScope ||
+ (varScope != null && varScope.getParent() instanceof IFunctionScope))
+ varScope = varScope.getParent();
+ if (!(varScope instanceof IFunctionScope)) {
+ errors.append("Wrong scope for " + var + ": " + varScope + "\n");
+ }
+ }
+
+ }
+
+ /**
+ * Be sure we zero extend when reading short DWARF attributes.
+ * One place this is quite important is in array bounds.
+ * Other cases in the reader are line tables, scope ranges, etc. which
+ * are unsigned. Enum values, though, must remain signed.
+ * @throws Exception
+ */
+ @Test
+ public void testAttributePromotion() throws Exception {
+ // In here, we have a tmp[256] array, with DW_AT_upper_bound == 255.
+ // This validates some lazy code that always cast this stuff to a long
+ // without considering the sign extension.
+
+ // (BTW, this bug was logged for something else, and is not the bug being tested here)
+ IEDCSymbolReader reader = Symbols.getSymbolReader(getFile("bug303066.exe"));
+ assertNotNull(reader);
+ Collection<IFunctionScope> scopes = reader.getModuleScope().getFunctionsByName("main");
+ assertNotNull(scopes);
+ assertEquals(1, scopes.size());
+ boolean found = false;
+ int enumcnt = 0;
+ for (IVariable var : scopes.iterator().next().getVariables()) {
+ if (var.getName().equals("tmp")) {
+ IType type = var.getType();
+ assertTrue(type instanceof IArrayType);
+ IArrayBoundType bound = ((IArrayType) type).getBound(0);
+ assertEquals(256, bound.getBoundCount());
+ found = true;
+ }
+
+ // these attributes *should* be sign extended
+ if (var.getName().equals("val")) {
+ IType type = TypeUtils.getBaseType(var.getType());
+ for (IEnumerator enumr : ((IEnumeration)type).getEnumerators()) {
+ if (enumr.getName().equals("Val1")) {
+ assertEquals(255, enumr.getValue());
+ enumcnt++;
+ } else if (enumr.getName().equals("Val2")) {
+ assertEquals(65535, enumr.getValue());
+ enumcnt++;
+ } else if (enumr.getName().equals("Val3")) {
+ assertEquals(-255, enumr.getValue());
+ enumcnt++;
+ } else if (enumr.getName().equals("Val4")) {
+ assertEquals(-65535, enumr.getValue());
+ enumcnt++;
+ }
+ }
+ }
+ }
+ assertEquals("Found all Val enums", 4, enumcnt);
+ assertTrue("Did not find 'tmp'", found);
+
+ found = false;
+ for (IVariable var : reader.getModuleScope().getVariablesByName("bigbuffer", false)) {
+ IType type = var.getType();
+ assertTrue(type instanceof IArrayType);
+ IArrayBoundType bound = ((IArrayType) type).getBound(0);
+ assertEquals(65536, bound.getBoundCount());
+ found = true;
+ break;
+ }
+ assertTrue("Did not find 'bigbuffer'", found);
+
+ }
+
+ /**
+ * RVCT generates location lists with two duplicate address ranges, where
+ * the latter is the one to trust. Be sure we filter out the earlier ones.
+ * @throws Exception
+ */
+ @Test
+ public void testBrokenLocationLists() throws Exception {
+ IPath file = getFile("BlackFlag_rvct.sym");
+ IEDCSymbolReader reader = Symbols.getSymbolReader(file);
+ // show_Const_Arguments
+ IFunctionScope func = (IFunctionScope) reader.getModuleScope().getScopeAtAddress(new Addr32(0x9648));
+ Collection<IVariable> variables = func.getParameters();
+ boolean found = false;
+ for (IVariable var : variables) {
+ if (var.getName().equals("aArg1")) {
+ found = true;
+ LocationEntry[] entries = ((LocationList)var.getLocationProvider()).getLocationEntries();
+ assertEquals(2, entries.length);
+ assertEquals(0x9648, entries[0].getLowPC());
+ assertEquals(1, entries[0].getBytes().length);
+ assertEquals((byte)0x50, entries[0].getBytes()[0]);
+ assertEquals("LocationEntry [bytes=[80], highPC=38474, lowPC=38472]", entries[0].toString());
+ break;
+ }
+ }
+ assertTrue(found);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableReader.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableReader.java
index f1a6c4f..eb1acfa 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableReader.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableReader.java
@@ -1,160 +1,161 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-package org.eclipse.cdt.debug.edc.tests;
-
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
-import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
-import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.IPath;
-import org.junit.Test;
-
-/**
- * Note: several tests are implied by TestDwarfReader
- */
-public class TestExecutableReader extends BaseDwarfTestCase {
- protected static final String[] symFilesToTest = {
- "BlackFlagMinGW.exe",
- "BlackFlag_gcce.sym",
- "BlackFlag_linuxgcc.exe",
- "BlackFlag_rvct.sym",
- "BlackFlag_gcce_343.sym",
- "HelloWorld_rvct_2_2.exe.sym",
- "HelloWorld_rvct_4_0.exe.sym",
- "SimpleCpp_rvct_22.sym",
- "SimpleCpp_rvct_40.sym",
- "SimpleCpp_gcce_432.sym",
- "SimpleCpp_gcc_x86.exe",
- };
-
- /** Bag of data for testing sym files. The key is 'symFile' and other
- * elements are used by specific tests.
- */
- protected static class TestInfo {
- IPath symFile;
- IPath exeFile;
- Map<String, SymLookupInfo> symToFuncAddrMap = new HashMap<String,SymLookupInfo>();
- }
-
- protected static Map<String, TestInfo> testInfos = new LinkedHashMap<String, TestInfo>();
-
- static {
- for (String sym : symFilesToTest) {
- TestInfo info = new TestInfo();
- info.symFile = getFile(sym);
- testInfos.put(sym, info);
- }
- }
-
- protected static TestInfo lookupInfo(String sym) {
- return testInfos.get(sym);
- }
-
- protected static void setExe(String sym, String exe) {
- TestInfo info = lookupInfo(sym);
- if (info != null)
- info.exeFile = getFile(exe);
- }
-
-
- static class SymLookupInfo {
- boolean isMangled;
- int addr;
- @Override
- public String toString() {
- return "mangled="+isMangled+"; addr="+Integer.toHexString(addr);
- }
- }
-
- private static void addSymbolAddr(String sym, String symbol, boolean isMangled, int addr) {
- TestInfo info = lookupInfo(sym);
- if (info != null) {
- SymLookupInfo si = new SymLookupInfo();
- si.isMangled = isMangled;
- si.addr = addr;
- info.symToFuncAddrMap.put(symbol, si);
- }
- }
- static {
- addSymbolAddr("BlackFlagMinGW.exe", "_mainCRTStartup", true, 0x401130);
- addSymbolAddr("BlackFlagMinGW.exe", "mainCRTStartup", false, 0x401130);
- addSymbolAddr("BlackFlagMinGW.exe", "_main", true, 0x40663d);
- addSymbolAddr("BlackFlagMinGW.exe", "_main", false, 0x40663d);
- addSymbolAddr("BlackFlagMinGW.exe", "main", false, 0x40663d);
- addSymbolAddr("BlackFlag_gcce.sym", "_Z7E32Mainv", true, 0x80a0);
- addSymbolAddr("BlackFlag_gcce.sym", "E32Main", false, 0x80a0);
- addSymbolAddr("BlackFlag_gcce.sym", "::E32Main", false, 0x80a0);
- addSymbolAddr("BlackFlag_gcce.sym", "E32Main()", false, 0x80a0);
- addSymbolAddr("BlackFlag_linuxgcc.exe", "main", false, 0x8048880);
- addSymbolAddr("BlackFlag_rvct.sym", "_Z7E32Mainv", true, 0x849c);
- addSymbolAddr("BlackFlag_rvct.sym", "E32Main", false, 0x849c);
- addSymbolAddr("BlackFlag_rvct.sym", "E32Main()", false, 0x849c);
- addSymbolAddr("BlackFlag_rvct.sym", "::E32Main()", false, 0x849c);
- addSymbolAddr("BlackFlag_rvct.sym", "::E32Main", false, 0x849c);
- addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "_E32Startup", true, 0x8000);
- addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "_E32Startup", false, 0x8000);
- addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "::_E32Startup", false, 0x8000);
- addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "_Z7E32Mainv", true, 0x82ea);
- addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "E32Main", false, 0x82ea);
- addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "::E32Main()", false, 0x82ea);
- }
-
-
- @Test
- public void testLookupOfSymbol() throws Exception {
- for (TestInfo info : testInfos.values()) {
- if (info.symToFuncAddrMap == null) continue;
- IEDCSymbolReader reader = Symbols.getSymbolReader(info.symFile);
- for (Map.Entry<String, SymLookupInfo> entry : info.symToFuncAddrMap.entrySet()) {
- SymLookupInfo si = entry.getValue();
- String label = info.symFile.lastSegment() + ":" + entry.getKey() + ":" + si;
- doLookupSymbol(reader, entry, si, label);
- }
- }
- }
-
- /**
- * @param reader
- * @param entry
- * @param si
- * @param label
- */
- private void doLookupSymbol(IEDCSymbolReader reader,
- Map.Entry<String, SymLookupInfo> entry, SymLookupInfo si,
- String label) {
- Collection<ISymbol> symbols;
- if (!si.isMangled) {
- // should find after unmangling
- symbols = reader.findUnmangledSymbols(entry.getKey());
- assertEquals(label, 1, symbols.size());
- } else {
- // should match mangled symbol
- symbols = reader.findSymbols(entry.getKey());
- assertEquals(label, 1, symbols.size());
-
- }
- assertEquals(label, new Addr32(si.addr),
- symbols.iterator().next().getAddress());
- }
-}
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IPath;
+import org.junit.Test;
+
+/**
+ * Note: several tests are implied by TestDwarfReader
+ */
+public class TestExecutableReader extends BaseDwarfTestCase {
+ protected static final String[] symFilesToTest = {
+ "BlackFlagMinGW.exe",
+ "BlackFlag_gcce.sym",
+ "BlackFlag_linuxgcc.exe",
+ "BlackFlag_rvct.sym",
+ "BlackFlag_gcce_343.sym",
+ "HelloWorld_rvct_2_2.exe.sym",
+ "HelloWorld_rvct_4_0.exe.sym",
+ "SimpleCpp_rvct_22.sym",
+ "SimpleCpp_rvct_40.sym",
+ "SimpleCpp_gcce_432.sym",
+ "SimpleCpp_gcc_x86.exe",
+ };
+
+ /** Bag of data for testing sym files. The key is 'symFile' and other
+ * elements are used by specific tests.
+ */
+ protected static class TestInfo {
+ IPath symFile;
+ IPath exeFile;
+ Map<String, SymLookupInfo> symToFuncAddrMap = new HashMap<String,SymLookupInfo>();
+ }
+
+ protected static Map<String, TestInfo> testInfos = new LinkedHashMap<String, TestInfo>();
+
+ static {
+ for (String sym : symFilesToTest) {
+ TestInfo info = new TestInfo();
+ info.symFile = getFile(sym);
+ testInfos.put(sym, info);
+ }
+ }
+
+ protected static TestInfo lookupInfo(String sym) {
+ return testInfos.get(sym);
+ }
+
+ protected static void setExe(String sym, String exe) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null)
+ info.exeFile = getFile(exe);
+ }
+
+
+ static class SymLookupInfo {
+ boolean isMangled;
+ int addr;
+ @Override
+ public String toString() {
+ return "mangled="+isMangled+"; addr="+Integer.toHexString(addr);
+ }
+ }
+
+ private static void addSymbolAddr(String sym, String symbol, boolean isMangled, int addr) {
+ TestInfo info = lookupInfo(sym);
+ if (info != null) {
+ SymLookupInfo si = new SymLookupInfo();
+ si.isMangled = isMangled;
+ si.addr = addr;
+ info.symToFuncAddrMap.put(symbol, si);
+ }
+ }
+ static {
+ addSymbolAddr("BlackFlagMinGW.exe", "_mainCRTStartup", true, 0x401130);
+ addSymbolAddr("BlackFlagMinGW.exe", "mainCRTStartup", false, 0x401130);
+ addSymbolAddr("BlackFlagMinGW.exe", "_main", true, 0x40663d);
+ addSymbolAddr("BlackFlagMinGW.exe", "_main", false, 0x40663d);
+ addSymbolAddr("BlackFlagMinGW.exe", "main", false, 0x40663d);
+ addSymbolAddr("BlackFlag_gcce.sym", "_Z7E32Mainv", true, 0x80a0);
+ addSymbolAddr("BlackFlag_gcce.sym", "E32Main", false, 0x80a0);
+ addSymbolAddr("BlackFlag_gcce.sym", "::E32Main", false, 0x80a0);
+ addSymbolAddr("BlackFlag_gcce.sym", "E32Main()", false, 0x80a0);
+ addSymbolAddr("BlackFlag_linuxgcc.exe", "main", false, 0x8048880);
+ addSymbolAddr("BlackFlag_rvct.sym", "_Z7E32Mainv", true, 0x849c);
+ addSymbolAddr("BlackFlag_rvct.sym", "E32Main", false, 0x849c);
+ addSymbolAddr("BlackFlag_rvct.sym", "E32Main()", false, 0x849c);
+ addSymbolAddr("BlackFlag_rvct.sym", "::E32Main()", false, 0x849c);
+ addSymbolAddr("BlackFlag_rvct.sym", "::E32Main", false, 0x849c);
+ addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "_E32Startup", true, 0x8000);
+ addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "_E32Startup", false, 0x8000);
+ addSymbolAddr("HelloWorld_rvct_2_2.exe.sym", "::_E32Startup", false, 0x8000);
+ addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "_Z7E32Mainv", true, 0x82ea);
+ addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "E32Main", false, 0x82ea);
+ addSymbolAddr("HelloWorld_rvct_4_0.exe.sym", "::E32Main()", false, 0x82ea);
+ }
+
+
+ @Test
+ public void testLookupOfSymbol() throws Exception {
+ for (TestInfo info : testInfos.values()) {
+ if (info.symToFuncAddrMap == null) continue;
+ IEDCSymbolReader reader = Symbols.getSymbolReader(info.symFile);
+ assertNotNull("Symbol reader null for: " + info.symFile, reader);
+ for (Map.Entry<String, SymLookupInfo> entry : info.symToFuncAddrMap.entrySet()) {
+ SymLookupInfo si = entry.getValue();
+ String label = info.symFile.lastSegment() + ":" + entry.getKey() + ":" + si;
+ doLookupSymbol(reader, entry, si, label);
+ }
+ }
+ }
+
+ /**
+ * @param reader
+ * @param entry
+ * @param si
+ * @param label
+ */
+ private void doLookupSymbol(IEDCSymbolReader reader,
+ Map.Entry<String, SymLookupInfo> entry, SymLookupInfo si,
+ String label) {
+ Collection<ISymbol> symbols;
+ if (!si.isMangled) {
+ // should find after unmangling
+ symbols = reader.findUnmangledSymbols(entry.getKey());
+ assertEquals(label, 1, symbols.size());
+ } else {
+ // should match mangled symbol
+ symbols = reader.findSymbols(entry.getKey());
+ assertEquals(label, 1, symbols.size());
+
+ }
+ assertEquals(label, new Addr32(si.addr),
+ symbols.iterator().next().getAddress());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableSymbolicsReaderFactory.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableSymbolicsReaderFactory.java
new file mode 100644
index 0000000..7469364
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestExecutableSymbolicsReaderFactory.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. Jun 29, 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.files.ExecutableSymbolicsReaderFactory;
+import org.eclipse.core.runtime.IPath;
+import org.junit.Test;
+
+/**
+ * Run as Junit plugin test.
+ */
+public class TestExecutableSymbolicsReaderFactory extends BaseDwarfTestCase {
+ @Test
+ public void testReaderFactory() {
+ // This does nothing but for code coverage of the implicit constructor.
+ ExecutableSymbolicsReaderFactory factory = new ExecutableSymbolicsReaderFactory();
+ assertNotNull(factory);
+
+ /*
+ * The "bogus.exe" file has "bogus.sym" and "bogus.exe.sym" in the same
+ * folder. The function below should return the one with newer time
+ * stamp.
+ */
+ IPath exeFile = getFile("bogus.exe");
+ IPath symCandidate1 = getFile("bogus.sym");
+ IPath symCandidate2 = getFile("bogus.exe.sym");
+
+ String expectedSym =
+ symCandidate1.toFile().lastModified() < symCandidate2.toFile().lastModified() ?
+ symCandidate2.lastSegment() : symCandidate1.lastSegment();
+
+ IPath symFound = ExecutableSymbolicsReaderFactory.findSymbolicsFile(exeFile);
+ assertEquals(expectedSym, symFound.lastSegment());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestIAddressInterval.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestIAddressInterval.java
new file mode 100644
index 0000000..7c6fe97
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestIAddressInterval.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ * Nokia
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.core.IAddressFactory;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.LexicalBlockScope;
+import org.eclipse.cdt.debug.edc.internal.symbols.Section;
+import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.ExecutableSection;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.SectionInfo;
+import org.eclipse.cdt.debug.edc.symbols.IHasSize;
+import org.eclipse.cdt.debug.edc.symbols.IAddressInterval;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.utils.Addr64Factory;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestIAddressInterval {
+
+ private static IAddressInterval emptyExecutableSection;
+ private static IExecutableSection fullExecutableSection;
+ private static IAddressInterval emptyScope;
+ private static IAddressInterval fullScope;
+ private static IAddressInterval emptySection;
+ private static ISection fullSection;
+ private static IAddressInterval fullSymbol;
+ private static IAddressInterval emptySymbol;
+ private static IAddress twenty;
+ private static IAddress fourty;
+ private static IAddress twoFourty;
+ private static IAddress oneFourty;
+
+ @BeforeClass
+ public static void setup() {
+ IAddressFactory addrF = new Addr64Factory();
+
+ // IAddress zero = addrF.createAddress("0x0");
+ twenty = addrF.createAddress("0x20");
+ fourty = addrF.createAddress("0x40");
+ oneFourty = addrF.createAddress("0x140");
+ twoFourty = addrF.createAddress("0x240");
+
+ Map<String, Object> emptyMap = new HashMap<String, Object>();
+ emptySection = new Section(0, 0, fourty, emptyMap);
+ fullSection = new Section(1, 0x200, fourty, emptyMap);
+
+ emptyExecutableSection
+ = new ExecutableSection(null, "emptyExecutableSection",
+ new SectionInfo(fourty, 0, 0));
+ fullExecutableSection
+ = new ExecutableSection(null, "fullExecutableSection",
+ new SectionInfo(fourty, 0, 0x100));
+
+ emptyScope = new LexicalBlockScope("emptyScope", null, twenty, twenty);
+ fullScope = new LexicalBlockScope("fullScope", null, twenty, fourty);
+
+ emptySymbol = new Symbol("emptySymbol", fourty, 0);
+ fullSymbol = new Symbol("fullSymbol", twenty, 0x20);
+ }
+
+ @Test
+ public void getName() {
+ testName(emptySection, "0");
+ testName(fullSection, "1");
+ testName(emptyExecutableSection, "emptyExecutableSection");
+ testName(fullExecutableSection, "fullExecutableSection");
+ testName(emptyScope, "emptyScope");
+ testName(fullScope, "fullScope");
+ testName(emptySymbol, "emptySymbol");
+ testName(fullSymbol, "fullSymbol");
+ }
+
+ private void testName(IAddressInterval interval, String name) {
+ Assert.assertNotNull(interval.getName());
+ Assert.assertEquals(name, interval.getName());
+ }
+
+ @Test
+ public void hasEmptyRange() {
+ testEmpty(emptySection, true);
+ testEmpty(fullSection, false);
+ testEmpty(emptyExecutableSection, true);
+ testEmpty(fullExecutableSection, false);
+ testEmpty(emptyScope, true);
+ testEmpty(fullScope, false);
+ testEmpty(emptySymbol, true);
+ testEmpty(fullSymbol, false);
+ }
+
+ private void testEmpty(IAddressInterval interval, boolean empty) {
+ Assert.assertEquals(empty, interval.hasEmptyRange());
+ }
+
+ @Test
+ public void getLowAddress() {
+ testLowAddress(emptySection, fourty);
+ testLowAddress(fullSection, fourty);
+
+ testLowAddress(emptyExecutableSection, fourty);
+ testLowAddress(fullExecutableSection, fourty);
+
+ testLowAddress(emptyScope, twenty);
+ testLowAddress(fullScope, twenty);
+
+ testLowAddress(emptySymbol, fourty);
+ testLowAddress(fullSymbol, twenty);
+ }
+
+ private void testLowAddress(IAddressInterval interval, IAddress address) {
+ Assert.assertEquals(address, interval.getLowAddress());
+ }
+
+ @Test
+ public void getHighAddress() {
+ testHighAddress(emptySection, fourty);
+ testHighAddress(fullSection, twoFourty);
+
+ testHighAddress(emptyExecutableSection, fourty);
+ testHighAddress(fullExecutableSection, oneFourty);
+
+ testHighAddress(emptyScope, twenty);
+ testHighAddress(fullScope, fourty);
+
+ testHighAddress(emptySymbol, fourty);
+ testHighAddress(fullSymbol, fourty);
+ }
+
+ private void testHighAddress(IAddressInterval interval, IAddress address) {
+ Assert.assertEquals(address, interval.getHighAddress());
+ }
+
+ @Test
+ public void getSize() {
+ testGetSize(emptySection, 0);
+ testGetSize(fullSection, 0x200);
+
+ testGetSize(emptyExecutableSection, 0);
+ testGetSize(fullExecutableSection, 0x100);
+
+ testGetSize(emptySymbol, 0);
+ testGetSize(fullSymbol, 0x20);
+ }
+
+ private void testGetSize(IAddressInterval interval, int size) {
+ Assert.assertTrue(interval instanceof IHasSize);
+ Assert.assertEquals(size, ((IHasSize) interval).getSize());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestRangeList.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestRangeList.java
new file mode 100644
index 0000000..a4eb64a
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestRangeList.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Iterator;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.RangeList;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList.Entry;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestRangeList {
+
+ private static RangeList first;
+ private static int low;
+ private static int high;
+ private static RangeList second;
+ private static RangeList expectedMerged;
+
+ @BeforeClass
+ public static void init(){
+ low = 0;
+ high = 120;
+ first = new RangeList();
+ first.addRange(low,10);
+ first.addRange(25,32);
+ first.addRange(60,68);
+ first.addRange(107,high);
+
+ second = new RangeList();
+ second.addRange(7,18);
+ second.addRange(32,35);
+ second.addRange(52,60);
+ second.addRange(75,80);
+ second.addRange(93,high);
+
+ expectedMerged = new RangeList();
+ expectedMerged.addRange(low,18);
+ expectedMerged.addRange(25,35);
+ expectedMerged.addRange(52,68);
+ expectedMerged.addRange(75,80);
+ expectedMerged.addRange(93,high);
+ }
+
+ @Test
+ public void lowHigh(){
+ assertEquals(low,first.getLowAddress());
+ assertEquals(high,first.getHighAddress());
+
+ assertEquals(low,expectedMerged.getLowAddress());
+ assertEquals(high,expectedMerged.getHighAddress());
+ }
+
+ @Test
+ public void merge(){
+ IRangeList merged = RangeList.mergeRangeLists(first, second);
+ Iterator<Entry> mergedIter = merged.iterator();
+ Iterator<Entry> expectedIter = expectedMerged.iterator();
+ while (mergedIter.hasNext() && expectedIter.hasNext()){
+ assertEquals("Entries should be equal",expectedIter.next(),mergedIter.next());
+ }
+ assertFalse("Should be finished",mergedIter.hasNext());
+ assertFalse("Should be finished",expectedIter.hasNext());
+ }
+
+ @Test
+ public void isInRange(){
+ checkInRange(7,true,true,true);
+ checkInRange(8,true,true,true);
+ checkInRange(10,false,true,true);
+ checkInRange(20,false,false,false);
+ checkInRange(60,true,false,true);
+ }
+
+ private void checkInRange(int point, boolean inFirst, boolean inSecond, boolean inExpectedMerged) {
+ assertEquals(inFirst,first.isInRange(point));
+ assertEquals(inSecond,second.isInRange(point));
+ assertEquals(inExpectedMerged,expectedMerged.isInRange(point));
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestReflectionHelper.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestReflectionHelper.java
new file mode 100644
index 0000000..00e40cf
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestReflectionHelper.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This software, including documentation is protected by copyright controlled
+ * by Nokia Corporation. Copying, including reproducing, storing, adapting or
+ * translating, any or all of this material can only be done in accordance
+ * with the Nokia Symbian License version 1.0 (or any subsequent update) or
+ * any other license terms expressly agreed between you and Nokia.
+ * This material contains Nokia's confidential information which
+ * may not be disclosed to others without the prior written consent of Nokia.
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class TestReflectionHelper {
+
+ public static Object getPrivateField(final String fieldName, final Object o)
+ throws NoSuchFieldException, IllegalAccessException {
+ Class<?> c = o.getClass();
+ Field f = c.getDeclaredField(fieldName);
+ f.setAccessible(true);
+ return f.get(o);
+ }
+
+ public static boolean privateStringEquality(final String left,
+ final String rightFieldName, final Object o)
+ throws SecurityException, IllegalArgumentException,
+ NoSuchFieldException, IllegalAccessException {
+ return left.equals(getPrivateField(rightFieldName, o));
+ }
+
+ public static String stringFromPrivateFunction(final Object o,
+ final String funcName) throws NoSuchMethodException,
+ IllegalAccessException, InvocationTargetException {
+ Class<?> c = o.getClass();
+ Method m = c.getDeclaredMethod(funcName, (Class<?>[]) null);
+ if (!m.getReturnType().equals(String.class))
+ throw new IllegalArgumentException("member function '" + funcName + "' must return type String");
+ m.setAccessible(true);
+ return (String)m.invoke(o, (Object[])null);
+ }
+
+ private static Class<?>[] getArgClasses(final Object[] argList) {
+ Class<?>[] argClasses = null;
+ if (argList != null && argList.length > 0) {
+ argClasses = new Class<?>[argList.length];
+ for (int i = 0 ; i < argList.length; ++i) {
+ argClasses[i] = argList[i].getClass();
+ }
+ }
+ return argClasses;
+ }
+
+ public static Object objectFromPrivateFunctionWithArgs(
+ final Object o, final String funcName, final Object[] argList)
+ throws NoSuchMethodException, IllegalAccessException,
+ InvocationTargetException {
+ return objectFromPrivateFunctionWithArgs(o, funcName, argList, getArgClasses(argList));
+ }
+
+ public static Object objectFromPrivateFunctionWithArgs(
+ final Object o, final Class<?> c, final String funcName, final Object[] argList)
+ throws NoSuchMethodException, IllegalAccessException,
+ InvocationTargetException {
+ return objectFromPrivateFunctionWithArgs(o, c, funcName, argList, getArgClasses(argList));
+ }
+
+ public static Object objectFromPrivateFunctionWithArgs(
+ final Object o, final String funcName,
+ final Object[] argList, final Class<?>[] argClasses)
+ throws NoSuchMethodException, IllegalAccessException,
+ InvocationTargetException {
+ Class<?> c = o.getClass();
+ return objectFromPrivateFunctionWithArgs(o, c, funcName, argList, argClasses);
+ }
+
+ public static Object objectFromPrivateFunctionWithArgs(
+ final Object o, final Class<?> c, final String funcName,
+ final Object[] argList, final Class<?>[] argClasses)
+ throws NoSuchMethodException, IllegalAccessException,
+ InvocationTargetException {
+ Method m = c.getDeclaredMethod(funcName, argClasses);
+ m.setAccessible(true);
+ return m.invoke(o, argList);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestSymbolicsReader.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestSymbolicsReader.java
new file mode 100644
index 0000000..95c850b
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestSymbolicsReader.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2011 Broadcom Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Broadcom Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.util.Collection;
+
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.utils.Addr32;
+import org.junit.Test;
+
+public class TestSymbolicsReader extends AbstractDwarfReaderTest {
+
+ @Test
+ public void getSymbolAtAddress() {
+ for (TestInfo info : testInfos.values()) {
+ IExecutableSymbolicsReader reader = Symbols.getSymbolReader(info.symFile);
+ assertNotNull(reader);
+ if (info.symbols == null){// No test data for that info
+ continue;
+ }
+ for (SymbolInfo symbol : info.symbols) {
+ String addressString = "0x" + symbol.address;
+ ISymbol gotSymbol = reader.getSymbolAtAddress(new Addr32(addressString));
+ String assertMsgSuffix = symbol.toString() + ", " + gotSymbol.toString();
+ assertNotNull("Null symbol for : " + assertMsgSuffix, gotSymbol);
+ assertEquals("Addresses equal: " + assertMsgSuffix,
+ addressString, gotSymbol.getAddress().toHexAddressString());
+ assertEquals("Names equal " + assertMsgSuffix,
+ symbol.name, gotSymbol.getName());
+ assertEquals("Size equal " + assertMsgSuffix,
+ symbol.size, gotSymbol.getSize());
+ }
+ }
+ }
+
+ @Test
+ public void getSymbolsAtAddress() {
+ for (TestInfo info : testInfos.values()) {
+ IExecutableSymbolicsReader reader = Symbols.getSymbolReader(info.symFile);
+ assertNotNull(reader);
+ if (info.symbols == null){// No test data for that info
+ continue;
+ }
+ for (SymbolInfo symbol : info.symbols) {
+ String addressString = "0x" + symbol.address;
+ Collection<ISymbol> gotSymbols = reader.getSymbolsAtAddress(new Addr32(addressString));
+ assertTrue("At least one symbol", gotSymbols.size() >= 1);
+ boolean foundEqualName = false;
+ for (ISymbol gotSymbol : gotSymbols) {
+ assertNotNull(gotSymbol);
+ assertEquals("Addresses equal", addressString, gotSymbol.getAddress().toHexAddressString());
+ if (symbol.name.equals(gotSymbol.getName())) {
+ foundEqualName = true;
+ assertEquals("Size equal", symbol.size, gotSymbol.getSize());
+ }
+ }
+ assertTrue(foundEqualName);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFLoggingService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFLoggingService.java
new file mode 100644
index 0000000..f851cb1
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFLoggingService.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation, June 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.EDCTestAgent;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.IUnitTestDriver;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.LoggingService;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.junit.Assert;
+
+/**
+ * Test TCF {@link ILogging} service defined by EDC.
+ */
+public class TestTCFLoggingService extends BaseTCFServiceTest {
+
+ private boolean testWriteOK = false;
+ private boolean testWritelnOK = false;
+ private boolean testDialogOK = false;
+
+ private final String WRITE_MSG = "Mystring_Logging_Write";
+ private final String WRITELN_MSG = "Mystring_Logging_Writeln";
+ private final String DIALOG_MSG = "Mystring_Logging_Dialog";
+
+ // This should match that defined in agent. It's easy when
+ // the agent is written in Java and resides in the same plugin
+ // as this test does.
+ private static final String LOGGER_ID = LoggingService.CONSOLE_LOGGER_ID;
+
+ private boolean loggingTestDone = false;
+
+ protected void testLoggingService(final ILogging logSvc, final IUnitTestDriver testDriveSvc) {
+ // Use TestDriver service to ask Logging service to fire some events, which
+ // should then be received by the log event listener, where we would check
+ // if the messages from event matches the strings we send out here.
+
+ if (testDriveSvc == null) {
+ errorInTCFThread("IUnitTestDriver service is required in agent to test ILogging service.");
+ return;
+ }
+
+ ILogging.LogListener myLoggingListener = new ILogging.LogListener() {
+
+ public void writeln(String msg) {
+ testWritelnOK = msg.equals(WRITELN_MSG);
+ }
+
+ public void write(String msg) {
+ testWriteOK = msg.equals(WRITE_MSG);
+ }
+
+ public void dialog(int severity, String summary, String details) {
+ testDialogOK = summary.equals(DIALOG_MSG) && details.equals(DIALOG_MSG);
+
+ // As we fire the "dialog" event last (see testLoggingService()),
+ // it's assume that the "dialog" event is the last one we receive here.
+ // Now we can remove the listener.
+ if (logSvc != null)
+ logSvc.removeListener(LOGGER_ID, this, new ILogging.DoneRemoveListener() {
+ public void doneRemoveListener(IToken token, Exception error) {
+ if (error != null)
+ errorInTCFThread("LoggingService.removeListener() failed.");
+
+ loggingTestDone = true;
+ }
+ });
+ }
+ };
+
+ logSvc.addListener(LOGGER_ID, myLoggingListener, new ILogging.DoneAddListener() {
+ public void doneAddListener(IToken token, Exception error) {
+ if (error != null) {
+ errorInTCFThread("LoggingService: fail to addListener: " + error.getMessage());
+ return;
+ }
+
+ testDriveSvc.loggingWrite(WRITE_MSG, new IUnitTestDriver.DoneWithNoReplyCommand() {
+ public void done(IToken token, Throwable error) {
+ if (error != null) {
+ errorInTCFThread("TestDriverService: fail to invoke [write] in ILogging service: " + error.getMessage());
+ return;
+ }
+
+ testDriveSvc.loggingWriteln(WRITELN_MSG, new IUnitTestDriver.DoneWithNoReplyCommand() {
+ public void done(IToken token, Throwable error) {
+ if (error != null) {
+ errorInTCFThread("TestDriverService: fail to invoke [writeln] in ILogging service: " + error.getMessage());
+ return;
+ }
+
+ testDriveSvc.loggingDialog(DIALOG_MSG, new IUnitTestDriver.DoneWithNoReplyCommand() {
+ public void done(IToken token, Throwable error) {
+ if (error != null)
+ errorInTCFThread("TestDriverService: fail to invoke [dialog] in ILogging service: " + error.getMessage());
+ }
+ });
+ }
+ });
+ }
+ });
+ }
+ });
+
+ }
+
+ @Override
+ protected EDCTestAgent getTestAgentInstance() {
+ return EDCTestAgent.getInstance();
+ }
+
+ @Override
+ protected boolean testDone() {
+ return loggingTestDone;
+ }
+
+ @Override
+ protected void testTCFService(IService svc, IUnitTestDriver testDriverSvc) {
+ if (svc instanceof ILogging)
+ testLoggingService((ILogging)svc, testDriverSvc);
+ }
+
+ @Override
+ protected String[] getServicesToTest() {
+ return new String[] {
+ ILogging.NAME,
+ };
+ }
+
+ @Override
+ protected void assertTestResult() {
+ Assert.assertTrue(loggingTestDone);
+ Assert.assertTrue(testWriteOK);
+ Assert.assertTrue(testWritelnOK);
+ Assert.assertTrue(testDialogOK);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFSettingsService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFSettingsService.java
new file mode 100644
index 0000000..5e5f7ec
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestTCFSettingsService.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation, June 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.services.ISettings;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.EDCTestAgent;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.IUnitTestDriver;
+import org.eclipse.cdt.debug.edc.tests.tcfagent.SettingsService;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.junit.Assert;
+
+/**
+ * Test TCF {@link ISettings} service defined by EDC.
+ */
+public class TestTCFSettingsService extends BaseTCFServiceTest {
+ private boolean getIds_ok = false;
+ private boolean setValues_ok = false;
+
+ protected void testSettingsService(final ISettings settings,
+ IUnitTestDriver testDriver) {
+ settings.getIds(new ISettings.DoneGetSettingIds() {
+ public void doneGetSettingIds(IToken token, Exception error, String[] ids) {
+ if (error != null)
+ errorInTCFThread("SettingsService.getIds command failed: " + error.getMessage());
+ else {
+ boolean failed = false;
+ if (ids.length != SettingsService.supportedSettings.length)
+ failed = true;
+ else
+ for (int i=0; i < ids.length && !failed; i++)
+ if (! ids[i].equals(SettingsService.supportedSettings[i]))
+ failed = true;
+
+ if (failed)
+ errorInTCFThread("SettingsService.getIds got the wrong IDs.");
+ else {
+ getIds_ok = true;
+
+ settings.setValues(null, ids, new Object[] {1, "value2"}, new ISettings.DoneSetSettingValues() {
+
+ public void doneSetSettingValues(IToken token, Exception error) {
+ if (error != null)
+ errorInTCFThread("SettingsService.setValues() failed: " + error.getMessage());
+ else
+ setValues_ok = true;
+ }
+ });
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ protected EDCTestAgent getTestAgentInstance() {
+ return EDCTestAgent.getInstance();
+ }
+
+ @Override
+ protected boolean testDone() {
+ return getIds_ok && setValues_ok;
+ }
+
+ @Override
+ protected void testTCFService(IService svc, IUnitTestDriver testDriverSvc) {
+ if (svc instanceof ISettings)
+ testSettingsService((ISettings)svc, testDriverSvc);
+ }
+
+ @Override
+ protected String[] getServicesToTest() {
+ return new String[] {
+ ISettings.NAME
+ };
+ }
+
+ @Override
+ protected void assertTestResult() {
+ Assert.assertTrue(getIds_ok);
+ Assert.assertTrue(setValues_ok);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerEABI.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerEABI.java
index 8f0d75d..d72ad26 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerEABI.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerEABI.java
@@ -1,312 +1,330 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerEABI;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- *
- */
-public class TestUnmanglerEABI extends TestCase {
- private UnmanglerEABI um;
-
- @Before
- public void setUp() {
- um = new UnmanglerEABI();
- }
-
- protected String unmangle(String symbol) throws UnmanglingException {
- return um.unmangle(symbol);
- }
-
- protected String unmangleType(String symbol) throws UnmanglingException {
- return um.unmangleType(symbol);
- }
-
- @Test
- public void testNotMangled() throws UnmanglingException {
- assertNull(unmangle(null));
- assertEquals("global", unmangle("global"));
- assertEquals("?myfunc@@YAHXZ", unmangle("?myfunc@@YAHXZ")); // win32, not EABI
- }
-
- @Test
- public void testSimpleGlobal() throws UnmanglingException {
- assertEquals("myfunc()", unmangle("_Z6myfuncv"));
-
- // some errors
- try {
- assertEquals("myfunc()", unmangle("_Z16myfuncv"));
- fail("expected error");
- } catch (UnmanglingException e) {
-
- }
- try {
- assertEquals("myfunc()", unmangle("_Z1myfuncv"));
- fail("expected error");
- } catch (UnmanglingException e) {
-
- }
-
- }
-
- @Test
- public void testOtherFuncs() throws UnmanglingException {
- assertEquals("foo(double,float)", unmangle("_Z3foodf"));
-
- // hmm, this example doesn't work in our unmangler or c++filt
- //assertEquals("foo()::C::bar::E::baz()", unmangle("_ZZ3foovEN1C3barEvEN1E3bazEv"));
- }
- @Test
- public void testTemplateFuncs1() throws UnmanglingException {
- assertEquals("int bar<float>(float)", unmangle("_Z3barIfEiT_"));
- assertEquals("List<char>::add(char)", unmangle("_ZN4ListIcE3addEc"));
- assertEquals("List<float>::add(float)", unmangle("_ZN4ListIfE3addEf"));
- }
-
- @Test
- public void testTemplateFuncs2() throws UnmanglingException {
- // (Note: first template is S_, Duo is S0_, first(Duo) is S1_.
- // Since the function parameter is not dependent, don't use T_.)
- assertEquals("void first<Duo>(Duo)", unmangle("_Z5firstI3DuoEvS0_"));
-
- // Ret? operator<< (X const&, X const&);
- // (Note: X is S_, X const is S0_, X const& is S1_)
- assertEquals("operator <<(X const&,X const&)", unmangle("_ZlsRK1XS1_"));
- assertEquals("operator %(X,X)", unmangle("_Zrm1XS_"));
-
- }
- @Test
- public void testStaticMember() throws UnmanglingException {
- assertEquals("S::x", unmangle("_ZN1S1xE"));
- }
- @Test
- public void testPtmfTypes1() throws UnmanglingException {
- // struct A;
- // void f (void (A::*)() const) {}
- // produces the mangled name "_Z1fM1AKFvvE".
- // name -> f
- // args -> M1AKFvvE
- assertEquals("f(void (A::*)() const)", unmangle("_Z1fM1AKFvvE"));
- }
- @Test
- public void testPtmfTypes2() throws UnmanglingException {
- assertEquals("foo(void (Foo::*)(),int (Foo::*)(float))", unmangle("_Z3fooM3FooFvvEMS_FifE"));
-
- assertEquals("foo(int AB::**)", unmangle("_Z3fooPM2ABi"));
- }
-
- @Test
- public void testBlackflag() throws UnmanglingException {
- assertEquals("show_Const_Arguments(TDesC8 const&,TDesC8 const*,TDesC8&,TDesC8*)", unmangle("_Z20show_Const_ArgumentsRK6TDesC8PS0_RS_PS_"));
- assertEquals("show_Arguments(TDes16&,TDes16*,TDes16*)", unmangle("_Z14show_ArgumentsR6TDes16PS_S1_"));
- // void tree_clear(t_node*& pRoot)
- assertEquals("tree_clear(t_node*&)", unmangle("_Z10tree_clearRP6t_node"));
- assertEquals("dbg_namespace::dbg_nameSpace_InitNamespace()", unmangle("_ZN13dbg_namespace27dbg_nameSpace_InitNamespaceEv"));
- }
-
- @Test
- public void testSpecialClassMethods() throws UnmanglingException {
- assertEquals("Der2::~Der2()", unmangle("_ZN4Der2D0Ev"));
- assertEquals("DerivedTypes::DerivedTypes()", unmangle("_ZN12DerivedTypesC2Ev"));
- }
-
- @Test
- public void testOperatorMethods() throws UnmanglingException {
- assertEquals("Klass::operator &=(Klass)", unmangle("_ZN5KlassaNES_"));
- assertEquals("Klass::operator +(Klass const&)", unmangle("_ZN5KlassplERKS_"));
- assertEquals("Klass::operator =(Klass const&)", unmangle("_ZN5KlassaSERKS_"));
- // note: c++filt doesn't show (), but 'v' is clearly there
- assertEquals("Klass::operator int() const()", unmangle("_ZNK5KlasscviEv"));
- assertEquals("List<float>::operator [](unsigned int)", unmangle("_ZN4ListIfEixEj"));
- assertEquals("operator delete[](void*)", unmangle("_ZdaPv"));
- assertEquals("operator new(unsigned int)", unmangle("_Znwj"));
-
-
- }
-
- @Test
- public void testStdExpansions() throws UnmanglingException {
- assertEquals("operator <<(::std::basic_ostream<char,::std::char_traits<char> >&,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const&)", unmangle("_ZlsRSoRKSs"));
- assertEquals("::std::__codecvt_abstract_base<char,char,int>::~__codecvt_abstract_base()", unmangle("_ZNSt23__codecvt_abstract_baseIcciED0Ev"));
- }
-
- @Test
- public void testStdTypeSubstitutions() throws UnmanglingException {
- assertEquals("::std::string", unmangleType("_ZSt6string"));
- assertEquals("::std::wstring", unmangleType("_ZSt7wstring"));
- assertEquals("::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >",
- unmangleType("_ZSs"));
- }
-
- @Test
- public void testStdTemplateSubstitutions() throws UnmanglingException {
- assertEquals("::std::allocator<::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > > >",
- unmangleType("_ZSaISt4pairIKiSsEE"));
- assertEquals("::std::allocator<::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value> >",
- unmangleType("_ZSaISt4pairIKSsN4Json5ValueEEE"));
-
- assertEquals("::std::less<int>", unmangleType("_ZSt4lessIiE"));
- assertEquals("::std::less<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >",
- unmangleType("_ZSt4lessISs"));
-
- assertEquals("::std::map<int,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >,::std::less<int>,::std::allocator<::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > > > >",
- unmangleType("_ZSt3mapIiSsSt4lessIiESaISt4pairIKiSsEEE"));
-
- assertEquals("::std::map<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >,Json::Value,::std::less<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >,::std::allocator<::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value> > >",
- unmangleType("_ZSt3mapISsN4Json5ValueESt4lessISsESaISt4pairIKSsS1_EEE"));
-
- assertEquals("::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value>",
- unmangleType("_ZSt4pairIKSsN4Json5ValueEE"));
- assertEquals("::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >",
- unmangleType("_ZSt4pairIKiSsE"));
- }
-
- @Test
- public void testExtraStuff() throws UnmanglingException {
- assertEquals("_ZdaPv", um.undecorate("_ZdaPv@@GLIBCXX_3.4"));
- assertEquals("_Znwj", um.undecorate("_Znwj@@GLIBCXX_3.4"));
- }
-
-
- @Test
- public void testTemplateWithSubst() throws UnmanglingException {
- // <encoding> = _Z + ...
- // <function-name> = "N1N1TiiE2mfE" + <bare-function-type> = "S0_IddE"
- // <nested-name> = "N" + <prefix> = "1N1TIiiE" + <unqualified-name> = "2mf" + "E"
- // <prefix> = <template-prefix> = "1N1T" + <template-args> = "IiiE"
- // S0_ = N::T (template name), so must be followed with template-args = "IddE"
- assertEquals("N::T<int,int>::mf(N::T<double,double>)", unmangle("_ZN1N1TIiiE2mfES0_IddE"));
-
- // /*T1=*/Factory</*T2=*/int> make<Factory, int>();
- // (Note: T_ = factory (a template), T0_ = int)
- assertEquals("Factory<int> make<Factory,int>()", unmangle("_Z4makeI7FactoryiET_IT0_Ev"));
- }
-
- @Test
- public void testUnnamedTypes() throws UnmanglingException {
- assertEquals("g(int)::S::f#2(int)", unmangle("_ZZ1giEN1S1fE_2i"));
- assertEquals("g(int)::S::f#2(int)::<unnamed #3>", unmangle("_ZZZ1giEN1S1fE_2iEUt1_"));
- assertEquals("g()::S::S()", unmangle("_ZZZ1gvEN1SC1EvEs"));
- assertEquals("g()::str4a", unmangle("_ZZ1gvE5str4a"));
- assertEquals("g()::string literal#1", unmangle("_ZZ1gvEs_1"));
- }
-
- @Test
- public void testTemplateArrays() throws UnmanglingException {
- assertEquals("Foo<int[4]>::bar", unmangle("_ZN3FooIA4_iE3barE"));
- }
-
- @Test
- public void testFieldNames() throws UnmanglingException {
- assertEquals("Arena::level", unmangle("_ZN5Arena5levelE"));
- assertEquals("Stack<int,int>::level", unmangle("_ZN5StackIiiE5levelE"));
- }
- @Test
- public void testSpecialNames() throws UnmanglingException {
- assertEquals("<typeinfo name for Derv1>", unmangle("_ZTS5Derv1"));
- assertEquals("<typeinfo structure for Derv1>", unmangle("_ZTI5Derv1"));
- assertEquals("<virtual table for IFaceDerived>", unmangle("_ZTV12IFaceDerived"));
- assertEquals("<VTT structure for Iface2>", unmangle("_ZTT6Iface2"));
- assertEquals("<one-time-init guard for Foo::bar()::val>", unmangle("_ZGVZN3Foo3barEvE3val"));
- assertEquals("<virtual base override at offset 0x0, vcall offset -0x10 for Bar::first()>", unmangle("_ZTv0_n16_N3Bar5firstEv"));
- assertEquals("<non-virtual base override at offset -0x4 for Bar::first()>", unmangle("_ZThn4_N3Bar5firstEv"));
- }
-
- /*@Test
- public void testClosureAndLambdaSig() throws UnmanglingException {
- assertEquals("S<int>::x::operator... ???", unmangle("_Z4algoIZ1giEUlvE0_EiT_"));
- assertEquals("???", unmangle("_ZNK1SIiE1xMUlvE_clEv"));
- assertEquals("???", unmangle("_ZZ1giENKUlvE_clEv"));
- }
-
- @Test
- public void testTemplateExprs() throws UnmanglingException {
- assertEquals("void operator-<42>(A<J+2>::T)", "_ZngILi42EEvN1AIXplT_Li2EEE1TE");
- assertEquals("...B<(J+1)/2>...", "_Z1BIXdvplT1_Li1ELi2EEE");
- */
-
- @Test
- public void testSubstitutions() throws UnmanglingException {
- // 0: TPckgBuf
- // 1: WiFiProt
- // 2: WiFiProt::TWiFiInputParams
- // 3: TPckgBuf<WiFiProt::TWiFiInputParams>
- assertEquals("TPckgBuf<WiFiProt::TWiFiInputParams>::TPckgBuf(TPckgBuf<WiFiProt::TWiFiInputParams> const&)",
- unmangle("_ZN8TPckgBufIN8WiFiProt16TWiFiInputParamsEEC1ERKS2_"));
-
- // 0: long long const
- // 1: long long const [4]
- // 2: long long const (&) [4]
- assertEquals("dVector3Dot(long long const(&)[4],long long const(&)[4])",
- unmangle("_Z11dVector3DotRA4_KxS1_"));
-
- /*
-typedef void T();
-struct S {};
-void f(T*, T (S::*)) {}
-
- */
- //assertEquals("void f(T*, T (S::*))",
- // unmangle("_Z1fPFvvEM1SFvvE"));
- assertEquals("f(void (*)(),void (S::*)())",
- unmangle("_Z1fPFvvEM1SFvvE"));
-
- assertEquals("CActiveScheduler::Start(CActiveScheduler::TLoop**)",
- unmangle("_ZN16CActiveScheduler5StartEPPNS_5TLoopE"));
-
- assertEquals("CActiveScheduler::DoRunL(CActiveScheduler::TLoop** volatile const&,CActive* volatile&,CActiveScheduler::TCleanupBundle*)",
- unmangle("_ZN16CActiveScheduler6DoRunLERVKPPNS_5TLoopERVP7CActivePNS_14TCleanupBundleE"));
- }
-
- @Test
- public void testRegressions() throws UnmanglingException {
- assertEquals("void Klass<Data,Type<Data> >::method<Type<Data> >()",
- unmangle("_ZN5KlassI4Data4TypeIS0_EE6methodIS2_EEvv"));
- assertEquals("CMMFFormatEncode::GetSupportedNumChannelsL(RArray<unsigned int>&)",
- unmangle("_ZN16CMMFFormatEncode24GetSupportedNumChannelsLER6RArrayIjE"));
- assertEquals("MeshMachine::TAggregatedTransition<CoreNetStates::TAddDataClient,PRStates::TSendProvision,MeshMachine::TNodeContext<ESock::CMMCommsProviderBase,MeshMachine::TNodeContext<ESock::ACFMMNodeBase,MeshMachine::TNodeContext<MeshMachine::AMMNodeBase,MeshMachine::TNodeContextBase,MeshMachine::CNodeActivityBase>,MeshMachine::CNodeActivityBase>,MeshMachine::CNodeActivityBase> >::~TAggregatedTransition()",
- unmangle("_ZN11MeshMachine21TAggregatedTransitionIN13CoreNetStates14TAddDataClientEN8PRStates14TSendProvisionENS_12TNodeContextIN5ESock20CMMCommsProviderBaseENS5_INS6_13ACFMMNodeBaseENS5_INS_11AMMNodeBaseENS_16TNodeContextBaseENS_17CNodeActivityBaseEEESB_EESB_EEED1Ev"));
- }
-
-
- @Test
- public void testExpressions1() throws UnmanglingException {
- assertEquals("TBuf8<128>::TBuf8(TBuf8<128> const&)",
- unmangle("_ZN5TBuf8ILi128EEC1ERKS0_"));
-
- // int types have suffixes
- assertEquals("CArrayFix<TBuf8<6> >::~CArrayFix()",
- unmangle("_ZN9CArrayFixI5TBuf8ILi6EEED1Ev"));
- assertEquals("int something<10UL>(float)",
- unmangle("_Z9somethingILm10EEif"));
- assertEquals("CArrayFix<TBuf8<6LL> >::~CArrayFix()",
- unmangle("_ZN9CArrayFixI5TBuf8ILx6EEED1Ev"));
-
- // show cast-to-type name if not simple int
- assertEquals("CArrayFix<TBuf8<(__int128)6> >::~CArrayFix()",
- unmangle("_ZN9CArrayFixI5TBuf8ILn6EEED1Ev"));
- }
-
- @Test
- public void testEnumConstants() throws UnmanglingException {
- assertEquals("Json::objectValue",
- unmangle("__N4Json11objectValueE"));
- assertEquals("Json::ValueType",
- unmangle("_ZN4Json9ValueTypeE"));
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerEABI;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class TestUnmanglerEABI extends TestCase {
+ private UnmanglerEABI um;
+
+ @Before
+ public void setUp() {
+ um = new UnmanglerEABI();
+ }
+
+ protected String unmangle(String symbol) throws UnmanglingException {
+ return um.unmangle(symbol);
+ }
+
+ protected String unmangleType(String symbol) throws UnmanglingException {
+ return um.unmangleType(symbol);
+ }
+
+ @Test
+ public void testNotMangled() throws UnmanglingException {
+ assertNull(unmangle(null));
+ assertEquals("global", unmangle("global"));
+ assertEquals("?myfunc@@YAHXZ", unmangle("?myfunc@@YAHXZ")); // win32, not EABI
+ }
+
+ @Test
+ public void testErrorCases() throws UnmanglingException {
+ assertEquals("myfunc()", unmangle("_Z6myfuncv"));
+
+ try {
+ assertEquals("myfunc()", unmangle("_Z16myfuncv"));
+ fail("expected error");
+ } catch (UnmanglingException e) {
+ }
+
+ try {
+ assertEquals("myfunc()", unmangle("_Z1myfuncv"));
+ fail("expected error");
+ } catch (UnmanglingException e) {
+ }
+
+ // Throw unimplemented exception.
+ //
+ assertEquals("Foo<int[4]>::bar", unmangle("_ZN3FooIA4_iE3barE")); // right
+ try {
+ assertEquals("Foo<int[4]>::bar", unmangle("_ZN3FooIAb_NNN")); // wrong
+ fail("expected error");
+ } catch (UnmanglingException e) {
+ System.out.println(e.toString());
+ System.out.println(e.getPartialUnmangling());
+ }
+
+ // Throw unexpected(string) exception.
+ //
+ assertEquals("g(int)::S::f#2(int)", unmangle("_ZZ1giEN1S1fE_2i")); // right
+ try {
+ assertEquals("g(int)::S::f#2(int)", unmangle("_ZZ1giEN1S1fE_b")); // wrong
+ fail("expected error");
+ } catch (UnmanglingException e) {
+ }
+
+ }
+
+ @Test
+ public void testOtherFuncs() throws UnmanglingException {
+ assertEquals("foo(double,float)", unmangle("_Z3foodf"));
+
+ // hmm, this example doesn't work in our unmangler or c++filt
+ //assertEquals("foo()::C::bar::E::baz()", unmangle("_ZZ3foovEN1C3barEvEN1E3bazEv"));
+ }
+ @Test
+ public void testTemplateFuncs1() throws UnmanglingException {
+ assertEquals("int bar<float>(float)", unmangle("_Z3barIfEiT_"));
+ assertEquals("List<char>::add(char)", unmangle("_ZN4ListIcE3addEc"));
+ assertEquals("List<float>::add(float)", unmangle("_ZN4ListIfE3addEf"));
+ }
+
+ @Test
+ public void testTemplateFuncs2() throws UnmanglingException {
+ // (Note: first template is S_, Duo is S0_, first(Duo) is S1_.
+ // Since the function parameter is not dependent, don't use T_.)
+ assertEquals("void first<Duo>(Duo)", unmangle("_Z5firstI3DuoEvS0_"));
+
+ // Ret? operator<< (X const&, X const&);
+ // (Note: X is S_, X const is S0_, X const& is S1_)
+ assertEquals("operator <<(X const&,X const&)", unmangle("_ZlsRK1XS1_"));
+ assertEquals("operator %(X,X)", unmangle("_Zrm1XS_"));
+
+ }
+ @Test
+ public void testStaticMember() throws UnmanglingException {
+ assertEquals("S::x", unmangle("_ZN1S1xE"));
+ }
+ @Test
+ public void testPtmfTypes1() throws UnmanglingException {
+ // struct A;
+ // void f (void (A::*)() const) {}
+ // produces the mangled name "_Z1fM1AKFvvE".
+ // name -> f
+ // args -> M1AKFvvE
+ assertEquals("f(void (A::*)() const)", unmangle("_Z1fM1AKFvvE"));
+ }
+ @Test
+ public void testPtmfTypes2() throws UnmanglingException {
+ assertEquals("foo(void (Foo::*)(),int (Foo::*)(float))", unmangle("_Z3fooM3FooFvvEMS_FifE"));
+
+ assertEquals("foo(int AB::**)", unmangle("_Z3fooPM2ABi"));
+ }
+
+ @Test
+ public void testBlackflag() throws UnmanglingException {
+ assertEquals("show_Const_Arguments(TDesC8 const&,TDesC8 const*,TDesC8&,TDesC8*)", unmangle("_Z20show_Const_ArgumentsRK6TDesC8PS0_RS_PS_"));
+ assertEquals("show_Arguments(TDes16&,TDes16*,TDes16*)", unmangle("_Z14show_ArgumentsR6TDes16PS_S1_"));
+ // void tree_clear(t_node*& pRoot)
+ assertEquals("tree_clear(t_node*&)", unmangle("_Z10tree_clearRP6t_node"));
+ assertEquals("dbg_namespace::dbg_nameSpace_InitNamespace()", unmangle("_ZN13dbg_namespace27dbg_nameSpace_InitNamespaceEv"));
+ }
+
+ @Test
+ public void testSpecialClassMethods() throws UnmanglingException {
+ assertEquals("Der2::~Der2()", unmangle("_ZN4Der2D0Ev"));
+ assertEquals("DerivedTypes::DerivedTypes()", unmangle("_ZN12DerivedTypesC2Ev"));
+ }
+
+ @Test
+ public void testOperatorMethods() throws UnmanglingException {
+ assertEquals("Klass::operator &=(Klass)", unmangle("_ZN5KlassaNES_"));
+ assertEquals("Klass::operator +(Klass const&)", unmangle("_ZN5KlassplERKS_"));
+ assertEquals("Klass::operator =(Klass const&)", unmangle("_ZN5KlassaSERKS_"));
+ // note: c++filt doesn't show (), but 'v' is clearly there
+ assertEquals("Klass::operator int() const()", unmangle("_ZNK5KlasscviEv"));
+ assertEquals("List<float>::operator [](unsigned int)", unmangle("_ZN4ListIfEixEj"));
+ assertEquals("operator delete[](void*)", unmangle("_ZdaPv"));
+ assertEquals("operator new(unsigned int)", unmangle("_Znwj"));
+
+
+ }
+
+ @Test
+ public void testStdExpansions() throws UnmanglingException {
+ assertEquals("operator <<(::std::basic_ostream<char,::std::char_traits<char> >&,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const&)", unmangle("_ZlsRSoRKSs"));
+ assertEquals("::std::__codecvt_abstract_base<char,char,int>::~__codecvt_abstract_base()", unmangle("_ZNSt23__codecvt_abstract_baseIcciED0Ev"));
+ }
+
+ @Test
+ public void testStdTypeSubstitutions() throws UnmanglingException {
+ assertEquals("::std::string", unmangleType("_ZSt6string"));
+ assertEquals("::std::wstring", unmangleType("_ZSt7wstring"));
+ assertEquals("::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >",
+ unmangleType("_ZSs"));
+ }
+
+ @Test
+ public void testStdTemplateSubstitutions() throws UnmanglingException {
+ assertEquals("::std::allocator<::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > > >",
+ unmangleType("_ZSaISt4pairIKiSsEE"));
+ assertEquals("::std::allocator<::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value> >",
+ unmangleType("_ZSaISt4pairIKSsN4Json5ValueEEE"));
+
+ assertEquals("::std::less<int>", unmangleType("_ZSt4lessIiE"));
+ assertEquals("::std::less<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >",
+ unmangleType("_ZSt4lessISs"));
+
+ assertEquals("::std::map<int,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >,::std::less<int>,::std::allocator<::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > > > >",
+ unmangleType("_ZSt3mapIiSsSt4lessIiESaISt4pairIKiSsEEE"));
+
+ assertEquals("::std::map<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >,Json::Value,::std::less<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >,::std::allocator<::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value> > >",
+ unmangleType("_ZSt3mapISsN4Json5ValueESt4lessISsESaISt4pairIKSsS1_EEE"));
+
+ assertEquals("::std::pair<::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > const,Json::Value>",
+ unmangleType("_ZSt4pairIKSsN4Json5ValueEE"));
+ assertEquals("::std::pair<int const,::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> > >",
+ unmangleType("_ZSt4pairIKiSsE"));
+ }
+
+ @Test
+ public void testExtraStuff() throws UnmanglingException {
+ assertEquals("_ZdaPv", um.undecorate("_ZdaPv@@GLIBCXX_3.4"));
+ assertEquals("_Znwj", um.undecorate("_Znwj@@GLIBCXX_3.4"));
+ }
+
+
+ @Test
+ public void testTemplateWithSubst() throws UnmanglingException {
+ // <encoding> = _Z + ...
+ // <function-name> = "N1N1TiiE2mfE" + <bare-function-type> = "S0_IddE"
+ // <nested-name> = "N" + <prefix> = "1N1TIiiE" + <unqualified-name> = "2mf" + "E"
+ // <prefix> = <template-prefix> = "1N1T" + <template-args> = "IiiE"
+ // S0_ = N::T (template name), so must be followed with template-args = "IddE"
+ assertEquals("N::T<int,int>::mf(N::T<double,double>)", unmangle("_ZN1N1TIiiE2mfES0_IddE"));
+
+ // /*T1=*/Factory</*T2=*/int> make<Factory, int>();
+ // (Note: T_ = factory (a template), T0_ = int)
+ assertEquals("Factory<int> make<Factory,int>()", unmangle("_Z4makeI7FactoryiET_IT0_Ev"));
+ }
+
+ @Test
+ public void testUnnamedTypes() throws UnmanglingException {
+ assertEquals("g(int)::S::f#2(int)", unmangle("_ZZ1giEN1S1fE_2i"));
+ assertEquals("g(int)::S::f#2(int)::<unnamed #3>", unmangle("_ZZZ1giEN1S1fE_2iEUt1_"));
+ assertEquals("g()::S::S()", unmangle("_ZZZ1gvEN1SC1EvEs"));
+ assertEquals("g()::str4a", unmangle("_ZZ1gvE5str4a"));
+ assertEquals("g()::string literal#1", unmangle("_ZZ1gvEs_1"));
+ }
+
+ @Test
+ public void testTemplateArrays() throws UnmanglingException {
+ assertEquals("Foo<int[4]>::bar", unmangle("_ZN3FooIA4_iE3barE"));
+ }
+
+ @Test
+ public void testFieldNames() throws UnmanglingException {
+ assertEquals("Arena::level", unmangle("_ZN5Arena5levelE"));
+ assertEquals("Stack<int,int>::level", unmangle("_ZN5StackIiiE5levelE"));
+ }
+ @Test
+ public void testSpecialNames() throws UnmanglingException {
+ assertEquals("<typeinfo name for Derv1>", unmangle("_ZTS5Derv1"));
+ assertEquals("<typeinfo structure for Derv1>", unmangle("_ZTI5Derv1"));
+ assertEquals("<virtual table for IFaceDerived>", unmangle("_ZTV12IFaceDerived"));
+ assertEquals("<VTT structure for Iface2>", unmangle("_ZTT6Iface2"));
+ assertEquals("<one-time-init guard for Foo::bar()::val>", unmangle("_ZGVZN3Foo3barEvE3val"));
+ assertEquals("<virtual base override at offset 0x0, vcall offset -0x10 for Bar::first()>", unmangle("_ZTv0_n16_N3Bar5firstEv"));
+ assertEquals("<non-virtual base override at offset -0x4 for Bar::first()>", unmangle("_ZThn4_N3Bar5firstEv"));
+ }
+
+ /*@Test
+ public void testClosureAndLambdaSig() throws UnmanglingException {
+ assertEquals("S<int>::x::operator... ???", unmangle("_Z4algoIZ1giEUlvE0_EiT_"));
+ assertEquals("???", unmangle("_ZNK1SIiE1xMUlvE_clEv"));
+ assertEquals("???", unmangle("_ZZ1giENKUlvE_clEv"));
+ }
+
+ @Test
+ public void testTemplateExprs() throws UnmanglingException {
+ assertEquals("void operator-<42>(A<J+2>::T)", "_ZngILi42EEvN1AIXplT_Li2EEE1TE");
+ assertEquals("...B<(J+1)/2>...", "_Z1BIXdvplT1_Li1ELi2EEE");
+ */
+
+ @Test
+ public void testSubstitutions() throws UnmanglingException {
+ // 0: TPckgBuf
+ // 1: WiFiProt
+ // 2: WiFiProt::TWiFiInputParams
+ // 3: TPckgBuf<WiFiProt::TWiFiInputParams>
+ assertEquals("TPckgBuf<WiFiProt::TWiFiInputParams>::TPckgBuf(TPckgBuf<WiFiProt::TWiFiInputParams> const&)",
+ unmangle("_ZN8TPckgBufIN8WiFiProt16TWiFiInputParamsEEC1ERKS2_"));
+
+ // 0: long long const
+ // 1: long long const [4]
+ // 2: long long const (&) [4]
+ assertEquals("dVector3Dot(long long const(&)[4],long long const(&)[4])",
+ unmangle("_Z11dVector3DotRA4_KxS1_"));
+
+ /*
+typedef void T();
+struct S {};
+void f(T*, T (S::*)) {}
+
+ */
+ //assertEquals("void f(T*, T (S::*))",
+ // unmangle("_Z1fPFvvEM1SFvvE"));
+ assertEquals("f(void (*)(),void (S::*)())",
+ unmangle("_Z1fPFvvEM1SFvvE"));
+
+ assertEquals("CActiveScheduler::Start(CActiveScheduler::TLoop**)",
+ unmangle("_ZN16CActiveScheduler5StartEPPNS_5TLoopE"));
+
+ assertEquals("CActiveScheduler::DoRunL(CActiveScheduler::TLoop** volatile const&,CActive* volatile&,CActiveScheduler::TCleanupBundle*)",
+ unmangle("_ZN16CActiveScheduler6DoRunLERVKPPNS_5TLoopERVP7CActivePNS_14TCleanupBundleE"));
+ }
+
+ @Test
+ public void testRegressions() throws UnmanglingException {
+ assertEquals("void Klass<Data,Type<Data> >::method<Type<Data> >()",
+ unmangle("_ZN5KlassI4Data4TypeIS0_EE6methodIS2_EEvv"));
+ assertEquals("CMMFFormatEncode::GetSupportedNumChannelsL(RArray<unsigned int>&)",
+ unmangle("_ZN16CMMFFormatEncode24GetSupportedNumChannelsLER6RArrayIjE"));
+ assertEquals("MeshMachine::TAggregatedTransition<CoreNetStates::TAddDataClient,PRStates::TSendProvision,MeshMachine::TNodeContext<ESock::CMMCommsProviderBase,MeshMachine::TNodeContext<ESock::ACFMMNodeBase,MeshMachine::TNodeContext<MeshMachine::AMMNodeBase,MeshMachine::TNodeContextBase,MeshMachine::CNodeActivityBase>,MeshMachine::CNodeActivityBase>,MeshMachine::CNodeActivityBase> >::~TAggregatedTransition()",
+ unmangle("_ZN11MeshMachine21TAggregatedTransitionIN13CoreNetStates14TAddDataClientEN8PRStates14TSendProvisionENS_12TNodeContextIN5ESock20CMMCommsProviderBaseENS5_INS6_13ACFMMNodeBaseENS5_INS_11AMMNodeBaseENS_16TNodeContextBaseENS_17CNodeActivityBaseEEESB_EESB_EEED1Ev"));
+ }
+
+
+ @Test
+ public void testExpressions1() throws UnmanglingException {
+ assertEquals("TBuf8<128>::TBuf8(TBuf8<128> const&)",
+ unmangle("_ZN5TBuf8ILi128EEC1ERKS0_"));
+
+ // int types have suffixes
+ assertEquals("CArrayFix<TBuf8<6> >::~CArrayFix()",
+ unmangle("_ZN9CArrayFixI5TBuf8ILi6EEED1Ev"));
+ assertEquals("int something<10UL>(float)",
+ unmangle("_Z9somethingILm10EEif"));
+ assertEquals("CArrayFix<TBuf8<6LL> >::~CArrayFix()",
+ unmangle("_ZN9CArrayFixI5TBuf8ILx6EEED1Ev"));
+
+ // show cast-to-type name if not simple int
+ assertEquals("CArrayFix<TBuf8<(__int128)6> >::~CArrayFix()",
+ unmangle("_ZN9CArrayFixI5TBuf8ILn6EEED1Ev"));
+ }
+
+ @Test
+ public void testEnumConstants() throws UnmanglingException {
+ assertEquals("Json::objectValue",
+ unmangle("__N4Json11objectValueE"));
+ assertEquals("Json::ValueType",
+ unmangle("_ZN4Json9ValueTypeE"));
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerWin32.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerWin32.java
new file mode 100644
index 0000000..9b2d2ab
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUnmanglerWin32.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation. Jun 29, 2011
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerWin32;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Note: {@link UnmanglerWin32} is just stubbed, thus this test is just a stub.
+ */
+public class TestUnmanglerWin32 extends Assert {
+ @Test
+ public void testUnmanglerWin32() throws UnmanglingException {
+ UnmanglerWin32 um = new UnmanglerWin32();
+
+ assertTrue(um.isMangled("?ab"));
+ assertFalse(um.isMangled("ab"));
+
+ assertEquals("main", um.undecorate("_main"));
+ assertEquals("func", um.undecorate("__imp_func"));
+
+ um.unmangle("doNothing");
+ um.unmangleType("bogus");
+ um.unmangleWithoutArgs("bogus");
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUtils.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUtils.java
index 684fffd..7b87b70 100644
--- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUtils.java
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/TestUtils.java
@@ -1,621 +1,678 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.tests;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-
-import org.eclipse.cdt.debug.edc.ITCFAgentLauncher;
-import org.eclipse.cdt.debug.edc.formatter.IVariableValueConverter;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.TCFServiceManager;
-import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl;
-import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
-import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
-import org.eclipse.cdt.debug.edc.launch.IEDCLaunchConfigurationConstants;
-import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
-import org.eclipse.cdt.debug.edc.services.IEDCExpression;
-import org.eclipse.cdt.debug.edc.services.Stack;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.datamodel.IDMContext;
-import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IExpressions2;
-import org.eclipse.cdt.dsf.debug.service.IExpressions2.CastInfo;
-import org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
-import org.eclipse.cdt.dsf.debug.service.IStack;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
-import org.eclipse.cdt.dsf.service.DsfServicesTracker;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tm.tcf.services.IRunControl;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.junit.Assert;
-
-@SuppressWarnings("restriction")
-public class TestUtils {
-
- private static final Map<DsfSession,Map<Object,Object>> services = Collections
- .synchronizedMap(new HashMap<DsfSession,Map<Object,Object>>());
-
- public interface Condition {
-
- boolean isConditionValid()throws Exception;
-
- }
-
- public static final long DEFAULT_WAIT_TIMEOUT = 60000;
- public static final long DEFAULT_WAIT_INTERVAL = 10;
-
- public static void wait(Condition condition) throws Exception {
- wait(condition, DEFAULT_WAIT_TIMEOUT, DEFAULT_WAIT_INTERVAL);
- }
-
- public static void waitOnExecutorThread(DsfSession session, Condition condition) throws Exception {
- waitOnExecutorThread(session, condition, DEFAULT_WAIT_TIMEOUT, DEFAULT_WAIT_INTERVAL);
- }
-
- public static void wait(Condition condition, long timeout) throws Exception {
- wait(condition, timeout, DEFAULT_WAIT_INTERVAL);
- }
-
- public static void waitOnExecutorThread(DsfSession session, Condition condition, long timeout) throws Exception {
- waitOnExecutorThread(session, condition, timeout, DEFAULT_WAIT_INTERVAL);
- }
-
- static public class ConditionQuery extends Query<Boolean> {
-
- private final Condition condition;
-
- public ConditionQuery(Condition condition) {
- super();
- this.condition = condition;
- }
-
- @Override
- protected void execute(DataRequestMonitor<Boolean> rm) {
- try {
- rm.setData(condition.isConditionValid());
- } catch (Exception e) {
- rm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
- null, e)); //$NON-NLS-1$
- }
- rm.done();
- }
- };
-
- public static void waitOnExecutorThread(DsfSession session, final Condition condition, final long timeout,
- final long interval) throws Exception {
-
- long limit = System.currentTimeMillis() + timeout;
-
- ConditionQuery conditionRunnable = new ConditionQuery(condition);
- session.getExecutor().execute(conditionRunnable);
- boolean conditionValid = conditionRunnable.get();
-
- while (!conditionValid) {
- Thread.sleep(interval);
- if (System.currentTimeMillis() > limit)
- throw new AssertionError();
- conditionRunnable = new TestUtils.ConditionQuery(condition);
- session.getExecutor().execute(conditionRunnable);
- conditionValid = conditionRunnable.get();
- }
-
- }
-
- public static void wait(Condition condition, long timeout, long interval) throws Exception {
- long limit = System.currentTimeMillis() + timeout;
- while (!condition.isConditionValid()) {
- Display display = Display.getCurrent();
- if (display != null && !display.readAndDispatch())
- display.sleep();
- Thread.sleep(interval);
- if (System.currentTimeMillis() > limit)
- throw new AssertionError();
- }
- }
-
- public static String[] getFileNamesByExtension(final String folderName, final String fileExtension) {
- File folder = new File(folderName);
-
- String[] files = folder.list(new FilenameFilter() {
-
- public boolean accept(File dir, String name) {
- if (fileExtension == null || fileExtension.length() == 0)
- return true;
- return name.endsWith(fileExtension);
- }
-
- });
-
- return files;
- }
-
- public static String[] getFileFullNamesByExtension(final String folderName, final String fileExtension) {
- String[] files = getFileNamesByExtension(folderName, fileExtension);
-
- for (int i = 0; i < files.length; i++) {
- files[i] = folderName + File.separatorChar + files[i];
- }
-
- return files;
- }
-
- public static boolean stringCompare(String s1, String s2, boolean ignoreCase, boolean ignoreWhite, boolean ignore0x) {
- if (ignoreWhite) {
- s1 = s1.replaceAll(" ", "").replaceAll("\t", "");
- s2 = s2.replaceAll(" ", "").replaceAll("\t", "");
- }
-
- if (ignore0x) {
- s1 = s1.replaceAll("0x", "");
- s2 = s2.replaceAll("0x", "");
- }
-
- if (ignoreCase)
- return s1.equalsIgnoreCase(s2);
- else
- return s1.equals(s2);
- }
-
- public static void showDebugPerspective() {
- showPerspective("org.eclipse.debug.ui.DebugPerspective");
- }
-
- public static void showPerspective(final String perspective) {
-
- Display display = Display.getDefault();
- if ( display != null )
- display.syncExec( new Runnable() {
- public void run() {
- IWorkbench workbench = PlatformUI.getWorkbench();
- IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
- try {
- workbench.showPerspective(perspective, activeWindow);
- } catch (WorkbenchException e) {}
- }
- });
- }
-
- public static void disableDebugPerspectiveSwitchPrompt() {
- if (null == Display.getCurrent() || null == Display.getCurrent().getActiveShell()) // in case test is run in headless mode.
- return;
- IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
- store.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.ALWAYS);
- }
-
- public static EDCLaunch createLaunchForAlbum(String albumName) throws Exception {
- String res_folder = EDCTestPlugin.projectRelativePath("resources/Snapshots");
- return createLaunchForAlbum(albumName, res_folder);
- }
-
- public static EDCLaunch createLaunchForAlbum(String albumName, String res_folder) throws Exception {
- ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
- ILaunchConfigurationWorkingCopy configuration = lm.getLaunchConfigurationType(
- "org.eclipse.cdt.debug.edc.snapshot").newInstance(null, "TestAlbumLaunch");
- IPath dsaPath = new Path(res_folder);
- dsaPath = dsaPath.append(albumName);
-
- configuration.setAttribute(IEDCLaunchConfigurationConstants.ATTR_ALBUM_FILE, dsaPath.toOSString());
-
- final EDCLaunch[] launchHolder = new EDCLaunch[1];
-
- ILaunchListener listener = new ILaunchListener() {
-
- public void launchRemoved(ILaunch launch) {
- }
-
- public void launchChanged(ILaunch launch) {
- }
-
- public void launchAdded(ILaunch launch) {
- if (launch instanceof EDCLaunch) {
- EDCLaunch edcLaunch = (EDCLaunch) launch;
- launchHolder[0] = edcLaunch;
- }
- }
- };
- lm.addLaunchListener(listener);
- ILaunch launch = configuration.doSave().launch(ILaunchManager.DEBUG_MODE, new NullProgressMonitor(), true);
- if (launch == null)
- return null;
-
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- return launchHolder[0] != null;
- }
- });
-
- lm.removeLaunchListener(listener);
-
- Assert.assertNotNull(launchHolder[0]);
- return launchHolder[0];
- }
-
- public static DsfSession waitForSession(final EDCLaunch launch) throws Exception {
- final DsfSession sessionHolder[] = { null };
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- DsfSession session = launch.getSession();
- if (session == null)
- return false;
-
- sessionHolder[0] = session;
- return true;
- }
- });
- return sessionHolder[0];
- }
-
- public static IEDCExecutionDMC waitForExecutionDMC(final DsfSession session) throws Exception {
- final IEDCExecutionDMC contextHolder[] = { null };
- TestUtils.waitOnExecutorThread(session, new Condition() {
- public boolean isConditionValid() {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- RunControl runControlService = servicesTracker.getService(RunControl.class);
- if (runControlService == null)
- return false;
- ExecutionDMC rootDMC = runControlService.getRootDMC();
- if (rootDMC == null)
- return false;
- IEDCExecutionDMC[] processes = rootDMC.getChildren();
- if (processes.length == 0)
- return false;
-
- contextHolder[0] = processes[0];
- return true;
- }
-
- });
- return contextHolder[0];
- }
-
- public static IFrameDMContext waitForStackFrame(final DsfSession session, final IEDCExecutionDMC threadDMC)
- throws Exception {
- return waitForStackFrame(session, threadDMC, 0);
- }
-
- public static IFrameDMContext waitForStackFrame(final DsfSession session, final IEDCExecutionDMC threadDMC, final int level)
- throws Exception {
- final IFrameDMContext frameHolder[] = { null };
- TestUtils.waitOnExecutorThread(session, new Condition() {
- public boolean isConditionValid() throws Exception {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- Stack stackService = servicesTracker.getService(Stack.class);
- if (stackService == null)
- return false;
- IFrameDMContext[] frames = stackService.getFramesForDMC(threadDMC, 0, IStack.ALL_FRAMES);
- if (frames.length > level) {
- frameHolder[0] = frames[level];
- return true;
- }
- return false;
- }
-
- });
- return frameHolder[0];
- }
-
-
- public static ExecutionDMC waitForSuspendedThread(final DsfSession session) throws Exception {
- final ExecutionDMC contextHolder[] = { null };
- TestUtils.waitOnExecutorThread(session, new Condition() {
- public boolean isConditionValid() {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- RunControl runControlService = servicesTracker.getService(RunControl.class);
- if (runControlService == null)
- return false;
- ExecutionDMC rootDMC = runControlService.getRootDMC();
- if (rootDMC == null)
- return false;
- ExecutionDMC[] processes = rootDMC.getChildren();
- if (processes.length == 0)
- return false;
-
- for (ExecutionDMC process : processes) {
- ExecutionDMC[] threads = process.getChildren();
- for (ExecutionDMC thread : threads) {
- if (thread.isSuspended() && thread.getStateChangeReason() != StateChangeReason.SHAREDLIB) {
- contextHolder[0] = thread;
- return true;
- }
- }
- }
- return contextHolder[0] != null;
- }
-
- });
- return contextHolder[0];
- }
-
- /**
- * Get only the formatted value of an expression.
- * @param session
- * @param frame
- * @param expr
- * @return
- * @throws Exception
- * @throws ExecutionException
- */
- public static String getExpressionValue(final DsfSession session, final IDMContext frame, final String expr)
- throws Exception, ExecutionException {
-
- IEDCExpression expression = getExpressionDMC(session, frame, expr);
- String formatted = getFormattedExpressionValue(session, frame, expression);
-
- return formatted;
- }
-
- /**
- * Get an evaluated expression context.
- * @param session
- * @param frame
- * @param expr
- * @return
- * @throws Exception
- * @throws ExecutionException
- */
- public static IEDCExpression getExpressionDMC(final DsfSession session, final IDMContext frame, final String expr)
- throws Exception, ExecutionException {
-
- Expressions expressionsService = getService(session, Expressions.class);
- IEDCExpression expression = (IEDCExpression) expressionsService.createExpression(frame, expr);
- expression.evaluateExpression();
- return expression;
- }
-
-
- /**
- * Get the formatted string value of an expression context.
- * @param session
- * @param frame
- * @param expression
- * @return
- * @throws Exception
- * @throws ExecutionException
- */
- public static String getFormattedExpressionValue(final DsfSession session, final IDMContext frame, final IEDCExpression expression)
- throws Exception, ExecutionException {
- Expressions expressionsService = getService(session, Expressions.class);
- FormattedValueDMContext fvc = expressionsService.getFormattedValueContext(expression,
- IFormattedValues.NATURAL_FORMAT);
- FormattedValueDMData formattedValue = expression.getFormattedValue(fvc);
- IType exprType = TypeUtils.getStrippedType(expression.getEvaluatedType());
- IVariableValueConverter customValue =
- FormatExtensionManager.instance().getVariableValueConverter(exprType);
- if (customValue != null) {
- FormattedValueDMData customFormattedValue = null;
- try {
- customFormattedValue = new FormattedValueDMData(customValue.getValue(expression));
- formattedValue = customFormattedValue;
- }
- catch (CoreException e) {}
- catch (Throwable t) {
- }
- }
-
- return formattedValue.getFormattedValue();
- }
-
- /**
- * Get a casted expression.
- * @param session
- * @param frame
- * @param expr
- * @return casted expression DMC
- * @throws Exception
- * @throws ExecutionException
- */
- public static ICastedExpressionDMContext getCastedExpressionValue(final DsfSession session, final IDMContext frame, final String expr, final String type)
- throws Exception, ExecutionException {
-
- IEDCExpression expression = getExpressionDMC(session, frame, expr);
-
- CastInfo castInfo = new CastInfo(type);
-
- ICastedExpressionDMContext castedDMC = getCastedExpressionDMC(session, frame, expression, castInfo);
-
- return castedDMC;
- }
-
- /**
- * @param session
- * @param frame
- * @param expression
- * @param castInfo
- * @return
- * @throws ExecutionException
- * @throws InterruptedException
- */
- public static ICastedExpressionDMContext getCastedExpressionDMC(
- final DsfSession session, final IDMContext frame, final IExpressionDMContext expression,
- final CastInfo castInfo) throws InterruptedException, ExecutionException {
- Query<ICastedExpressionDMContext> runnable = new Query<ICastedExpressionDMContext>() {
-
- @Override
- protected void execute(DataRequestMonitor<ICastedExpressionDMContext> rm) {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- IExpressions2 expressionsService = servicesTracker.getService(IExpressions2.class);
- rm.setData(expressionsService.createCastedExpression(expression, castInfo));
- rm.done();
- }
- };
-
- session.getExecutor().execute(runnable);
-
- return runnable.get();
- }
-
- /**
- * Get an evaluated expression context.
- * @param session
- * @param frame
- * @param expr
- * @return
- * @throws Exception
- * @throws ExecutionException
- */
- public static IExpressionDMContext[] getSubExpressionDMCs(final DsfSession session, final IDMContext frame,
- final IExpressionDMContext expr)
- throws Exception, ExecutionException {
-
- Query<IExpressionDMContext[]> runnable = new Query<IExpressionDMContext[]>() {
-
- @Override
- protected void execute(DataRequestMonitor<IExpressionDMContext[]> rm) {
- DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
- Expressions expressionsService = servicesTracker.getService(Expressions.class);
- expressionsService.getSubExpressions(expr, rm);
- }
- };
-
- session.getExecutor().execute(runnable);
-
- return runnable.get();
- }
-
- @SuppressWarnings("unchecked")
- static public <V> V getService(final DsfSession session, final Class<V> serviceClass) {
- if (services.get(session) == null)
- services.put(session, new HashMap<Object, Object>());
- if (!services.get(session).containsKey(serviceClass))
- {
- if (session.getExecutor().isInExecutorThread())
- {
- services.get(session).put(serviceClass, getDsfServicesTracker(session).getService(serviceClass));
- }
- else
- {
- Query<V> serviceQuery = new Query<V>() {
- @Override
- protected void execute(
- DataRequestMonitor<V> rm) {
- rm.setData(getDsfServicesTracker(session).getService(serviceClass));
- rm.done();
- }
- };
- session.getExecutor().execute(serviceQuery);
- try {
- services.get(session).put(serviceClass, serviceQuery.get());
- } catch (Exception e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- return null;
- }
- }
- }
- return (V) services.get(session).get(serviceClass);
- }
-
- public static DsfServicesTracker getDsfServicesTracker(final DsfSession session) {
- return new DsfServicesTracker(EDCTestPlugin.getBundleContext(), session.getId());
- }
-
- /** Tell if a given launcher is available. Useful when a snapshot test depends on an internal
- * launch type.
- * @param id the id of the org.eclipse.debug.core.launchConfigurationTypes launchConfigurationType
- * @return true if found
- */
- public static boolean hasLaunchConfiguationType(String id) {
- return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(id) != null;
- }
-
- /**
- * Tell whether there is a TCF agent launcher available with the given ID.
- * @param reqdLauncher
- * @return
- */
- public static boolean hasTCFAgentLauncher(String id) {
- TCFServiceManager tcfServiceManager = (TCFServiceManager) EDCDebugger.getDefault().getServiceManager();
- ITCFAgentLauncher[] registered = tcfServiceManager.findSuitableAgentLaunchers(IRunControl.NAME, Collections.<String, String>emptyMap(), true);
- for (ITCFAgentLauncher launcher : registered) {
- if (launcher.getClass().getName().equals(id))
- return true;
- }
- return false;
- }
-
- public static void shutdownDebugSession(EDCLaunch launch, final DsfSession session) {
- final Boolean done[] = new Boolean[] {false};
-
- // shutdown the launch
- if (launch != null) {
- // terminating the launch will cause the session to end, but wait for
- // it to end to prevent multiple launches from tests existing at the
- // same time which can cause some weird behavior
- DsfSession.addSessionEndedListener(new DsfSession.SessionEndedListener() {
-
- public void sessionEnded(DsfSession se) {
- if (session == se) {
- done[0] = true;
- }
- }
- });
-
- try {
- launch.terminate();
- } catch (DebugException de) {
- }
- launch = null;
-
- while (! done[0]) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- }
- }
- }
- }
-
- public static void waitForLaunchTerminated(final EDCLaunch launch) throws Exception {
- TestUtils.wait(new Condition() {
- public boolean isConditionValid() {
- return launch.isTerminated();
- }
- });
- }
-
- public static void terminateLaunch(EDCLaunch launch) throws Exception {
- launch.terminate();
- waitForLaunchTerminated(launch);
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.tests;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.cdt.debug.edc.ITCFAgentLauncher;
+import org.eclipse.cdt.debug.edc.formatter.IVariableValueConverter;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.TCFServiceManager;
+import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
+import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.launch.IEDCLaunchConfigurationConstants;
+import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
+import org.eclipse.cdt.debug.edc.services.Stack;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
+import org.eclipse.cdt.dsf.debug.service.IExpressions2;
+import org.eclipse.cdt.dsf.debug.service.IExpressions2.CastInfo;
+import org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchListener;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.tm.tcf.services.IRunControl;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.junit.Assert;
+
+@SuppressWarnings("restriction")
+public class TestUtils {
+
+ private static final Map<DsfSession,Map<Object,Object>> services = Collections
+ .synchronizedMap(new HashMap<DsfSession,Map<Object,Object>>());
+
+ public interface Condition {
+
+ boolean isConditionValid()throws Exception;
+
+ }
+
+ public static final long DEFAULT_WAIT_TIMEOUT = 60000;
+ public static final long DEFAULT_WAIT_INTERVAL = 10;
+
+ public static void wait(Condition condition) throws Exception {
+ wait(condition, DEFAULT_WAIT_TIMEOUT, DEFAULT_WAIT_INTERVAL);
+ }
+
+ public static void waitOnExecutorThread(DsfSession session, Condition condition) throws Exception {
+ waitOnExecutorThread(session, condition, DEFAULT_WAIT_TIMEOUT, DEFAULT_WAIT_INTERVAL);
+ }
+
+ public static void wait(Condition condition, long timeout) throws Exception {
+ wait(condition, timeout, DEFAULT_WAIT_INTERVAL);
+ }
+
+ public static void waitOnExecutorThread(DsfSession session, Condition condition, long timeout) throws Exception {
+ waitOnExecutorThread(session, condition, timeout, DEFAULT_WAIT_INTERVAL);
+ }
+
+ static public class ConditionQuery extends Query<Boolean> {
+
+ private final Condition condition;
+
+ public ConditionQuery(Condition condition) {
+ super();
+ this.condition = condition;
+ }
+
+ @Override
+ protected void execute(DataRequestMonitor<Boolean> rm) {
+ try {
+ rm.setData(condition.isConditionValid());
+ } catch (Exception e) {
+ rm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID,
+ null, e)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ };
+
+ public static void waitOnExecutorThread(DsfSession session, final Condition condition, final long timeout,
+ final long interval) throws Exception {
+
+ long limit = System.currentTimeMillis() + timeout;
+
+ ConditionQuery conditionRunnable = new ConditionQuery(condition);
+ session.getExecutor().execute(conditionRunnable);
+ boolean conditionValid = conditionRunnable.get();
+
+ while (!conditionValid) {
+ Thread.sleep(interval);
+ if (System.currentTimeMillis() > limit)
+ throw new AssertionError();
+ conditionRunnable = new TestUtils.ConditionQuery(condition);
+ session.getExecutor().execute(conditionRunnable);
+ conditionValid = conditionRunnable.get();
+ }
+
+ }
+
+ public static void wait(Condition condition, long timeout, long interval) throws Exception {
+ long limit = System.currentTimeMillis() + timeout;
+ while (!condition.isConditionValid()) {
+ Display display = Display.getCurrent();
+ if (display != null && !display.readAndDispatch())
+ display.sleep();
+ Thread.sleep(interval);
+ if (System.currentTimeMillis() > limit)
+ throw new AssertionError();
+ }
+ }
+
+ /**
+ * Wait for UI to update so that we can see the debugger work in
+ * test workbench.
+ * For headless mode, this just does nothing and return immediately.
+ *
+ * @param timeout
+ */
+ public static void waitForUIUpdate(int timeout) {
+ long limit = System.currentTimeMillis() + timeout;
+ Display display = Display.getCurrent();
+ if (display == null || null == display.getActiveShell())
+ return;
+
+ while (true) {
+ while (display.readAndDispatch());
+ if (System.currentTimeMillis() > limit)
+ break;
+ }
+ }
+
+ public static String[] getFileNamesByExtension(final String folderName, final String fileExtension) {
+ File folder = new File(folderName);
+
+ String[] files = folder.list(new FilenameFilter() {
+
+ public boolean accept(File dir, String name) {
+ if (fileExtension == null || fileExtension.length() == 0)
+ return true;
+ return name.endsWith(fileExtension);
+ }
+
+ });
+
+ return files;
+ }
+
+ public static String[] getFileFullNamesByExtension(final String folderName, final String fileExtension) {
+ String[] files = getFileNamesByExtension(folderName, fileExtension);
+
+ for (int i = 0; i < files.length; i++) {
+ files[i] = folderName + File.separatorChar + files[i];
+ }
+
+ return files;
+ }
+
+ public static boolean stringCompare(String s1, String s2, boolean ignoreCase, boolean ignoreWhite, boolean ignore0x) {
+ if (ignoreWhite) {
+ s1 = s1.replaceAll(" ", "").replaceAll("\t", "");
+ s2 = s2.replaceAll(" ", "").replaceAll("\t", "");
+ }
+
+ if (ignore0x) {
+ s1 = s1.replaceAll("0x", "");
+ s2 = s2.replaceAll("0x", "");
+ }
+
+ if (ignoreCase)
+ return s1.equalsIgnoreCase(s2);
+ else
+ return s1.equals(s2);
+ }
+
+ public static void hideView(final IViewPart viewPart) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ page.hideView(viewPart);
+ }
+ });
+ }
+
+ public static IViewPart showView(final String viewId) throws PartInitException {
+ final IViewPart[] vpHolder = new IViewPart[]{null};
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ vpHolder[0] = page.showView(viewId);
+ Assert.assertNotNull("Can't open View", vpHolder[0] != null);
+ } catch (PartInitException e) {
+ Assert.fail(e.getMessage());
+ }
+ }
+ });
+ return vpHolder[0];
+ }
+
+ public static void showDebugPerspective() {
+ showPerspective("org.eclipse.debug.ui.DebugPerspective");
+ }
+
+ public static void showPerspective(final String perspective) {
+
+ Display display = Display.getDefault();
+ if ( display != null )
+ display.syncExec( new Runnable() {
+ public void run() {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
+ try {
+ workbench.showPerspective(perspective, activeWindow);
+ } catch (WorkbenchException e) {}
+ }
+ });
+ }
+
+ public static void disableDebugPerspectiveSwitchPrompt() {
+ if (null == Display.getCurrent() || null == Display.getCurrent().getActiveShell()) // in case test is run in headless mode.
+ return;
+ IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
+ store.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.ALWAYS);
+ }
+
+ public static EDCLaunch createLaunchForAlbum(String albumName) throws Exception {
+ String res_folder = EDCTestPlugin.projectRelativePath("resources/Snapshots");
+ return createLaunchForAlbum(albumName, res_folder);
+ }
+
+ public static EDCLaunch createLaunchForAlbum(String albumName, String res_folder) throws Exception {
+ ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
+ ILaunchConfigurationWorkingCopy configuration = lm.getLaunchConfigurationType(
+ "org.eclipse.cdt.debug.edc.snapshot").newInstance(null, "TestAlbumLaunch");
+ IPath dsaPath = new Path(res_folder);
+ dsaPath = dsaPath.append(albumName);
+ Assert.assertTrue("The path must exist: " + dsaPath, dsaPath.toFile().exists());
+
+ configuration.setAttribute(IEDCLaunchConfigurationConstants.ATTR_ALBUM_FILE, dsaPath.toOSString());
+
+ final EDCLaunch[] launchHolder = new EDCLaunch[1];
+
+ ILaunchListener listener = new ILaunchListener() {
+
+ public void launchRemoved(ILaunch launch) {
+ }
+
+ public void launchChanged(ILaunch launch) {
+ }
+
+ public void launchAdded(ILaunch launch) {
+ if (launch instanceof EDCLaunch) {
+ EDCLaunch edcLaunch = (EDCLaunch) launch;
+ launchHolder[0] = edcLaunch;
+ }
+ }
+ };
+ lm.addLaunchListener(listener);
+ ILaunch launch = configuration.doSave().launch(ILaunchManager.DEBUG_MODE, new NullProgressMonitor(), true);
+ if (launch == null)
+ return null;
+
+ TestUtils.wait(new Condition() {
+ public boolean isConditionValid() {
+ return launchHolder[0] != null;
+ }
+ });
+
+ lm.removeLaunchListener(listener);
+
+ Assert.assertNotNull(launchHolder[0]);
+ return launchHolder[0];
+ }
+
+ public static DsfSession waitForSession(final EDCLaunch launch) throws Exception {
+ final DsfSession sessionHolder[] = { null };
+ TestUtils.wait(new Condition() {
+ public boolean isConditionValid() {
+ DsfSession session = launch.getSession();
+ if (session == null)
+ return false;
+
+ sessionHolder[0] = session;
+ return true;
+ }
+ });
+ return sessionHolder[0];
+ }
+
+ public static IEDCExecutionDMC waitForExecutionDMC(final DsfSession session) throws Exception {
+ final IEDCExecutionDMC contextHolder[] = { null };
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+ public boolean isConditionValid() {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ RunControl runControlService = servicesTracker.getService(RunControl.class);
+ if (runControlService == null)
+ return false;
+ ExecutionDMC rootDMC = runControlService.getRootDMC();
+ if (rootDMC == null)
+ return false;
+ IEDCExecutionDMC[] processes = rootDMC.getChildren();
+ if (processes.length == 0)
+ return false;
+
+ contextHolder[0] = processes[0];
+ return true;
+ }
+
+ });
+ return contextHolder[0];
+ }
+
+ public static IFrameDMContext waitForStackFrame(final DsfSession session, final IEDCExecutionDMC threadDMC)
+ throws Exception {
+ return waitForStackFrame(session, threadDMC, 0);
+ }
+
+ public static IFrameDMContext waitForStackFrame(final DsfSession session, final IEDCExecutionDMC threadDMC, final int level)
+ throws Exception {
+ final IFrameDMContext frameHolder[] = { null };
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+ public boolean isConditionValid() throws Exception {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ Stack stackService = servicesTracker.getService(Stack.class);
+ if (stackService == null)
+ return false;
+ IFrameDMContext[] frames = stackService.getFramesForDMC(threadDMC, 0, IStack.ALL_FRAMES);
+ if (frames.length > level) {
+ frameHolder[0] = frames[level];
+ return true;
+ }
+ return false;
+ }
+
+ });
+ return frameHolder[0];
+ }
+
+
+ public static ExecutionDMC waitForSuspendedThread(final DsfSession session) throws Exception {
+ final ExecutionDMC contextHolder[] = { null };
+ TestUtils.waitOnExecutorThread(session, new Condition() {
+ public boolean isConditionValid() {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ RunControl runControlService = servicesTracker.getService(RunControl.class);
+ if (runControlService == null)
+ return false;
+ ExecutionDMC rootDMC = runControlService.getRootDMC();
+ if (rootDMC == null)
+ return false;
+ ExecutionDMC[] processes = rootDMC.getChildren();
+ if (processes.length == 0)
+ return false;
+
+ for (ExecutionDMC process : processes) {
+ ExecutionDMC[] threads = process.getChildren();
+ for (ExecutionDMC thread : threads) {
+ if (thread.isSuspended() && thread.getStateChangeReason() != StateChangeReason.SHAREDLIB) {
+ contextHolder[0] = thread;
+ return true;
+ }
+ }
+ }
+ return contextHolder[0] != null;
+ }
+
+ });
+ return contextHolder[0];
+ }
+
+ /**
+ * Get only the formatted value of an expression.
+ * @param session
+ * @param frame
+ * @param expr
+ * @return
+ * @throws Exception
+ * @throws ExecutionException
+ */
+ public static String getExpressionValue(final DsfSession session, final IDMContext frame, final String expr)
+ throws Exception, ExecutionException {
+
+ IEDCExpression expression = getExpressionDMC(session, frame, expr);
+ String formatted = getFormattedExpressionValue(session, frame, expression);
+
+ return formatted;
+ }
+
+ /**
+ * Get an evaluated expression context.
+ * @param session
+ * @param frame
+ * @param expr
+ * @return
+ * @throws Exception
+ * @throws ExecutionException
+ */
+ public static IEDCExpression getExpressionDMC(final DsfSession session, final IDMContext frame, final String expr)
+ throws Exception, ExecutionException {
+
+ Expressions expressionsService = getService(session, Expressions.class);
+ IEDCExpression expression = (IEDCExpression) expressionsService.createExpression(frame, expr);
+ expression.evaluateExpression();
+ return expression;
+ }
+
+
+ /**
+ * Get the formatted string value of an expression context.
+ * @param session
+ * @param frame
+ * @param expression
+ * @return
+ * @throws Exception
+ * @throws ExecutionException
+ */
+ public static String getFormattedExpressionValue(final DsfSession session, final IDMContext frame, final IEDCExpression expression)
+ throws Exception, ExecutionException {
+ Expressions expressionsService = getService(session, Expressions.class);
+ FormattedValueDMContext fvc = expressionsService.getFormattedValueContext(expression,
+ IFormattedValues.NATURAL_FORMAT);
+ FormattedValueDMData formattedValue = expression.getFormattedValue(fvc);
+ IType exprType = TypeUtils.getStrippedType(expression.getEvaluatedType());
+ IVariableValueConverter customValue =
+ FormatExtensionManager.instance().getVariableValueConverter(exprType);
+ if (customValue != null) {
+ FormattedValueDMData customFormattedValue = null;
+ try {
+ customFormattedValue = new FormattedValueDMData(customValue.getValue(expression));
+ formattedValue = customFormattedValue;
+ }
+ catch (CoreException e) {
+ EDCTestPlugin.getMessageLogger().logException(e);
+ }
+ catch (Throwable t) {
+ EDCTestPlugin.getMessageLogger().logException(t);
+ }
+ }
+
+ return formattedValue.getFormattedValue();
+ }
+
+ /**
+ * Get a casted expression.
+ * @param session
+ * @param frame
+ * @param expr
+ * @return casted expression DMC
+ * @throws Exception
+ * @throws ExecutionException
+ */
+ public static ICastedExpressionDMContext getCastedExpressionValue(final DsfSession session, final IDMContext frame, final String expr, final String type)
+ throws Exception, ExecutionException {
+
+ IEDCExpression expression = getExpressionDMC(session, frame, expr);
+
+ CastInfo castInfo = new CastInfo(type);
+
+ ICastedExpressionDMContext castedDMC = getCastedExpressionDMC(session, frame, expression, castInfo);
+
+ return castedDMC;
+ }
+
+ /**
+ * @param session
+ * @param frame
+ * @param expression
+ * @param castInfo
+ * @return
+ * @throws ExecutionException
+ * @throws InterruptedException
+ */
+ public static ICastedExpressionDMContext getCastedExpressionDMC(
+ final DsfSession session, final IDMContext frame, final IExpressionDMContext expression,
+ final CastInfo castInfo) throws InterruptedException, ExecutionException {
+ Query<ICastedExpressionDMContext> runnable = new Query<ICastedExpressionDMContext>() {
+
+ @Override
+ protected void execute(DataRequestMonitor<ICastedExpressionDMContext> rm) {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ IExpressions2 expressionsService = servicesTracker.getService(IExpressions2.class);
+ rm.setData(expressionsService.createCastedExpression(expression, castInfo));
+ rm.done();
+ }
+ };
+
+ session.getExecutor().execute(runnable);
+
+ return runnable.get();
+ }
+
+ /**
+ * Get an evaluated expression context.
+ * @param session
+ * @param frame
+ * @param expr
+ * @return
+ * @throws Exception
+ * @throws ExecutionException
+ */
+ public static IExpressionDMContext[] getSubExpressionDMCs(final DsfSession session, final IDMContext frame,
+ final IExpressionDMContext expr)
+ throws Exception, ExecutionException {
+
+ Query<IExpressionDMContext[]> runnable = new Query<IExpressionDMContext[]>() {
+
+ @Override
+ protected void execute(DataRequestMonitor<IExpressionDMContext[]> rm) {
+ DsfServicesTracker servicesTracker = getDsfServicesTracker(session);
+ Expressions expressionsService = servicesTracker.getService(Expressions.class);
+ expressionsService.getSubExpressions(expr, rm);
+ }
+ };
+
+ session.getExecutor().execute(runnable);
+
+ return runnable.get();
+ }
+
+ @SuppressWarnings("unchecked")
+ static public <V> V getService(final DsfSession session, final Class<V> serviceClass) {
+ if (services.get(session) == null)
+ services.put(session, new HashMap<Object, Object>());
+ if (!services.get(session).containsKey(serviceClass))
+ {
+ if (session.getExecutor().isInExecutorThread())
+ {
+ services.get(session).put(serviceClass, getDsfServicesTracker(session).getService(serviceClass));
+ }
+ else
+ {
+ Query<V> serviceQuery = new Query<V>() {
+ @Override
+ protected void execute(
+ DataRequestMonitor<V> rm) {
+ rm.setData(getDsfServicesTracker(session).getService(serviceClass));
+ rm.done();
+ }
+ };
+ session.getExecutor().execute(serviceQuery);
+ try {
+ services.get(session).put(serviceClass, serviceQuery.get());
+ } catch (Exception e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ return null;
+ }
+ }
+ }
+ return (V) services.get(session).get(serviceClass);
+ }
+
+ public static DsfServicesTracker getDsfServicesTracker(final DsfSession session) {
+ return new DsfServicesTracker(EDCTestPlugin.getBundleContext(), session.getId());
+ }
+
+ /** Tell if a given launcher is available. Useful when a snapshot test depends on an internal
+ * launch type.
+ * @param id the id of the org.eclipse.debug.core.launchConfigurationTypes launchConfigurationType
+ * @return true if found
+ */
+ public static boolean hasLaunchConfiguationType(String id) {
+ return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(id) != null;
+ }
+
+ /**
+ * Tell whether there is a TCF agent launcher available with the given ID.
+ * @param reqdLauncher
+ * @return
+ */
+ public static boolean hasTCFAgentLauncher(String id) {
+ TCFServiceManager tcfServiceManager = (TCFServiceManager) EDCDebugger.getDefault().getServiceManager();
+ ITCFAgentLauncher[] registered = tcfServiceManager.findSuitableAgentLaunchers(IRunControl.NAME, Collections.<String, String>emptyMap(), true);
+ for (ITCFAgentLauncher launcher : registered) {
+ if (launcher.getClass().getName().equals(id))
+ return true;
+ }
+ return false;
+ }
+
+ public static void shutdownDebugSession(EDCLaunch launch, final DsfSession session) {
+ // shutdown the launch
+ if (launch != null) {
+ final Boolean done[] = new Boolean[] {false};
+ synchronized (launch) {
+ if (launch.isTerminated() || launch.isTerminating())
+ return;
+
+ // terminating the launch will cause the session to end, but wait for
+ // it to end to prevent multiple launches from tests existing at the
+ // same time which can cause some weird behavior
+ DsfSession.addSessionEndedListener(new DsfSession.SessionEndedListener() {
+
+ public void sessionEnded(DsfSession se) {
+ if (session == se) {
+ done[0] = true;
+ }
+ }
+ });
+
+ try {
+ launch.terminate();
+ } catch (DebugException de) {
+ }
+
+ }
+ launch = null;
+
+ while (! done[0]) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ }
+
+ public static void waitForLaunchTerminated(final EDCLaunch launch) throws Exception {
+ TestUtils.wait(new Condition() {
+ public boolean isConditionValid() {
+ return launch.isTerminated();
+ }
+ });
+ }
+
+ public static void terminateLaunch(EDCLaunch launch) throws Exception {
+ launch.terminate();
+ waitForLaunchTerminated(launch);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/EDCTestAgent.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/EDCTestAgent.java
new file mode 100644
index 0000000..110d1a7
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/EDCTestAgent.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.LinkedList;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.AgentUtils;
+import org.eclipse.cdt.debug.edc.tcf.extension.ServerTCP;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IEventQueue;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IServiceProvider;
+import org.eclipse.tm.tcf.protocol.Protocol;
+
+/**
+ * A TCF agent in Java used for unit test.
+ *
+ */
+public class EDCTestAgent {
+
+ private static final String NAME = "TCFTestAgentForEDC";
+
+ // Make it a singleton class.
+ private static EDCTestAgent sInstance = null;
+
+ private ServerTCP fServer = null;
+
+ private IServiceProvider serviceProvider = new IServiceProvider() {
+ /*
+ * Tell framework that we are offering this service.
+ */
+ public IService[] getLocalService(IChannel channel) {
+ return getProvidedServices(channel);
+ }
+
+ public IService getServiceProxy(IChannel channel, String serviceName) {
+ return null;
+ }
+ };
+
+ protected static class EventQueue extends Thread implements IEventQueue {
+
+ private final LinkedList<Runnable> queue = new LinkedList<Runnable>();
+
+ public EventQueue() {
+ setName("TCF Event Dispatch");
+ start();
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (true) {
+ Runnable r = null;
+ synchronized (this) {
+ while (queue.isEmpty())
+ wait();
+ r = queue.removeFirst();
+ }
+ try {
+ r.run();
+ } catch (Throwable x) {
+ System.err.println("Error dispatching TCF event:");
+ x.printStackTrace();
+ }
+ }
+ } catch (Throwable x) {
+ x.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ public synchronized int getCongestion() {
+ int n = queue.size() - 100;
+ if (n > 100)
+ n = 100;
+ return n;
+ }
+
+ public synchronized void invokeLater(Runnable runnable) {
+ queue.add(runnable);
+ notify();
+ }
+
+ public boolean isDispatchThread() {
+ return Thread.currentThread() == this;
+ }
+ }
+
+ /**
+ * Run the agent as a standalone Java application.
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ Protocol.setEventQueue(new EventQueue());
+
+ getInstance().start();
+ } catch (IOException e) {
+ System.out.println("Fail to start the agent. IOException: " + e.getMessage());
+ return;
+ }
+
+ while (true) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Define the services the agent provides.
+ *
+ * @param channel
+ * @return
+ */
+ protected IService[] getProvidedServices(IChannel channel) {
+ return new IService[] {
+ new UnitTestDriverService(channel),
+
+ new LoggingService(channel),
+ new SettingsService(channel),
+ };
+ }
+
+ protected EDCTestAgent() {
+ }
+
+ public static EDCTestAgent getInstance() {
+ if (sInstance == null) {
+ sInstance = new EDCTestAgent();
+ }
+
+ return sInstance;
+ }
+
+ public void start() throws IOException {
+ if (fServer == null) {
+ Protocol.addServiceProvider(serviceProvider);
+ final IOException exc[] = { null };
+
+ Protocol.invokeAndWait(new Runnable() {
+
+ public void run() {
+ try {
+ fServer = new ServerTCP(getAgentName(), AgentUtils.findFreePort()) {
+ @Override
+ protected boolean shouldCreatePeerOnAddress(
+ InetAddress localAddr) {
+ // Make this agent only visible on host machine.
+ if (localAddr.isLoopbackAddress())
+ return true;
+ return false;
+ }
+
+ };
+ } catch (IOException e) {
+ exc[0] = e;
+ }
+ }
+ });
+
+ if (exc[0] != null)
+ throw exc[0];
+ }
+ }
+
+ public String getAgentName() {
+ return NAME;
+ }
+
+ public void stop() throws IOException {
+ if (fServer != null) {
+ fServer.close();
+ Protocol.removeServiceProvider(serviceProvider);
+ }
+
+ fServer = null;
+ }
+
+ public boolean isRunning() {
+ return fServer != null;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/IUnitTestDriver.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/IUnitTestDriver.java
new file mode 100644
index 0000000..2184da0
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/IUnitTestDriver.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+
+/**
+ * A TCF service for driving unit test. Add commands here when you want
+ * host test code to drive the {@link EDCTestAgent}.
+ */
+public interface IUnitTestDriver extends IService {
+ /**
+ * This service name, as it appears on the wire - a TCF name of the service.
+ */
+ public static final String NAME = "UnitTestDriver";
+
+ /**
+ * Call back interface for a command that does not need reply.
+ */
+ interface DoneWithNoReplyCommand {
+ /**
+ * @param token
+ * - command handle.
+ * @param error
+ * - error object or null.
+ */
+ void done(IToken token, Throwable error);
+ }
+
+ /**
+ * ============================================
+ * Commands for driving test of {@link ILogging} service
+ * ============================================
+ */
+ public final static String COMMAND_LOGGING_WRITE = "Logging_Write";
+ public final static String COMMAND_LOGGING_WRITELN = "Logging_Writeln";
+ public final static String COMMAND_LOGGING_DIALOG = "Logging_Dialog";
+
+ IToken loggingWrite(String msg, DoneWithNoReplyCommand done);
+ IToken loggingWriteln(String msg, DoneWithNoReplyCommand done);
+ IToken loggingDialog(String msg, DoneWithNoReplyCommand done);
+
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/LoggingService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/LoggingService.java
new file mode 100644
index 0000000..940b6c7
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/LoggingService.java
@@ -0,0 +1,111 @@
+/**
+* Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import java.io.IOException;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.AgentUtils;
+import org.eclipse.cdt.debug.edc.tcf.extension.services.AbstractTCFService;
+import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging;
+import org.eclipse.tm.tcf.core.AbstractChannel;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IChannel.ICommandServer;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.eclipse.tm.tcf.protocol.JSON;
+import org.eclipse.tm.tcf.protocol.Protocol;
+
+/**
+ * {@link ILogging} service implementation in test agent.
+ */
+public class LoggingService extends AbstractTCFService {
+
+ public LoggingService(IChannel channel) {
+ super(channel);
+ }
+
+ public static final String CONSOLE_LOGGER_ID = "ProgramOutputConsoleLogger";
+
+ private static final String WRITELN_EVENT = "writeln";
+ private static final String WRITE_EVENT = "write";
+ private static final String DIALOG_EVENT = "dialog";
+ private int numProgramOuputListeners = 0;
+
+ public class CommandServer extends AbstractCommandServer {
+ public void addListener(IToken token, String name, Object[] args) throws IOException {
+ if (!AgentUtils.checkNumArgs(token, getChannel(), args.length, 1))
+ return;
+ String id = (String) args[0];
+ if (CONSOLE_LOGGER_ID.equals(id))
+ numProgramOuputListeners++;
+
+ getChannel().sendResult(token, JSON.toJSONSequence( new Object[] { null }));
+ }
+
+ public void removeListener(IToken token, String name, Object[] args) throws IOException {
+ if (!AgentUtils.checkNumArgs(token, getChannel(), args.length, 1))
+ return;
+ String id = (String) args[0];
+ if (CONSOLE_LOGGER_ID.equals(id)) {
+ numProgramOuputListeners--;
+ if (numProgramOuputListeners < 0)
+ numProgramOuputListeners = 0;
+ }
+
+ getChannel().sendResult(token, JSON.toJSONSequence( new Object[] { null }));
+ }
+ }
+
+ public void sendEvent(final String name, final Object[] args) {
+ Protocol.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ ((AbstractChannel) getChannel()).sendEvent(LoggingService.this, name,
+ JSON.toJSONSequence(args));
+ } catch (IOException e) {
+ getChannel().terminate(e);
+ }
+ }
+ });
+ }
+
+ public void write(String message) {
+ if (numProgramOuputListeners > 0) {
+ sendEvent(WRITE_EVENT, new Object[] { CONSOLE_LOGGER_ID, message });
+ }
+ }
+
+ public void writeln(String message){
+ if (numProgramOuputListeners > 0) {
+ sendEvent(WRITELN_EVENT, new Object[] { CONSOLE_LOGGER_ID, message });
+ }
+ }
+
+ public void dialog(int severity, String summary, String details) {
+ sendEvent(DIALOG_EVENT, new Object[] { CONSOLE_LOGGER_ID, severity, summary, details });
+ }
+
+ public String getName() {
+ return ILogging.NAME;
+ }
+
+ @Override
+ protected ICommandServer getCommandServer() {
+ return new CommandServer();
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/SettingsService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/SettingsService.java
new file mode 100644
index 0000000..8cd841b
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/SettingsService.java
@@ -0,0 +1,67 @@
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.services.AbstractTCFService;
+import org.eclipse.cdt.debug.edc.tcf.extension.services.ISettings;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IChannel.ICommandServer;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.eclipse.tm.tcf.protocol.JSON;
+
+public class SettingsService extends AbstractTCFService {
+
+ private final HashMap<String, Object> settingsValues = new HashMap<String, Object>();
+ public static final String[] supportedSettings = {
+ "TestSetting_1",
+ "TestSetting_2",
+ };
+
+ public class CommandServer extends AbstractCommandServer {
+
+ public void getIds(IToken token, String name, Object[] args) throws IOException {
+ getChannel().sendResult(token, JSON.toJSONSequence(new Object[] { null,
+ supportedSettings }));
+ }
+
+ public void set(IToken token, String name, Object[] args) throws IOException {
+ @SuppressWarnings("unchecked")
+ Collection<Object>
+ ids = (Collection<Object>) args[1],
+ values = (Collection<Object>) args[2];
+ handleSetValues(token, (String) args[0], ids.toArray(new String[ids.size()]), values.toArray());
+ }
+
+ private void handleSetValues(IToken token, String context, String[] ids, Object[] values) throws IOException {
+ if (ids.length != values.length) {
+ throw new IOException("ids[] != values[] length");
+ }
+
+ for (int i = 0; i < ids.length; i++) {
+ settingsValues.put(ids[i], values[i]);
+ }
+
+ getChannel().sendResult(token, JSON.toJSONSequence(new Object[] { null }));
+ }
+ }
+
+ public SettingsService(IChannel channel) {
+ super(channel);
+ }
+
+ public String getName() {
+ return ISettings.NAME;
+ }
+
+ public Object getSettingValue(String id) {
+ return settingsValues.get(id);
+ }
+
+ @Override
+ protected ICommandServer getCommandServer() {
+ return new CommandServer();
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverProxy.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverProxy.java
new file mode 100644
index 0000000..7f3020c
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverProxy.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import org.eclipse.tm.tcf.core.Command;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IToken;
+
+public class UnitTestDriverProxy implements IUnitTestDriver {
+
+ private final IChannel channel;
+
+ public UnitTestDriverProxy(IChannel channel) {
+ this.channel = channel;
+ }
+
+ /**
+ * Return service name, as it appears on the wire - a TCF name of the
+ * service.
+ */
+ public String getName() {
+ return NAME;
+ }
+
+ public IToken loggingWrite(String msg, final DoneWithNoReplyCommand done) {
+ return new Command(channel, this, COMMAND_LOGGING_WRITE, new Object[] { msg }) {
+ @Override
+ public void done(Exception error, Object[] args) {
+ if (error == null) {
+ assert args.length == 1;
+ error = toError(args[0]);
+ }
+ done.done(token, error);
+ }
+ }.token;
+ }
+
+ public IToken loggingWriteln(String msg, final DoneWithNoReplyCommand done) {
+ return new Command(channel, this, COMMAND_LOGGING_WRITELN, new Object[] { msg }) {
+ @Override
+ public void done(Exception error, Object[] args) {
+ if (error == null) {
+ assert args.length == 1;
+ error = toError(args[0]);
+ }
+ done.done(token, error);
+ }
+ }.token;
+ }
+
+ public IToken loggingDialog(String msg, final DoneWithNoReplyCommand done) {
+ return new Command(channel, this, COMMAND_LOGGING_DIALOG, new Object[] { msg }) {
+ @Override
+ public void done(Exception error, Object[] args) {
+ if (error == null) {
+ assert args.length == 1;
+ error = toError(args[0]);
+ }
+ done.done(token, error);
+ }
+ }.token;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverService.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverService.java
new file mode 100644
index 0000000..add9cf9
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/tcfagent/UnitTestDriverService.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.tests.tcfagent;
+
+import org.eclipse.cdt.debug.edc.tcf.extension.AgentUtils;
+import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging;
+import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IService;
+import org.eclipse.tm.tcf.protocol.IToken;
+import org.eclipse.tm.tcf.protocol.JSON;
+
+/**
+ * See {@link IUnitTestDriver}
+ */
+public class UnitTestDriverService implements IService {
+
+ private final IChannel channel;
+
+ private class CommandServer implements IChannel.ICommandServer {
+
+ public void command(IToken token, String name, byte[] data) {
+ try {
+ command(token, name, JSON.parseSequence(data));
+ } catch (Throwable x) {
+ channel.terminate(x);
+ }
+ }
+
+ private void command(IToken token, String name, Object[] args) throws Exception {
+ if (name.equals(IUnitTestDriver.COMMAND_LOGGING_WRITE)||
+ name.equals(IUnitTestDriver.COMMAND_LOGGING_WRITELN) ||
+ name.equals(IUnitTestDriver.COMMAND_LOGGING_DIALOG))
+ {
+ if (!AgentUtils.checkNumArgs(token, channel, args.length, 1))
+ return;
+ String s = (String) args[0];
+
+ // Now ask loggingService to send a event.
+ LoggingService loggingSvc = (LoggingService)channel.getLocalService(ILogging.NAME);
+ if (loggingSvc == null)
+ channel.sendResult(token, AgentUtils.jsonErr("LoggingService not supported by the agent."));
+ else {
+ channel.sendResult(token, JSON.toJSONSequence(new Object[] { null }));
+
+ if (name.equals(IUnitTestDriver.COMMAND_LOGGING_WRITE))
+ loggingSvc.write(s);
+ else if (name.equals(IUnitTestDriver.COMMAND_LOGGING_WRITELN))
+ loggingSvc.writeln(s);
+ else if (name.equals(IUnitTestDriver.COMMAND_LOGGING_DIALOG))
+ loggingSvc.dialog(0, s, s);
+ }
+ }
+ else {
+ channel.rejectCommand(token);
+ }
+ }
+ }
+
+ public UnitTestDriverService(IChannel channel) {
+ this.channel = channel;
+ channel.addCommandServer(this, new CommandServer());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.tm.tcf.protocol.IService#getName()
+ */
+ public String getName() {
+ return IUnitTestDriver.NAME;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.ui/plugin.xml b/org.eclipse.cdt.debug.edc.ui/plugin.xml
index 2a952cd..67f8c54 100644
--- a/org.eclipse.cdt.debug.edc.ui/plugin.xml
+++ b/org.eclipse.cdt.debug.edc.ui/plugin.xml
@@ -755,14 +755,7 @@
verticalRulerPreferenceValue="true">
</specification>
</extension>
-
- <extension
- point="org.eclipse.cdt.debug.core.BreakpointActionType">
- <actionType
- name="%SkipAction.name"
- class="org.eclipse.cdt.debug.edc.internal.breakpointactions.SkipAction"
- id="org.eclipse.cdt.debug.edc.breakpointactions.SkipAction"/>
- </extension>
+
<extension
point="org.eclipse.cdt.debug.ui.BreakpointActionPage">
<actionPage
diff --git a/org.eclipse.cdt.debug.edc.ui/src/org/eclipse/cdt/debug/edc/ui/console/ConsoleLogManager.java b/org.eclipse.cdt.debug.edc.ui/src/org/eclipse/cdt/debug/edc/ui/console/ConsoleLogManager.java
index 7755ecf..d20af85 100644
--- a/org.eclipse.cdt.debug.edc.ui/src/org/eclipse/cdt/debug/edc/ui/console/ConsoleLogManager.java
+++ b/org.eclipse.cdt.debug.edc.ui/src/org/eclipse/cdt/debug/edc/ui/console/ConsoleLogManager.java
@@ -24,13 +24,15 @@
import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging.DoneRemoveListener;
import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging.LogListener;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.tm.tcf.core.AbstractChannel;
import org.eclipse.tm.tcf.protocol.IChannel;
+import org.eclipse.tm.tcf.protocol.IChannel.IChannelListener;
import org.eclipse.tm.tcf.protocol.IToken;
import org.eclipse.tm.tcf.protocol.Protocol;
-import org.eclipse.tm.tcf.protocol.IChannel.IChannelListener;
import org.eclipse.tm.tcf.util.TCFTask;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
@@ -190,27 +192,37 @@
public void removeConsole(MessageConsole console) {
if (consoleStreamMappings.remove(console) != null && consoleStreamMappings.isEmpty()) {
if (isChannelOpen()) {
- TCFTask<Object> task = new TCFTask<Object>() {
- public void run() {
- ILogging logging = ConsoleLogManager.this.channel.getRemoteService(ILogging.class);
- assert logging != null;
- logging.removeListener(logId, ConsoleLogManager.this, new DoneRemoveListener() {
- public void doneRemoveListener(IToken token, Exception error) {
- if (error == null)
- done(this);
- else
- error(error);
+ Job job = new Job("Disabling console logging") { //$NON-NLS-1$
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+
+ TCFTask<Object> task = new TCFTask<Object>() {
+ public void run() {
+ ILogging logging = ConsoleLogManager.this.channel.getRemoteService(ILogging.class);
+ assert logging != null;
+ logging.removeListener(logId, ConsoleLogManager.this, new DoneRemoveListener() {
+ public void doneRemoveListener(IToken token, Exception error) {
+ if (error == null)
+ done(this);
+ else
+ error(error);
+ }
+ });
}
- });
+ };
+ // wait a fixed time since the target may be disconnected
+ try {
+ task.get(15, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ } catch (Exception e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ }
+
+ return Status.OK_STATUS;
}
};
- // wait a fixed time since the target may be disconnected
- try {
- task.get(15, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- } catch (Exception e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- }
+ job.setSystem(true);
+ job.schedule();
}
}
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/.cproject b/org.eclipse.cdt.debug.edc.windows.agent/.cproject
index 527ec8c..8529c4d 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/.cproject
+++ b/org.eclipse.cdt.debug.edc.windows.agent/.cproject
@@ -1,1083 +1,1083 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
- <storageModule moduleId="org.eclipse.cdt.core.settings">
- <cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601" moduleId="org.eclipse.cdt.core.settings" name="Debug">
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactName="EDCWindowsDebugAgent" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
- <folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.1538365029" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
- <targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.2100792486" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
- <builder buildPath="${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.159000015" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" parallelBuildOn="true" parallelizationNumber="-1" stopOnErr="false" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base">
- <outputEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release"/>
- </outputEntries>
- </builder>
- <tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.1887694892" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
- <option id="gnu.both.asm.option.include.paths.1865509858" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.471260719" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.320899905" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
- <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug">
- <option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.1862733942" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1678712047" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.include.paths.731820516" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.82616184" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="_DEBUG"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
- <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.234277509" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" valueType="enumerated"/>
- <option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.629164322" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.include.paths.220381318" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1194206575" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.338856969" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug"/>
- <tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1578922838" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug">
- <option id="gnu.cpp.link.option.libs.158783698" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
- <listOptionValue builtIn="false" value="ws2_32"/>
- <listOptionValue builtIn="false" value="Iphlpapi"/>
- <listOptionValue builtIn="false" value="shell32"/>
- <listOptionValue builtIn="false" value="Psapi"/>
- </option>
- <option id="gnu.cpp.link.option.flags.873085297" superClass="gnu.cpp.link.option.flags" value="-static-libgcc -static-libstdc++" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1812182462" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="common_agent|win_agent|tcf_agent" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/common_agent"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/win_agent"/>
- <entry excluding="system/Windows/windbgcache.c|system/Windows/context-win32.c|services/sysmon.c|services/filesystem.c|framework/cpudefs.c|framework/context.c|system/VxWorks|system/Msys|system/GNU|system/FreeBSD|system/Darwin|system/Cygwin|services/tcf_elf.h|services/tcf_elf.c|services/sysmon.h|services/symbols.h|services/symbols.c|services/symbols_win32.c|services/symbols_proxy.c|services/symbols_elf.c|services/symbols_alloc.h|services/streamsservice.h|services/streamsservice.c|services/stacktrace.h|services/stacktrace.c|services/runctrl.h|services/runctrl.c|services/registers.h|services/registers.c|services/processes.h|services/processes.c|services/pathmap.h|services/pathmap.c|services/memoryservice.h|services/memoryservice.c|services/memorymap.h|services/memorymap.c|services/linenumbers.h|services/linenumbers.c|services/linenumbers_win32.c|services/linenumbers_proxy.c|services/linenumbers_elf.c|services/filesystem.h|services/expressions.h|services/expressions.c|services/dwarfreloc.h|services/dwarfreloc.c|services/dwarfio.h|services/dwarfio.c|services/dwarfframe.h|services/dwarfframe.c|services/dwarfexpr.h|services/dwarfexpr.c|services/dwarfcache.h|services/dwarfcache.c|services/dwarf.h|services/diagnostics.h|services/diagnostics.c|services/breakpoints.h|services/breakpoints.c|main" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="src/tcf_agent"/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
- <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- </storageModule>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056" moduleId="org.eclipse.cdt.core.settings" name="Release">
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactName="EDCWindowsDebugAgent" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
- <folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.release.621696957" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.release">
- <targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.release.1475534765" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.release"/>
- <builder buildPath="${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/Release}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.262145787" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
- <tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release.1879731861" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release">
- <option id="gnu.both.asm.option.include.paths.1343345944" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.421024354" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1221113286" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
- <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.2094424424" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release">
- <option id="gnu.cpp.compiler.mingw.exe.release.option.optimization.level.767183911" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.mingw.exe.release.option.debugging.level.38623966" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.include.paths.653960025" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.474725460" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.exe.release.option.optimization.level.832130839" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.release.option.optimization.level" valueType="enumerated"/>
- <option id="gnu.c.compiler.mingw.exe.release.option.debugging.level.2025140279" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.include.paths.1162453484" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
- <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1040528181" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release.94608933" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release"/>
- <tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release.500637091" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release">
- <option id="gnu.cpp.link.option.libs.995621225" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
- <listOptionValue builtIn="false" value="ws2_32"/>
- <listOptionValue builtIn="false" value="Psapi"/>
- <listOptionValue builtIn="false" value="shell32"/>
- <listOptionValue builtIn="false" value="Iphlpapi"/>
- </option>
- <option id="gnu.cpp.link.option.flags.1501936203" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-static-libgcc -static-libstdc++" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1472560075" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/win_agent"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/common_agent"/>
- <entry excluding="common_agent|win_agent|common|tcf_agent" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
- <entry excluding="system/Windows/context-win32.c|system/Windows/windbgcache.c|services/sysmon.c|services/filesystem.c|framework/cpudefs.c|framework/context.c|system/VxWorks|system/Msys|system/GNU|system/FreeBSD|system/Darwin|system/Cygwin|services/tcf_elf.h|services/tcf_elf.c|services/sysmon.h|services/symbols.h|services/symbols.c|services/symbols_win32.c|services/symbols_proxy.c|services/symbols_elf.c|services/symbols_alloc.h|services/streamsservice.h|services/streamsservice.c|services/stacktrace.h|services/stacktrace.c|services/runctrl.h|services/runctrl.c|services/registers.h|services/registers.c|services/processes.h|services/processes.c|services/pathmap.h|services/pathmap.c|services/memoryservice.h|services/memoryservice.c|services/memorymap.h|services/memorymap.c|services/linenumbers.h|services/linenumbers.c|services/linenumbers_win32.c|services/linenumbers_proxy.c|services/linenumbers_elf.c|services/filesystem.h|services/expressions.h|services/expressions.c|services/dwarfreloc.h|services/dwarfreloc.c|services/dwarfio.h|services/dwarfio.c|services/dwarfframe.h|services/dwarfframe.c|services/dwarfexpr.h|services/dwarfexpr.c|services/dwarfcache.h|services/dwarfcache.c|services/dwarf.h|services/diagnostics.h|services/diagnostics.c|services/breakpoints.h|services/breakpoints.c|main" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/tcf_agent"/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
- <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- </storageModule>
- </cconfiguration>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="org.eclipse.cdt.debug.edc.windows.agent.cdt.managedbuild.target.gnu.mingw.exe.184573277" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
- <storageModule moduleId="refreshScope" versionNumber="1">
- <resource workspacePath="/org.eclipse.cdt.debug.edc.windows.agent"/>
- </storageModule>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.1454028438;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342.655119744;cdt.managedbuild.tool.gnu.c.compiler.input.1319117429">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.1509754350;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.826284934;cdt.managedbuild.tool.gnu.cpp.compiler.input.1852549565">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.2094424424;cdt.managedbuild.tool.gnu.cpp.compiler.input.474725460">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.767990038;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342.1115661107;cdt.managedbuild.tool.gnu.c.compiler.input.1557143381">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.1509754350;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1179175434;cdt.managedbuild.tool.gnu.c.compiler.input.163879355">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342;cdt.managedbuild.tool.gnu.c.compiler.input.1040528181">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- </storageModule>
-</cproject>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="EDCWindowsDebugAgent" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
+ <folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601." name="/" resourcePath="">
+ <toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.1538365029" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
+ <targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.2100792486" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
+ <builder buildPath="${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.159000015" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" parallelBuildOn="true" parallelizationNumber="-1" stopOnErr="false" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release"/>
+ </outputEntries>
+ </builder>
+ <tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.1887694892" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
+ <option id="gnu.both.asm.option.include.paths.1865509858" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.471260719" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.320899905" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug">
+ <option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.1862733942" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1678712047" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.731820516" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.82616184" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="_DEBUG"/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
+ <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.234277509" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" valueType="enumerated"/>
+ <option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.629164322" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.220381318" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1194206575" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.338856969" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1578922838" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug">
+ <option id="gnu.cpp.link.option.libs.158783698" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <listOptionValue builtIn="false" value="ws2_32"/>
+ <listOptionValue builtIn="false" value="Iphlpapi"/>
+ <listOptionValue builtIn="false" value="shell32"/>
+ <listOptionValue builtIn="false" value="Psapi"/>
+ </option>
+ <option id="gnu.cpp.link.option.flags.873085297" superClass="gnu.cpp.link.option.flags" value="-static-libgcc -static-libstdc++" valueType="string"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1812182462" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="common_agent|win_agent|tcf_agent" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/common_agent"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/win_agent"/>
+ <entry excluding="system/Windows/windbgcache.c|system/Windows/context-win32.c|services/sysmon.c|services/filesystem.c|framework/cpudefs.c|framework/context.c|system/VxWorks|system/Msys|system/GNU|system/FreeBSD|system/Darwin|system/Cygwin|services/tcf_elf.h|services/tcf_elf.c|services/sysmon.h|services/symbols.h|services/symbols.c|services/symbols_win32.c|services/symbols_proxy.c|services/symbols_elf.c|services/symbols_alloc.h|services/streamsservice.h|services/streamsservice.c|services/stacktrace.h|services/stacktrace.c|services/runctrl.h|services/runctrl.c|services/registers.h|services/registers.c|services/processes.h|services/processes.c|services/pathmap.h|services/pathmap.c|services/memoryservice.h|services/memoryservice.c|services/memorymap.h|services/memorymap.c|services/linenumbers.h|services/linenumbers.c|services/linenumbers_win32.c|services/linenumbers_proxy.c|services/linenumbers_elf.c|services/filesystem.h|services/expressions.h|services/expressions.c|services/dwarfreloc.h|services/dwarfreloc.c|services/dwarfio.h|services/dwarfio.c|services/dwarfframe.h|services/dwarfframe.c|services/dwarfexpr.h|services/dwarfexpr.c|services/dwarfcache.h|services/dwarfcache.c|services/dwarf.h|services/diagnostics.h|services/diagnostics.c|services/breakpoints.h|services/breakpoints.c|main" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="src/tcf_agent"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ </cconfiguration>
+ <cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056" moduleId="org.eclipse.cdt.core.settings" name="Release">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="EDCWindowsDebugAgent" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
+ <folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.757224056." name="/" resourcePath="">
+ <toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.release.621696957" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.release">
+ <targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.release.1475534765" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.release"/>
+ <builder buildPath="${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/Release}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.262145787" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release.1879731861" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release">
+ <option id="gnu.both.asm.option.include.paths.1343345944" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.421024354" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1221113286" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.2094424424" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release">
+ <option id="gnu.cpp.compiler.mingw.exe.release.option.optimization.level.767183911" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.mingw.exe.release.option.debugging.level.38623966" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.653960025" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.474725460" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release">
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.exe.release.option.optimization.level.832130839" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.release.option.optimization.level" valueType="enumerated"/>
+ <option id="gnu.c.compiler.mingw.exe.release.option.debugging.level.2025140279" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.1162453484" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1040528181" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release.94608933" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release.500637091" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release">
+ <option id="gnu.cpp.link.option.libs.995621225" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <listOptionValue builtIn="false" value="ws2_32"/>
+ <listOptionValue builtIn="false" value="Psapi"/>
+ <listOptionValue builtIn="false" value="shell32"/>
+ <listOptionValue builtIn="false" value="Iphlpapi"/>
+ </option>
+ <option id="gnu.cpp.link.option.flags.1501936203" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-static-libgcc -static-libstdc++" valueType="string"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1472560075" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/win_agent"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/common_agent"/>
+ <entry excluding="common_agent|win_agent|common|tcf_agent" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ <entry excluding="system/Windows/context-win32.c|system/Windows/windbgcache.c|services/sysmon.c|services/filesystem.c|framework/cpudefs.c|framework/context.c|system/VxWorks|system/Msys|system/GNU|system/FreeBSD|system/Darwin|system/Cygwin|services/tcf_elf.h|services/tcf_elf.c|services/sysmon.h|services/symbols.h|services/symbols.c|services/symbols_win32.c|services/symbols_proxy.c|services/symbols_elf.c|services/symbols_alloc.h|services/streamsservice.h|services/streamsservice.c|services/stacktrace.h|services/stacktrace.c|services/runctrl.h|services/runctrl.c|services/registers.h|services/registers.c|services/processes.h|services/processes.c|services/pathmap.h|services/pathmap.c|services/memoryservice.h|services/memoryservice.c|services/memorymap.h|services/memorymap.c|services/linenumbers.h|services/linenumbers.c|services/linenumbers_win32.c|services/linenumbers_proxy.c|services/linenumbers_elf.c|services/filesystem.h|services/expressions.h|services/expressions.c|services/dwarfreloc.h|services/dwarfreloc.c|services/dwarfio.h|services/dwarfio.c|services/dwarfframe.h|services/dwarfframe.c|services/dwarfexpr.h|services/dwarfexpr.c|services/dwarfcache.h|services/dwarfcache.c|services/dwarf.h|services/diagnostics.h|services/diagnostics.c|services/breakpoints.h|services/breakpoints.c|main" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/tcf_agent"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="org.eclipse.cdt.debug.edc.windows.agent.cdt.managedbuild.target.gnu.mingw.exe.184573277" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="refreshScope" versionNumber="1">
+ <resource workspacePath="/org.eclipse.cdt.debug.edc.windows.agent"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.472286202;cdt.managedbuild.tool.gnu.cpp.compiler.input.843378569">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.1454028438;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342.655119744;cdt.managedbuild.tool.gnu.c.compiler.input.1319117429">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.1509754350;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.826284934;cdt.managedbuild.tool.gnu.cpp.compiler.input.1852549565">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.2094424424;cdt.managedbuild.tool.gnu.cpp.compiler.input.474725460">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.767990038;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342.1115661107;cdt.managedbuild.tool.gnu.c.compiler.input.1557143381">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1347372394;cdt.managedbuild.tool.gnu.c.compiler.input.1194206575">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601;cdt.managedbuild.config.gnu.mingw.exe.debug.1644349601.1509754350;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1179175434;cdt.managedbuild.tool.gnu.c.compiler.input.163879355">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.757224056;cdt.managedbuild.config.gnu.mingw.exe.release.757224056.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1979802342;cdt.managedbuild.tool.gnu.c.compiler.input.1040528181">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="makefileGenerator">
+ <runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ <profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+ <buildOutputProvider>
+ <openAction enabled="true" filePath=""/>
+ <parser enabled="true"/>
+ </buildOutputProvider>
+ <scannerInfoProvider id="specsFile">
+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+ <parser enabled="true"/>
+ </scannerInfoProvider>
+ </profile>
+ </scannerConfigBuildInfo>
+ </storageModule>
+</cproject>
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/ProtocolConstants.h b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/ProtocolConstants.h
index ca67af7..aab0a67 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/ProtocolConstants.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/ProtocolConstants.h
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -20,7 +20,7 @@
// This is supplement to properties in IRunControl.
// ID of a context in hosting OS (e.g. process id, thread id).
// Supposed to replace IRunControl.PROCESS_ID
-#define PROP_OS_ID "OSID" // value type: string
+#define PROP_OS_ID "OSID" // value type: string
/*
* These are properties that a TCF agent should report with module-load or
@@ -28,35 +28,37 @@
* happen (e.g. for a Windows DLL), the agent must report at least
* PROP_IMAGE_BASE_ADDRESS or PROP_CODE_ADDRESS.
*/
-#define PROP_NAME "Name" // module file name (base)
-#define PROP_FILE "File" // module file name (for breakpoints)
-#define PROP_TIME "Time"
-#define PROP_MODULE_LOADED "Loaded" // Boolean, whether loaded or unloaded.
-#define PROP_CODE_SIZE "CodeSize" // value type: Number (c++ int or long).
-#define PROP_DATA_SIZE "DataSize" // value type: Number.
-#define PROP_BSS_SIZE "BssSize" // value type: Number.
+#define PROP_NAME "Name" // module file name (base)
+#define PROP_FILE "File" // module file name (for breakpoints)
+#define PROP_TIME "Time"
+#define PROP_MODULE_LOADED "Loaded" // Boolean, whether loaded or unloaded.
+#define PROP_CODE_SIZE "CodeSize" // value type: Number (c++ int or long).
+#define PROP_DATA_SIZE "DataSize" // value type: Number.
+#define PROP_BSS_SIZE "BssSize" // value type: Number.
// image base address for modules (PE file) from Windows
-#define PROP_IMAGE_BASE_ADDRESS "ImageBaseAddress" // value type: Number.
+#define PROP_IMAGE_BASE_ADDRESS "ImageBaseAddress" // value type: Number.
// following are for systems that can give us such info.
// Note these are mutually exclusive with PROP_IMAGE_BASE_ADDRESS.
-#define PROP_CODE_ADDRESS "CodeAddress" // value type: Number.
-#define PROP_DATA_ADDRESS "DataAddress" // value type: Number.
-#define PROP_BSS_ADDRESS "BssAddress" // value type: Number.
+#define PROP_CODE_ADDRESS "CodeAddress" // value type: Number.
+#define PROP_DATA_ADDRESS "DataAddress" // value type: Number.
+#define PROP_BSS_ADDRESS "BssAddress" // value type: Number.
-#define PROP_REQUIRED_RESUME "RequireResume" // if true, the process should be resumed after setting breakpoints on the module
-#define PROP_UID "UID" // the UID of the module (Symbian)
+#define PROP_REQUIRED_RESUME "RequireResume" // if true, the process should be resumed after setting breakpoints on the module
+#define PROP_UID "UID" // the UID of the module (Symbian)
+
+#define PROP_SUSPEND_DETAIL "message" // usually the exception message
/**
* State change reason of a context.
* Reason can be any text, but if it is one of predefined strings,
* a generic client might be able to handle it better.
*/
-#define REASON_USER_REQUEST "Suspended"
+#define REASON_USER_REQUEST "Suspended"
#define REASON_STEP "Step"
-#define REASON_BREAKPOINT "Breakpoint"
-#define REASON_EXCEPTION "Exception"
-#define REASON_CONTAINER "Container"
-#define REASON_WATCHPOINT "Watchpoint"
-#define REASON_SIGNAL "Signal"
+#define REASON_BREAKPOINT "Breakpoint"
+#define REASON_EXCEPTION "Exception"
+#define REASON_CONTAINER "Container"
+#define REASON_WATCHPOINT "Watchpoint"
+#define REASON_SIGNAL "Signal"
#define REASON_SHAREDLIB "Shared Library"
-#define REASON_ERROR "Error"
+#define REASON_ERROR "Error"
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.cpp
index a64a4a5..e3511f6 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.cpp
@@ -22,16 +22,15 @@
{
osID = osid;
- initialize();
+ Initialize();
}
-void RunControlContext::initialize()
-{
+void RunControlContext::Initialize() {
SetProperty(PROP_OS_ID, PropertyValue(GetOSID()));
}
-ContextOSID RunControlContext::GetOSID() {
+ContextOSID RunControlContext::GetOSID() const {
return osID;
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.h b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.h
index 02fe264..878924e 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/RunControlContext.h
@@ -57,14 +57,14 @@
/*
* Get OS ID of the process or thread.
*/
- ContextOSID GetOSID();
+ ContextOSID GetOSID() const;
/**
* If true, the context is under control of the debugger.
* If not, it is just known to be running as of some recent update
* (usually the Processes::getChildren command).
*/
- bool IsDebugging() { return isDebugging; }
+ bool IsDebugging() const { return isDebugging; }
/**
* Toggle the status of the context being under control of the debugger.
*
@@ -74,26 +74,26 @@
void SetDebugging(bool debugging) { isDebugging = debugging; }
/** Read memory synchronously, returning TCF error code or throwing exception. */
- virtual int ReadMemory(const ReadWriteMemoryParams& params) throw (AgentException) = 0;
+ virtual int ReadMemory(const ReadWriteMemoryParams&) throw (AgentException) = 0;
/** Write memory synchronously, returning TCF error code or throwing exception. */
- virtual int WriteMemory(const ReadWriteMemoryParams& params) throw (AgentException) = 0;
+ virtual int WriteMemory(const ReadWriteMemoryParams&) throw (AgentException) = 0;
/** Resume execution asynchronously. */
- virtual void Resume(const AgentActionParams& params) throw (AgentException) = 0;
+ virtual void Resume(const AgentActionParams&) throw (AgentException) = 0;
/** Suspend execution asynchronously. */
- virtual void Suspend(const AgentActionParams& params) throw (AgentException) = 0;
+ virtual void Suspend(const AgentActionParams&) throw (AgentException) = 0;
/** Terminate execution asynchronously. */
- virtual void Terminate(const AgentActionParams& params) throw (AgentException) = 0;
+ virtual void Terminate(const AgentActionParams&) throw (AgentException) = 0;
/** Invoke single step and suspend asynchronously. */
- virtual void SingleStep(const AgentActionParams& params) throw (AgentException) = 0;
+ virtual void SingleStep(const AgentActionParams&) throw (AgentException) = 0;
-private:
+ private:
// initialize specific properties.
- void initialize();
+ void Initialize();
ContextOSID osID; /* process or thread identifier */
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.cpp
index 0450b84..1e37847 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.cpp
@@ -21,7 +21,7 @@
this->internalID = internalID;
this->parentID = parentID;
- initialize();
+ Initialize();
// Don't add the context to any context cache here as there are different
// caches for different purposes.
@@ -32,7 +32,7 @@
this->internalID = internalID;
this->parentID = parentID;
this->properties = props;
- initialize();
+ Initialize();
}
Context::~Context() {
@@ -53,17 +53,17 @@
ContextManager::removeContext(GetID());
}
-void Context::initialize()
+void Context::Initialize()
{
SetProperty(PROP_ID, PropertyValue(internalID));
SetProperty(PROP_PARENT_ID, PropertyValue(parentID));
}
-ContextID Context::GetID() {
+ContextID Context::GetID() const {
return internalID;
}
-ContextID Context::GetParentID() {
+ContextID Context::GetParentID() const {
return parentID;
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.h b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.h
index 795e29e..662837e 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent/TCFContext.h
@@ -53,7 +53,7 @@
* The context can be a process, thread, register group, register, etc.
*/
class Context {
-public:
+ public:
Context(const ContextID& parentID, const ContextID& internalID);
Context(const ContextID& parentID, const ContextID& internalID, Properties& props);
@@ -64,12 +64,12 @@
* Get unique ID for the instance. This is internal ID, not process ID
* or thread ID in the OS.
*/
- ContextID GetID();
+ ContextID GetID() const;
/* Get internal ID of the process if the context is a thread.
* Return invalid id if the context is a process.
*/
- ContextID GetParentID();
+ ContextID GetParentID() const;
virtual std::list<Context*>& GetChildren();
void AddChild(Context *);
@@ -79,8 +79,8 @@
PropertyValue& GetProperty(const std::string& key);
void SetProperty(const std::string& key, const PropertyValue& value);
-private:
- void initialize();
+ private:
+ void Initialize();
ContextID internalID;
ContextID parentID;
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.c b/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.c
index 325a052..4d74712 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.c
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.c
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
+ * Copyright (c) 2007, 2010, 2011 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
@@ -10,6 +10,7 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
+ * Nokia - additional error messages for watchpoints
*******************************************************************************/
/*
@@ -318,33 +319,37 @@
const char * errno_to_str(int err) {
switch (err) {
- case ERR_ALREADY_STOPPED: return "Already stopped";
- case ERR_ALREADY_EXITED: return "Already exited";
- case ERR_ALREADY_RUNNING: return "Already running";
- case ERR_JSON_SYNTAX: return "JSON syntax error";
- case ERR_PROTOCOL: return "Protocol format error";
- case ERR_INV_CONTEXT: return "Invalid context";
- case ERR_INV_ADDRESS: return "Invalid address";
- case ERR_EOF: return "End of file";
- case ERR_BASE64: return "Invalid BASE64 string";
- case ERR_INV_EXPRESSION: return "Invalid expression";
- case ERR_SYM_NOT_FOUND: return "Symbol not found";
- case ERR_ALREADY_ATTACHED: return "Already attached";
- case ERR_BUFFER_OVERFLOW: return "Buffer overflow";
- case ERR_INV_FORMAT: return "Format is not supported";
- case ERR_INV_NUMBER: return "Invalid number";
- case ERR_IS_RUNNING: return "Execution context is running";
- case ERR_INV_DWARF: return "Error reading DWARF data";
- case ERR_UNSUPPORTED: return "Unsupported command";
- case ERR_CHANNEL_CLOSED: return "Channel closed";
- case ERR_COMMAND_CANCELLED: return "Command canceled";
- case ERR_UNKNOWN_PEER: return "Unknown peer";
- case ERR_INV_DATA_SIZE: return "Invalid data size";
- case ERR_INV_DATA_TYPE: return "Invalid data type";
- case ERR_INV_COMMAND: return "Command is not recognized";
- case ERR_INV_TRANSPORT: return "Invalid transport name";
- case ERR_CACHE_MISS: return "Invalid data cache state";
- case ERR_NOT_ACTIVE: return "Context is not active";
+ case ERR_ALREADY_STOPPED: return "Already stopped";
+ case ERR_ALREADY_EXITED: return "Already exited";
+ case ERR_ALREADY_RUNNING: return "Already running";
+ case ERR_JSON_SYNTAX: return "JSON syntax error";
+ case ERR_PROTOCOL: return "Protocol format error";
+ case ERR_INV_CONTEXT: return "Invalid context";
+ case ERR_INV_ADDRESS: return "Invalid address";
+ case ERR_EOF: return "End of file";
+ case ERR_BASE64: return "Invalid BASE64 string";
+ case ERR_INV_EXPRESSION: return "Invalid expression";
+ case ERR_SYM_NOT_FOUND: return "Symbol not found";
+ case ERR_ALREADY_ATTACHED: return "Already attached";
+ case ERR_BUFFER_OVERFLOW: return "Buffer overflow";
+ case ERR_INV_FORMAT: return "Format is not supported";
+ case ERR_INV_NUMBER: return "Invalid number";
+ case ERR_IS_RUNNING: return "Execution context is running";
+ case ERR_INV_DWARF: return "Error reading DWARF data";
+ case ERR_UNSUPPORTED: return "Unsupported command";
+ case ERR_CHANNEL_CLOSED: return "Channel closed";
+ case ERR_COMMAND_CANCELLED: return "Command canceled";
+ case ERR_UNKNOWN_PEER: return "Unknown peer";
+ case ERR_INV_DATA_SIZE: return "Invalid data size";
+ case ERR_INV_DATA_TYPE: return "Invalid data type";
+ case ERR_INV_COMMAND: return "Command is not recognized";
+ case ERR_INV_TRANSPORT: return "Invalid transport name";
+ case ERR_CACHE_MISS: return "Invalid data cache state";
+ case ERR_NOT_ACTIVE: return "Context is not active";
+ case ERR_HWBRK_NOT_SET: return "Cannot set hardware breakpoint";
+ case ERR_HWBRK_INVALID_SIZE: return "Invalid size";
+ case ERR_HWBRK_NO_RESOURCES: return "No resources available";
+ case ERR_HWBRK_NOT_ALIGNED: return "Invalid address alignment";
default:
if (err >= ERR_MESSAGE_MIN && err <= ERR_MESSAGE_MAX) {
if (is_dispatch_thread()) {
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.h b/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.h
index dd5b0d2..80f90f7 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework/errors.h
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
+ * Copyright (c) 2007, 2010, 2011 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
@@ -10,6 +10,7 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
+ * Nokia - additional error messages for watchpoints
*******************************************************************************/
/*
@@ -51,6 +52,10 @@
#define ERR_INV_TRANSPORT (STD_ERR_BASE + 26)
#define ERR_CACHE_MISS (STD_ERR_BASE + 27)
#define ERR_NOT_ACTIVE (STD_ERR_BASE + 28)
+#define ERR_HWBRK_NOT_SET (STD_ERR_BASE + 29)
+#define ERR_HWBRK_INVALID_SIZE (STD_ERR_BASE + 30)
+#define ERR_HWBRK_NO_RESOURCES (STD_ERR_BASE + 31)
+#define ERR_HWBRK_NOT_ALIGNED (STD_ERR_BASE + 32)
typedef struct ErrorReportItem {
char * name;
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.cpp
index ef1ff6e..9a0c180 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.cpp
@@ -22,6 +22,7 @@
#include "EventClientNotifier.h"
#include "Logger.h"
+#include "WinHWBkptMgr.h"
#include "WinProcess.h"
#include "WinThread.h"
@@ -36,143 +37,153 @@
//
static void read_id_array(InputStream* inp, void* arg)
{
- TCFInputStream inpStream(inp);
- std::vector<std::string>* ids = (std::vector<std::string>*)(arg);
- std::string str = inpStream.readString();
- ids->push_back(str);
+ TCFInputStream inpStream(inp);
+ std::vector<std::string>* ids = (std::vector<std::string>*)(arg);
+ std::string str = inpStream.readString();
+ ids->push_back(str);
}
//
// This static function is used to read all the breakpoint properties or attributes
//
-static void read_breakpoint_attr(InputStream * inp, const char * nm, void * arg)
-{
- TCFInputStream inpStream(inp);
- TBreakpoint * attrs = (TBreakpoint*)arg;
-
- if (strcmp(nm, "Location") == 0)
- {
- std::string location(inpStream.readString());
- // atoi fails on large unsigned ints.
- // this will also handle negative numbers, though.
- sscanf(location.c_str(), "%u", (unsigned int*)&attrs->address);
- return;
- }
+static void read_breakpoint_attr(InputStream * inp, const char * nm, void * arg) {
+ TCFInputStream inpStream(inp);
+ TBreakpoint* attrs = (TBreakpoint*)arg;
- if (strcmp(nm, "ContextIds") == 0)
- {
- json_read_array(inp,read_id_array,&attrs->iContextIds);
- return;
- }
-
- if (strcmp(nm, "ID") == 0)
- {
- attrs->hostBreakPointId = inpStream.readString();
- return;
- }
-
- if (strcmp(nm, "Enabled") == 0)
- {
- attrs->enabled = json_read_boolean(inp);
- return;
- }
-
- json_skip_object(inp);
+ if (::strcmp(nm, "AccessMode") == 0) {
+ attrs->accessMode = (TCFAccessMode)inpStream.readULong();
+ return;
+ }
+
+ if (::strcmp(nm, "BreakpointType") == 0) {
+ std::string type = inpStream.readString();
+ if (type.compare("Auto") == 0) {
+ attrs->bpType = type_Auto;
+ } else if (type.compare("Software") == 0) {
+ attrs->bpType = type_Software;
+ } else if (type.compare("Hardware") == 0) {
+ attrs->bpType = type_Hardware;
+ }
+ return;
+ }
+
+ if (::strcmp(nm, "ContextIds") == 0) {
+ json_read_array(inp,read_id_array,&attrs->iContextIds);
+ return;
+ }
+
+ if (::strcmp(nm, "Enabled") == 0) {
+ attrs->enabled = json_read_boolean(inp);
+ return;
+ }
+
+ if (::strcmp(nm, "ID") == 0) {
+ attrs->hostBreakPointId = inpStream.readString();
+ return;
+ }
+
+ if (::strcmp(nm, "Location") == 0) {
+ std::string location(inpStream.readString());
+ // atoi fails on large unsigned ints.
+ // this will also handle negative numbers, though.
+ ::sscanf(location.c_str(), "%u", (unsigned int*)&attrs->address);
+ return;
+ }
+
+ if (::strcmp(nm, "Size") == 0) {
+ attrs->size = inpStream.readULong();
+ return;
+ }
+
+ json_skip_object(inp);
}
//
// BreakpointService::BreakpointService()
//
-BreakpointsService::BreakpointsService(Protocol * proto)
- :TCFService(proto)
+BreakpointsService::BreakpointsService(Protocol* proto)
+ : TCFService(proto)
{
- AddCommand("add", CommandAddBreakpoint);
- AddCommand("remove", CommandRemoveBreakpoint);
+ AddCommand("add", CommandAddBreakpoint);
+ AddCommand("remove", CommandRemoveBreakpoint);
- sServiceInstalled = true;
+ sServiceInstalled = true;
}
//
// static function to get the service name
//
-const char* BreakpointsService::GetName()
-{
- return sServiceName;
+const char* BreakpointsService::GetName() {
+ return sServiceName;
}
//
// BreakpointService::CommandAddBreakpoint()
//
-void BreakpointsService::CommandAddBreakpoint(const char * token, Channel * c)
-{
- LogTrace("BreakpointService::command_add_Breakpoint", "token: %s", token);
-
- TCFChannel channel(c);
- TBreakpoint* breakInfo = new TBreakpoint();
- json_read_struct(&c->inp, read_breakpoint_attr, breakInfo);
-
- channel.readZero();
- channel.readComplete();
-
- // EDC in 3.x > 20100831 will pass a thread-specific bp (if known) at the end of the list.
- // For now we stick with process-specific breakpoints.
- // TODO: see if we want thread-specific breakpoints in the future.
- std::string contextID = breakInfo->iContextIds.front();
-
- Context* context = ContextManager::findContext(contextID);
-
- RunControlContext* thread_context = 0;
- WinProcess* proc_context = 0;
-
- if ((proc_context = dynamic_cast<WinProcess*>(context)) != NULL)
- {
- // id is a process
- }
- else if ((thread_context = dynamic_cast<WinThread*>(context)) != NULL)
- {
- // id is a thread
- proc_context = dynamic_cast<WinProcess*>(ContextManager::findContext(
- thread_context->GetParentID()));
- }
+void BreakpointsService::CommandAddBreakpoint(const char* token, Channel* c) {
+ LogTrace("BreakpointService::command_add_Breakpoint", "token: %s", token);
- if (!proc_context || !proc_context->IsDebugging())
- {
+ TCFChannel channel(c);
+ TBreakpoint* breakInfo = new TBreakpoint();
+ json_read_struct(&c->inp, read_breakpoint_attr, breakInfo);
+
+ channel.readZero();
+ channel.readComplete();
+
+ // EDC in 3.x > 20100831 will pass a thread-specific bp (if known) at the end of the list.
+ // For now we stick with process-specific breakpoints.
+ // TODO: see if we want thread-specific breakpoints in the future.
+ std::string contextID
+ = breakInfo->iContextIds.empty() ? "" : breakInfo->iContextIds.front();
+
+ Context* context = ContextManager::findContext(contextID);
+
+ WinProcess*& proc_context = breakInfo->process;
+ WinThread* thread_context = NULL;
+
+ if ((proc_context = dynamic_cast<WinProcess*>(context)) != NULL) {
+ // id is a process
+ } else if ((thread_context = dynamic_cast<WinThread*>(context)) != NULL) {
+ // id is a thread
+ proc_context = dynamic_cast<WinProcess*>(ContextManager::findContext(
+ thread_context->GetParentID()));
+ }
+
+ if (!proc_context || !proc_context->IsDebugging()) {
channel.writeCompleteReply(token, ERR_INV_CONTEXT);
return;
- }
+ }
// "thread_context" is not required.
- if (thread_context && !thread_context->IsDebugging())
- {
- channel.writeCompleteReply(token, ERR_INV_CONTEXT);
+ if (thread_context && !thread_context->IsDebugging()) {
+ channel.writeCompleteReply(token, ERR_INV_CONTEXT);
return;
- }
-
- if (!breakInfo->enabled)
- {
- trace(LOG_ALWAYS, "!!! cannot set disabled breakpoints");
+ }
+
+ if (!breakInfo->enabled) {
+ trace(LOG_ALWAYS, "!!! cannot set disabled breakpoints");
channel.writeCompleteReply(token, ERR_UNSUPPORTED);
return;
- }
+ }
- breakInfo->procHandle = proc_context->GetProcessHandle();
+ int err;
+ if (ACCESSMODE_EXECUTE == breakInfo->accessMode)
+ err = InsertBreak(breakInfo);
+ else
+ err = InsertWatch(breakInfo);
- int err = InsertBreak(breakInfo);
-
- if( err == 0)
- {
+ if (err == 0) {
trace(LOG_ALWAYS, "Breakpoint added for ID = %s", breakInfo->hostBreakPointId.c_str());
sBreakPointMap[breakInfo->hostBreakPointId] = breakInfo;
- }
-
+ }
+
channel.writeCompleteReply(token, err);
}
//
// BreakpointService::CommandRemoveBreakpoint()
//
-void BreakpointsService::CommandRemoveBreakpoint(const char * token, Channel * c)
-{
+void BreakpointsService::CommandRemoveBreakpoint(const char* token, Channel* c) {
LogTrace("BreakpointService::command_remove_Breakpoint", "token: %s", token);
TCFChannel channel(c);
@@ -185,56 +196,57 @@
channel.readComplete();
std::vector<std::string>::iterator iter ;
- for(iter = breakIdList.begin(); iter != breakIdList.end(); )
- {
+ for (iter = breakIdList.begin(); iter != breakIdList.end(); ) {
TID2BreakpointMap::iterator it = sBreakPointMap.find(*iter++);
- if (it == sBreakPointMap.end())
- {
+ if (it == sBreakPointMap.end()) {
if (!overallError)
- overallError = ERR_OTHER;
+ overallError = ERR_OTHER;
continue;
- }
+ }
TBreakpoint* bp = it->second;
sBreakPointMap.erase(it->first);
-
- err = ClearBreak(bp);
-
+
+ if (ACCESSMODE_EXECUTE == bp->accessMode)
+ err = ClearBreak(bp);
+ else
+ err = ClearWatch(bp);
+
delete bp;
// ignore "not found" from the driver, since some breakpoints
// are removed automatically on process kill / detach / etc.
if (err != 0 && err != ERR_OTHER && !overallError)
- overallError = err;
- }
-
- channel.writeCompleteReply(token, overallError);
+ overallError = err;
+ }
+
+ channel.writeCompleteReply(token, overallError);
}
/*
* Is the Breakpoints service installed in the agent ?
*/
-bool BreakpointsService::ServiceInstalled()
-{
+bool BreakpointsService::ServiceInstalled() {
return sServiceInstalled;
}
/*
* Insert a software breakpoint in a process.
*/
-int BreakpointsService::InsertBreak(const TBreakpoint* bpInfo)
-{
+int BreakpointsService::InsertBreak(const TBreakpoint* bpInfo) {
+ const HANDLE& procHandle = bpInfo->process->GetProcessHandle();
+
// save byte at breakpoint address.
- if (! ReadProcessMemory(bpInfo->procHandle, (LPCVOID)bpInfo->address, (LPVOID)&bpInfo->originalByte, 1, NULL))
- return GetLastError();
+ if (! ::ReadProcessMemory(procHandle, (LPCVOID)bpInfo->address, (LPVOID)&bpInfo->originalByte, 1, NULL))
+ return ::GetLastError();
// write breakpoint (INT3) to memory
- if (! WriteProcessMemory(bpInfo->procHandle, (LPVOID)bpInfo->address, (LPVOID)&sBreakInst, 1, NULL))
- return GetLastError();
+ if (! ::WriteProcessMemory(procHandle, (LPVOID)bpInfo->address, (LPVOID)&sBreakInst, 1, NULL))
+ return ::GetLastError();
// make sure original instruction isn't already in cache
- if (! FlushInstructionCache(bpInfo->procHandle, (LPCVOID) bpInfo->address, 1))
- return GetLastError();
+ if (! ::FlushInstructionCache(procHandle, (LPCVOID)bpInfo->address, 1))
+ return ::GetLastError();
return 0;
}
@@ -242,30 +254,68 @@
/*
* Clear a breakpoint from a process.
*/
-int BreakpointsService::ClearBreak(const TBreakpoint* bpInfo)
-{
- // write breakpoint (INT3) to memory
- if (! WriteProcessMemory(bpInfo->procHandle, (LPVOID)bpInfo->address, (LPVOID)&bpInfo->originalByte, 1, NULL))
- return GetLastError();
+int BreakpointsService::ClearBreak(const TBreakpoint* bpInfo) {
+ const HANDLE& procHandle = bpInfo->process->GetProcessHandle();
+
+ // write original byte back over top of (INT3) in memory
+ if (! ::WriteProcessMemory(procHandle, (LPVOID)bpInfo->address, (LPVOID)&bpInfo->originalByte, 1, NULL))
+ return ::GetLastError();
// make sure bp instruction isn't already in cache
- if (! FlushInstructionCache(bpInfo->procHandle, (LPCVOID) bpInfo->address, 1))
- return GetLastError();
+ if (! ::FlushInstructionCache(procHandle, (LPCVOID)bpInfo->address, 1))
+ return ::GetLastError();
return 0;
}
/*
+ * establish a hardware watchpoint using the hardware debug registers
+ */
+int BreakpointsService::InsertWatch(TBreakpoint* bpInfo) {
+ return WinHWBkptMgr::SetHardwareBreak(bpInfo);
+}
+
+/*
+ * clear the hardware debug register for a given watchpoint
+ */
+int BreakpointsService::ClearWatch(TBreakpoint* bpInfo) {
+ return WinHWBkptMgr::ClearHardwareBreak(bpInfo);
+}
+
+/*
* find if there's a breakpoint at the given address in a process.
*/
-TBreakpoint* BreakpointsService::FindBreakpointByAddress(HANDLE processHandle, unsigned long address)
-{
+TBreakpoint* BreakpointsService::FindBreakpointByAddress(
+ const HANDLE& processHandle, const ContextAddress address) {
TID2BreakpointMap::iterator iter;
for (iter = sBreakPointMap.begin(); iter != sBreakPointMap.end(); iter++) {
TBreakpoint* bp = iter->second;
- if (processHandle == bp->procHandle && // same process
- address == bp->address)
+ if (ACCESSMODE_EXECUTE == bp->accessMode
+ && bp->process && processHandle == bp->process->GetProcessHandle() // same process
+ && address == bp->address)
+ {
return bp;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * find if there's a watchpoint at the given address in a process.
+ */
+TBreakpoint*
+BreakpointsService::FindWatchpointByAddress(const HANDLE& processHandle,
+ ContextAddress address)
+{
+ TID2BreakpointMap::iterator iter;
+ for (iter = sBreakPointMap.begin(); iter != sBreakPointMap.end(); iter++) {
+ TBreakpoint* wp = iter->second;
+ if (ACCESSMODE_EXECUTE != wp->accessMode
+ && wp->process && processHandle == wp->process->GetProcessHandle() // same process
+ && wp->address <= address && address < wp->address+wp->size)
+ {
+ return wp;
+ }
}
return NULL;
}
@@ -273,13 +323,15 @@
/*
* Given a memory buffer read from a process, remove any breakpoint instructions added by debugger in the buffer.
*/
-void BreakpointsService::RemoveBreakpointsFromMemoryRead(HANDLE processHandle, ContextAddress address, char* memBuffer, unsigned long size)
-{
+void BreakpointsService::RemoveBreakpointsFromMemoryRead(
+ const HANDLE& processHandle, ContextAddress address, char* memBuffer,
+ const unsigned long size) {
TID2BreakpointMap::iterator iter;
for (iter = sBreakPointMap.begin(); iter != sBreakPointMap.end(); iter++) {
TBreakpoint* bp = iter->second;
- if (processHandle == bp->procHandle && // same process
- address <= bp->address && address+size > bp->address) // bp falls in the buffer
+ if (ACCESSMODE_EXECUTE == bp->accessMode
+ && bp->process && processHandle == bp->process->GetProcessHandle() // same process
+ && address <= bp->address && address+size > bp->address) // bp falls in the buffer
{
char *byteToChange = memBuffer + (bp->address - address);
*byteToChange = bp->originalByte;
@@ -290,13 +342,15 @@
/*
* Given a memory buffer that has been writen to a process, re-inssert any breakpoints in the buffer range.
*/
-void BreakpointsService::ReInsertBreakpointsAfterMemoryWrite(HANDLE processHandle, ContextAddress address, char* memBuffer, unsigned long size)
-{
+void BreakpointsService::ReInsertBreakpointsAfterMemoryWrite(
+ const HANDLE& processHandle, ContextAddress address, char* memBuffer,
+ const unsigned long size) {
TID2BreakpointMap::iterator iter;
for (iter = sBreakPointMap.begin(); iter != sBreakPointMap.end(); iter++) {
TBreakpoint* bp = iter->second;
- if (processHandle == bp->procHandle && // same process
- address <= bp->address && address+size > bp->address) // bp falls in the buffer
+ if (ACCESSMODE_EXECUTE == bp->accessMode
+ && bp->process && processHandle == bp->process->GetProcessHandle() // same process
+ && address <= bp->address && address+size > bp->address) // bp falls in the buffer
{
InsertBreak(bp);
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.h b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.h
index 92783dc..adb3740 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/BreakpointsService.h
@@ -19,23 +19,49 @@
#include "TCFService.h"
#include "TCFContext.h"
-struct Protocol;
+class WinProcess;
struct Channel;
+struct Protocol;
+
+enum TCFBreakpointType {
+ type_Auto,
+ type_Software,
+ type_Hardware
+};
+
+enum TCFAccessMode {
+ ACCESSMODE_READ = 0x01,
+ ACCESSMODE_WRITE = 0x02,
+ ACCESSMODE_EXECUTE = 0x04,
+ ACCESSMODE_CHANGE = 0x08,
+};
+
+typedef unsigned char HWBreakID;
+#define HWBREAK_NOT_SET 0
//
// To store the breakpoint info
//
-struct TBreakpoint
-{
- std::vector<std::string> iContextIds;
- HANDLE procHandle; // Win32 handle of the hosting process
- std::string hostBreakPointId; // breakpoint ID from host debugger.
- ContextAddress address;
- bool enabled;
- unsigned char originalByte; // original byte where we set the bp.
-
- TBreakpoint(): address(0), enabled(true), originalByte(0)
- {}
+struct TBreakpoint {
+ std::vector<std::string> iContextIds;
+ WinProcess* process; // pointer to the process hosint the bkpt
+ std::string hostBreakPointId; // breakpoint ID from host debugger.
+ ContextAddress address;
+ bool enabled;
+ unsigned char originalByte; // original byte where we set the bp.
+ unsigned char size; // for windows-x86, max is well below 255
+
+ TCFBreakpointType bpType; // ignored; always software for bkpt
+ // and always hardware for watchpoint
+
+ TCFAccessMode accessMode; // _EXECUTE means bkpt; o/w -> watchpoint
+ HWBreakID hwBreakID;
+
+ TBreakpoint()
+ : process(NULL), address(0), enabled(true), originalByte(0),
+ size(0), bpType(type_Auto), accessMode(ACCESSMODE_READ),
+ hwBreakID(HWBREAK_NOT_SET)
+ {}
};
typedef std::map<std::string, TBreakpoint*> TID2BreakpointMap;
@@ -48,28 +74,35 @@
//
// Breakpoint service implementation
//
-class BreakpointsService: public TCFService
-{
-public:
- BreakpointsService(Protocol * proto);
-
- const char* GetName();
+class BreakpointsService: public TCFService {
+ public:
+ BreakpointsService(Protocol * proto);
- static void CommandAddBreakpoint(const char *, Channel *);
- static void CommandRemoveBreakpoint(const char *, Channel *);
+ const char* GetName();
- static int InsertBreak(const TBreakpoint* bpInfo);
- static int ClearBreak(const TBreakpoint* bpInfo);
+ static void CommandAddBreakpoint(const char* token, Channel*);
+ static void CommandRemoveBreakpoint(const char* token, Channel*);
- static TBreakpoint* FindBreakpointByAddress(HANDLE processHandle, unsigned long address);
- static void RemoveBreakpointsFromMemoryRead(HANDLE, ContextAddress, char*, unsigned long);
- static void ReInsertBreakpointsAfterMemoryWrite(HANDLE, ContextAddress, char*, unsigned long);
+ static int InsertBreak(const TBreakpoint*);
+ static int ClearBreak(const TBreakpoint*);
- static bool ServiceInstalled();
+ static int InsertWatch(TBreakpoint*);
+ static int ClearWatch(TBreakpoint*);
-private:
- static bool sServiceInstalled;
+ static TBreakpoint* FindBreakpointByAddress(const HANDLE& processHandle,
+ const ContextAddress);
+ static TBreakpoint* FindWatchpointByAddress(const HANDLE& processHandle,
+ const ContextAddress);
+ static void RemoveBreakpointsFromMemoryRead(const HANDLE& processHandle,
+ const ContextAddress, char* memBuffer, const unsigned long size);
+ static void ReInsertBreakpointsAfterMemoryWrite(
+ const HANDLE& processHandle, const ContextAddress, char* memBuffer,
+ const unsigned long size);
+
+ static bool ServiceInstalled();
+
+ private:
+ static bool sServiceInstalled;
};
-
#endif /* BREAKPOINTSERVICE_H_ */
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/ProcessService.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/ProcessService.cpp
index 1099e2a..3979c41 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/ProcessService.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/ProcessService.cpp
@@ -277,7 +277,14 @@
environment.push_back(envp[i]);
}
- json_read_boolean(&c->inp); // attach
+ // this is the "attach" parameter, but note that in this case
+ // it's really if you want to stay attached to the process we're
+ // launching in order to debug it, vs. just launching it in order
+ // to run it (without debugging). for attaching to an existing
+ // process, command_attach will be called.
+// TODO currently ignored, but we need to honor it if/when we add
+// support for running vs. debugging.
+/* bool debug = */ json_read_boolean(&c->inp); // attach
if (read_stream(&c->inp) != 0)
exception(ERR_JSON_SYNTAX);
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/SettingsService.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/SettingsService.cpp
index 3606e2c..0ec7b51 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/SettingsService.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/SettingsService.cpp
@@ -11,6 +11,7 @@
#include <string>
#include <vector>
+#include <algorithm>
#include "SettingsService.h"
#include "TCFChannel.h"
@@ -100,7 +101,10 @@
Channel* c = static_cast<Channel*>(arg);
TCFChannel channel(c);
std::string executable = channel.readString();
- modulesToDebug.insert(executable);
+
+ // convert to lower case for later case-insensitive comparison (windows is case-insensitive)
+ std::transform(executable.begin(), executable.end(), executable.begin(), ::tolower);
+ modulesToDebug.insert(executable);
}
static void read_setting_value(InputStream * inp, void * arg)
@@ -173,8 +177,12 @@
if (modulesToDebug.empty())
return true;
+ // first convert to lower case - windows is case-insensitive after all
+ std::string moduleLower(module);
+ std::transform(moduleLower.begin(), moduleLower.end(), moduleLower.begin(), ::tolower);
+
// first look for an exact, full path match
- if (modulesToDebug.count(module) > 0)
+ if (modulesToDebug.count(moduleLower) > 0)
return true;
if (allowFilenameMatch)
@@ -190,7 +198,7 @@
std::string filename = getFilenameFromPath(path);
// search the module string
- if (std::string::npos != module.rfind(filename)) {
+ if (std::string::npos != moduleLower.rfind(filename)) {
return true;
}
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/TerminateProcessAction.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/TerminateProcessAction.cpp
index a5eb8c3..08dea2a 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/TerminateProcessAction.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/TerminateProcessAction.cpp
@@ -44,6 +44,8 @@
postReply(error, 0, new std::string("Failed to terminate process"));
} else {
postReply(0, 0);
+
+ // an EXIT_PROCESS_DEBUG_EVENT will be fired by the OS.
}
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.cpp
new file mode 100644
index 0000000..74f70d4
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.cpp
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ */
+
+/*
+ * WinHWBkptMgr.cpp
+ *
+ * This class manages the use of the X86 Hardware Debug Registers
+ * to set Hardware Breakpoints and Hardware Watchpoints.
+ *
+ * Rules governing the use of X86 Debug registers:
+ * - there are four debug registers (DR0, DR1, DR2 & DR3)
+ * which can be set with an address in memory that will be
+ * monitored for access
+ * - there is a management debug register (DR7) that contains
+ * the bits governing which of the DR0-DR3 registers will be
+ * monitored, the type of access, and the size of the memory
+ * to be monitored.
+ * - eligible access modes are {execution, write, read+write}
+ * - eligible sizes are 1, 2, 4 and 8
+ * - monitoring is only legal for each size at proper alignment
+ * (i.e. a watchpoint of size 8 must have an address that is
+ * aligned on a 8-byte boundary; a watchpoint of size 2 can
+ * be on any 2-byte boundary; a watchpoint of size 1 can be
+ * at any address)
+ *
+ * This implementation currently allows watchpoints only, and
+ * will monitor memory regions of sizes from 1-32, depending
+ * upon alignment, by combining the use of available registers
+ * when necessary and available.
+ *
+ * The use of this manager thus restricts the caller to a
+ * maximum of 4 hardware watchpoints, and fewer if any user
+ * watchpoints are unaligned for size and/or greater in size
+ * than 8 bytes.
+ *
+ * The use of this manager also restricts watchpoints to being
+ * identified on a per-process basis. The thread accessing the
+ * watchpoint will be identified, but the caller cannot
+ * establish a watchpoint only for specific threads; all
+ * threads in a process will be established.
+ *
+ * This implementation does not currently allow hardware
+ * breakpoints for execution, nor does it manage debug registers
+ * in such a way as to optimize for overlapping watchpoint
+ * regions.
+ *
+ * Created on: Aug 17, 2011
+ * Author: bkirk
+ */
+
+#include "WinHWBkptMgr.h"
+
+#include "errors.h"
+
+#include "BreakpointsService.h"
+#include "WinProcess.h"
+#include "WinThread.h"
+
+static const WinHWBkptMgr::Mode
+ sDR7ModeBitsMap[9]
+ = { WinHWBkptMgr::invalid,
+ WinHWBkptMgr::invalid,
+ WinHWBkptMgr::write,
+ WinHWBkptMgr::readwrite,
+ WinHWBkptMgr::execute,
+ WinHWBkptMgr::invalid,
+ WinHWBkptMgr::invalid,
+ WinHWBkptMgr::invalid,
+ WinHWBkptMgr::invalid
+ };
+
+// invalid bits in the following 2 masks
+#define XFF 0xFF
+
+/*
+ * DR0 size bits are 18 & 19
+ * DR1 size bits are 22 & 23
+ * DR2 size bits are 26 & 27
+ * DR3 size bits are 30 & 31
+ *
+ * so, the following are the mask bits within each
+ * DR7 highword nibble for each debug-register that
+ * makes for the simplest masking later
+ *
+ */
+#define SB1 0x00
+#define SB2 0x04
+#define SB4 0x0C
+#define SB8 0x08
+
+static const WinHWBkptMgr::SizeBits
+ sDR7SizeBitsMap[9]
+ = {XFF, SB1, SB2, XFF, SB4, XFF, XFF, XFF, SB8};
+
+/*
+ * the following table represents a mapping of
+ * the number of registers necessary to set a
+ * hardware watchpoint of a given size at an
+ * address of a given alignment.
+ *
+ * e.g. for a watchpoint of size 8, the following
+ * number of DR registers would be required for each of
+ * the following addresses:
+ * 0x10: 1 (0x10 size 8)
+ * 0x11: 4 (0x11 size 1, 0x12 size 2, 0x14 size 4, 0x18 size 1)
+ * 0x12: 3 (0x12 size 2, 0x14 size 4, 0x18 size 2)
+ * 0x13: 4 (0x13 size 1, 0x14 size 4, 0x18 size 2, 0x1a size 1)
+ * 0x14: 2 (0x14 size 4, 0x14 size 4)
+ * 0x15: 4 (0x15 size 1, 0x16 size 2, 0x18 size 4, 0x1c size 1)
+ * 0x16: 3 (0x16 size 2, 0x18 size 4, 0x1c size 2)
+ * 0x17: 4 (0x17 size 1, 0x18 size 4, 0x1c size 2, 0x1e size 1)
+ *
+ *
+ * first index is size, second index is alignBits
+ */
+static const unsigned char
+ sRequiredRegsMap[33][8] // size
+ = { {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 0 - unused
+ { 1, 1, 1, 1, 1, 1, 1, 1}, // 1
+ { 1, 2, 1, 2, 1, 2, 1, 2}, // 2
+ { 2, 2, 2, 2, 2, 2, 2, 2}, // 3
+ { 1, 3, 2, 3, 1, 3, 2, 3}, // 4
+ { 2, 3, 3, 2, 2, 3, 3, 2}, // 5
+ { 2, 4, 2, 3, 2, 4, 2, 3}, // 6
+ { 3, 3, 3, 3, 3, 3, 3, 3}, // 7
+ { 1, 4, 3, 4, 2, 4, 3, 4}, // 8
+ { 2, 4, 4, 3, 3, 4, 4, 2}, // 9
+ { 2,XFF, 3, 4, 3,XFF, 2, 3}, // 10
+ { 3, 4, 4, 4, 4, 3, 3, 3}, // 11
+ { 2,XFF, 4,XFF, 2, 4, 3, 4}, // 12
+ { 3,XFF,XFF, 3, 3, 4, 4, 3}, // 13
+ { 3,XFF, 3, 4, 3,XFF, 3, 4}, // 14
+ { 4, 4, 4, 4, 4, 4, 4, 4}, // 15
+ { 2,XFF, 4,XFF, 3,XFF, 4,XFF}, // 16
+ { 3,XFF,XFF, 4, 4,XFF,XFF, 3}, // 17
+ { 3,XFF, 4,XFF, 4,XFF, 3, 4}, // 18
+ { 4,XFF,XFF,XFF,XFF, 4, 4, 4}, // 19
+ { 3,XFF,XFF,XFF, 3,XFF, 4,XFF}, // 20
+ { 4,XFF,XFF, 4, 4,XFF,XFF, 4}, // 21
+ { 4,XFF, 4,XFF, 4,XFF, 4,XFF}, // 22
+ {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 23
+ { 3,XFF,XFF,XFF, 4,XFF,XFF,XFF}, // 24
+ { 4,XFF,XFF,XFF,XFF,XFF,XFF, 4}, // 25
+ { 4,XFF,XFF,XFF,XFF,XFF, 4,XFF}, // 26
+ {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 27
+ { 4,XFF,XFF,XFF, 4,XFF,XFF,XFF}, // 28
+ {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 29
+ {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 30
+ {XFF,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 31
+ { 4,XFF,XFF,XFF,XFF,XFF,XFF,XFF}, // 32
+ };
+
+WinHWBkptMgr::DRMask WinHWBkptMgr::inUse = 0;
+WinHWBkptMgr::HWBreakInfo WinHWBkptMgr::hwBkpt[4];
+
+unsigned char WinHWBkptMgr::InUseCount() {
+ return (DR0 & inUse)
+ + ((DR1 & inUse) >> 1)
+ + ((DR2 & inUse) >> 2)
+ + ((DR3 & inUse) >> 3);
+}
+
+unsigned char WinHWBkptMgr::UnusedCount() {
+ return MAX_HWBP - InUseCount();
+}
+
+WinHWBkptMgr::DRMask WinHWBkptMgr::UseUnusedRegister() {
+ if (!(DR0 & inUse)) { inUse |= DR0; return DR0; }
+ if (!(DR1 & inUse)) { inUse |= DR1; return DR1; }
+ if (!(DR2 & inUse)) { inUse |= DR2; return DR2; }
+ if (!(DR3 & inUse)) { inUse |= DR3; return DR3; }
+ return 0;
+}
+
+unsigned char WinHWBkptMgr::GetUnusedWatchpoint() {
+ for (int i = 0 ; i < MAX_HWBP; ++i) {
+ if (hwBkpt[i].inUse == 0)
+ return i;
+ }
+ return XFF;
+}
+
+int WinHWBkptMgr::SetHardwareBreak(TBreakpoint* bp) {
+ if (0xF == inUse) // all regs already being used
+ return ERR_HWBRK_NO_RESOURCES;
+
+ if (bp->accessMode == ACCESSMODE_EXECUTE) {
+// support for hardware breakpoints for execution
+// currently not yet implemented
+ return ERR_HWBRK_NOT_SET;
+ }
+
+ unsigned char locSize = bp->size;
+ if (locSize > 32)
+ return ERR_HWBRK_INVALID_SIZE;
+
+ ContextAddress locAddr = bp->address;
+
+ unsigned char reqdRegs = sRequiredRegsMap[locSize][locAddr&7];
+ if (reqdRegs == XFF)
+ return ERR_HWBRK_NOT_ALIGNED;
+
+ if (reqdRegs > UnusedCount())
+ return ERR_HWBRK_NO_RESOURCES;
+
+ unsigned char wp = GetUnusedWatchpoint();
+ hwBkpt[wp].address = locAddr;
+ hwBkpt[wp].size = locSize;
+ hwBkpt[wp].accessMode = sDR7ModeBitsMap[bp->accessMode];
+ for (;reqdRegs > 0;--reqdRegs) {
+ DRMask dr = UseUnusedRegister();
+ hwBkpt[wp].inUse |= dr;
+
+ unsigned char drSz; // size to set in DR register
+ switch (locAddr & 7) {
+ // keep falling through cases until drSz is set
+ case 0: if (locSize >= 8) { drSz = 8; break; }
+ case 4: if (locSize >= 4) { drSz = 4; break; }
+ case 6:
+ case 2: if (locSize >= 2) { drSz = 2; break; }
+
+ default: drSz = 1;
+ }
+
+ // these are shifted inside based on the reg used
+ DRFlags dr7bits = sDR7SizeBitsMap[drSz] | hwBkpt[wp].accessMode;
+
+ bp->process->SetDebugRegister(dr, locAddr, dr7bits);
+
+ locAddr += drSz;
+ locSize -= drSz;
+ }
+
+ bp->hwBreakID = wp;
+ return 0;
+}
+
+int WinHWBkptMgr::ClearHardwareBreak(TBreakpoint* bp) {
+ if (!bp->process)
+ return ERR_INV_CONTEXT;
+ unsigned char& wp = bp->hwBreakID;
+ for (int i = 0; i < MAX_HWBP; ++i) {
+ DRMask dr = 1 << i;
+ if (hwBkpt[wp].inUse & dr) {
+ inUse &= ~dr;
+ bp->process->ClearDebugRegister(dr);
+ }
+ }
+
+ bp->process = NULL;
+ wp = 0;
+ return 0;
+}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.h b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.h
new file mode 100644
index 0000000..eee839e
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinHWBkptMgr.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ */
+
+/* WinHWBkptMgr.h
+ *
+ * This class manages the use of the X86 Hardware Debug Registers
+ * to set Hardware Breakpoints and Hardware Watchpoints.
+ *
+ * Rules governing the use of X86 Debug registers:
+ * - there are four debug registers (DR0, DR1, DR2 & DR3)
+ * which can be set with an address in memory that will be
+ * monitored for access
+ * - there is a management debug register (DR7) that contains
+ * the bits governing which of the DR0-DR3 registers will be
+ * monitored, the type of access, and the size of the memory
+ * to be monitored.
+ * - eligible access modes are {execution, write, read+write}
+ * - eligible sizes are 1, 2, 4 and 8
+ * - monitoring is only legal for each size at proper alignment
+ * (i.e. a watchpoint of size 8 must have an address that is
+ * aligned on a 8-byte boundary; a watchpoint of size 2 can
+ * be on any 2-byte boundary; a watchpoint of size 1 can be
+ * at any address)
+ *
+ * This implementation currently allows watchpoints only, and
+ * will monitor memory regions of sizes from 1-32, depending
+ * upon alignment, by combining the use of available registers
+ * when necessary and available.
+ *
+ * The use of this manager thus restricts the caller to a
+ * maximum of 4 hardware watchpoints, and fewer if any user
+ * watchpoints are unaligned for size and/or greater in size
+ * than 8 bytes.
+ *
+ * The use of this manager also restricts watchpoints to being
+ * identified on a per-process basis. The thread accessing the
+ * watchpoint will be identified, but the caller cannot
+ * establish a watchpoint only for specific threads; all
+ * threads in a process will be established.
+ *
+ * This implementation does not currently allow hardware
+ * breakpoints for execution, nor does it manage debug registers
+ * in such a way as to optimize for overlapping watchpoint
+ * regions.
+ *
+ * Created on: Aug 17, 2011
+ * Author: bkirk
+ */
+
+#ifndef WINHWBKPTMGR_H_
+#define WINHWBKPTMGR_H_
+
+#include "TCFContext.h"
+
+#define MAX_HWBP 4
+
+struct TBreakpoint;
+
+class WinHWBkptMgr {
+ public:
+
+ typedef unsigned char DRMask;
+ typedef unsigned char DRFlags;
+
+ static int SetHardwareBreak(TBreakpoint*);
+ static int ClearHardwareBreak(TBreakpoint*);
+
+ public: // would like these to be private, but static initializers require otherwise
+
+ typedef unsigned char Mode;
+ typedef unsigned char SizeBits;
+
+ static const Mode execute = 0x00;
+ static const Mode write = 0x01;
+ // 0x02 is defined to mean break on I/O read/write, unsupported
+ static const Mode readwrite = 0x03;
+ static const Mode invalid = 0x04;
+
+ private:
+
+ typedef struct {
+ ContextAddress address; // address of the full HW break
+ DRMask inUse; // mask of the regs used for this hw-break
+ Mode accessMode; // accessMode to use for all regs used
+ unsigned char size; // combined size of HW breaks in bits of all DRegs
+ } HWBreakInfo;
+
+ static DRMask inUse;
+ static unsigned char InUseCount();
+ static unsigned char UnusedCount();
+ static DRMask UseUnusedRegister();
+
+
+ static HWBreakInfo hwBkpt[MAX_HWBP];
+ static unsigned char GetUnusedWatchpoint();
+};
+
+#endif /* WINHWBKPTMGR_H_ */
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.cpp
index 27842ad..fe082de 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.cpp
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -24,8 +24,8 @@
std::map<int, WinProcess*> WinProcess::processIDMap;
-WinProcess::WinProcess(WinDebugMonitor* monitor, DEBUG_EVENT& debugEvent) :
- ProcessContext(debugEvent.dwProcessId, ROOT_CONTEXT_ID, CreateInternalID(debugEvent.dwProcessId)),
+WinProcess::WinProcess(WinDebugMonitor* monitor, DEBUG_EVENT& debugEvent)
+ : ProcessContext(debugEvent.dwProcessId, ROOT_CONTEXT_ID, CreateInternalID(debugEvent.dwProcessId)),
processHandle_(debugEvent.u.CreateProcessInfo.hProcess),
monitor_(monitor)
{
@@ -39,9 +39,9 @@
LPTSTR processNameBuffer = new TCHAR[bufferSize];
int nameLength = GetProcessImageFileName((HMODULE) processHandle_,
processNameBuffer, bufferSize);
- if (nameLength > 0) {
+ if (nameLength > 0)
moduleFileName = AgentUtils::makeString(processNameBuffer);
- }
+
delete[] processNameBuffer;
}
int lastSlash = moduleFileName.find_last_of("\\");
@@ -49,22 +49,21 @@
moduleFileName = moduleFileName.substr(lastSlash + 1);
processName_ = moduleFileName;
- initialize();
+ Initialize();
}
-WinProcess::WinProcess(DWORD procID, std::string procName) :
- ProcessContext(procID, ROOT_CONTEXT_ID, CreateInternalID(procID)),
+WinProcess::WinProcess(DWORD procID, std::string procName)
+ : ProcessContext(procID, ROOT_CONTEXT_ID, CreateInternalID(procID)),
processHandle_(NULL),
monitor_(NULL)
{
processName_ = procName;
- initialize();
+ Initialize();
}
// Initialize process specific properties.
-void WinProcess::initialize()
-{
+void WinProcess::Initialize() {
SetProperty(PROP_NAME, PropertyValue(processName_));
// do not support process stepping yet
@@ -85,7 +84,7 @@
// delete all children contexts (threads, registers, etc).
}
-HANDLE WinProcess::GetProcessHandle() {
+const HANDLE& WinProcess::GetProcessHandle() const {
return processHandle_;
}
@@ -93,17 +92,18 @@
std::map<int, WinProcess*>::iterator iter = processIDMap.find(processID);
if (iter == processIDMap.end())
return NULL;
- else
- return iter->second;
+
+ return iter->second;
}
int WinProcess::ReadMemory(const ReadWriteMemoryParams& params) throw (AgentException) {
int result = 0;
- boolean success = ReadProcessMemory(processHandle_, (LPCVOID) params.address,
- params.memBuffer, params.size, params.sizeTransferred);
+ BOOL success
+ = ::ReadProcessMemory(processHandle_, (LPCVOID) params.address,
+ params.memBuffer, params.size, params.sizeTransferred);
if (!success)
- result = GetLastError();
+ result = ::GetLastError();
else
BreakpointsService::RemoveBreakpointsFromMemoryRead(processHandle_, params.address, params.memBuffer, params.size);
@@ -111,13 +111,13 @@
}
int WinProcess::WriteMemory(const ReadWriteMemoryParams& params) throw (AgentException) {
- // to do: handle breakpoints and watchpoints
int result = 0;
- boolean success = WriteProcessMemory(processHandle_, (LPVOID) params.address,
- params.memBuffer, params.size, params.sizeTransferred);
+ BOOL success
+ = ::WriteProcessMemory(processHandle_, (LPVOID) params.address,
+ params.memBuffer, params.size, params.sizeTransferred);
if (!success)
- result = GetLastError();
+ result = ::GetLastError();
else {
BreakpointsService::ReInsertBreakpointsAfterMemoryWrite(processHandle_, params.address, params.memBuffer, params.size);
}
@@ -137,12 +137,30 @@
};
-WinDebugMonitor* WinProcess::GetMonitor() {
+WinDebugMonitor* WinProcess::GetMonitor() const {
return monitor_;
}
-std::map<int, Properties>& WinProcess::GetExecutablesByAddress()
-{
+std::map<int, Properties>& WinProcess::GetExecutablesByAddress() {
return executablesByAddress_;
}
+void WinProcess::SetDebugRegister(WinHWBkptMgr::DRMask drMask, ContextAddress addr, WinHWBkptMgr::DRFlags flags) {
+ const std::list<Context*>& children = GetChildren();
+ std::list<Context*>::const_iterator c;
+ for (c = children.begin(); c != children.end(); c++) {
+ WinThread* winThread = dynamic_cast<WinThread*>(*c);
+ if (winThread != NULL)
+ winThread->SetDebugRegister(drMask, addr, flags);
+ }
+}
+
+void WinProcess::ClearDebugRegister(WinHWBkptMgr::DRMask drMask) {
+ const std::list<Context*>& children = GetChildren();
+ std::list<Context*>::const_iterator c;
+ for (c = children.begin(); c != children.end(); c++) {
+ WinThread* winThread = dynamic_cast<WinThread*>(*c);
+ if (winThread != NULL)
+ winThread->ClearDebugRegister(drMask);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.h b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.h
index 635976e..57356e7 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinProcess.h
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -14,6 +14,7 @@
#include <set>
#include "stdafx.h"
#include "ProcessContext.h"
+#include "WinHWBkptMgr.h"
#include "WinDebugMonitor.h"
class WinThread;
@@ -21,7 +22,7 @@
class WinProcess : public ProcessContext {
public:
- WinProcess(WinDebugMonitor* monitor, DEBUG_EVENT& debugEvent);
+ WinProcess(WinDebugMonitor*, DEBUG_EVENT& debugEvent);
WinProcess(DWORD procID, std::string procName);
virtual ~WinProcess(void);
@@ -29,23 +30,25 @@
//
// Overrides of RunControlContext
//
- virtual int ReadMemory(const ReadWriteMemoryParams& params) throw (AgentException);
- virtual int WriteMemory(const ReadWriteMemoryParams& params) throw (AgentException);
- virtual void Terminate(const AgentActionParams& params) throw (AgentException);
- virtual void SingleStep(const AgentActionParams& params) throw (AgentException);
+ virtual int ReadMemory(const ReadWriteMemoryParams&) throw (AgentException);
+ virtual int WriteMemory(const ReadWriteMemoryParams&) throw (AgentException);
+ virtual void Terminate(const AgentActionParams&) throw (AgentException);
+ virtual void SingleStep(const AgentActionParams&) throw (AgentException);
//
// end overrides
- HANDLE GetProcessHandle();
+ const HANDLE& GetProcessHandle() const;
- WinDebugMonitor* GetMonitor();
+ WinDebugMonitor* GetMonitor() const;
static WinProcess* GetProcessByID(int processID);
std::map<int, Properties>& GetExecutablesByAddress();
-private:
- void initialize();
+ void SetDebugRegister(WinHWBkptMgr::DRMask, ContextAddress, WinHWBkptMgr::DRFlags);
+ void ClearDebugRegister(WinHWBkptMgr::DRMask);
+ private:
+ void Initialize();
bool isRoot_;
HANDLE processHandle_;
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.cpp b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.cpp
index ecfc2c8..83494cb 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.cpp
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.cpp
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -8,6 +8,7 @@
* Contributors:
* Nokia - Initial API and implementation
*******************************************************************************/
+#include <sstream>
#include <stdio.h>
#include <assert.h>
@@ -25,8 +26,8 @@
std::map<std::pair<int, int>, WinThread*> WinThread::threadIDMap_;
-WinThread::WinThread(WinProcess& process, DEBUG_EVENT& debugEvent) :
- ThreadContext(debugEvent.dwThreadId, process.GetID(), CreateInternalID(debugEvent.dwThreadId, process.GetID())),
+WinThread::WinThread(WinProcess& process, DEBUG_EVENT& debugEvent)
+ : ThreadContext(debugEvent.dwThreadId, process.GetID(), CreateInternalID(debugEvent.dwThreadId, process.GetID())),
threadLookupPair_(debugEvent.dwProcessId, debugEvent.dwThreadId),
parentProcess_(process)
{
@@ -54,14 +55,13 @@
// in HandleException
exceptionInfo_.ExceptionRecord.ExceptionCode = USER_SUSPEND_THREAD;
- initialize();
+ Initialize();
}
// Initialize thread specific properties.
-void WinThread::initialize()
-{
+void WinThread::Initialize() {
char buf[32];
- _snprintf(buf, sizeof(buf), "0x%08x", startAddress_);
+ ::_snprintf(buf, sizeof(buf), "0x%08x", startAddress_);
SetProperty(PROP_NAME, PropertyValue(buf));
int supportedResumeModes = (1 << RM_RESUME) | (1 << RM_STEP_INTO);
@@ -83,7 +83,7 @@
// delete all children contexts (registers, etc).
}
-ContextAddress WinThread::GetPCAddress() {
+ContextAddress WinThread::GetPCAddress() const {
// The following is actually the address of the instruction that causes
// the exception, not the actual PC register value which is usually
// pointing to the byte after the exception instruction.
@@ -95,7 +95,7 @@
return threadContextInfo_.Eip;
}
-const char* WinThread::GetSuspendReason() {
+const char* WinThread::GetSuspendReason() const {
const char* reason = REASON_EXCEPTION;
switch (exceptionInfo_.ExceptionRecord.ExceptionCode) {
@@ -110,7 +110,7 @@
return reason;
}
-DWORD WinThread::GetContinueStatus() {
+DWORD WinThread::GetContinueStatus() const {
// for resuming from any exception other than breakpoint or step (which the debugger handles), we must pass
// DBG_EXCEPTION_NOT_HANDLED to allow the process under debug the chance to handle it
switch (exceptionInfo_.ExceptionRecord.ExceptionCode) {
@@ -123,7 +123,7 @@
return DBG_EXCEPTION_NOT_HANDLED;
}
-std::string WinThread::GetExceptionMessage() {
+std::string WinThread::GetExceptionMessage() const {
if (exceptionInfo_.ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP
|| exceptionInfo_.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT
|| exceptionInfo_.ExceptionRecord.ExceptionCode == USER_SUSPEND_THREAD)
@@ -141,10 +141,18 @@
exceptionInfo_ = debugEvent.u.Exception;
MarkSuspended();
EnsureValidContextInfo();
- AdjustPC();
- EventClientNotifier::SendContextSuspended(this,
- GetPCAddress(), GetSuspendReason(), GetExceptionMessage());
+ if (threadContextInfo_.Dr6 & 0xF) { // one will be set if a HW bkpt triggered
+ HandleHardwareBreak();
+
+ // always reset to this for the next time through.
+ threadContextInfo_.Dr6 = 0xFFFF0FF0;
+ ::SetThreadContext(handle_, &threadContextInfo_);
+ } else {
+ AdjustPC();
+ EventClientNotifier::SendContextSuspended(this,
+ GetPCAddress(), GetSuspendReason(), GetExceptionMessage());
+ }
}
/*
@@ -190,24 +198,25 @@
props[PROP_MODULE_LOADED] = PropertyValue(isLoaded);
props[PROP_IMAGE_BASE_ADDRESS] = PropertyValue((int) baseAddress);
props[PROP_CODE_SIZE] = PropertyValue((int) codeSize);
+ parentProcess_.GetExecutablesByAddress()[baseAddress] = props;
}
else
{
props = parentProcess_.GetExecutablesByAddress()[baseAddress];
- if (props.empty())
- { // We have an unloaded event for an executable we didn't know about.
- props[PROP_ID] = PropertyValue((int) baseAddress);
- props[PROP_IMAGE_BASE_ADDRESS] = PropertyValue((int) baseAddress);
- }
+ assert(!props.empty());
props[PROP_MODULE_LOADED] = PropertyValue(false);
+
+ // the executable is unloaded so remove it from our list of executables
+ // otherwise if another executable is later loaded into the same address
+ // and later unloaded, we'll send a bogus unloaded event
+ parentProcess_.GetExecutablesByAddress().erase(baseAddress);
}
- parentProcess_.GetExecutablesByAddress()[baseAddress] = props;
EventClientNotifier::SendExecutableEvent(this,
threadContextInfo_.Eip, props);
}
-bool WinThread::isSuspended() {
+bool WinThread::IsSuspended() const {
return isSuspended_;
}
@@ -218,43 +227,43 @@
#endif
void WinThread::EnsureValidContextInfo() {
- if (!threadContextValid_ && isSuspended()) {
+ if (!threadContextValid_ && IsSuspended()) {
threadContextInfo_.ContextFlags = CONTEXT_ALL;
- if (GetThreadContext(handle_, &threadContextInfo_) != 0) {
+ if (::GetThreadContext(handle_, &threadContextInfo_) != 0) {
registerValueCache_.clear();
// Cache general registers
- registerValueCache_["EAX"] = AgentUtils::IntToHexString(
- threadContextInfo_.Eax);
- registerValueCache_["ECX"] = AgentUtils::IntToHexString(
- threadContextInfo_.Ecx);
- registerValueCache_["EDX"] = AgentUtils::IntToHexString(
- threadContextInfo_.Edx);
- registerValueCache_["EBX"] = AgentUtils::IntToHexString(
- threadContextInfo_.Ebx);
- registerValueCache_["ESP"] = AgentUtils::IntToHexString(
- threadContextInfo_.Esp);
- registerValueCache_["EBP"] = AgentUtils::IntToHexString(
- threadContextInfo_.Ebp);
- registerValueCache_["ESI"] = AgentUtils::IntToHexString(
- threadContextInfo_.Esi);
- registerValueCache_["EDI"] = AgentUtils::IntToHexString(
- threadContextInfo_.Edi);
- registerValueCache_["EIP"] = AgentUtils::IntToHexString(
- threadContextInfo_.Eip);
- registerValueCache_["GS"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegGs);
- registerValueCache_["FS"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegFs);
- registerValueCache_["ES"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegEs);
- registerValueCache_["DS"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegDs);
- registerValueCache_["CS"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegCs);
- registerValueCache_["EFL"] = AgentUtils::IntToHexString(
- threadContextInfo_.EFlags);
- registerValueCache_["SS"] = AgentUtils::IntToHexString(
- threadContextInfo_.SegSs);
+ registerValueCache_["EAX"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Eax);
+ registerValueCache_["ECX"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Ecx);
+ registerValueCache_["EDX"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Edx);
+ registerValueCache_["EBX"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Ebx);
+ registerValueCache_["ESP"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Esp);
+ registerValueCache_["EBP"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Ebp);
+ registerValueCache_["ESI"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Esi);
+ registerValueCache_["EDI"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Edi);
+ registerValueCache_["EIP"]
+ = AgentUtils::IntToHexString(threadContextInfo_.Eip);
+ registerValueCache_["GS"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegGs);
+ registerValueCache_["FS"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegFs);
+ registerValueCache_["ES"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegEs);
+ registerValueCache_["DS"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegDs);
+ registerValueCache_["CS"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegCs);
+ registerValueCache_["EFL"]
+ = AgentUtils::IntToHexString(threadContextInfo_.EFlags);
+ registerValueCache_["SS"]
+ = AgentUtils::IntToHexString(threadContextInfo_.SegSs);
threadContextValid_ = true;
}
@@ -262,42 +271,42 @@
}
void WinThread::SetContextInfo() {
- if (isSuspended()) {
+ if (IsSuspended()) {
threadContextInfo_.ContextFlags = CONTEXT_ALL;
// Set general registers values
- threadContextInfo_.Eax = AgentUtils::HexStringToInt(
- registerValueCache_["EAX"]);
- threadContextInfo_.Ecx = AgentUtils::HexStringToInt(
- registerValueCache_["ECX"]);
- threadContextInfo_.Edx = AgentUtils::HexStringToInt(
- registerValueCache_["EDX"]);
- threadContextInfo_.Ebx = AgentUtils::HexStringToInt(
- registerValueCache_["EBX"]);
- threadContextInfo_.Esp = AgentUtils::HexStringToInt(
- registerValueCache_["ESP"]);
- threadContextInfo_.Ebp = AgentUtils::HexStringToInt(
- registerValueCache_["EBP"]);
- threadContextInfo_.Esi = AgentUtils::HexStringToInt(
- registerValueCache_["ESI"]);
- threadContextInfo_.Edi = AgentUtils::HexStringToInt(
- registerValueCache_["EDI"]);
- threadContextInfo_.Eip = AgentUtils::HexStringToInt(
- registerValueCache_["EIP"]);
- threadContextInfo_.SegGs = AgentUtils::HexStringToInt(
- registerValueCache_["GS"]);
- threadContextInfo_.SegFs = AgentUtils::HexStringToInt(
- registerValueCache_["FS"]);
- threadContextInfo_.SegEs = AgentUtils::HexStringToInt(
- registerValueCache_["ES"]);
- threadContextInfo_.SegDs = AgentUtils::HexStringToInt(
- registerValueCache_["DS"]);
- threadContextInfo_.SegCs = AgentUtils::HexStringToInt(
- registerValueCache_["CS"]);
- threadContextInfo_.EFlags = AgentUtils::HexStringToInt(
- registerValueCache_["EFL"]);
- threadContextInfo_.SegSs = AgentUtils::HexStringToInt(
- registerValueCache_["SS"]);
- SetThreadContext(handle_, &threadContextInfo_);
+ threadContextInfo_.Eax
+ = AgentUtils::HexStringToInt(registerValueCache_["EAX"]);
+ threadContextInfo_.Ecx
+ = AgentUtils::HexStringToInt(registerValueCache_["ECX"]);
+ threadContextInfo_.Edx
+ = AgentUtils::HexStringToInt(registerValueCache_["EDX"]);
+ threadContextInfo_.Ebx
+ = AgentUtils::HexStringToInt(registerValueCache_["EBX"]);
+ threadContextInfo_.Esp
+ = AgentUtils::HexStringToInt(registerValueCache_["ESP"]);
+ threadContextInfo_.Ebp
+ = AgentUtils::HexStringToInt(registerValueCache_["EBP"]);
+ threadContextInfo_.Esi
+ = AgentUtils::HexStringToInt(registerValueCache_["ESI"]);
+ threadContextInfo_.Edi
+ = AgentUtils::HexStringToInt(registerValueCache_["EDI"]);
+ threadContextInfo_.Eip
+ = AgentUtils::HexStringToInt(registerValueCache_["EIP"]);
+ threadContextInfo_.SegGs
+ = AgentUtils::HexStringToInt(registerValueCache_["GS"]);
+ threadContextInfo_.SegFs
+ = AgentUtils::HexStringToInt(registerValueCache_["FS"]);
+ threadContextInfo_.SegEs
+ = AgentUtils::HexStringToInt(registerValueCache_["ES"]);
+ threadContextInfo_.SegDs
+ = AgentUtils::HexStringToInt(registerValueCache_["DS"]);
+ threadContextInfo_.SegCs
+ = AgentUtils::HexStringToInt(registerValueCache_["CS"]);
+ threadContextInfo_.EFlags
+ = AgentUtils::HexStringToInt(registerValueCache_["EFL"]);
+ threadContextInfo_.SegSs
+ = AgentUtils::HexStringToInt(registerValueCache_["SS"]);
+ ::SetThreadContext(handle_, &threadContextInfo_);
}
}
@@ -306,15 +315,15 @@
std::map<std::pair<int, int>, WinThread*>::iterator iter = threadIDMap_.find(ptPair);
if (iter == threadIDMap_.end())
return NULL;
- else
- return iter->second;
+
+ return iter->second;
}
std::vector<std::string> WinThread::GetRegisterValues(
const std::vector<std::string>& registerIDs) {
std::vector<std::string> registerValues;
- if (isSuspended()) {
+ if (IsSuspended()) {
EnsureValidContextInfo();
std::vector<std::string>::const_iterator itVectorData;
@@ -333,7 +342,7 @@
* Get pointer to register value cache for a given register.
* Return NULL if the register is not found.
*/
-void* WinThread::getRegisterValueBuffer(const std::string& regName) {
+void* WinThread::GetRegisterValueBuffer(const std::string& regName) const {
void* v = NULL;
if (regName == "EAX")
@@ -383,15 +392,15 @@
char* ret = NULL;
- if (isSuspended()) {
+ if (IsSuspended()) {
EnsureValidContextInfo();
ret = new char[regSize];
- void* v = getRegisterValueBuffer(regName);
+ void* v = GetRegisterValueBuffer(regName);
assert(v != NULL);
- memcpy((void*)ret, v, regSize);
+ ::memcpy((void*)ret, v, regSize);
}
return ret;
@@ -399,19 +408,19 @@
bool WinThread::SetRegisterValue(const std::string& regName, int regSize, char* val) {
- if (! isSuspended())
+ if (! IsSuspended())
return false;
- void* v = getRegisterValueBuffer(regName);
+ void* v = GetRegisterValueBuffer(regName);
assert(v != NULL);
- memcpy(v, (void*)val, regSize);
- return SetThreadContext(handle_, &threadContextInfo_);
+ ::memcpy(v, (void*)val, regSize);
+ return ::SetThreadContext(handle_, &threadContextInfo_);
}
void WinThread::SetRegisterValues(const std::vector<std::string>& registerIDs,
const std::vector<std::string>& registerValues) {
- if (isSuspended()) {
+ if (IsSuspended()) {
std::vector<std::string>::const_reverse_iterator itVectorData;
int idx = registerValues.size();
for (itVectorData = registerIDs.rbegin(); itVectorData
@@ -436,12 +445,18 @@
parentProcess_.Terminate(params);
}
-void WinThread::Suspend(const AgentActionParams& params) throw (AgentException) {
- DWORD suspendCount = SuspendThread(handle_);
+DWORD WinThread::Suspend() {
+ DWORD suspendCount = ::SuspendThread(handle_);
MarkSuspended();
EnsureValidContextInfo();
exceptionInfo_.ExceptionRecord.ExceptionCode = USER_SUSPEND_THREAD; // "Suspended"
isUserSuspended_ = true;
+ return suspendCount;
+}
+
+void WinThread::Suspend(const AgentActionParams& params) throw (AgentException)
+{
+ DWORD suspendCount = Suspend();
if (! isTerminating_) // don't send Suspend event if we are terminating.
EventClientNotifier::SendContextSuspended(this,
GetPCAddress(), GetSuspendReason(), GetExceptionMessage());
@@ -451,18 +466,23 @@
params.reportSuccessForAction();
}
+void WinThread::Resume() {
+ if (! IsSuspended() || !isUserSuspended_)
+ return;
+ ::ResumeThread(handle_);
+ isUserSuspended_ = false;
+}
+
void WinThread::Resume(const AgentActionParams& params) throw (AgentException) {
- if (! isSuspended()) {
+ if (! IsSuspended()) {
params.reportSuccessForAction();
return;
}
- if (isUserSuspended_){
- ResumeThread(handle_);
- isUserSuspended_ = false;
+ if (isUserSuspended_) {
+ Resume();
params.reportSuccessForAction();
- }
- else {
+ } else {
parentProcess_.GetMonitor()->PostAction(new ResumeContextAction(
params, parentProcess_, *this, RM_RESUME));
}
@@ -475,7 +495,7 @@
#define FLAG_TRACE_BIT 0x100
// The bit will be auto-cleared after next resume.
threadContextInfo_.EFlags |= FLAG_TRACE_BIT;
- SetThreadContext(handle_, &threadContextInfo_);
+ ::SetThreadContext(handle_, &threadContextInfo_);
}
void WinThread::SingleStep(const AgentActionParams& params) throw (AgentException) {
@@ -486,8 +506,74 @@
void WinThread::PrepareForTermination(const AgentActionParams& params) throw (AgentException) {
isTerminating_ = true;
- if (isSuspended()) {
+ if (IsSuspended()) {
Suspend(params);
- ContinueDebugEvent(parentProcess_.GetOSID(), GetOSID(), DBG_CONTINUE);
+ ::ContinueDebugEvent(parentProcess_.GetOSID(), GetOSID(), DBG_CONTINUE);
+ }
+}
+
+void WinThread::SetDebugRegister(WinHWBkptMgr::DRMask dRegs, ContextAddress addr, WinHWBkptMgr::DRFlags dr7bits) {
+ bool suspended = isSuspended_;
+ if (!suspended)
+ Suspend();
+ DWORD& DR7 = threadContextInfo_.Dr7;
+ switch (dRegs) {
+ case DR0:
+ threadContextInfo_.Dr0 = addr;
+ DR7 = (DR7 & ~0x000F0003) | (dr7bits<<16) | 0x01;
+ break;
+ case DR1:
+ threadContextInfo_.Dr1 = addr;
+ DR7 = (DR7 & ~0x00F0000C) | (dr7bits<<20) | 0x04;
+ break;
+ case DR2:
+ threadContextInfo_.Dr2 = addr;
+ DR7 = (DR7 & ~0x0F000030) | (dr7bits<<24) | 0x10;
+ break;
+ case DR3:
+ threadContextInfo_.Dr3 = addr;
+ DR7 = (DR7 & ~0xF0000030) | (dr7bits<<28) | 0x40;
+ break;
+ default:
+ return;
+ }
+ ::SetThreadContext(handle_, &threadContextInfo_);
+ if (!suspended)
+ Resume();
+}
+
+void WinThread::ClearDebugRegister(WinHWBkptMgr::DRMask singleDReg) {
+ bool suspended = isSuspended_;
+ if (!suspended)
+ Suspend();
+ DWORD& DR7 = threadContextInfo_.Dr7;
+ switch (singleDReg) {
+ case DR0: DR7 &= ~0x000F0003; break;
+ case DR1: DR7 &= ~0x00F0000C; break;
+ case DR2: DR7 &= ~0x0F000030; break;
+ case DR3: DR7 &= ~0xF00000C0; break;
+ default:
+ return;
+ }
+ ::SetThreadContext(handle_, &threadContextInfo_);
+ ::SetThreadContext(handle_, &threadContextInfo_);
+ if (!suspended)
+ Resume();
+}
+
+void WinThread::HandleHardwareBreak() {
+ const HANDLE& procHandle = parentProcess_.GetProcessHandle();
+ ContextAddress* dr = (ContextAddress*)&(threadContextInfo_.Dr0);
+ for (int i = 0; i < 4; ++i) {
+ if (threadContextInfo_.Dr6 & (1 << i)) {
+ TBreakpoint* wp
+ = BreakpointsService::FindWatchpointByAddress(procHandle, dr[i]);
+ if (wp) {
+ std::ostringstream wpAddr; wpAddr << std::hex << wp->address;
+ EventClientNotifier::SendContextSuspended(this,
+ GetPCAddress(), REASON_WATCHPOINT, wpAddr.str());
+ break;
+ }
+ }
}
}
diff --git a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.h b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.h
index e4d99c0..a525c2a 100644
--- a/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.h
+++ b/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent/WinThread.h
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -12,6 +12,13 @@
#include "stdafx.h"
#include "ThreadContext.h"
+#include "WinHWBkptMgr.h" // for DRMask, DRFlags on SetDebugRegister/ClearDebugRegister
+
+#define DR0 0x01
+#define DR1 0x02
+#define DR2 0x04
+#define DR3 0x08
+
#define USER_SUSPEND_THREAD 0
@@ -38,49 +45,56 @@
//
// overrides of RunControlContext
//
- virtual int ReadMemory(const ReadWriteMemoryParams& params) throw (AgentException);
- virtual int WriteMemory(const ReadWriteMemoryParams& params) throw (AgentException);
+ virtual int ReadMemory(const ReadWriteMemoryParams&) throw (AgentException);
+ virtual int WriteMemory(const ReadWriteMemoryParams&) throw (AgentException);
- virtual void Resume(const AgentActionParams& params) throw (AgentException);
+ virtual void Resume(const AgentActionParams&) throw (AgentException);
- virtual void Suspend(const AgentActionParams& params) throw (AgentException);
+ virtual void Suspend(const AgentActionParams&) throw (AgentException);
- virtual void Terminate(const AgentActionParams& params) throw (AgentException);
+ virtual void Terminate(const AgentActionParams&) throw (AgentException);
- virtual void SingleStep(const AgentActionParams& params) throw (AgentException);
+ virtual void SingleStep(const AgentActionParams&) throw (AgentException);
//
// end overrides
- void PrepareForTermination(const AgentActionParams& params) throw (AgentException);
+ void PrepareForTermination(const AgentActionParams&) throw (AgentException);
void HandleException(DEBUG_EVENT& debugEvent);
void HandleExecutableEvent(bool isLoaded, const std::string& exePath,
unsigned long baseAddress, unsigned long codeSize);
/* Address where suspend is reported */
- ContextAddress GetPCAddress();
+ ContextAddress GetPCAddress() const;
void EnableSingleStep();
- DWORD GetContinueStatus();
+ DWORD GetContinueStatus() const;
-private:
- void initialize();
+ void SetDebugRegister(WinHWBkptMgr::DRMask, ContextAddress, WinHWBkptMgr::DRFlags);
+ void ClearDebugRegister(WinHWBkptMgr::DRMask);
+
+ private:
+ void Resume();
+ DWORD Suspend();
+
+ void Initialize();
void EnsureValidContextInfo();
void SetContextInfo();
- bool isSuspended();
+ bool IsSuspended() const;
void MarkSuspended();
void AdjustPC();
/** REASON_xx code for suspend */
- const char* GetSuspendReason();
+ const char* GetSuspendReason() const;
/** Description for suspend */
- std::string GetExceptionMessage();
+ std::string GetExceptionMessage() const;
-private:
- void* getRegisterValueBuffer(const std::string& regName);
+ void* GetRegisterValueBuffer(const std::string& regName) const;
+
+ void HandleHardwareBreak();
std::pair<int, int> threadLookupPair_;
diff --git a/org.eclipse.cdt.debug.edc.windows/META-INF/MANIFEST.MF b/org.eclipse.cdt.debug.edc.windows/META-INF/MANIFEST.MF
index 61a105f..30fd3c0 100644
--- a/org.eclipse.cdt.debug.edc.windows/META-INF/MANIFEST.MF
+++ b/org.eclipse.cdt.debug.edc.windows/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: Windows Plug-in
Bundle-SymbolicName: org.eclipse.cdt.debug.edc.windows;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.1.0.qualifier
Bundle-Activator: org.eclipse.cdt.debug.edc.windows.WindowsDebugger
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.debug.core;bundle-version="3.4.0",
diff --git a/org.eclipse.cdt.debug.edc.windows/os/win32/x86/EDCWindowsDebugAgent.exe b/org.eclipse.cdt.debug.edc.windows/os/win32/x86/EDCWindowsDebugAgent.exe
index c681d43..5cce9bc 100644
--- a/org.eclipse.cdt.debug.edc.windows/os/win32/x86/EDCWindowsDebugAgent.exe
+++ b/org.eclipse.cdt.debug.edc.windows/os/win32/x86/EDCWindowsDebugAgent.exe
Binary files differ
diff --git a/org.eclipse.cdt.debug.edc.windows/src/org/eclipse/cdt/debug/edc/windows/launch/WindowsFinalLaunchSequence.java b/org.eclipse.cdt.debug.edc.windows/src/org/eclipse/cdt/debug/edc/windows/launch/WindowsFinalLaunchSequence.java
index dd14db1..1a59c00 100644
--- a/org.eclipse.cdt.debug.edc.windows/src/org/eclipse/cdt/debug/edc/windows/launch/WindowsFinalLaunchSequence.java
+++ b/org.eclipse.cdt.debug.edc.windows/src/org/eclipse/cdt/debug/edc/windows/launch/WindowsFinalLaunchSequence.java
@@ -99,7 +99,7 @@
/**
* Just here so subclasses can override if needed
- * @since 2.0
+ * @since 2.1
*/
protected boolean enableOutputLogging() {
return true;
diff --git a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/TargetEnvironmentX86.java b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/TargetEnvironmentX86.java
index 9810feb..788eb4f 100644
--- a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/TargetEnvironmentX86.java
+++ b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/TargetEnvironmentX86.java
@@ -11,20 +11,35 @@
package org.eclipse.cdt.debug.edc.x86;
+import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.edc.IAddressExpressionEvaluator;
+import org.eclipse.cdt.debug.edc.disassembler.IDisassembledInstruction;
import org.eclipse.cdt.debug.edc.disassembler.IDisassembler;
+import org.eclipse.cdt.debug.edc.disassembler.IDisassembler.IDisassemblerOptions;
import org.eclipse.cdt.debug.edc.services.AbstractTargetEnvironment;
+import org.eclipse.cdt.debug.edc.services.Disassembly;
import org.eclipse.cdt.debug.edc.services.ITargetEnvironment;
import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
import org.eclipse.cdt.debug.edc.x86.disassembler.AddressExpressionEvaluatorX86;
import org.eclipse.cdt.debug.edc.x86.disassembler.DisassemblerX86;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
+import org.eclipse.cdt.dsf.debug.service.IMemory;
+import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType;
import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.MemoryByte;
/**
* {@link ITargetEnvironment} service for x86.
@@ -135,4 +150,54 @@
*/
return 0;
}
+
+ @Override
+ public void stepPastGlueCode(final IExecutionDMContext dmc, final IAddress pc,
+ final RequestMonitor rm) {
+ IMemory memService = getService(IMemory.class);
+ IMemoryDMContext mem_dmc = DMContexts.getAncestorOfType(dmc, IMemoryDMContext.class);
+
+ // Glue code in function call in x86:
+ // it's just a jmp instruction.
+
+ // We need to get the instruction at the PC. We have to
+ // retrieve memory bytes for longest instruction.
+ int maxInstLength = getLongestInstructionLength();
+
+ memService.getMemory(mem_dmc, pc, 0, 1, maxInstLength,
+ new DataRequestMonitor<MemoryByte[]>(getExecutor(), rm) {
+ @Override
+ protected void handleSuccess() {
+ ByteBuffer codeBuf = Disassembly.translateMemoryBytes(getData(), pc, rm);
+ if (codeBuf == null) {
+ return; // rm status set in translateMemoryBytes()
+ }
+
+ IDisassemblyDMContext dis_dmc
+ = DMContexts.getAncestorOfType(dmc, IDisassemblyDMContext.class);
+ Map<String, Object> options = new HashMap<String, Object>();
+ options.put(IDisassemblerOptions.ADDRESS_IS_PC, 1);
+ IDisassembledInstruction inst;
+ try {
+ inst = disassembler.disassembleOneInstruction(pc, codeBuf, options, dis_dmc);
+ } catch (CoreException e) {
+ rm.setStatus(e.getStatus());
+ rm.done();
+ return;
+ }
+
+ final boolean isJump = inst.getJumpToAddress() != null
+ && !inst.getJumpToAddress().isSubroutineAddress();
+
+ if (! isJump) // not glue code, done.
+ rm.done();
+ else {
+ // Execute a single instruction to step past the glue code
+ //
+ IRunControl rcService = getService(IRunControl.class);
+ rcService.step(dmc, StepType.INSTRUCTION_STEP_INTO, rm);
+ }
+ }
+ });
+ }
}
diff --git a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/X86Stack.java b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/X86Stack.java
index dbb2239..f4669f6 100644
--- a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/X86Stack.java
+++ b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/X86Stack.java
@@ -17,7 +17,6 @@
import java.util.Map;
import org.eclipse.cdt.debug.edc.MemoryUtils;
-import org.eclipse.cdt.debug.edc.internal.HostOS;
import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
import org.eclipse.cdt.debug.edc.services.IEDCMemory;
import org.eclipse.cdt.debug.edc.services.IEDCModuleDMContext;
@@ -176,9 +175,8 @@
baseAddress = previousBaseAddress;
instructionAddress = returnAddress;
- // Bail out when we hit the top of the stack frame
- // (but not always if a module is unrecognized; this can happen in Linux/gdbserver sometimes -- TODO)
- if (baseAddress == 0 || (module == null && !HostOS.IS_UNIX)) {
+ // Bail out when we hit the top of the stack frame
+ if (baseAddress == 0) {
properties.put(StackFrameDMC.ROOT_FRAME, true);
break;
}
diff --git a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/disassembler/AddressExpressionEvaluatorX86.java b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/disassembler/AddressExpressionEvaluatorX86.java
index 9fb9736..a2c6cd9 100644
--- a/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/disassembler/AddressExpressionEvaluatorX86.java
+++ b/org.eclipse.cdt.debug.edc.x86/src/org/eclipse/cdt/debug/edc/x86/disassembler/AddressExpressionEvaluatorX86.java
@@ -58,7 +58,7 @@
int tokenCnt = tokenizer.countTokens();
if (tokenCnt == 1) {
- // "*%eax" or "*0x80000"
+ // "*%eax", "*(%esi)", or "*0x80000"
String token = tokenizer.nextToken();
@@ -67,7 +67,7 @@
String val = edcRegService.getRegisterValue(context, regName);
- ret = new Addr64(val, 16);
+ memAddr = new Addr64(val, 16);
} else { // must be a hex string like 0x80000
memAddr = new Addr64(token.substring(2), 16);
// read from the memAddr below.
@@ -79,10 +79,17 @@
String token = tokenizer.nextToken();
- // Could offset be negative ?
- assert !token.startsWith("-");
+ // offset can be negative
+ boolean is_negative = false;
+ if (token.startsWith("-")) {
+ is_negative = true;
+ token = token.substring(1);
+ }
BigInteger offset = new BigInteger(token.substring(2), 16);
+
+ if (is_negative)
+ offset = offset.negate();
String baseReg = null, indexReg = null;
int scale = 1;
@@ -106,7 +113,8 @@
if (indexReg != null)
index = Long.valueOf(edcRegService.getRegisterValue((IEDCExecutionDMC) context, indexReg), 16);
- memAddr = new Addr64(offset).add(base + index * scale);
+ long sum = offset.longValue() + base + index * scale;
+ memAddr = new Addr64(BigInteger.valueOf(sum));
// next read the memAddr to get the address we need.
} else {
// invalid
@@ -129,12 +137,15 @@
throw new CoreException(st);
byte[] bytes = new byte[memBuffer.size()];
- for (int i = 0; i < bytes.length; i++) {
+ assert(bytes.length == 4);
+
+ for (int i = 0; i < 4; i++) {
// check each byte
if (!memBuffer.get(i).isReadable())
throw new CoreException(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
("Cannot read memory at 0x" + memAddr.add(i).getValue().toString(16))));
- bytes[i] = memBuffer.get(i).getValue();
+ // Note we need the "bytes" in big-endian byte order.
+ bytes[i] = memBuffer.get(4-1-i).getValue();
}
ret = new Addr64(new BigInteger(bytes));
diff --git a/org.eclipse.cdt.debug.edc/.settings/.api_filters b/org.eclipse.cdt.debug.edc/.settings/.api_filters
index e759a19..8fbe983 100644
--- a/org.eclipse.cdt.debug.edc/.settings/.api_filters
+++ b/org.eclipse.cdt.debug.edc/.settings/.api_filters
@@ -1,44 +1,44 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.cdt.debug.edc" version="2">
- <resource path="src/org/eclipse/cdt/debug/edc/internal/EDCTrace.java" type="org.eclipse.cdt.debug.edc.internal.EDCTrace$NullDebugTrace">
- <filter id="574619656">
- <message_arguments>
- <message_argument value="DebugTrace"/>
- <message_argument value="NullDebugTrace"/>
- </message_arguments>
- </filter>
- </resource>
- <resource path="src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/ASTInstructionCompiler.java" type="org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTInstructionCompiler">
- <filter id="640712815">
- <message_arguments>
- <message_argument value="ASTVisitor"/>
- <message_argument value="ASTInstructionCompiler"/>
- <message_argument value="visit(ASTAmbiguousNode)"/>
- </message_arguments>
- </filter>
- <filter id="642777099">
- <message_arguments>
- <message_argument value="ASTVisitor"/>
- <message_argument value="ASTInstructionCompiler"/>
- <message_argument value="visit(ASTAmbiguousNode)"/>
- </message_arguments>
- </filter>
- </resource>
- <resource path="src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java" type="org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.EvaluateID">
- <filter id="640712815">
- <message_arguments>
- <message_argument value="IASTName"/>
- <message_argument value="EvaluateID"/>
- <message_argument value="getLookupKey()"/>
- </message_arguments>
- </filter>
- </resource>
- <resource path="src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java" type="org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader">
- <filter id="571473929">
- <message_arguments>
- <message_argument value="ISymbolReader"/>
- <message_argument value="IEDCSymbolReader"/>
- </message_arguments>
- </filter>
- </resource>
-</component>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.cdt.debug.edc" version="2">
+ <resource path="src/org/eclipse/cdt/debug/edc/internal/EDCTrace.java" type="org.eclipse.cdt.debug.edc.internal.EDCTrace$NullDebugTrace">
+ <filter id="574619656">
+ <message_arguments>
+ <message_argument value="DebugTrace"/>
+ <message_argument value="NullDebugTrace"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/ASTInstructionCompiler.java" type="org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTInstructionCompiler">
+ <filter id="640712815">
+ <message_arguments>
+ <message_argument value="ASTVisitor"/>
+ <message_argument value="ASTInstructionCompiler"/>
+ <message_argument value="visit(ASTAmbiguousNode)"/>
+ </message_arguments>
+ </filter>
+ <filter id="642777099">
+ <message_arguments>
+ <message_argument value="ASTVisitor"/>
+ <message_argument value="ASTInstructionCompiler"/>
+ <message_argument value="visit(ASTAmbiguousNode)"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java" type="org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.EvaluateID">
+ <filter id="640712815">
+ <message_arguments>
+ <message_argument value="IASTName"/>
+ <message_argument value="EvaluateID"/>
+ <message_argument value="getLookupKey()"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java" type="org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader">
+ <filter id="571473929">
+ <message_arguments>
+ <message_argument value="ISymbolReader"/>
+ <message_argument value="IEDCSymbolReader"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.cdt.debug.edc/META-INF/MANIFEST.MF b/org.eclipse.cdt.debug.edc/META-INF/MANIFEST.MF
index bf611b3..d65ba14 100644
--- a/org.eclipse.cdt.debug.edc/META-INF/MANIFEST.MF
+++ b/org.eclipse.cdt.debug.edc/META-INF/MANIFEST.MF
@@ -28,9 +28,7 @@
org.eclipse.cdt.debug.edc.linux.x86,
org.eclipse.cdt.debug.edc.x86,
org.eclipse.cdt.debug.edc.arm",
- org.eclipse.cdt.debug.edc.internal.breakpointactions;
- x-friends:="org.eclipse.cdt.debug.edc.ui,
- org.eclipse.cdt.debug.edc.tests",
+ org.eclipse.cdt.debug.edc.internal.breakpointactions;x-friends:="org.eclipse.cdt.debug.edc.ui,org.eclipse.cdt.debug.edc.tests",
org.eclipse.cdt.debug.edc.internal.eval.ast.engine;x-friends:="org.eclipse.cdt.debug.edc.tests",
org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions;x-friends:="org.eclipse.cdt.debug.edc.tests",
org.eclipse.cdt.debug.edc.internal.formatter,
@@ -42,7 +40,7 @@
org.eclipse.cdt.debug.edc.windows,
org.eclipse.cdt.debug.edc.linux.x86,
org.eclipse.cdt.debug.edc.tests",
- org.eclipse.cdt.debug.edc.internal.symbols;x-friends:="org.eclipse.cdt.debug.edc.tests",
+ org.eclipse.cdt.debug.edc.internal.symbols;x-friends:="org.eclipse.cdt.debug.edc.tests,org.eclipse.cdt.debug.edc.arm",
org.eclipse.cdt.debug.edc.internal.symbols.dwarf;x-friends:="org.eclipse.cdt.debug.edc.tests",
org.eclipse.cdt.debug.edc.internal.symbols.elf;x-friends:="org.eclipse.cdt.debug.edc.arm,org.eclipse.cdt.debug.edc.tests",
org.eclipse.cdt.debug.edc.internal.symbols.files;x-friends:="org.eclipse.cdt.debug.edc.tests,org.eclipse.cdt.debug.edc.arm",
diff --git a/org.eclipse.cdt.debug.edc/plugin.xml b/org.eclipse.cdt.debug.edc/plugin.xml
index b716c2f..37e2ae3 100644
--- a/org.eclipse.cdt.debug.edc/plugin.xml
+++ b/org.eclipse.cdt.debug.edc/plugin.xml
@@ -198,4 +198,11 @@
label="QMapNode Formatter">
</variableFormatProvider>
</extension>
+ <extension
+ point="org.eclipse.cdt.debug.core.BreakpointActionType">
+ <actionType
+ name="%SkipAction.name"
+ class="org.eclipse.cdt.debug.edc.internal.breakpointactions.SkipAction"
+ id="org.eclipse.cdt.debug.edc.breakpointactions.SkipAction"/>
+ </extension>
</plugin>
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/StreamBufferBase.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/StreamBufferBase.java
index e12852d..21ed5d2 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/StreamBufferBase.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/StreamBufferBase.java
@@ -28,7 +28,28 @@
public abstract class StreamBufferBase implements IStreamBuffer {
/* must be a power of 2 */
public static final int BUFFER_SIZE = 4096;
-
+
+ private static double LN_2 = 0.0;
+ private static double mathLogOf2() {
+ if (0.0 == LN_2) {
+ LN_2 = Math.log(2);
+ }
+ return LN_2;
+ }
+
+ /**
+ * get a smaller buffer size when capacity < 4096
+ * EXTENSION: go faster using bitshift operations.
+ * @return either BUFFER_SIZE or a smaller power of 2 that is
+ * larger than the sourceCapacity.
+ */
+ private int getBufferSize() {
+ if (sourceCapacity >= BUFFER_SIZE) {
+ return BUFFER_SIZE;
+ }
+ return 1 << (int)Math.ceil(Math.log(sourceCapacity)/mathLogOf2());
+ }
+
protected ByteOrder order;
// absolute
@@ -56,8 +77,8 @@
this.baseOffset = baseOffset;
this.position = 0;
this.sourceCapacity = capacity;
-
- this.buffer = new byte[BUFFER_SIZE];
+
+ this.buffer = new byte[getBufferSize()];
this.sourceOffset = 0;
this.sourceLimit = 0;
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/breakpointactions/EDCLogActionEnabler.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/breakpointactions/EDCLogActionEnabler.java
new file mode 100644
index 0000000..3701744
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/breakpointactions/EDCLogActionEnabler.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ * This enabler is necessary to get back into EDC in order to use its
+ * expression evaluator for any expression associated with a Log Action
+ *
+ */
+package org.eclipse.cdt.debug.edc.internal.breakpointactions;
+
+import org.eclipse.cdt.debug.core.breakpointactions.ILogActionEnabler;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Expressions;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+
+public class EDCLogActionEnabler implements ILogActionEnabler {
+
+ Expressions exprService;
+ IDMContext dmContext;
+
+ /**
+ * @param service the expressions service used to evaluate the expression
+ * @param dmc the thread context in which to evaluate the expression
+ */
+ public EDCLogActionEnabler(Expressions service, IDMContext dmc) {
+ exprService = service;
+ dmContext = dmc;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.breakpointactions.ILogActionEnabler#evaluateExpression(java.lang.String)
+ */
+ public String evaluateExpression(String exprString) throws Exception {
+ IEDCExpression expression
+ = (IEDCExpression) exprService.createExpression(dmContext, exprString);
+ IFormattedValues.FormattedValueDMContext fvc
+ = exprService.getFormattedValueContext(expression, IFormattedValues.NATURAL_FORMAT);
+ return expression.getFormattedValue(fvc).getFormattedValue();
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java
index f9f97a3..87a50ce 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/eval/ast/engine/instructions/EvaluateID.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -11,6 +11,7 @@
package org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions;
import java.text.MessageFormat;
+import java.util.Collection;
import java.util.List;
import org.eclipse.cdt.core.IAddress;
@@ -19,19 +20,30 @@
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.ASTEvalMessages;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCSymbolReader;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ProcessExecutionDMC;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ThreadExecutionDMC;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
import org.eclipse.cdt.debug.edc.internal.symbols.InvalidVariableLocation;
-import org.eclipse.cdt.debug.edc.services.IEDCModuleDMContext;
-import org.eclipse.cdt.debug.edc.services.IEDCModules;
import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
+import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
+import org.eclipse.cdt.debug.edc.services.IEDCModules;
+import org.eclipse.cdt.debug.edc.services.Stack;
import org.eclipse.cdt.debug.edc.services.Stack.EnumeratorDMC;
import org.eclipse.cdt.debug.edc.services.Stack.IVariableEnumeratorContext;
import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
import org.eclipse.cdt.debug.edc.services.Stack.VariableDMC;
+import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
import org.eclipse.cdt.debug.edc.symbols.IVariableLocation;
import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.core.runtime.CoreException;
public class EvaluateID extends SimpleInstruction {
@@ -77,63 +89,88 @@
*/
@Override
public void execute() throws CoreException {
-
IDMContext context = getContext();
- if (!(context instanceof StackFrameDMC))
+ if (!((context instanceof StackFrameDMC) || (context instanceof ModuleDMC)))
throw EDCDebugger.newCoreException(MessageFormat.format(ASTEvalMessages.EvaluateID_CannotResolveName, name));
- StackFrameDMC frame = (StackFrameDMC) context;
- EDCServicesTracker servicesTracker = frame.getEDCServicesTracker();
- IEDCModules modules = servicesTracker.getService(IEDCModules.class);
+ EDCServicesTracker servicesTracker = null;
+ ModuleDMC module = null;
+ if (context instanceof ModuleDMC) {
+ module = (ModuleDMC)context;
+ servicesTracker = module.getEDCServicesTracker();
+ } else if (context instanceof StackFrameDMC) {
- // check by name for a variable or enumerator
- IVariableEnumeratorContext variableOrEnumerator = frame.findVariableOrEnumeratorByName(name, qualifiedName != null ? qualifiedName.getRawSignature() : null, false);
- VariableDMC variable = variableOrEnumerator instanceof VariableDMC ?
- (VariableDMC)variableOrEnumerator : null;
- EnumeratorDMC enumerator = variableOrEnumerator instanceof EnumeratorDMC ?
- (EnumeratorDMC)variableOrEnumerator : null;
+ StackFrameDMC frame = (StackFrameDMC) context;
+ servicesTracker = frame.getEDCServicesTracker();
- // This may be called on debugger shutdown, in which case the "modules"
- // service may have been shutdown.
- if (variable != null && modules != null) {
- IVariableLocation valueLocation = null;
- ILocationProvider provider = variable.getVariable().getLocationProvider();
- IEDCModuleDMContext module = frame.getModule();
- if (module != null && provider != null) {
- valueLocation = provider.getLocation(servicesTracker, frame, module.toLinkAddress(frame.getInstructionPtrAddress()),
- TypeUtils.isConstType(variable.getVariable().getType()));
+ // This may be called on debugger shutdown, in which case the "modules"
+ // service may have been shutdown.
+ IEDCModules modules = servicesTracker.getService(IEDCModules.class);
+ if (modules == null)
+ return;
+
+ // check by name for a variable or enumerator
+ IVariableEnumeratorContext variableOrEnumerator
+ = frame.findVariableOrEnumeratorByName(name, qualifiedName != null ? qualifiedName.getRawSignature() : null, false);
+ VariableDMC variable
+ = variableOrEnumerator instanceof VariableDMC ? (VariableDMC)variableOrEnumerator : null;
+ EnumeratorDMC enumerator
+ = variableOrEnumerator instanceof EnumeratorDMC ? (EnumeratorDMC)variableOrEnumerator : null;
+
+ module = (ModuleDMC)frame.getModule();
+ if (variable != null) {
+ IVariableLocation valueLocation = null;
+ ILocationProvider provider = variable.getVariable().getLocationProvider();
+ if (module != null && provider != null) {
+ valueLocation = provider.getLocation(servicesTracker, frame, module.toLinkAddress(frame.getInstructionPtrAddress()),
+ TypeUtils.isConstType(variable.getVariable().getType()));
+ }
+ if (valueLocation == null) {
+ // unhandled
+ valueLocation
+ = new InvalidVariableLocation(
+ MessageFormat.format(ASTEvalMessages.EvaluateID_NameHasNoLocation,
+ variable.getName()));
+ }
+
+ // create a VariableWithValue and push on the stack
+ VariableWithValue varWval = new VariableWithValue(servicesTracker, frame, variable.getVariable());
+ varWval.setValueLocation(valueLocation);
+ push(varWval);
+ return;
}
- if (valueLocation == null) {
- // unhandled
- valueLocation = new InvalidVariableLocation(MessageFormat.format(ASTEvalMessages.EvaluateID_NameHasNoLocation, variable.getName()));
+
+ if (enumerator != null) {
+ // TODO: map IEnumerator to an IEnumeration and use the real type
+ pushNewValue(fInterpreter.getTypeEngine().getIntegerTypeOfSize(4, true),
+ enumerator.getEnumerator().getValue());
+ return;
}
- // create a VariableWithValue and push on the stack
- VariableWithValue varWval = new VariableWithValue(servicesTracker, frame, variable.getVariable());
- varWval.setValueLocation(valueLocation);
- push(varWval);
- return;
}
- if (enumerator != null) {
- // TODO: map IEnumerator to an IEnumeration and use the real type
- pushNewValue(fInterpreter.getTypeEngine().getIntegerTypeOfSize(4, true),
- enumerator.getEnumerator().getValue());
- return;
- }
-
- // match against function names visible in the module
- Symbols symbolsService = servicesTracker.getService(Symbols.class);
- if (symbolsService != null) {
- IEDCModuleDMContext module = frame.getModule();
- if (module != null) {
+ if (module != null) {
+ @SuppressWarnings("null") // XXX false positive null-check on servicesTracker
+ Symbols symbolsService = servicesTracker.getService(Symbols.class);
+ if (symbolsService != null) {
String searchName = name;
if (qualifiedName != null)
searchName = qualifiedName.getRawSignature();
+
+ // first attempt to match against variable names in the module
+ IEDCSymbolReader reader = module.getSymbolReader();
+ if (reader instanceof EDCSymbolReader) {
+ if (findGlobalVariable(searchName, (EDCSymbolReader)reader, servicesTracker)
+ || findLocalVariable(searchName, module, (EDCSymbolReader)reader, servicesTracker))
+ return;
+ }
+
+ // if no variable matches, attempt to
+ // match against function names visible in the module
List<IAddress> addresses = symbolsService.getFunctionAddress(module, searchName);
if (addresses.size() > 0) {
pushNewValue(fInterpreter.getTypeEngine().getIntegerTypeOfSize(4, false),
- addresses.get(0).getValue().longValue());
+ addresses.get(0).getValue().longValue());
return;
}
// show the whole qualified name in the exception message
@@ -146,4 +183,92 @@
MessageFormat.format(ASTEvalMessages.EvaluateID_VariableNotFound, name));
}
+ /**
+ * @param servicesTracker
+ * @param searchName
+ * @param idip
+ * @param baseLinkAddress
+ */
+ private boolean findGlobalVariable(String searchName,
+ EDCSymbolReader reader, EDCServicesTracker servicesTracker) {
+
+ IDebugInfoProvider idip = reader.getDebugInfoProvider();
+ if (idip == null)
+ return false;
+
+ Collection<IVariable> vars = idip.getVariablesByName(searchName, true);
+ for (IVariable var : vars) {
+ IVariableLocation loc
+ = var.getLocationProvider()
+ .getLocation(servicesTracker, null, reader.getBaseLinkAddress(),
+ TypeUtils.isConstType(var.getType()));
+ if (loc instanceof InvalidVariableLocation)
+ continue;
+
+ VariableWithValue varWval
+ = new VariableWithValue(servicesTracker, null, var);
+ varWval.setValueLocation(loc);
+ push(varWval);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param context
+ * @param servicesTracker
+ * @param searchName
+ * @param reader
+ * @param idip
+ * @throws CoreException
+ */
+ private boolean findLocalVariable(String searchName, ModuleDMC module,
+ EDCSymbolReader reader, EDCServicesTracker servicesTracker) {
+
+ IDebugInfoProvider idip = reader.getDebugInfoProvider();
+ if (idip == null)
+ return false;
+
+ Stack stackService = servicesTracker.getService(Stack.class);
+ if (stackService == null)
+ return false;
+
+ final ProcessExecutionDMC procDMC
+ = DMContexts.getAncestorOfType(module, ProcessExecutionDMC.class);
+ if (procDMC == null)
+ return false;
+ Collection<IVariable> vars = idip.getVariablesByName(searchName, false);
+ if (vars == null || vars.isEmpty())
+ return false;
+
+ for (IEDCExecutionDMC tc : procDMC.getChildren()) {
+ if (!(tc instanceof ThreadExecutionDMC)
+ || !((ThreadExecutionDMC)tc).isSuspended())
+ continue;
+ IFrameDMContext[] frames;
+ try {
+ frames = stackService.getFramesForDMC(tc, 0, Stack.ALL_FRAMES);
+ } catch (CoreException e) {
+ continue; // let's try another thread, if available
+ }
+ for (IFrameDMContext frame : frames)
+ if (frame instanceof StackFrameDMC) {
+ StackFrameDMC stackFrame = (StackFrameDMC)frame;
+ IAddress pc = stackFrame.getInstructionPtrAddress();
+ for (IVariable var : vars) {
+ IScope varScope = var.getScope();
+ if (varScope.getLowAddress().compareTo(pc) <= 0
+ && pc.compareTo(varScope.getHighAddress()) < 0) {
+
+ VariableWithValue varWval
+ = new VariableWithValue(servicesTracker,
+ stackFrame, var);
+ push(varWval);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/BreakpointAttributeTranslator.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/BreakpointAttributeTranslator.java
index 7b57bbb..8419e9d 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/BreakpointAttributeTranslator.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/BreakpointAttributeTranslator.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -23,9 +23,15 @@
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.EDCTrace;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
+import org.eclipse.cdt.debug.edc.internal.symbols.InvalidVariableLocation;
import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
+import org.eclipse.cdt.debug.edc.services.IEDCExpression;
import org.eclipse.cdt.debug.edc.services.ITargetEnvironment;
import org.eclipse.cdt.debug.edc.symbols.ILineEntryProvider.ILineAddresses;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
+import org.eclipse.cdt.debug.internal.core.breakpoints.CWatchpoint;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.BreakpointsMediator2;
@@ -47,6 +53,9 @@
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
+//trying to avoid dependence on the ui, even the core debug UI
+//import org.eclipse.debug.ui.DebugUITools;
+
public class BreakpointAttributeTranslator implements IBreakpointAttributeTranslator2 {
private DsfServicesTracker dsfServicesTracker;
@@ -191,166 +200,240 @@
if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().traceEntry(null,
"Resolving breakpoint " + EDCTrace.fixArg(breakpoint) + " in context " + EDCTrace.fixArg(context)); }
- if (dsfSession == null) {
- // already disposed
+ if (dsfSession == null) {
+ // already disposed
drm.setData(targetBPAttrs);
drm.done();
if (EDCTrace.BREAKPOINTS_TRACE_ON) {EDCTrace.getTrace().traceExit(null, "null session");}
return;
- }
-
- Map<String, Object> oneBPAttr;
-
+ }
+
final ModuleDMC module = (ModuleDMC) context;
- String bpType = (String)attributes.get(Breakpoints.BREAKPOINT_SUBTYPE);
-
- if (bpType.equals(Breakpoints.ADDRESS_BREAKPOINT)) {
- String addr = (String)attributes.get(ICLineBreakpoint.ADDRESS);
- // This is hex string with "0x".
- assert addr != null;
- // remove "0x"
- String s = addr.toLowerCase().startsWith("0x") ? addr.substring(2) : addr;
-
- // Check if the address falls in the module code adress range
- Addr64 a = new Addr64(s, 16);
- if (module.containsAddress(a)) {
- oneBPAttr = new HashMap<String, Object>(attributes);
- oneBPAttr.put(Breakpoints.RUNTIME_ADDRESS, s);
- targetBPAttrs.add(oneBPAttr);
-
- drm.setData(targetBPAttrs);
- }
- else {
- drm.setStatus(new Status(IStatus.WARNING, EDCDebugger.PLUGIN_ID, MessageFormat
- .format("Address breakpoint at {0} does not fall in the module [{1}].",
- addr, module.getName())));
- }
-
- drm.done();
- }
- else if (bpType.equals(Breakpoints.FUNCTION_BREAKPOINT)) {
- String function = (String) attributes.get(ICLineBreakpoint.FUNCTION);
- assert (function != null && function.length() > 0);
-
- // the point is a symbol
- Symbols symService = dsfServicesTracker.getService(Symbols.class);
- List<IAddress> addrs = symService.getFunctionAddress(module, function);
- for (IAddress a : addrs) {
- oneBPAttr = new HashMap<String, Object>(attributes);
- oneBPAttr.put(Breakpoints.RUNTIME_ADDRESS, a.toString(16));
-
- targetBPAttrs.add(oneBPAttr);
- }
-
- drm.setData(targetBPAttrs);
- drm.done();
- }
- else {
- assert bpType.equals(Breakpoints.LINE_BREAKPOINT);
-
- final String bpFile = (String) attributes.get(ICBreakpoint.SOURCE_HANDLE);
- final Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER);
-
- final IExecutionDMContext exe_dmc = DMContexts.getAncestorOfType(context, IExecutionDMContext.class);
-
- final ICBreakpoint icBP = (ICBreakpoint)breakpoint;
-
- assert exe_dmc != null : "ExecutionDMContext is unknown in resolveBreakpoint().";
-
- Modules modulesService = dsfServicesTracker.getService(Modules.class);
- ISymbolDMContext sym_dmc = DMContexts.getAncestorOfType(context, ISymbolDMContext.class);
-
- String compileFile = EDCLaunch.getLaunchForSession(dsfSession.getId()).getCompilationPath(bpFile);
- if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().trace(null,
- "BP file: " + bpFile + " Compile file: " + compileFile); }
-
- /*
- * Look for code lines within five lines above and below the line in
- * question as we don't want to move a breakpoint too far.
- */
- modulesService.findClosestLineWithCode(sym_dmc, compileFile, line, 5,
- new DataRequestMonitor<ILineAddresses>(dsfSession.getExecutor(), drm) {
-
- @Override
- protected void handleCompleted() {
- if (! isSuccess()) {
- drm.setStatus(getStatus());
- drm.done();
- if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().trace(null,
- "findClosestLineWithCode failed: " + drm.getStatus()); }
- return;
- }
-
- ILineAddresses codeLine = getData();
-
- /*
- * there could be multiple address ranges for the same
- * source line. e.g. for templates or inlined functions. if
- * so, we need only set a breakpoint on the first location
- */
- IAddress[] addresses = codeLine.getAddress();
- if (addresses.length > 0) {
- IAddress address = addresses[0];
- for (int i = 1; i < addresses.length; i++)
- if (addresses[i].getValue().longValue() < address.getValue().longValue())
- address = addresses[i];
- Map<String, Object> targetAttr = new HashMap<String, Object>(attributes);
- targetAttr.put(Breakpoints.RUNTIME_ADDRESS, address.toString(16));
- targetBPAttrs.add(targetAttr);
- }
-
- drm.setData(targetBPAttrs);
-
- int actualCodeLine = codeLine.getLineNumber();
-
- if (actualCodeLine == line)
- drm.done();
- else {
- // breakpoint is resolved to a different line (the closest code line).
- // If there is no user breakpoint at that line, we move the breakpoint there.
- // Otherwise just mark this breakpoint as unresolved.
- //
- final int newLine = actualCodeLine;
-
- /**
- * Move the breakpoint to the actual code line.
- *
- * Should we run following code in another thread ? Seems yes according to comment in
- * BreakpointsMediator2.startTrackingBreakpoints(). But that way we'll run into this
- * problem:
- * 11 // blank line
- * 12 // blank line
- * 13 i = 2;
- * set bp at line 11 & 12, start debugger, we'll get two resolved breakpoints on line 13
- * (check in Breakpoints view).
- *
- * To fix that issue, I just run this in DSF executor thread. I don't see any problem
- * in my test......... 01/03/11
- */
- if (null == findUserBreakpointAt(bpFile, newLine)) {
- // After we change the line number attribute, a breakpoint-change
- // notification will come from platform through BreakpointsMediator2,
- // resulting in installation of the changed bp and removal of the
- // original bp.
- try {
- icBP.getMarker().setAttribute(IMarker.LINE_NUMBER, newLine);
- } catch (CoreException e) {
- // When will this happen ? ignore.
- }
-
- // At this point the "drm" contains a valid list of "targetBPAttrs", namely
- // we treat this BP as resolved. This is needed for such moved-BP to work
- // on debugger start.
- drm.done();
+ Map<String, Object> oneBPAttr;
+ if (breakpoint instanceof ICWatchpoint) {
+ String wpExpr = (String)attributes.get(ICWatchpoint.EXPRESSION);
+ final Expressions expressions = dsfServicesTracker.getService(Expressions.class);
+ if (expressions == null) {
+ drm.setStatus(
+ new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ EDCServicesMessages.BPAttrTranslator_WatchptNoExprService,
+ wpExpr)));
+ drm.done();
+ } else {
+ IEDCExpression exprDMC = (IEDCExpression)expressions.createExpression(module, wpExpr);
+ exprDMC.evaluateExpression();
+ IVariableLocation varLoc = exprDMC.getEvaluatedLocation();
+// the following depends upon org.eclipse.debug.ui to get the current stackFrame;
+// not certain that creating a ui dependency is exactly kosher in this situation.
+// if (varLoc == null || varLoc instanceof InvalidVariableLocation) {
+// IAdaptable adaptable = DebugUITools.getDebugContext();
+// if (adaptable == null) {
+// drm.setStatus(
+// new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
+// MessageFormat.format(
+// EDCServicesMessages.BPAttrTranslator_WatchptNoContext,
+// wpExpr)));
+// drm.done();
+// return;
+// }
+// StackFrameDMC frame = (StackFrameDMC)adaptable.getAdapter(StackFrameDMC.class);
+// if (frame == null) {
+// drm.setStatus(
+// new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
+// MessageFormat.format(
+// EDCServicesMessages.BPAttrTranslator_WatchptNoContext,
+// wpExpr)));
+// drm.done();
+// return; // message is ready, need to skip all setStatus() calls below
+// }
+// exprDMC = (IEDCExpression)expressions.createExpression(frame, wpExpr);
+// exprDMC.evaluateExpression();
+// varLoc = exprDMC.getEvaluatedLocation();
+// }
+ if (varLoc == null || varLoc instanceof InvalidVariableLocation) {
+ drm.setStatus(
+ new Status(IStatus.WARNING, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ EDCServicesMessages.BPAttrTranslator_WatchptLocationInvalid,
+ wpExpr, module.getName())));
+ } else {
+ try {
+ IAddress wpAddr = varLoc.getAddress();
+ if (wpAddr == null)
+ throw new CoreException(null);
+ String wpAddrString = wpAddr.toString(16);
+ if (module.containsAddress(wpAddr)) {
+ IType exprType = TypeUtils.getStrippedType(exprDMC.getEvaluatedType());
+ Map<String,Object> wpAttr = new HashMap<String, Object>(attributes);
+ wpAttr.put(Breakpoints.RUNTIME_ADDRESS, wpAddrString);
+ wpAttr.put(CWatchpoint.RANGE, exprType.getByteSize());
+ targetBPAttrs.add(wpAttr);
+ drm.setData(targetBPAttrs);
+ } else {
+ drm.setStatus(
+ new Status(IStatus.WARNING, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ EDCServicesMessages.BPAttrTranslator_WatchptNotInModule,
+ wpExpr, wpAddrString, module.getName())));
}
- else {
- targetBPAttrs.clear(); // mark the BP as unresolved by clearing the list.
- drm.done();
- }
+ } catch (CoreException e) {
+ drm.setStatus(
+ new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ EDCServicesMessages.BPAttrTranslator_WatchptCoreExceptionGettingAddr,
+ wpExpr, e.getLocalizedMessage())));
}
}
- });
+ drm.done();
+ }
+ } else {
+ String bpType = (String)attributes.get(Breakpoints.BREAKPOINT_SUBTYPE);
+ if (bpType.equals(Breakpoints.ADDRESS_BREAKPOINT)) {
+ String addr = (String)attributes.get(ICLineBreakpoint.ADDRESS);
+ // This is hex string with "0x".
+ assert addr != null;
+ // remove "0x"
+ String s = addr.toLowerCase().startsWith("0x") ? addr.substring(2) : addr;
+
+ // Check if the address falls in the module code adress range
+ Addr64 a = new Addr64(s, 16);
+ if (module.containsAddress(a)) {
+ oneBPAttr = new HashMap<String, Object>(attributes);
+ oneBPAttr.put(Breakpoints.RUNTIME_ADDRESS, s);
+ targetBPAttrs.add(oneBPAttr);
+
+ drm.setData(targetBPAttrs);
+ } else {
+ drm.setStatus(
+ new Status(IStatus.WARNING, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ EDCServicesMessages.BPAttrTranslator_BkptAddressNotInModule,
+ addr, module.getName())));
+ }
+
+ drm.done();
+ } else if (bpType.equals(Breakpoints.FUNCTION_BREAKPOINT)) {
+ String function = (String) attributes.get(ICLineBreakpoint.FUNCTION);
+ assert (function != null && function.length() > 0);
+
+ // the point is a symbol
+ Symbols symService = dsfServicesTracker.getService(Symbols.class);
+ List<IAddress> addrs = symService.getFunctionAddress(module, function);
+ for (IAddress a : addrs) {
+ oneBPAttr = new HashMap<String, Object>(attributes);
+ oneBPAttr.put(Breakpoints.RUNTIME_ADDRESS, a.toString(16));
+
+ targetBPAttrs.add(oneBPAttr);
+ }
+
+ drm.setData(targetBPAttrs);
+ drm.done();
+ } else {
+ assert bpType.equals(Breakpoints.LINE_BREAKPOINT);
+
+ final String bpFile = (String) attributes.get(ICBreakpoint.SOURCE_HANDLE);
+ final Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER);
+
+ final IExecutionDMContext exe_dmc = DMContexts.getAncestorOfType(context, IExecutionDMContext.class);
+
+ final ICBreakpoint icBP = (ICBreakpoint)breakpoint;
+
+ assert exe_dmc != null : "ExecutionDMContext is unknown in resolveBreakpoint().";
+
+ Modules modulesService = dsfServicesTracker.getService(Modules.class);
+ ISymbolDMContext sym_dmc = DMContexts.getAncestorOfType(context, ISymbolDMContext.class);
+
+ String compileFile = EDCLaunch.getLaunchForSession(dsfSession.getId()).getCompilationPath(bpFile);
+ if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().trace(null,
+ "BP file: " + bpFile + " Compile file: " + compileFile); }
+ /*
+ * Look for code lines within five lines above and below the line in
+ * question as we don't want to move a breakpoint too far.
+ */
+ modulesService.findClosestLineWithCode(sym_dmc, compileFile, line, 5,
+ new DataRequestMonitor<ILineAddresses>(dsfSession.getExecutor(), drm) {
+
+ @Override
+ protected void handleCompleted() {
+ if (! isSuccess()) {
+ drm.setStatus(getStatus());
+ drm.done();
+ if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().trace(null,
+ "findClosestLineWithCode failed: " + drm.getStatus()); }
+ return;
+ }
+
+ ILineAddresses codeLine = getData();
+
+ /*
+ * there could be multiple address ranges for the same
+ * source line. e.g. for templates or inlined functions. if
+ * so, we need only set a breakpoint on the first location
+ */
+ IAddress[] addresses = codeLine.getAddress();
+ if (addresses.length > 0) {
+ IAddress address = addresses[0];
+ for (int i = 1; i < addresses.length; i++)
+ if (addresses[i].getValue().longValue() < address.getValue().longValue())
+ address = addresses[i];
+ Map<String, Object> targetAttr = new HashMap<String, Object>(attributes);
+ targetAttr.put(Breakpoints.RUNTIME_ADDRESS, address.toString(16));
+ targetBPAttrs.add(targetAttr);
+ }
+
+ drm.setData(targetBPAttrs);
+
+ int actualCodeLine = codeLine.getLineNumber();
+
+ if (actualCodeLine == line)
+ drm.done();
+ else {
+ // breakpoint is resolved to a different line (the closest code line).
+ // If there is no user breakpoint at that line, we move the breakpoint there.
+ // Otherwise just mark this breakpoint as unresolved.
+ //
+ final int newLine = actualCodeLine;
+
+ /*
+ * Move the breakpoint to the actual code line.
+ *
+ * Should we run following code in another thread ? Seems yes according to comment in
+ * BreakpointsMediator2.startTrackingBreakpoints(). But that way we'll run into this
+ * problem:
+ * 11 // blank line
+ * 12 // blank line
+ * 13 i = 2;
+ * set bp at line 11 & 12, start debugger, we'll get two resolved breakpoints on line 13
+ * (check in Breakpoints view).
+ *
+ * To fix that issue, I just run this in DSF executor thread. I don't see any problem
+ * in my test......... 01/03/11
+ */
+ if (null == findUserBreakpointAt(bpFile, newLine)) {
+ // After we change the line number attribute, a breakpoint-change
+ // notification will come from platform through BreakpointsMediator2,
+ // resulting in installation of the changed bp and removal of the
+ // original bp.
+ try {
+ icBP.getMarker().setAttribute(IMarker.LINE_NUMBER, newLine);
+ } catch (CoreException e) {
+ // When will this happen ? ignore.
+ }
+
+ // At this point the "drm" contains a valid list of "targetBPAttrs", namely
+ // we treat this BP as resolved. This is needed for such moved-BP to work
+ // on debugger start.
+ drm.done();
+ } else {
+ targetBPAttrs.clear(); // mark the BP as unresolved by clearing the list.
+ drm.done();
+ }
+ }
+ }
+ });
+ }
}
if (EDCTrace.BREAKPOINTS_TRACE_ON) {EDCTrace.getTrace().traceExit(null);}
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Breakpoints.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Breakpoints.java
index 2de01a9..acf8034 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Breakpoints.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Breakpoints.java
@@ -26,6 +26,7 @@
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
+import org.eclipse.cdt.debug.core.model.ICWatchpoint2;
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.EDCTrace;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
@@ -113,12 +114,33 @@
public static final String LINE_BREAKPOINT = "line_bp"; //$NON-NLS-1$
public static final String FUNCTION_BREAKPOINT = "function_bp"; //$NON-NLS-1$
public static final String ADDRESS_BREAKPOINT = "address_bp"; //$NON-NLS-1$
-
+
/**
* breakpoint runtime address: value is hex string with no preceding "0x".
*/
public static final String RUNTIME_ADDRESS = PREFIX + ".runtime_addr";
+ /**
+ * TCF properties using keys from {@link org.eclipse.tm.tcf.services.IBreakpoints}
+ */
+ public static final String TCF_PROPERTIES = PREFIX + ".tcf_properties"; //$NON-NLS-1$
+ private static final String TCF_BP_ACCESSMODE = org.eclipse.tm.tcf.services.IBreakpoints.PROP_ACCESSMODE;
+// private static final int TCF_BP_ACCESSMODE_CHANGE = org.eclipse.tm.tcf.services.IBreakpoints.ACCESSMODE_CHANGE;
+ private static final int TCF_BP_ACCESSMODE_EXECUTE = org.eclipse.tm.tcf.services.IBreakpoints.ACCESSMODE_EXECUTE;
+ private static final int TCF_BP_ACCESSMODE_READ = org.eclipse.tm.tcf.services.IBreakpoints.ACCESSMODE_READ;
+ private static final int TCF_BP_ACCESSMODE_WRITE = org.eclipse.tm.tcf.services.IBreakpoints.ACCESSMODE_WRITE;
+ private static final String TCF_BP_CONDITION = org.eclipse.tm.tcf.services.IBreakpoints.PROP_CONDITION;
+ private static final String TCF_BP_CONTEXTIDS = org.eclipse.tm.tcf.services.IBreakpoints.PROP_CONTEXTIDS;
+ private static final String TCF_BP_ENABLED = org.eclipse.tm.tcf.services.IBreakpoints.PROP_ENABLED;
+ private static final String TCF_BP_FILE = org.eclipse.tm.tcf.services.IBreakpoints.PROP_FILE;
+ private static final String TCF_BP_ID = org.eclipse.tm.tcf.services.IBreakpoints.PROP_ID;
+ private static final String TCF_BP_IGNORECOUNT = org.eclipse.tm.tcf.services.IBreakpoints.PROP_IGNORECOUNT;
+ private static final String TCF_BP_LINE = org.eclipse.tm.tcf.services.IBreakpoints.PROP_LINE;
+ private static final String TCF_BP_LOCATION = org.eclipse.tm.tcf.services.IBreakpoints.PROP_LOCATION;
+ private static final String TCF_BP_SIZE = org.eclipse.tm.tcf.services.IBreakpoints.PROP_SIZE;
+ private static final String TCF_BP_TYPE = org.eclipse.tm.tcf.services.IBreakpoints.PROP_TYPE;
+ private static final String TCF_BP_TYPE_AUTO = org.eclipse.tm.tcf.services.IBreakpoints.TYPE_AUTO;
+
// Error messages
static final String NULL_STRING = ""; //$NON-NLS-1$
static final String UNKNOWN_EXECUTION_CONTEXT = "Unknown execution context"; //$NON-NLS-1$
@@ -295,10 +317,20 @@
return context;
}
+ @SuppressWarnings("unchecked")
+ public Map<String, Object> getTCFProperties() {
+ return (Map<String, Object>)properties.get(TCF_PROPERTIES);
+ }
+
public void setProperties(Map<String, Object> props) {
properties = new HashMap<String, Object>(props);
}
+ public void setTCFProperties(Map<String, Object> tcfprops) {
+ // insert a copy of the properties
+ properties.put(TCF_PROPERTIES, new HashMap<String, Object>(tcfprops));
+ }
+
@Override
public int hashCode() {
final int prime = 31;
@@ -546,9 +578,7 @@
if (type.equals(BREAKPOINT)) {
addBreakpoint(context, attributes, drm);
} else if (type.equals(WATCHPOINT)) {
- drm.setStatus(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, REQUEST_FAILED,
- "Watchpoint is not supported yet.", null));
- drm.done();
+ addWatchpoint(context, attributes, drm);
} else {
drm.setStatus(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, REQUEST_FAILED, UNKNOWN_BREAKPOINT_TYPE,
null));
@@ -603,6 +633,51 @@
if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().traceExit(null); }
}
+ /**
+ * Set one target watchpoint.
+ *
+ * @param context
+ * @param attributes
+ * attributes for the target breakpoint. For EDC, it must contain
+ * the RUNTIME_ADDRESS attribute.
+ * @param drm
+ */
+ private void addWatchpoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes,
+ final DataRequestMonitor<IBreakpointDMContext> drm) {
+ if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArgs(new Object[] { attributes })); }
+
+ IExecutionDMContext exe_dmc = DMContexts.getAncestorOfType(context, IExecutionDMContext.class);
+ String bpAddr = (String)attributes.get(RUNTIME_ADDRESS);
+
+ assert exe_dmc != null : "DMContext is unknown in addWatchpoint().";
+ assert bpAddr != null;
+
+ createWatchpoint(exe_dmc, new Addr64(bpAddr, 16), attributes, new DataRequestMonitor<BreakpointDMData>(
+ getExecutor(), drm) {
+
+ @Override
+ protected void handleSuccess() {
+ final BreakpointDMData bpd = getData();
+
+ enableBreakpoint(bpd, new RequestMonitor(getExecutor(), drm) {
+
+ @Override
+ protected void handleSuccess() {
+ IBreakpointDMContext bp_dmc = bpd.getContext();
+ drm.setData(bp_dmc);
+
+ // Remember this in our global list.
+ userBreakpoints.put(bp_dmc, bpd);
+
+ drm.done();
+ }
+ });
+ }
+ });
+
+ if (EDCTrace.BREAKPOINTS_TRACE_ON) { EDCTrace.getTrace().traceExit(null); }
+ }
+
public ISourceLocator getSourceLocator() {
return sourceLocator;
}
@@ -684,44 +759,37 @@
disableBreakpoint(bp, crm);
}
- private void createBreakpoint(final IExecutionDMContext exeDMC, final IAddress address, final Map<String, Object> props,
+ private void createBreakpoint(final IExecutionDMContext exeDMC,
+ final IAddress address, final Map<String, Object> allProps,
final DataRequestMonitor<BreakpointDMData> drm) {
asyncExec(new Runnable() {
public void run() {
final long id = getNewBreakpointID();
- final IBreakpointDMContext bp_dmc = new BreakpointDMContext(getSession().getId(), new IDMContext[] { exeDMC },
- id);
+ final IBreakpointDMContext bp_dmc
+ = new BreakpointDMContext(getSession().getId(),
+ new IDMContext[] { exeDMC },
+ id);
final IAddress[] bp_addrs = new IAddress[] { address };
- final Map<String, Object> properties = new HashMap<String, Object>(props);
if (usesTCFBreakpointService()) {
- properties.put(org.eclipse.tm.tcf.services.IBreakpoints.PROP_ID, Long.toString(id));
- properties.put(org.eclipse.tm.tcf.services.IBreakpoints.PROP_ENABLED, true);
- properties.put(org.eclipse.tm.tcf.services.IBreakpoints.PROP_TYPE,
- org.eclipse.tm.tcf.services.IBreakpoints.TYPE_AUTO);
- properties.put(org.eclipse.tm.tcf.services.IBreakpoints.PROP_LOCATION, address.toString());
+ final Map<String, Object> tcfProperties = new HashMap<String, Object>();
+ tcfProperties.put(TCF_BP_ACCESSMODE, TCF_BP_ACCESSMODE_EXECUTE);
+ tcfProperties.put(TCF_BP_ID, Long.toString(id));
+ tcfProperties.put(TCF_BP_ENABLED, true);
+ tcfProperties.put(TCF_BP_TYPE, TCF_BP_TYPE_AUTO);
+ tcfProperties.put(TCF_BP_LOCATION, address.toString());
+ tcfProperties.put(TCF_BP_CONTEXTIDS, getTcfContextIDs(exeDMC));
+ transferOptionalTcfProperties(allProps, tcfProperties);
- // Pass "contexts" for which the BP is supposed to work.
- // NOTE: EDC extension to TCF:
- // TCF only define "IBreakpoints.PROP_CONTEXTIDS" as a array of IDs.
- // In EDC, it's required the first element in the array be IBreakpointsTargetDMContext
- // which is usually (but not always) a process. This makes EDC backward compatible with
- // some existing TCF agents.
- IBreakpointsTargetDMContext bpTargetDMC = DMContexts.getAncestorOfType(exeDMC, IBreakpointsTargetDMContext.class);
- // pass "exeDMC" as a context if it's different from bpTargetDMC, say, if "exeDMC" is a thread and
- // the "bpTargetDMC" is the owner process. This allows for thread-specific BP if agent supports it.
- String[] contexts;
- if (! exeDMC.equals(bpTargetDMC))
- contexts = new String[] {((IEDCDMContext)bpTargetDMC).getID(), ((IEDCDMContext)exeDMC).getID()};
- else
- contexts = new String[] {((IEDCDMContext)bpTargetDMC).getID()};
- properties.put(org.eclipse.tm.tcf.services.IBreakpoints.PROP_CONTEXTIDS, contexts);
+ // save the separated TCF properties as a property
+ // set amongst the regular properties; makes them
+ // easy to pass as a set when calling the agent's add()
+ allProps.put(TCF_PROPERTIES, tcfProperties);
+ getTargetEnvironmentService().updateBreakpointProperties(exeDMC, address, allProps);
- getTargetEnvironmentService().updateBreakpointProperties(exeDMC, address, properties);
-
- drm.setData(new BreakpointDMData(id, bp_dmc, bp_addrs, properties));
+ drm.setData(new BreakpointDMData(id, bp_dmc, bp_addrs, allProps));
drm.done();
} else { // generic software breakpoint
final byte[] bpInstruction = getTargetEnvironmentService().getBreakpointInstruction(exeDMC, address);
@@ -748,15 +816,126 @@
org_inst_bytes[i] = org_inst[i].getValue();
}
- drm.setData(new BreakpointDMData(id, bp_dmc, bp_addrs, org_inst_bytes, properties));
+ drm.setData(new BreakpointDMData(id, bp_dmc, bp_addrs, org_inst_bytes, allProps));
drm.done();
}
});
}
}
-
}, drm);
+ }
+ private void createWatchpoint(final IDMContext dmc, final IAddress address,
+ final Map<String, Object> allProps,
+ final DataRequestMonitor<BreakpointDMData> drm) {
+ asyncExec(new Runnable() {
+ public void run() {
+ final long id = getNewBreakpointID();
+ final IBreakpointDMContext bp_dmc
+ = new BreakpointDMContext(getSession().getId(),
+ new IDMContext[] { dmc },
+ id);
+ final IAddress[] bp_addrs = new IAddress[] { address };
+
+ if (hasTCFWatchpointSupport()) {
+ final Map<String, Object> tcfProperties = new HashMap<String, Object>();
+ tcfProperties.put(TCF_BP_ID, Long.toString(id));
+ tcfProperties.put(TCF_BP_ENABLED, true);
+ tcfProperties.put(TCF_BP_TYPE, TCF_BP_TYPE_AUTO);
+ tcfProperties.put(TCF_BP_LOCATION, address.toString());
+
+ Boolean wpRead = (Boolean)allProps.get(ICWatchpoint.READ);
+ Boolean wpWrite = (Boolean)allProps.get(ICWatchpoint.WRITE);
+ int accessMode
+ = ((wpRead != null && wpRead) ? TCF_BP_ACCESSMODE_READ : 0)
+ | ((wpWrite != null && wpWrite) ? TCF_BP_ACCESSMODE_WRITE : 0);
+ tcfProperties.put(TCF_BP_ACCESSMODE, accessMode);
+
+ Number wpSize = (Number)allProps.get(ICWatchpoint2.RANGE);
+ if (wpSize != null)
+ tcfProperties.put(TCF_BP_SIZE, wpSize);
+
+ tcfProperties.put(TCF_BP_CONTEXTIDS, getTcfContextIDs(dmc));
+
+ transferOptionalTcfProperties(allProps, tcfProperties);
+
+ allProps.put(TCF_PROPERTIES, tcfProperties);
+ getTargetEnvironmentService().updateBreakpointProperties(dmc, address, allProps);
+
+ drm.setData(new BreakpointDMData(id, bp_dmc, bp_addrs, allProps));
+ } else { // generic software watchpoint? i don't think so, tim!
+ drm.setStatus(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, REQUEST_FAILED,
+ "Watchpoints not supported for this system", null));
+ }
+ drm.done();
+ }
+ }, drm);
+ }
+
+
+ /**
+ * Pass "contexts" for which the BP/WP is supposed to work.
+ * <br>
+ * Commonly utility used when creating breakpoint or watchpoint
+ *
+ * @param dmc
+ * @return String[] array representing contexts<br>
+ * NOTE: EDC extension to TCF:
+ * TCF only define "IBreakpoints.PROP_CONTEXTIDS" as an array of IDs.
+ * In EDC, it's required the first element in the array be
+ * IBreakpointsTargetDMContext which is usually (but not always) a
+ * process. This makes EDC backward compatible with some existing TCF agents.
+ *
+ */
+ private String[] getTcfContextIDs(final IDMContext dmc) {
+ // Pass "contexts" for which the BP is supposed to work.
+ // NOTE: EDC extension to TCF:
+ IBreakpointsTargetDMContext bpTargetDMC
+ = DMContexts.getAncestorOfType(dmc, IBreakpointsTargetDMContext.class);
+ // pass "dmc" as a context if it's different from bpTargetDMC
+ if (! dmc.equals(bpTargetDMC))
+ return new String[] {((IEDCDMContext)bpTargetDMC).getID(),
+ ((IEDCDMContext)dmc).getID()};
+
+ return new String[] {((IEDCDMContext)bpTargetDMC).getID()};
+ }
+
+ /**
+ * Looks for properties recognized by TCF and puts them in
+ * the propertie list that will passed to the agent.
+ * <br>
+ * Commonly utility used when creating breakpoint or watchpoint
+ * @param bpProps
+ * @param tcfProperties
+ */
+ private void transferOptionalTcfProperties(
+ final Map<String, Object> bpProps,
+ final Map<String, Object> tcfProperties) {
+
+ // the following are optional, and may not apply to all agents
+ Object sourceHandle = bpProps.get(ICBreakpoint.SOURCE_HANDLE);
+ if (sourceHandle instanceof String)
+ tcfProperties.put(TCF_BP_FILE, sourceHandle);
+
+ Object lineNumber = bpProps.get(ICBreakpoint.SOURCE_HANDLE);
+ if (lineNumber instanceof Number)
+ tcfProperties.put(TCF_BP_LINE, lineNumber);
+
+ Object condition = bpProps.get(ICBreakpoint.CONDITION);
+ if (condition instanceof String)
+ tcfProperties.put(TCF_BP_CONDITION, condition);
+
+ Object ignoreCount = bpProps.get(ICBreakpoint.IGNORE_COUNT);
+ if (ignoreCount instanceof Number)
+ tcfProperties.put(TCF_BP_IGNORECOUNT, ignoreCount);
+
+ // ok, so the following does not strictly conform to the API.
+ // however, it helps in logging & debugging, will aid debugging
+ // watchpoints which have an expression but not a file or
+ // line-number, and, in the end, will make my friend ed happy.
+ Object bpMessage = bpProps.get(IMarker.MESSAGE);
+ if (bpMessage instanceof String)
+ tcfProperties.put(IMarker.MESSAGE, bpMessage);
}
/**
@@ -771,7 +950,7 @@
if (usesTCFBreakpointService()) {
Protocol.invokeLater(new Runnable() {
public void run() {
- tcfBreakpointService.add(bp.getProperties(), new DoneCommand() {
+ tcfBreakpointService.add(bp.getTCFProperties(), new DoneCommand() {
public void doneCommand(IToken token, Exception error) {
if (error != null) {
@@ -870,7 +1049,7 @@
} else {
Protocol.invokeLater(new Runnable() {
public void run() {
- Map<String, Object> properties = bp.getProperties();
+ Map<String, Object> properties = bp.getTCFProperties();
String id = (String) properties.get(org.eclipse.tm.tcf.services.IBreakpoints.PROP_ID);
tcfBreakpointService.remove(new String[] { id }, new DoneCommand() {
@@ -907,6 +1086,10 @@
return tcfBreakpointService != null;
}
+ private boolean hasTCFWatchpointSupport() {
+ return usesTCFBreakpointService(); // TODO && tcfBreakpointService.supportsWatchpoints
+ }
+
public void tcfServiceReady(IService service) {
tcfBreakpointService = (org.eclipse.tm.tcf.services.IBreakpoints) service;
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.java
index 1a90b90..14aa020 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -31,6 +31,18 @@
public static String Disassembly_NoDisassemblerYet;
+ public static String BPAttrTranslator_BkptAddressNotInModule;
+
+ public static String BPAttrTranslator_WatchptCoreExceptionGettingAddr;
+
+ public static String BPAttrTranslator_WatchptLocationInvalid;
+
+ public static String BPAttrTranslator_WatchptNoContext;
+
+ public static String BPAttrTranslator_WatchptNoExprService;
+
+ public static String BPAttrTranslator_WatchptNotInModule;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, EDCServicesMessages.class);
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.properties b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.properties
index 7618d6e..dab568e 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.properties
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCServicesMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2009, 2010 Nokia and others.
+# Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -16,3 +16,10 @@
Expressions_ExpressionNoLocation=expression has no location
Disassembly_CannotReadMemoryAt=Cannot read memory at {0} (length {1})
Disassembly_NoDisassemblerYet=No disassembler is available yet.
+
+BPAttrTranslator_BkptAddressNotInModule=Address breakpoint at {0} does not fall in the module [{1}].
+BPAttrTranslator_WatchptCoreExceptionGettingAddr=CoreException thrown acquiring address for expression "{0}": {1}
+BPAttrTranslator_WatchptLocationInvalid=Cannot get address for expression "{0}" in module [{1}].
+BPAttrTranslator_WatchptNoContext=Cannot evaluate expression "{0}"; context unavailable.
+BPAttrTranslator_WatchptNoExprService=Cannot evaluate expression "{0}"; EDC Expression service unavailable.
+BPAttrTranslator_WatchptNotInModule=Watchpoint for expression "{0}" at address {1} does not fall in the module [{2}].
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/EDCSymbolReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCSymbolReader.java
similarity index 66%
rename from org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/EDCSymbolReader.java
rename to org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCSymbolReader.java
index 7df0952..d634ef5 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/EDCSymbolReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/EDCSymbolReader.java
@@ -1,175 +1,234 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.nio.ByteOrder;
-import java.util.Collection;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.BaseExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
-import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
-import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * This class handles the high-level retrieval of symbolic information, using
- * {@link IDebugInfoProvider} and {@link IExecutableSymbolicsReader}.
- */
-public class EDCSymbolReader implements IEDCSymbolReader {
-
- private static final String[] NO_SOURCE_FILES = new String[0];
-
- private static final IModuleScope EMPTY_MODULE_SCOPE = new DwarfModuleScope(null);
-
- private IDebugInfoProvider debugInfoProvider;
- private IExecutableSymbolicsReader exeSymReader;
-
- public EDCSymbolReader(IExecutableSymbolicsReader exeSymReader, IDebugInfoProvider debugInfoProvider) {
- if (exeSymReader == null)
- throw new IllegalArgumentException();
-
- this.exeSymReader = exeSymReader;
- this.debugInfoProvider = debugInfoProvider;
-
- // we expect these two files to be the same
- if (debugInfoProvider != null)
- if (!debugInfoProvider.getSymbolFile().equals(exeSymReader.getSymbolFile()))
- throw new IllegalArgumentException();
- }
-
- public void shutDown() {
- if (exeSymReader != null) {
- exeSymReader.dispose();
- exeSymReader = null;
- }
- if (debugInfoProvider != null) {
- debugInfoProvider.dispose();
- debugInfoProvider = null;
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#dispose()
- */
- public void dispose() {
- exeSymReader.dispose();
- }
-
- public Collection<IExecutableSection> getExecutableSections() {
- return exeSymReader.getExecutableSections();
- }
-
- public IExecutableSection findExecutableSection(String sectionName) {
- return exeSymReader.findExecutableSection(sectionName);
- }
-
- public Collection<ISection> getSections() {
- return exeSymReader.getSections();
- }
-
- public IAddress getBaseLinkAddress() {
- return exeSymReader.getBaseLinkAddress();
- }
-
- public long getModificationDate() {
- return exeSymReader.getModificationDate();
- }
-
- public Collection<ISymbol> findSymbols(String name) {
- return exeSymReader.findSymbols(name);
- }
-
- public Collection<ISymbol> findUnmangledSymbols(String name) {
- return exeSymReader.findUnmangledSymbols(name);
- }
-
- public Collection<ISymbol> getSymbols() {
- return exeSymReader.getSymbols();
- }
-
- public ISymbol getSymbolAtAddress(IAddress linkAddress) {
- return exeSymReader.getSymbolAtAddress(linkAddress);
- }
-
- public IPath getSymbolFile() {
- return debugInfoProvider != null ? debugInfoProvider.getSymbolFile() :
- (exeSymReader != null ? exeSymReader.getSymbolFile() : null);
- }
-
- public ByteOrder getByteOrder() {
- return exeSymReader.getByteOrder();
- }
-
- public IModuleScope getModuleScope() {
- if (debugInfoProvider != null)
- return debugInfoProvider.getModuleScope();
- else
- return EMPTY_MODULE_SCOPE;
- }
-
- public String[] getSourceFiles() {
- if (debugInfoProvider != null)
- {
- final String[][] resultHolder = new String[1][];
- Job quickParseJob = new Job("Reading Debug Symbol Information: " + debugInfoProvider.getSymbolFile().toOSString()) {
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- String[] sourceFiles = getSourceFiles(monitor);
- resultHolder[0] = sourceFiles;
- return Status.OK_STATUS;
- }
- };
-
- try {
- quickParseJob.schedule();
- quickParseJob.join();
- } catch (InterruptedException e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- }
- return resultHolder[0];
- }
- else
- return NO_SOURCE_FILES;
- }
-
- public String[] getSourceFiles(IProgressMonitor monitor) {
- if (debugInfoProvider != null)
- return debugInfoProvider.getSourceFiles(monitor);
- else
- return NO_SOURCE_FILES;
- }
-
- public boolean hasRecognizedDebugInformation() {
- return debugInfoProvider != null;
- }
-
- public IDebugInfoProvider getDebugInfoProvider() {
- return debugInfoProvider;
- }
-
- public IUnmangler getUnmangler() {
- if (exeSymReader instanceof BaseExecutableSymbolicsReader)
- return ((BaseExecutableSymbolicsReader) exeSymReader).getUnmangler();
- return null;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.services.dsf;
+
+import java.nio.ByteOrder;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.ModuleLineEntryProvider;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.BaseExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
+import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.IModuleLineEntryProvider;
+import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * This class handles the high-level retrieval of symbolic information, using
+ * {@link IDebugInfoProvider} and {@link IExecutableSymbolicsReader}.
+ */
+public class EDCSymbolReader implements IEDCSymbolReader {
+
+ private static final String[] NO_SOURCE_FILES = new String[0];
+
+ public static final IModuleScope EMPTY_MODULE_SCOPE = new IModuleScope() {
+ ModuleLineEntryProvider lineEntryMapper = new ModuleLineEntryProvider();
+
+ public int compareTo(Object arg0) { return 0; }
+ public boolean hasEmptyRange() { return true; }
+ public IScope getScopeAtAddress(IAddress linkAddress) { return null; }
+ public IRangeList getRangeList() { return null; }
+ public IScope getParent() { return null; }
+ public String getName() { return ""; }
+ public IAddress getLowAddress() { return Addr32.ZERO; }
+ public IAddress getHighAddress() { return Addr32.ZERO; }
+ public IPath getSymbolFile() { return null; }
+ public IModuleLineEntryProvider getModuleLineEntryProvider() { return lineEntryMapper; }
+ public IFrameRegisterProvider getFrameRegisterProvider() { return null; }
+ public ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress) { return null; }
+ public IFunctionScope getFunctionByName(String name) { return null; }
+ public Collection<IScope> getChildren() {
+ return Collections.emptyList();
+ }
+ public Collection<IEnumerator> getEnumerators() {
+ return Collections.emptyList();
+ }
+ public Collection<IFunctionScope> getFunctionsByName(String name) {
+ return Collections.emptyList();
+ }
+ public Collection<IType> getTypes() {
+ return Collections.emptyList();
+ }
+ public Collection<IVariable> getVariables() {
+ return Collections.emptyList();
+ }
+ public Collection<IVariable> getVariablesByName(String name, boolean globalsOnly) {
+ return Collections.emptyList();
+ }
+ public List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath) {
+ return Collections.emptyList();
+ }
+ public void dispose() { }
+ };
+
+ private IDebugInfoProvider debugInfoProvider;
+ private IExecutableSymbolicsReader exeSymReader;
+
+ public EDCSymbolReader(IExecutableSymbolicsReader exeSymReader, IDebugInfoProvider debugInfoProvider) {
+ if (exeSymReader == null)
+ throw new IllegalArgumentException();
+
+ this.exeSymReader = exeSymReader;
+ this.debugInfoProvider = debugInfoProvider;
+
+ // we expect these two files to be the same
+ if (debugInfoProvider != null)
+ if (!debugInfoProvider.getSymbolFile().equals(exeSymReader.getSymbolFile()))
+ throw new IllegalArgumentException();
+ }
+
+ public void shutDown() {
+ if (exeSymReader != null) {
+ exeSymReader.dispose();
+ exeSymReader = null;
+ }
+ if (debugInfoProvider != null) {
+ debugInfoProvider.dispose();
+ debugInfoProvider = null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#dispose()
+ */
+ public void dispose() {
+ exeSymReader.dispose();
+ }
+
+ public Collection<IExecutableSection> getExecutableSections() {
+ return exeSymReader.getExecutableSections();
+ }
+
+ public IExecutableSection findExecutableSection(String sectionName) {
+ return exeSymReader.findExecutableSection(sectionName);
+ }
+
+ public Collection<ISection> getSections() {
+ return exeSymReader.getSections();
+ }
+
+ public IAddress getBaseLinkAddress() {
+ return exeSymReader.getBaseLinkAddress();
+ }
+
+ public long getModificationDate() {
+ return exeSymReader.getModificationDate();
+ }
+
+ public Collection<ISymbol> findSymbols(String name) {
+ return exeSymReader.findSymbols(name);
+ }
+
+ public Collection<ISymbol> findUnmangledSymbols(String name) {
+ return exeSymReader.findUnmangledSymbols(name);
+ }
+
+ public Collection<ISymbol> getSymbols() {
+ return exeSymReader.getSymbols();
+ }
+
+ public ISymbol getSymbolAtAddress(IAddress linkAddress) {
+ return exeSymReader.getSymbolAtAddress(linkAddress);
+ }
+
+ public Collection<ISymbol> getSymbolsAtAddress(IAddress linkAddress) {
+ return exeSymReader.getSymbolsAtAddress(linkAddress);
+ }
+
+ public IPath getSymbolFile() {
+ return debugInfoProvider != null ? debugInfoProvider.getSymbolFile() :
+ (exeSymReader != null ? exeSymReader.getSymbolFile() : null);
+ }
+
+ public ByteOrder getByteOrder() {
+ return exeSymReader.getByteOrder();
+ }
+
+ public IModuleScope getModuleScope() {
+ if (debugInfoProvider != null)
+ return debugInfoProvider.getModuleScope();
+ else
+ return EMPTY_MODULE_SCOPE;
+ }
+
+ public String[] getSourceFiles() {
+ if (debugInfoProvider != null)
+ {
+ final String[][] resultHolder = new String[1][];
+ Job quickParseJob = new Job("Reading Debug Symbol Information: " + debugInfoProvider.getSymbolFile().toOSString()) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ String[] sourceFiles = getSourceFiles(monitor);
+ resultHolder[0] = sourceFiles;
+ return Status.OK_STATUS;
+ }
+ };
+
+ try {
+ quickParseJob.schedule();
+ quickParseJob.join();
+ } catch (InterruptedException e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ }
+ return resultHolder[0];
+ }
+ else
+ return NO_SOURCE_FILES;
+ }
+
+ public String[] getSourceFiles(IProgressMonitor monitor) {
+ if (debugInfoProvider != null)
+ return debugInfoProvider.getSourceFiles(monitor);
+ else
+ return NO_SOURCE_FILES;
+ }
+
+ public boolean hasRecognizedDebugInformation() {
+ return debugInfoProvider != null;
+ }
+
+ public IDebugInfoProvider getDebugInfoProvider() {
+ return debugInfoProvider;
+ }
+
+ public IUnmangler getUnmangler() {
+ if (exeSymReader instanceof BaseExecutableSymbolicsReader)
+ return ((BaseExecutableSymbolicsReader) exeSymReader).getUnmangler();
+ return null;
+ }
+
+ public IExecutableSymbolicsReader getSymbolicsReader() {
+ return exeSymReader;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Expressions.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Expressions.java
index ec8a19f..0ac5c73 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Expressions.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Expressions.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -32,6 +32,7 @@
import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.Interpreter;
import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.OperandValue;
import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
import org.eclipse.cdt.debug.edc.internal.symbols.IAggregate;
import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
@@ -49,10 +50,13 @@
import org.eclipse.cdt.debug.edc.services.IEDCExpression;
import org.eclipse.cdt.debug.edc.services.IEDCExpressions;
import org.eclipse.cdt.debug.edc.services.Stack.StackFrameDMC;
+import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader;
import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
import org.eclipse.cdt.debug.edc.symbols.IInvalidVariableLocation;
import org.eclipse.cdt.debug.edc.symbols.IType;
import org.eclipse.cdt.debug.edc.symbols.IVariableLocation;
+import org.eclipse.cdt.debug.edc.symbols.TypeEngine;
import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
@@ -65,6 +69,7 @@
import org.eclipse.cdt.dsf.debug.service.IExpressions;
import org.eclipse.cdt.dsf.debug.service.IExpressions2;
import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+import org.eclipse.cdt.dsf.debug.service.IModules.IModuleDMContext;
import org.eclipse.cdt.dsf.debug.service.IModules.ISymbolDMContext;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
@@ -93,8 +98,26 @@
public BaseEDCExpressionDMC(IDMContext parent, String expression, String name) {
super(Expressions.this, new IDMContext[] { parent }, name, ((IEDCDMContext)parent).getID() + "." + name); //$NON-NLS-1$
this.expression = expression;
- this.frame = DMContexts.getAncestorOfType(parent, StackFrameDMC.class);
- engine = new ASTEvaluationEngine(getEDCServicesTracker(), frame, frame.getTypeEngine());
+ frame = DMContexts.getAncestorOfType(parent, StackFrameDMC.class);
+ TypeEngine typeEngine;
+ if (frame != null) {
+ typeEngine = frame.getTypeEngine();
+ engine = new ASTEvaluationEngine(getEDCServicesTracker(), frame, typeEngine);
+ } else if (parent instanceof ModuleDMC) {
+ IEDCSymbolReader edcSymbolReader = ((ModuleDMC)parent).getSymbolReader();
+ if (edcSymbolReader instanceof EDCSymbolReader) {
+ IDebugInfoProvider debugInfoProvider
+ = ((EDCSymbolReader)edcSymbolReader).getDebugInfoProvider();
+ typeEngine = new TypeEngine(getTargetEnvironmentService(), debugInfoProvider);
+ engine = new ASTEvaluationEngine(getEDCServicesTracker(), parent, typeEngine);
+ } else {
+ typeEngine = null;
+ engine = null;
+ }
+ } else {
+ typeEngine = null;
+ engine = null;
+ }
}
public BaseEDCExpressionDMC(IDMContext parent, String expression) {
@@ -673,6 +696,8 @@
if (frameDmc != null) {
return new ExpressionDMC(frameDmc, expression);
+ } else if (context instanceof IModuleDMContext) {
+ return new ExpressionDMC(context, expression);
}
return new InvalidContextExpressionDMC(getSession().getId(), expression, context);
}
@@ -1391,11 +1416,14 @@
customFormattedValue = new FormattedValueDMData(customConverter.getValue(exprDMC));
formattedValue = customFormattedValue;
}
- catch (Throwable t) {
- // CoreExeception will just propagate out, so this is for
- // other unexpected errors, usually bug in the formatter. Log it
+ catch (CoreException e) {
+ // Checked exception like failure in reading memory. just re-throw
+ // it so it shows up in the variables view.
+ throw e;
+ } catch (Throwable t) {
+ // Other unexpected errors, usually bug in the formatter. Log it
// so that user will be able to see and report the bug.
- // Meanwhile, default to normal formatting so that user won't see
+ // Meanwhile default to normal formatting so that user won't see
// such error in Variable UI.
EDCDebugger.getMessageLogger().logError(
EDCServicesMessages.Expressions_ErrorInVariableFormatter + customConverter.getClass().getName(), t);
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/MemoryCache.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/MemoryCache.java
index e62250b..6305f7e 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/MemoryCache.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/MemoryCache.java
@@ -66,6 +66,8 @@
private final Map<String, MemoryContext> tcfMemoryContexts = Collections.synchronizedMap(new HashMap<String, MemoryContext>());
private final SortedMemoryBlockList memoryBlockList = new SortedMemoryBlockList();
+ private boolean snapshot = false;
+
/**
* @param minimumBlockSize minimum size of memory block to cache.
*/
@@ -244,28 +246,35 @@
// Case where the cached block overlaps completely the requested
// memory block
- if (cachedBlockStart.distanceTo(reqBlockStart).longValue() >= 0
- && reqBlockEnd.distanceTo(cachedBlockEnd).longValue() >= 0) {
- int pos = (int) cachedBlockStart.distanceTo(reqBlockStart).longValue();
- System.arraycopy(cachedBlock.fBlock, pos, resultBlock, 0, count);
+ long cs2rsGap = cachedBlockStart.distanceTo(reqBlockStart).longValue();
+ long ce2reGap = cachedBlockEnd.distanceTo(reqBlockEnd).longValue();
+ if (cs2rsGap >= 0 && ce2reGap <= 0) {
+ System.arraycopy(cachedBlock.fBlock, (int)cs2rsGap, resultBlock, 0, count);
+ break;
}
// Case where the beginning of the cached block is within the
// requested memory block
- else if (reqBlockStart.distanceTo(cachedBlockStart).longValue() >= 0
- && cachedBlockStart.distanceTo(reqBlockEnd).longValue() > 0) {
- int pos = (int) reqBlockStart.distanceTo(cachedBlockStart).longValue();
- int length = (int) Math.min(cachedBlock.fLength, count - pos);
- System.arraycopy(cachedBlock.fBlock, 0, resultBlock, pos, length);
- }
+ long cs2reGap = cachedBlockStart.distanceTo(reqBlockEnd).longValue();
+ if (cs2rsGap < 0 && cs2reGap > 0) {
+ int rpos = -(int)cs2rsGap;
+ int length = (int) Math.min(cachedBlock.fLength, count - rpos);
+ System.arraycopy(cachedBlock.fBlock, 0, resultBlock, rpos, length);
- // Case where the end of the cached block is within the requested
- // memory block
- else if (cachedBlockStart.distanceTo(reqBlockStart).longValue() >= 0
- && reqBlockStart.distanceTo(cachedBlockEnd).longValue() > 0) {
- int pos = (int) cachedBlockStart.distanceTo(reqBlockStart).longValue();
- int length = (int) Math.min(cachedBlock.fLength - pos, count);
- System.arraycopy(cachedBlock.fBlock, pos, resultBlock, 0, length);
+ // given that cached blocks are in sorted order, there is no need to
+ // continue if the end of this request block is in this cached block
+ if (count - rpos <= cachedBlock.fLength) // the last one
+ break;
+
+ } else {
+ // Case where the end of the cached block is within the requested
+ // memory block
+ long ce2rsGap = cachedBlockEnd.distanceTo(reqBlockStart).longValue();
+ if (cs2rsGap >= 0 && ce2rsGap < 0) {
+ int cpos = (int) cs2rsGap;
+ int length = Math.min((int)cachedBlock.fLength - cpos, count);
+ System.arraycopy(cachedBlock.fBlock, cpos, resultBlock, 0, length);
+ }
}
}
}
@@ -351,30 +360,32 @@
final int word_size, final int count, long timeOutLimit) throws CoreException {
if (EDCTrace.MEMORY_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArgs(new Object[] { context, address.toHexAddressString(), word_size, count })); }
- // determine number of read requests to issue
- final LinkedList<MemoryBlock> missingBlocks = getListOfMissingBlocks(address, count);
- final int numberOfRequests = missingBlocks.size();
-
- if (numberOfRequests > 0 && tcfMemoryService == null) {
- throw new CoreException(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, "Fail to read memory."));
- }
- // System.out.printf("MemoryCache.getMemory address=%x count=%d numberOfRequests=%d\n",
- // address.getValue(), count, numberOfRequests);
- for (int i = 0; i < numberOfRequests; i++) {
- MemoryBlock block = missingBlocks.get(i);
- IAddress blockAddress = block.fAddress;
- int blockLength = (int) block.fLength;
- if (blockLength < minimumBlockSize)
- blockLength = minimumBlockSize;
-
- MemoryByte[] result;
- try {
- result = readBlock(tcfMemoryService, context, blockAddress, word_size, blockLength, timeOutLimit);
- MemoryBlock newBlock = new MemoryBlock(blockAddress, blockLength, result);
- memoryBlockList.add(newBlock);
- } catch (Exception e) {
- throw new CoreException(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR,
- "Fail to read memory.", e.getCause())); //$NON-NLS-1$
+ if (!snapshot) {
+ // determine number of read requests to issue
+ final LinkedList<MemoryBlock> missingBlocks = getListOfMissingBlocks(address, count);
+ final int numberOfRequests = missingBlocks.size();
+
+ if (numberOfRequests >= 1 && tcfMemoryService == null) {
+ throw new CoreException(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, "Fail to read memory."));
+ }
+ // System.out.printf("MemoryCache.getMemory address=%x count=%d numberOfRequests=%d\n",
+ // address.getValue(), count, numberOfRequests);
+ for (int i = 0; i < numberOfRequests; i++) {
+ MemoryBlock block = missingBlocks.get(i);
+ IAddress blockAddress = block.fAddress;
+ int blockLength = (int) block.fLength;
+ if (blockLength < minimumBlockSize)
+ blockLength = minimumBlockSize;
+
+ MemoryByte[] result;
+ try {
+ result = readBlock(tcfMemoryService, context, blockAddress, word_size, blockLength, timeOutLimit);
+ MemoryBlock newBlock = new MemoryBlock(blockAddress, blockLength, result);
+ memoryBlockList.add(newBlock);
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, IDsfStatusConstants.INTERNAL_ERROR,
+ "Fail to read memory.", e.getCause())); //$NON-NLS-1$
+ }
}
}
MemoryByte[] result = getMemoryBlockFromCache(address, count);
@@ -799,6 +810,7 @@
public void loadSnapshot(Element element) throws Exception {
reset();
+ snapshot = true;
NodeList blockElements = element.getElementsByTagName(MEMORY_BLOCK);
int numBlocks = blockElements.getLength();
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Modules.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Modules.java
index 0068959..4e0fa7b 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Modules.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Modules.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - Process physical address in RuntimeSection for snapshots
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.services.dsf;
@@ -37,6 +38,7 @@
import org.eclipse.cdt.debug.edc.launch.EDCLaunch;
import org.eclipse.cdt.debug.edc.services.AbstractEDCService;
import org.eclipse.cdt.debug.edc.services.DMContext;
+import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
import org.eclipse.cdt.debug.edc.services.IEDCDMContext;
import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
import org.eclipse.cdt.debug.edc.services.IEDCModuleDMContext;
@@ -84,7 +86,6 @@
.synchronizedMap(new HashMap<String, List<ModuleDMC>>());
private ISourceLocator sourceLocator;
- private static int nextModuleID = 100;
public static class EDCAddressRange implements AddressRange, Serializable {
@@ -193,8 +194,7 @@
private final List<IRuntimeSection> runtimeSections = new ArrayList<IRuntimeSection>();
public ModuleDMC(ISymbolDMContext symbolContext, Map<String, Object> props) {
- super(Modules.this, symbolContext == null ? new IDMContext[0] : new IDMContext[] { symbolContext }, Integer
- .toString(getNextModuleID()), props);
+ super(Modules.this, symbolContext == null ? new IDMContext[0] : new IDMContext[] { symbolContext }, getModuleID(props), props);
this.symbolContext = symbolContext;
String filename = "";
@@ -204,6 +204,10 @@
hostFilePath = locateModuleFileOnHost(filename);
}
+ public EDCServicesTracker getEDCServicesTracker() {
+ return Modules.this.getEDCServicesTracker();
+ }
+
public ISymbolDMContext getSymbolContext() {
return symbolContext;
}
@@ -226,10 +230,17 @@
SnapshotUtils.initializeFromXML(propElement, properties);
IAddress linkAddress = new Addr64(sectionElement.getAttribute(ISection.PROPERTY_LINK_ADDRESS));
+ String physicalAddressString = sectionElement.getAttribute(ISection.PROPERTY_PHYSICAL_ADDRESS);
+ IAddress physicalAddress;
+ if (physicalAddressString != null && physicalAddressString.length() > 0) {
+ physicalAddress = new Addr64(physicalAddressString);
+ } else {
+ physicalAddress = null;
+ }
int sectionID = Integer.parseInt(sectionElement.getAttribute(ISection.PROPERTY_ID));
long size = Long.parseLong(sectionElement.getAttribute(ISection.PROPERTY_SIZE));
- RuntimeSection section = new RuntimeSection(new Section(sectionID, size, linkAddress, properties));
+ RuntimeSection section = new RuntimeSection(new Section(sectionID, size, linkAddress, physicalAddress, properties));
section.relocate(new Addr64(sectionElement.getAttribute(IRuntimeSection.PROPERTY_RUNTIME_ADDRESS)));
runtimeSections.add(section);
}
@@ -250,6 +261,10 @@
sectionElement.setAttribute(ISection.PROPERTY_ID, Integer.toString(s.getId()));
sectionElement.setAttribute(ISection.PROPERTY_SIZE, Long.toString(s.getSize()));
sectionElement.setAttribute(ISection.PROPERTY_LINK_ADDRESS, s.getLinkAddress().toHexAddressString());
+ IAddress physicalAddress = s.getPhysicalAddress();
+ if (physicalAddress != null) {
+ sectionElement.setAttribute(ISection.PROPERTY_PHYSICAL_ADDRESS, physicalAddress.toHexAddressString());
+ }
sectionElement.setAttribute(IRuntimeSection.PROPERTY_RUNTIME_ADDRESS, s.getRuntimeAddress()
.toHexAddressString());
propsElement = SnapshotUtils.makeXMLFromProperties(document, s.getProperties());
@@ -673,18 +688,10 @@
synchronized (modules) {
List<ModuleDMC> moduleList = modules.get(symContextID);
if (moduleList != null) {
- // other module attributes may not be passed during removal,
- // so remove the module with the same name
- for (ModuleDMC next : moduleList) {
- if (next.getFile().equals(module.getFile())) {
- moduleList.remove(next);
- break;
- }
- }
+ moduleList.remove(module);
}
}
}
-
}
/*
@@ -1044,10 +1051,6 @@
}
}
- private int getNextModuleID() {
- return nextModuleID++;
- }
-
public void moduleLoaded(ISymbolDMContext symbolContext, IExecutionDMContext executionDMC, Map<String, Object> moduleProps) {
ModuleDMC module = new ModuleDMC(symbolContext, moduleProps);
module.relocateSections(moduleProps);
@@ -1058,12 +1061,13 @@
public void moduleUnloaded(ISymbolDMContext symbolContext, IExecutionDMContext executionDMC,
Map<String, Object> moduleProps) {
- Object fileName = moduleProps.get(IEDCDMContext.PROP_NAME);
- ModuleDMC module = getModuleByName(symbolContext, fileName);
+ String moduleID = getModuleID(moduleProps); // the moduleProps comes from agent.
+ ModuleDMC module = getModuleByID(symbolContext, moduleID);
if (module == null) {
- EDCDebugger.getMessageLogger().logError("Unexpected unload of module: " + fileName, null);
+ EDCDebugger.getMessageLogger().logError("Unexpected unload of module: " + moduleProps, null);
return;
}
+ System.out.println("module: " + module.toString());
Object requireResumeValue = moduleProps.get("RequireResume");
if (requireResumeValue != null && requireResumeValue instanceof Boolean)
module.setProperty("RequireResume", requireResumeValue);
@@ -1161,6 +1165,17 @@
}
+ private static String getModuleID(Map<String, Object> props) {
+ if (props.containsKey(IEDCDMContext.PROP_ID))
+ return props.get(IEDCDMContext.PROP_ID).toString();
+ if (props.containsKey(IModuleProperty.PROP_FILE))
+ return props.get(IModuleProperty.PROP_FILE).toString();
+ if (props.containsKey(IEDCDMContext.PROP_NAME))
+ return props.get(IEDCDMContext.PROP_NAME).toString();
+ assert(false); // One of these is required
+ return "";
+ }
+
/**
* get module with given file name
*
@@ -1185,4 +1200,20 @@
return module;
}
+ private ModuleDMC getModuleByID(ISymbolDMContext symCtx, String id) {
+ ModuleDMC module = null;
+ synchronized (modules) {
+ List<ModuleDMC> moduleList = modules.get(((IEDCDMContext) symCtx).getID());
+ if (moduleList != null) {
+ for (ModuleDMC moduleDMC : moduleList) {
+ if ((moduleDMC.getID().compareToIgnoreCase(id)) == 0 ) {
+ module = moduleDMC;
+ break;
+ }
+ }
+ }
+ }
+ return module;
+ }
+
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Processes.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Processes.java
index 4137a1c..688a801 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Processes.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Processes.java
@@ -56,7 +56,8 @@
String id = "unknown";
public ExecutionDMData(ExecutionDMC dmc) {
- id = dmc.getProperty(ProtocolConstants.PROP_OS_ID).toString();
+ Object osid = dmc.getProperty(ProtocolConstants.PROP_OS_ID);
+ id = osid.toString();
name = (String) dmc.getProperty(IEDCDMContext.PROP_NAME);
}
@@ -263,14 +264,17 @@
}
public void isDebugNewProcessSupported(IDMContext dmc, DataRequestMonitor<Boolean> rm) {
+ rm.setData(false);
rm.done();
}
public void isDebuggerAttachSupported(IDMContext dmc, DataRequestMonitor<Boolean> rm) {
+ rm.setData(false);
rm.done();
}
public void isRunNewProcessSupported(IDMContext dmc, DataRequestMonitor<Boolean> rm) {
+ rm.setData(false);
rm.done();
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/RunControl.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/RunControl.java
index e9e542e..fe65b9a 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/RunControl.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/RunControl.java
@@ -31,9 +31,10 @@
import org.eclipse.cdt.debug.edc.disassembler.IDisassembler.IDisassemblerOptions;
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.EDCTrace;
-import org.eclipse.cdt.debug.edc.internal.breakpointactions.LogActionEnabler;
+import org.eclipse.cdt.debug.edc.internal.breakpointactions.EDCLogActionEnabler;
import org.eclipse.cdt.debug.edc.internal.formatter.FormatExtensionManager;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints.BreakpointDMData;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.EDCAddressRange;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
import org.eclipse.cdt.debug.edc.internal.snapshot.Album;
import org.eclipse.cdt.debug.edc.internal.snapshot.SnapshotUtils;
@@ -208,30 +209,40 @@
public IExecutionDMContext[] getTriggeringContexts() {
return new IExecutionDMContext[]{getDMContext()};
}
-}
+ }
+ private static Map<String, StateChangeReason> reasons;
private static StateChangeReason toDsfStateChangeReason(String tcfReason) {
if (tcfReason == null)
- return StateChangeReason.UNKNOWN;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_USER_REQUEST))
- return StateChangeReason.USER_REQUEST;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_STEP))
- return StateChangeReason.STEP;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_BREAKPOINT))
- return StateChangeReason.BREAKPOINT;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_EXCEPTION))
- return StateChangeReason.EXCEPTION;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_CONTAINER))
- return StateChangeReason.CONTAINER;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_WATCHPOINT))
- return StateChangeReason.WATCHPOINT;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_SIGNAL))
- return StateChangeReason.SIGNAL;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_SHAREDLIB))
- return StateChangeReason.SHAREDLIB;
- if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_ERROR))
- return StateChangeReason.ERROR;
- return StateChangeReason.UNKNOWN;
+ return StateChangeReason.UNKNOWN;
+ if (reasons == null)
+ reasons = new HashMap<String, IRunControl.StateChangeReason>();
+ StateChangeReason reason = reasons.get(tcfReason);
+ if (reason == null) {
+
+ if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_USER_REQUEST))
+ reason = StateChangeReason.USER_REQUEST;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_STEP))
+ reason = StateChangeReason.STEP;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_BREAKPOINT))
+ reason = StateChangeReason.BREAKPOINT;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_EXCEPTION))
+ reason = StateChangeReason.EXCEPTION;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_CONTAINER))
+ reason = StateChangeReason.CONTAINER;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_WATCHPOINT))
+ reason = StateChangeReason.WATCHPOINT;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_SIGNAL))
+ reason = StateChangeReason.SIGNAL;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_SHAREDLIB))
+ reason = StateChangeReason.SHAREDLIB;
+ else if (tcfReason.equals(org.eclipse.tm.tcf.services.IRunControl.REASON_ERROR))
+ reason = StateChangeReason.ERROR;
+ else
+ reason = StateChangeReason.UNKNOWN;
+ reasons.put(tcfReason, reason);
+ }
+ return reason;
}
@Immutable
@@ -277,8 +288,46 @@
*/
private boolean isTerminatingThanDisconnecting = false;
+ /**
+ * Code ranges to step outside of.
+ *
+ * Certain source line may have two separate sections of
+ * . For instance, the following lines <pre>
+ * for (i=0; i<3; i++)
+ * k *= k;
+ * </pre>
+ * will have such code generated by MinGW GCC compiler:
+ * <pre>
+ 184 for (i=0; i<3; i++)
+ 00000000004017f7: movl $0x0,-0x8(%ebp)
+ 00000000004017fe: jmp 0x40180d
+ 185 k *= k;
+ 0000000000401800: mov -0x10(%ebp),%eax
+ 0000000000401803: imul -0x10(%ebp),%eax
+ 0000000000401807: mov %eax,-0x10(%ebp)
+ 184 for (i=0; i<3; i++)
+ 000000000040180a: incl -0x8(%ebp)
+ 000000000040180d: cmpl $0x2,-0x8(%ebp)
+ 0000000000401811: setle %al
+ 0000000000401814: test %al,%al
+ 0000000000401816: jne 0x401800
+ </pre>
+ * To step over the above "for()" statement, we need
+ * to make sure stepping does not stop in its second
+ * code section.
+ */
+ private List<EDCAddressRange> stepRanges = Collections.synchronizedList(new ArrayList<EDCAddressRange>());
+
private boolean suspendEventsEnabled = true;
private DMCSuspendedEvent cachedSuspendedEvent = null;
+
+ /**
+ * All possible function call destination addresses when we perform a
+ * StepIn.<br>
+ * This is to help auto-step through glue code in a function call (e.g.
+ * the jmp instruction in a jump table for calling a Win32 DLL).
+ */
+ private List<IAddress> functionCallDestinations = Collections.synchronizedList(new ArrayList<IAddress>());
public ExecutionDMC(ExecutionDMC parent, Map<String, Object> props, RunControlContext tcfContext) {
super(RunControl.this, parent == null ? new IDMContext[0] : new IDMContext[] { parent }, props);
@@ -376,6 +425,10 @@
return stateChangeReason;
}
+ protected void setStateChangeDetails(String newStateChangeDetails) {
+ stateChangeDetails = newStateChangeDetails;
+ }
+
public String getStateChangeDetails() {
return stateChangeDetails;
}
@@ -453,7 +506,7 @@
Boolean isForeground = (Boolean)params.get(ProtocolConstants.PROP_IS_FOREGROUND);
if (isForeground != null)
stateChangeDetails += isForeground ? " [foreground]" : "";
-
+
final ExecutionDMC dmc = this;
final DataRequestMonitor<Object> preprocessDrm = new DataRequestMonitor<Object>(getExecutor(), null) {
@@ -482,6 +535,10 @@
// Mark done of the single step RM, if any pending.
if (steppingRM != null) {
+ if (bp == null) {
+ stateChangeReason = StateChangeReason.STEP;
+ stateChangeDetails = null;
+ }
steppingRM.done();
steppingRM = null;
}
@@ -515,7 +572,7 @@
}
}
};
-
+
preprocessOnSuspend(dmc, latestPC, preprocessDrm);
}
if (EDCTrace.RUN_CONTROL_TRACE_ON) { EDCTrace.getTrace().traceExit(null); }
@@ -747,12 +804,9 @@
public void suspend(final RequestMonitor requestMonitor) {
if (EDCTrace.RUN_CONTROL_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(this)); }
- if (isSnapshot())
- {
+ if (isSnapshot()) {
Album.getAlbumBySession(getSession().getId()).stopPlayingSnapshots();
- }
- else
- if (hasTCFContext()) {
+ } else if (hasTCFContext()) {
Protocol.invokeLater(new Runnable() {
public void run() {
getTCFContext().suspend(new DoneCommand() {
@@ -1062,6 +1116,29 @@
return isStepping;
}
+ private void addStepRange(IAddress lowAddress, IAddress highAddress) {
+ stepRanges.add(new EDCAddressRange(lowAddress, highAddress));
+ }
+
+ /**
+ * Check if the give address is in current step ranges, if yes, return
+ * the range that contains it.
+ *
+ * @param address
+ * @return null if not found.
+ */
+ private EDCAddressRange findStepRange(IAddress address) {
+ for (EDCAddressRange r : stepRanges) {
+ if (r.contains(address))
+ return r;
+ }
+ return null;
+ }
+
+ private void clearStepRanges() {
+ stepRanges.clear();
+ }
+
protected DMCSuspendedEvent createSuspendedEvent(StateChangeReason reason, Map<String, Object> properties) {
return new SuspendedEvent(this, reason, properties);
}
@@ -1108,7 +1185,7 @@
try {
frames = stackService.getFramesForDMC(this, 0, 0);
Expressions exprService = getService(Expressions.class);
- return new LogActionEnabler(exprService, frames[0]);
+ return new EDCLogActionEnabler(exprService, frames[0]);
} catch (CoreException e) {
return null;
}
@@ -1124,6 +1201,17 @@
return super.getAdapter(adapterType);
}
+ private void addFunctionCallDestination(IAddress addr) {
+ functionCallDestinations.add(addr);
+ }
+
+ private void clearFunctionCallDestinations() {
+ functionCallDestinations.clear();
+ }
+
+ private boolean isFunctionCallDestination(IAddress addr) {
+ return functionCallDestinations.contains(addr);
+ }
}
public class ProcessExecutionDMC extends ExecutionDMC implements IContainerDMContext, IProcessDMContext,
@@ -1513,7 +1601,9 @@
// "stateChangeReason" as BREAKPOINT when a breakpoint
// is hit.
- if (dmc.getStateChangeReason() != StateChangeReason.BREAKPOINT) {
+ StateChangeReason stateChangeReason = dmc.getStateChangeReason();
+ if (stateChangeReason != StateChangeReason.BREAKPOINT
+ && stateChangeReason != StateChangeReason.WATCHPOINT) {
drm.setData(true);
drm.done();
return;
@@ -1543,7 +1633,13 @@
dmc.setPC(pcString);
}
} else {
- bp = bpService.findUserBreakpoint(new Addr64(pcString, 16));
+ if (stateChangeReason == StateChangeReason.BREAKPOINT)
+ bp = bpService.findUserBreakpoint(new Addr64(pcString, 16));
+ else {// condition above means this is a StateChangeReason.WATCHPOINT
+ bp = bpService.findUserBreakpoint(new Addr64(dmc.getStateChangeDetails(), 16));
+ if (bp != null)
+ dmc.setStateChangeDetails("[" + bp.getExpression() + "]");
+ }
}
// check if a conditional breakpoint (must be a user bp) is hit
@@ -1674,7 +1770,9 @@
}
public void step(final IExecutionDMContext context, final StepType outerStepType, final RequestMonitor rm) {
-
+ /*
+ * Step from current PC in "context"
+ */
asyncExec(new Runnable() {
public void run() {
@@ -1693,6 +1791,7 @@
final ExecutionDMC dmc = (ExecutionDMC) context;
dmc.setStepping(true);
+ dmc.clearFunctionCallDestinations();
IAddress pcAddress = null;
@@ -1732,31 +1831,53 @@
IAddress endAddr = getAddressForNextLine(dmc, pcAddress, module,
linkAddress, lineEntryProvider, line,
stepType == StepType.STEP_OVER);
+
+ dmc.clearStepRanges();
+
+ // If the line has two or more code ranges, record them
+ //
+ Collection<ILineEntry> ranges
+ = lineEntryProvider.getLineEntriesForLines(line.getFilePath(),
+ line.getLineNumber(),
+ line.getLineNumber());
+ if (ranges.size() > 1)
+ {
+ for (ILineEntry iLineEntry : ranges) {
+ dmc.addStepRange(module.toRuntimeAddress(iLineEntry.getLowAddress()),
+ module.toRuntimeAddress(iLineEntry.getHighAddress()));
+ }
+ }
/*
- * It's possible that PC is larger than startAddr
- * (e.g. user does a few instruction level stepping
- * then switch to source level stepping; or when we
- * just step out a function). We just parse and
- * stepping instructions within [pcAddr, endAddr)
- * instead of all those within [startAddr, endAddr).
- * One possible problem with the solution is when
- * control jumps from within [pcAddress, endAddr) to
- * somewhere within [startAddr, pcAddress), the
- * stepping would stop at somewhere within
- * [startAddr, pcAddress) instead of outside of the
- * [startAddr, endAddr). But that case is rare (e.g.
- * a source line contains a bunch of statements) and
- * that "problem" is not unacceptable as user could
- * just keep stepping or set a breakpoint and run.
+ * It's possible that PC is larger than
+ * startAddr (e.g. user does a few instruction
+ * level stepping then switch to source level
+ * stepping). We just parse and step past
+ * instructions within [pcAddr, endAddr) instead
+ * of all those within [startAddr, endAddr). One
+ * possible problem with the solution is when
+ * control jumps from a point within [pcAddress,
+ * endAddr) to a point within [startAddr,
+ * pcAddress), the stepping would stop within
+ * instead of outside of the [startAddr,
+ * endAddr). But that case is rare (e.g. a
+ * source line contains a bunch of statements)
+ * and that "problem" is not unacceptable as
+ * user could just keep stepping or set a
+ * breakpoint and run.
*
- * We can overcome the problem but that would incur
- * much more complexity in the stepping code and
- * brings down the stepping speed.
+ * We can overcome the problem but that would
+ * incur much more complexity in the stepping
+ * code and brings down the stepping speed.
* ........................ 08/30/2009
*/
-
- stepAddressRange(dmc, stepType == StepType.STEP_INTO, pcAddress, endAddr, rm);
+ final boolean stepIn = stepType == StepType.STEP_INTO;
+ stepAddressRange(dmc, stepIn, pcAddress, endAddr, new RequestMonitor(getExecutor(), rm) {
+ @Override
+ protected void handleSuccess() {
+ handleStepAddressRangeDone(stepIn, dmc, rm);
+ }}
+ );
if (EDCTrace.RUN_CONTROL_TRACE_ON) { EDCTrace.getTrace().traceExit(null, "source level stepping."); }
return;
@@ -1776,6 +1897,9 @@
if (stepType == StepType.INSTRUCTION_STEP_OVER)
stepOverOneInstruction(dmc, pcAddress, rm);
else if (stepType == StepType.INSTRUCTION_STEP_INTO)
+ // Note when do StepIn at instruction level, we
+ // don't bother checking and stepping past glue code.
+ //
stepIntoOneInstruction(dmc, rm);
else if (stepType == StepType.INSTRUCTION_STEP_RETURN)
stepOut(dmc, pcAddress, rm);
@@ -1785,6 +1909,61 @@
}, rm);
}
+ private void handleStepAddressRangeDone(final boolean stepIn, final ExecutionDMC dmc, final RequestMonitor rm) {
+ IAddress newPC = new Addr64(dmc.getPC(), 16);
+
+ boolean done = false;
+ EDCAddressRange r = dmc.findStepRange(newPC);
+
+ if (r == null)
+ // PC is out of line code ranges, done
+ done = true;
+ else {
+ Breakpoints bpService = getService(Breakpoints.class);
+ if (bpService.findUserBreakpoint(newPC) != null)
+ // hit a user breakpoint
+ done = true;
+ }
+
+ if (done) {
+ if (stepIn) {
+ // Only when we step into a function (not jump to some place)
+ // do we check if there is glue code and step past it if any
+ // ...........................08/07/11
+ if (dmc.isFunctionCallDestination(newPC))
+ stepPastGlueCode(dmc, newPC, rm);
+ else
+ rm.done();
+ }
+ else
+ rm.done();
+ }
+ else if (r != null)
+ // Still in a code range of the line, keep going by recursive call.
+ stepAddressRange(dmc, stepIn, newPC, r.getEndAddress(), new RequestMonitor(getExecutor(), rm) {
+ @Override
+ protected void handleSuccess() {
+ // recursive
+ handleStepAddressRangeDone(stepIn, dmc, rm);
+ }});
+ }
+
+ /**
+ * If instructions at PC are glue code (e.g. jump table for call to function in DLL),
+ * step past them. Otherwise just do nothing.
+ *
+ * @param dmc the execution context, usually a thread.
+ * @param pc program counter.
+ * @param rm
+ */
+ private void stepPastGlueCode(ExecutionDMC dmc, IAddress pc,
+ RequestMonitor rm) {
+ // Glue code is totally processor specific. So
+ // let TargetEnvironment service handle it.
+ ITargetEnvironment te = getService(ITargetEnvironment.class);
+ te.stepPastGlueCode(dmc, pc, rm);
+ }
+
private void stepOut(final ExecutionDMC dmc, IAddress pcAddress, final RequestMonitor rm) {
if (EDCTrace.RUN_CONTROL_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, "Step out from address " + pcAddress.toHexAddressString()); }
@@ -1971,7 +2150,7 @@
protected void handleSuccess() {
ByteBuffer codeBuf = Disassembly.translateMemoryBytes(getData(), pcAddress, rm);
if (codeBuf == null) {
- return; // rm status set in checkMemoryBytes()
+ return; // rm status set in translateMemoryBytes()
}
IDisassemblyDMContext dis_dmc
@@ -2034,6 +2213,16 @@
final IAddress endAddr, final RequestMonitor rm) {
if (EDCTrace.RUN_CONTROL_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, MessageFormat.format("address range [{0},{1})", startAddr.toHexAddressString(), endAddr.toHexAddressString())); }
+ int memSize = startAddr.distanceTo(endAddr).intValue();
+ if (memSize < 0) { // endAddr < startAddr
+ rm.setStatus(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID,
+ MessageFormat.format(
+ "Invalid arguments for StepAddressRange(): ending address {0} is smaller than start address {1}.",
+ endAddr.toHexAddressString(), startAddr.toHexAddressString())));
+ rm.done();
+ return;
+ }
+
if (dmc.supportsStepMode(stepIn ? StepType.STEP_INTO : StepType.STEP_OVER)) {
dmc.stepRange(stepIn, startAddr, endAddr, rm);
return;
@@ -2050,8 +2239,6 @@
final Memory memoryService = getService(Memory.class);
IMemoryDMContext mem_dmc = DMContexts.getAncestorOfType(dmc, IMemoryDMContext.class);
- int memSize = startAddr.distanceTo(endAddr).intValue();
-
final IAddress pcAddress = startAddr;
// Note this memory read will give us memory bytes with
@@ -2092,7 +2279,7 @@
if (insertBPatRangeEnd == false)
insertBPatRangeEnd = true;
IJumpToAddress jta = inst.getJumpToAddress();
- if (jta == null)
+ if (jta == null) // not control-change instruction, ignore.
continue;
// the instruction is a control-change instruction
@@ -2119,12 +2306,12 @@
stepIntoOneInstruction(dmc, rm);
return;
}
- // evaluate the address expression
-
+
if (!jta.isSubroutineAddress() || stepIn)
{
- IAddressExpressionEvaluator evaluator = getTargetEnvironmentService()
- .getAddressExpressionEvaluator();
+ // evaluate the address expression
+ IAddressExpressionEvaluator evaluator =
+ getTargetEnvironmentService().getAddressExpressionEvaluator();
if (evaluator == null) {
rm.setStatus(new Status(IStatus.ERROR, EDCDebugger.PLUGIN_ID, REQUEST_FAILED,
"No evaluator for address expression yet.", null));
@@ -2145,6 +2332,9 @@
// don't add an address if we already have it
if (!stopPoints.contains(addr))
stopPoints.add(addr);
+
+ if (jta.isSubroutineAddress()) // step-in a function
+ dmc.addFunctionCallDestination(addr);
}
} else {
// we must run to this instruction first
@@ -2159,7 +2349,8 @@
if (!runToAndCheckPoints.contains(instAddr))
runToAndCheckPoints.add(instAddr);
}
- } else { // "jta" is immediate address.
+ }
+ else { // "jta" is immediate address.
IAddress jumpAddress = (IAddress) jta.getValue();
@@ -2168,6 +2359,9 @@
// is subroutine call
if (stepIn && !stopPoints.contains(jumpAddress)) {
stopPoints.add(jumpAddress);
+
+ dmc.addFunctionCallDestination(jumpAddress);
+
// no need to check remaining instructions
// !! Wrong. Control may jump over (skip)this instruction
// within the [startAddr, endAddr) range, so we still need
@@ -2218,11 +2412,11 @@
* the second RTC yet) and run out of the range and be
* gone with the wind...
*
- * There is no way we can solve the problem. Good thing
- * is, in practice is the case even possible ?
+ * TODO: we could solve it by keeping stepping till we are out
+ * of the range. Do it when really needed in practice (namely
+ * when the following warning is seen).
*/
- // Log (and show it, get rid of the "show" part after
- // tons of test) warning here.
+ // Log a warning here.
EDCDebugger.getMessageLogger().log(
new Status(IStatus.WARNING, EDCDebugger.PLUGIN_ID,
MessageFormat.format(
@@ -2256,8 +2450,7 @@
if (!doneWithStepping)
// -------- Phase 2: run to the "endAddr".
//
- stepAddressRange(dmc, stepIn, newPC, endAddr, rm); // Recursive
- // call
+ stepAddressRange(dmc, stepIn, newPC, endAddr, rm); // Recursive call
else
rm.done();
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
index 2cfb29a..c563f11 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
@@ -23,9 +23,9 @@
import org.eclipse.cdt.debug.edc.internal.EDCTrace;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Modules.ModuleDMC;
import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.EDCSymbolReader;
import org.eclipse.cdt.debug.edc.internal.symbols.files.DebugInfoProviderFactory;
import org.eclipse.cdt.debug.edc.internal.symbols.files.ExecutableSymbolicsReaderFactory;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.PEFileExecutableSymbolicsReader;
import org.eclipse.cdt.debug.edc.services.AbstractEDCService;
import org.eclipse.cdt.debug.edc.services.IEDCDMContext;
import org.eclipse.cdt.debug.edc.services.IEDCExecutionDMC;
@@ -324,6 +324,9 @@
continue;
Collection<IType> types = reader.getDebugInfoProvider().getTypesByName(type.getName());
+ if (types == null)
+ return result;
+
for (IType t : types) {
if (t instanceof ICompositeType && ! ((ICompositeType)t).isOpaque()) {
result = (ICompositeType)t;
@@ -338,9 +341,9 @@
/**
* A wrapper method that calls into symbol reader to get runtime address(es)
- * for a given function name.
- * Currently this method use symbol table instead of debug info (e.g. dwarf2)
- * to get function address. See reason in the implementation.
+ * for a given function name.
+ * For executables that are not PE-COFF, this method only uses the symbol table instead of
+ * also debug info (e.g. Dwarf3) to get function address. See reason in the implementation.
*
* @param module where the runtime address is.
* @param functionName
@@ -360,11 +363,11 @@
functionName = functionName.substring(0, parenIndex);
// Supposedly we could call this to get what we need, but this may cause full parse of
- // debug info and lead to heap overflow for a large symbol file (over one giga bytes of
- // memory required in parsing a 180M symbol file) and chokes the debugger.
+ // debug info and lead to heap overflow for a large symbol file (over one gigabytes of
+ // memory required in parsing a 180M ELF symbol file) and chokes the debugger.
// So before a good solution is available, we resort to symbol table of the executable.
// ................04/02/10
-// Collection<IFunctionScope> functions = symReader.getModuleScope().getFunctionsByName(function);
+// Collection<IFunctionScope> functions = symReader.getModuleScope().getFunctionsByName(functionName);
// for (IFunctionScope f : functions) {
// IAddress breakAddr = f.getLowAddress();
// ...
@@ -375,8 +378,13 @@
// else look for a raw symbol
symbols = symReader.findSymbols(functionName);
}
-
- for (ISymbol symbol : symbols) {
+
+ if (symbols.isEmpty() && symReader.getSymbolicsReader() instanceof PEFileExecutableSymbolicsReader) {
+ // for PE-COFF files, if the name is not in the symbol list, search the debug info
+ IFunctionScope function = symReader.getModuleScope().getFunctionByName(functionName);
+ if (function != null)
+ ret.add(function.getLowAddress());
+ } else for (ISymbol symbol : symbols) {
// don't consider zero sized symbol.
if (symbol.getSize() == 0)
continue;
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/snapshot/Album.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/snapshot/Album.java
index 3f8f3eb..30fa634 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/snapshot/Album.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/snapshot/Album.java
@@ -665,11 +665,13 @@
EDCDebugger.getMessageLogger().logError(null, e);
}
}
-
+
BufferedInputStream stream = ZipFileUtils.openFile(albumFile, ALBUM_DATA, DSA_FILE_EXTENSIONS);
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler(new DefaultHandler());
- setDocument(parser.parse(new InputSource(stream)));
+ InputSource inputSource = new InputSource(stream);
+ inputSource.setSystemId(albumFile.toURI().toString()); // avoid NPE inside XML parser
+ setDocument(parser.parse(inputSource));
loadAlbumInfo();
loadLaunchConfiguration();
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ArrayType.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ArrayType.java
index 0f54a83..74e0e3e 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ArrayType.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ArrayType.java
@@ -14,13 +14,43 @@
import java.util.Map;
import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
public class ArrayType extends MayBeQualifiedType implements IArrayType {
protected ArrayList<IArrayBoundType> bounds = new ArrayList<IArrayBoundType>();
+ protected String nameWithSize;
+ protected int boundsOnLastName = 0;
+ /**
+ *
+ * @param name not including any []
+ * @param scope
+ * @param byteSize
+ * @param properties
+ */
public ArrayType(String name, IScope scope, int byteSize, Map<Object, Object> properties) {
super(name, scope, byteSize, properties);
+ nameWithSize = name + "[]";
+ }
+
+ @Override
+ public String getName() {
+ if (!(boundsOnLastName == getBoundsCount())){
+ if (name == null || name.length() == 0){
+ IType subType = getType();
+ if (subType != null){
+ name = subType.getName();
+ } else {
+ name = "";
+ }
+ }
+ nameWithSize = name;
+ for (IArrayBoundType bound : bounds){
+ nameWithSize += "[" + bound.getBoundCount() + "]";
+ }
+ }
+ return nameWithSize;
}
public int getBoundsCount() {
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/CompileUnitScope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/CompileUnitScope.java
index 6c088ce..b4e8646 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/CompileUnitScope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/CompileUnitScope.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,7 +7,9 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - use toHexAddress in CompileUnitScope as used elsewhere
*******************************************************************************/
+
package org.eclipse.cdt.debug.edc.internal.symbols;
import java.util.ArrayList;
@@ -23,6 +25,10 @@
import org.eclipse.cdt.debug.edc.symbols.IScope;
import org.eclipse.core.runtime.IPath;
+/**
+ * Scope extension implementing ICompileUnitScope, with:<br>
+ * CompileUnitScope specific filePath and line-entries
+ */
public abstract class CompileUnitScope extends Scope implements ICompileUnitScope {
protected IPath filePath;
@@ -48,9 +54,6 @@
return (IFunctionScope) scope;
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.ICompileUnitScope#getFunctions()
- */
public Collection<IFunctionScope> getFunctions() {
List<IFunctionScope> functions = new ArrayList<IFunctionScope>(children.size());
for (IScope scope : getChildren()) {
@@ -76,14 +79,22 @@
}
return Collections.unmodifiableCollection(lineEntries);
}
+
+ /**
+ * CompileUnitScope specific version of toString():<br>
+ * <code>
+ * [lowAddress=, highAddress=, path=]
+ * </code>
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#toString()
+ */
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("CompileUnitScope ["); //$NON-NLS-1$
builder.append("lowAddress="); //$NON-NLS-1$
- builder.append(lowAddress);
+ builder.append(lowAddress != null ? lowAddress.toHexAddressString() : null);
builder.append(", highAddress="); //$NON-NLS-1$
- builder.append(highAddress);
+ builder.append(highAddress != null ? highAddress.toHexAddressString() : null);
builder.append(", "); //$NON-NLS-1$
if (filePath != null) {
builder.append("path="); //$NON-NLS-1$
@@ -93,4 +104,55 @@
builder.append("]"); //$NON-NLS-1$
return builder.toString();
}
+
+ /**
+ * force extensions of this abstract class to add their own
+ * debug-info specific info to the hashCode
+ * @return
+ * @see CompileUnitScope#hashCode
+ */
+ protected abstract int cuScopeHashCode();
+
+ /**
+ * hashCode() from this level on down is currently here for only one
+ * purpose: a HashSet<ICompileUnitScope> maintained by
+ * {@link org.eclipse.cdt.debug.edc.internal.symbols.ModuleLineEntryProvider}.
+ * It is made final so nothing below overrides the implementation to include the
+ * name, and relies on abstract {@link CompileUnitScope#compileScopeHashCode()}
+ * to force each extension of this abstract class to implement its own
+ * hashCode() to satisfy the need for a unique hash-id.
+ */
+ @Override
+ final public int hashCode() {
+ final int prime = 31;
+ return name.hashCode() * prime + cuScopeHashCode();
+ }
+
+ /**
+ * force extensions of this abstract class to add their own
+ * debug-info specific info to the CompileUnitScope equality test
+ * @return
+ * @see CompileUnitScope#equals
+ */
+ protected abstract boolean cuScopeEquals(Object obj);
+
+ /**
+ * equality comparison for use together with the value provided by
+ * {@link CompileUnitScope#hashCode}. made final here so extensions
+ * of this class cannot simply override it.
+ */
+ @Override
+ final public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ if (!name.equals(((Scope)obj).name))
+ return false;
+
+ return cuScopeEquals(obj);
+ }
+
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FileLineEntryProvider.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FileLineEntryProvider.java
index de10937..b69e865 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FileLineEntryProvider.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FileLineEntryProvider.java
@@ -1,3 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial refactoring out of ModuleLineEntryProvider
+ * Broadcom - memory optimization
+ *******************************************************************************/
+
package org.eclipse.cdt.debug.edc.internal.symbols;
import java.util.ArrayList;
@@ -82,7 +94,7 @@
List<ILineEntry> currentMappings = lineEntriesByLine.get(entry.getLineNumber());
if (currentMappings == null) {
- currentMappings = new ArrayList<ILineEntry>();
+ currentMappings = new ArrayList<ILineEntry>(5);//mostly 1,2 or 3 entries
lineEntriesByLine.put(entry.getLineNumber(), currentMappings);
}
currentMappings.add(entry);
@@ -206,7 +218,7 @@
int endLine = (endLineNumber != -1) ? endLineNumber :
lineEntriesByLine.lastKey();
- List<ILineEntry> entries = new ArrayList<ILineEntry>(), startMappings;
+ List<ILineEntry> startMappings, entries = Collections.emptyList();
/* in case the caller has requested something other than a single line,
* make certain this doesn't fail if the the caller passes a
@@ -218,7 +230,7 @@
if (startMappings != null) {
if (startLineNumber == endLineNumber) {
- entries.addAll(startMappings);
+ entries = new ArrayList<ILineEntry>(startMappings);
} else if (endLineNumber == -1) {
// return the entries for the rest of the file
entries = lineEntries.subList(lineEntries.indexOf(startMappings.get(0)), lntSize);
@@ -618,9 +630,6 @@
}
/*
- * Find code line for the anchor in one compile unit.
- * The returned value should only contain one entry.
- *
* (non-Javadoc)
* @see org.eclipse.cdt.debug.edc.symbols.ILineEntryProvider#findClosestLineWithCode(org.eclipse.core.runtime.IPath, int, int)
*/
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FunctionScope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FunctionScope.java
index d91fca1..6a32af9 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FunctionScope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/FunctionScope.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -151,33 +151,33 @@
public IPath getDeclFile() {
return declFile;
}
-
+
public void setDeclFile(IPath declFile) {
this.declFile = declFile;
}
-
+
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.edc.internal.symbols.IFunctionScope#getDeclLine()
*/
public int getDeclLine() {
return declLine;
}
-
+
public void setDeclLine(int declLine) {
this.declLine = declLine;
}
-
+
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.edc.internal.symbols.IFunctionScope#getDeclColumn()
*/
public int getDeclColumn() {
return declColumn;
}
-
+
public void setDeclColumn(int declColumn) {
this.declColumn = declColumn;
}
-
+
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#addChild(org.eclipse.cdt.debug.edc.internal.symbols.IScope)
*/
@@ -188,10 +188,28 @@
if (scope instanceof IFunctionScope)
addLineInfoToParent(scope);
}
-
public void setLocationProvider(ILocationProvider locationProvider) {
this.frameBaseLocationProvider = locationProvider;
}
+ @Override
+ public boolean contentsEquals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.contentsEquals(obj))
+ return false;
+ FunctionScope other = (FunctionScope) obj;
+ if (declColumn != other.declColumn)
+ return false;
+ if (declFile == null) {
+ if (other.declFile != null)
+ return false;
+ } else if (!declFile.equals(other.declFile))
+ return false;
+ if (declLine != other.declLine)
+ return false;
+ return true;
+ }
+
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ISection.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ISection.java
index ce9f748..9cd6408 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ISection.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ISection.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,18 +7,21 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - addition of getPhysicalAddress() to API
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
import java.util.Map;
import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.symbols.IHasSize;
+import org.eclipse.cdt.debug.edc.symbols.IAddressInterval;
/**
* Interface representing a section in memory. It is segment in Elf file and a
* section in PE file.
*/
-public interface ISection {
+public interface ISection extends IAddressInterval, IHasSize {
/**
* Commonly known properties of a section
@@ -26,15 +29,10 @@
static final String PROPERTY_ID = "id"; //$NON-NLS-1$
static final String PROPERTY_SIZE = "size"; //$NON-NLS-1$
static final String PROPERTY_LINK_ADDRESS = "link_address"; //$NON-NLS-1$
+ static final String PROPERTY_PHYSICAL_ADDRESS = "physical_address"; //$NON-NLS-1$
/** Canonical section name: one of NAME_TEXT, NAME_DATA, NAME_RODATA, or NAME_BSS */
static final String PROPERTY_NAME = "name"; //$NON-NLS-1$
- /* TODO: not used
- static final String PROPERTY_READABLE = "readable";
- static final String PROPERTY_WRITABLE = "writable";
- static final String PROPERTY_EXECUTABLE = "executable";
- */
-
static final String NAME_TEXT = ".text"; //$NON-NLS-1$
static final String NAME_DATA = ".data"; //$NON-NLS-1$
static final String NAME_RODATA = ".rodata"; // read only data //$NON-NLS-1$
@@ -48,13 +46,6 @@
int getId();
/**
- * Get the section size
- *
- * @return the section size
- */
- long getSize();
-
- /**
* Get the base link address of the section
*
* @return the base link address
@@ -62,10 +53,16 @@
IAddress getLinkAddress();
/**
+ * Get the physical address in memory of the start of this section
+ *
+ * @return the physical address in memory of the start of this section
+ */
+ IAddress getPhysicalAddress();
+
+ /**
* Get the properties of the section
*
* @return the section properties
*/
Map<String, Object> getProperties();
-
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ModuleLineEntryProvider.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ModuleLineEntryProvider.java
index 5dc14f8..a8c94a4 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ModuleLineEntryProvider.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/ModuleLineEntryProvider.java
@@ -1,19 +1,19 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
+/**
+ * Copyright (c) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution
+ * refactoring of FileLineEntryProvider to separate class
+ *
+ * Contributors:
+ * Broadcom - convert private class extensions to final
+ *
+ */
package org.eclipse.cdt.debug.edc.internal.symbols;
@@ -46,14 +46,14 @@
/**
* basically, a typedef of {@link ArrayList}<{@link FileLineEntryProvider}>
*/
- private final class FileLineEntryProviders extends ArrayList<FileLineEntryProvider> {
+ private static final class FileLineEntryProviders extends ArrayList<FileLineEntryProvider> {
private static final long serialVersionUID = -2157263701372708990L;
}
/**
* basically, a typedef of {@link HashMap}<{@link IPath},{@link FileLineEntryProvider}>
*/
- private final class PathToLineEntryMap extends HashMap<IPath, FileLineEntryProviders> {
+ private static final class PathToLineEntryMap extends HashMap<IPath, FileLineEntryProviders> {
private static final long serialVersionUID = 7064789571684986782L;
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/RuntimeSection.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/RuntimeSection.java
index 887fd17..5fb7a53 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/RuntimeSection.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/RuntimeSection.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 Nokia and others.
+ * Copyright (c) 2010, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - Addition of getPhysicalAddress() to API
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
@@ -14,8 +15,9 @@
import java.util.Map;
import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.symbols.AbstractAddressInterval;
-public class RuntimeSection implements IRuntimeSection {
+public class RuntimeSection extends AbstractAddressInterval implements IRuntimeSection {
private ISection section;
// the relocated address of the section at runtime
@@ -40,6 +42,10 @@
return section.getLinkAddress();
}
+ public IAddress getPhysicalAddress() {
+ return section.getPhysicalAddress();
+ }
+
public Map<String, Object> getProperties() {
return section.getProperties();
}
@@ -76,4 +82,27 @@
return true;
}
+ public IAddress getAddress() {
+ return getRuntimeAddress();
+ }
+
+ public int compareTo(Object o) {
+ if (equals(o)) {
+ return 0;
+ }
+ if (o instanceof RuntimeSection) {
+ return getAddress().compareTo(((RuntimeSection)o).getAddress());
+ }
+ return -1;
+ }
+
+ public String getName() {
+ return "" + getId();
+ }
+
+ @Override
+ public boolean hasEmptyRange() {
+ return section.hasEmptyRange();
+ }
+
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Scope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Scope.java
index fadec12..2b030fa 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Scope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Scope.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -29,6 +29,12 @@
import org.eclipse.cdt.utils.Addr32;
import org.eclipse.cdt.utils.Addr64;
+/**
+ * abstract implementation of {@link IScope},
+ * optionally containing a name, low & high addresses, IScope parent,
+ * children, variables, enumerators, et al
+ *
+ */
public abstract class Scope implements IScope {
protected String name;
@@ -68,7 +74,8 @@
public boolean hasEmptyRange() {
return (lowAddress == null || highAddress == null)
|| (lowAddress.isZero() && highAddress.isZero())
- || (lowAddress.getValue().longValue() == -1 && highAddress.isZero()); // TODO: remove this case
+ || (lowAddress.getValue().longValue() == -1 && highAddress.isZero()) // TODO: remove this case
+ || lowAddress.equals(highAddress);
}
/**
@@ -195,15 +202,32 @@
enumerators.add(enumerator);
}
+ /** Scope specific compareTo() based upon<br>
+ * 1) if object to compare is IScope, comparison of lowAddress, then highAddress<br>
+ * 2) if object to compare is IAddress, compare address to this lowAddress<br>
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
public int compareTo(Object o) {
if (o instanceof IScope) {
- return lowAddress.compareTo(((IScope) o).getLowAddress());
+ IScope io = (IScope) o;
+ int comparison = lowAddress.compareTo(io.getLowAddress());
+ if (comparison == 0) {
+ comparison = highAddress.compareTo(io.getHighAddress());
+ }
+ return comparison;
} else if (o instanceof IAddress) {
return lowAddress.compareTo(o);
}
return 0;
}
+ /**
+ * Scope specific version of toString():<br>
+ * <code>
+ * [ranges=, lowAddress=, highAddress=, name=]
+ * </code>
+ * @see java.lang.Object#toString()
+ */
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
@@ -227,11 +251,17 @@
return builder.toString();
}
+ /**
+ * deal with incorrectly generated ranges by the compiler
+ * that may not work together properly with ranges of children
+ * @param baseAddress
+ */
public void fixupRanges(IAddress baseAddress) {
// compile unit scopes not generated by the compiler so
// figure it out from the functions
IAddress newLowAddress = Addr64.MAX;
IAddress newHighAddress = Addr64.ZERO;
+ IRangeList newRangeList = new RangeList();
boolean any = false;
for (IScope kid : getChildren()) {
@@ -242,8 +272,15 @@
if (kid.hasEmptyRange()) {
continue;
}
-
+
if (kid.getLowAddress().compareTo(baseAddress) > 0) {
+ IRangeList kidRanges = kid.getRangeList();
+ if (kidRanges == null){// If it didn't have ranges it still has one range
+ kidRanges = new RangeList();
+ ((RangeList)kidRanges).addRange(kid.getLowAddress().getValue().longValue(),kid.getHighAddress().getValue().longValue());
+ }
+ newRangeList = RangeList.mergeRangeLists(newRangeList,kidRanges);
+
if (kid.getLowAddress().compareTo(newLowAddress) < 0) {
newLowAddress = kid.getLowAddress();
any = true;
@@ -260,7 +297,11 @@
//System.out.println("Needed to fix up ranges for " + getName());
lowAddress = newLowAddress;
highAddress = newHighAddress;
- rangeList = null;
+ int entryCount = 0;
+ for (@SuppressWarnings("unused") IRangeList.Entry entry : newRangeList){
+ ++entryCount;
+ }
+ rangeList = (entryCount > 1) ? newRangeList : null;
} else {
if (lowAddress == null) {
lowAddress = highAddress = Addr32.ZERO;
@@ -287,8 +328,7 @@
{
if (rangeList != null) {
if (scope.getRangeList() != null) {
- // TODO: merge properly
- rangeList = null;
+ rangeList = RangeList.mergeRangeLists(rangeList,scope.getRangeList());
} else {
((RangeList)rangeList).addLowRange(scope.getLowAddress().getValue().longValue());
}
@@ -298,8 +338,7 @@
if (scope.getHighAddress() != null && scope.getHighAddress().compareTo(highAddress) > 0) {
if (rangeList != null) {
if (scope.getRangeList() != null) {
- // TODO: merge properly
- rangeList = null;
+ rangeList = RangeList.mergeRangeLists(rangeList,scope.getRangeList());
} else {
((RangeList)rangeList).addHighRange(scope.getHighAddress().getValue().longValue());
}
@@ -308,7 +347,10 @@
}
}
}
-
+
+ /**
+ * @param scope
+ */
protected void addLineInfoToParent(IScope scope) {
IScope cu = parent;
while (cu != null) {
@@ -337,4 +379,57 @@
addressToScopeMap.clear();
rangeList = null;
}
+
+ /**
+ * there are not enough non-mutable members with which
+ * to provide a proper hashCode() for Scope, and we
+ * cannot provide equals() if we cannot guarantee
+ * hashCode() ... but at least we can make comparison
+ * of different Scope objects a little easier for
+ * situations where we want to claim to Scope objects
+ * have the same contents.
+ * <br>
+ * in this case, content equality is based upon the
+ * following criteria<br>
+ * 1) same children<br>
+ * 2) same highAddress<br>
+ * 3) same lowAddress<br>
+ * 4) same name<br>
+ * 5) same rangeList<br>
+ */
+ public boolean contentsEquals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Scope other = (Scope) obj;
+ if (children == null) {
+ if (other.children != null)
+ return false;
+ } else if (!children.equals(other.children))
+ return false;
+ if (highAddress == null) {
+ if (other.highAddress != null)
+ return false;
+ } else if (!highAddress.equals(other.highAddress))
+ return false;
+ if (lowAddress == null) {
+ if (other.lowAddress != null)
+ return false;
+ } else if (!lowAddress.equals(other.lowAddress))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (rangeList == null) {
+ if (other.rangeList != null)
+ return false;
+ } else if (!rangeList.equals(other.rangeList))
+ return false;
+ return true;
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Section.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Section.java
index 222be38..835fba5 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Section.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Section.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - addition of getPhysicalAddress() to API
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
@@ -15,24 +16,45 @@
import java.util.Map;
import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.symbols.AbstractAddressInterval;
-public class Section implements ISection {
+public class Section extends AbstractAddressInterval implements ISection {
private final int id;
private final long size;
- // the address generated by the linker
+ /** the address generated by the linker*/
private final IAddress linkAddress;
+ private final IAddress physicalAddress;
private final Map<String, Object> properties;
+ /**
+ * use {@link Section#Section(int, long, IAddress, IAddress, Map)} if possible;
+ * this version of the constructor sets a null physicalAddress
+ * @param id
+ * @param size
+ * @param linkAddress
+ * @param properties
+ */
public Section(int id, long size, IAddress linkAddress, Map<String, Object> properties) {
+ this(id, size, linkAddress, null, properties);
+ }
+
+ /**
+ * @param id
+ * @param size
+ * @param linkAddress
+ * @param physicalAddress
+ * @param properties
+ */
+ public Section(int id, long size, IAddress linkAddress, IAddress physicalAddress, Map<String, Object> properties) {
this.id = id;
this.size = size;
this.linkAddress = linkAddress;
- this.properties = new HashMap<String, Object>(properties); // make a
- // copy
+ this.physicalAddress = physicalAddress;
+ this.properties = new HashMap<String, Object>(properties); // make a copy
}
public int getId() {
@@ -47,6 +69,10 @@
return linkAddress;
}
+ public IAddress getPhysicalAddress() {
+ return physicalAddress;
+ }
+
public Map<String, Object> getProperties() {
return properties;
}
@@ -71,4 +97,22 @@
return false;
return true;
}
+
+ public String getName() {
+ return "" + getId();
+ }
+
+ public IAddress getAddress() {
+ return getLinkAddress();
+ }
+
+ public int compareTo(Object o) {
+ if (equals(o)) {
+ return 0;
+ }
+ if (o instanceof Section) {
+ return getAddress().compareTo(((Section)o).getAddress());
+ }
+ return -1;
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Symbol.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Symbol.java
index ed6de1b..ea97ac4 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Symbol.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Symbol.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,22 +7,47 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - addition of properties to ctor & getProperties() to API
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
+import java.util.HashMap;
+import java.util.Map;
+
import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.symbols.AbstractAddressInterval;
import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-public class Symbol implements ISymbol {
+public class Symbol extends AbstractAddressInterval implements ISymbol {
protected String name;
protected IAddress address;
protected long size;
+ private Map<String, Object> properties;
+
+ /**
+ * use {@link Symbol#Symbol(String, IAddress, long, Map)} to supply
+ * an already available set of properties
+ * @param name
+ * @param address
+ * @param size
+ */
public Symbol(String name, IAddress address, long size) {
+ this(name, address, size, new HashMap<String, Object>(0));
+ }
+
+ /**
+ * @param name
+ * @param address
+ * @param size
+ * @param properties
+ */
+ public Symbol(String name, IAddress address, long size, Map<String,Object> properties) {
this.name = name;
this.address = address;
this.size = size;
+ this.properties = properties;
}
public String getName() {
@@ -52,5 +77,7 @@
", address=0x" + Long.toHexString(address.getValue().longValue()) + //$NON-NLS-1$
", size=" + size; //$NON-NLS-1$
}
-
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Type.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Type.java
index 5204c57..65ebd0e 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Type.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Type.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - added override toString() to aid debugging
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
@@ -14,6 +15,7 @@
import org.eclipse.cdt.debug.edc.symbols.IScope;
import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
public class Type implements IType {
@@ -86,4 +88,7 @@
return byteSize;
}
+ public String toString() {
+ return TypeUtils.getFullTypeName(this);
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Variable.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Variable.java
index f7d66db..1c631f0 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Variable.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/Variable.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - added hashCode() and equals() implementations
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;
@@ -117,4 +118,53 @@
builder.append("]"); //$NON-NLS-1$
return builder.toString();
}
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((definingFile == null) ? 0 : definingFile.hashCode());
+ result = prime * result + (isDeclared ? 1231 : 1237);
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((scope == null) ? 0 : scope.hashCode());
+ result = prime * result + (int) (startScope ^ (startScope >>> 32));
+ result = prime * result + ((type == null) ? 0 : type.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Variable other = (Variable) obj;
+ if (definingFile == null) {
+ if (other.definingFile != null)
+ return false;
+ } else if (!definingFile.equals(other.definingFile))
+ return false;
+ if (isDeclared != other.isDeclared)
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (scope == null) {
+ if (other.scope != null)
+ return false;
+ } else if (!scope.equals(other.scope))
+ return false;
+ if (startScope != other.startScope)
+ return false;
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!type.equals(other.type))
+ return false;
+ return true;
+ }
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfCompileUnit.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfCompileUnit.java
index 203fb99..6409810 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfCompileUnit.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfCompileUnit.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia and others.
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Nokia - Initial API and implementation
+ * Broadcom - remove duplicate child methods (repeating super methods from Scope)
*******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
@@ -25,6 +26,14 @@
import org.eclipse.cdt.debug.edc.symbols.IVariable;
import org.eclipse.core.runtime.IPath;
+/**
+ * extension of CompileUnitScope that holds<br>
+ * 1) DWARF specific debug info provider<br>
+ * 2) DWARF specific attributes<br>
+ * 3) DWARF sepcific compile unit header<br>
+ * 4) cache flags for previously parsed variables, addresses & types
+ *
+ */
public class DwarfCompileUnit extends CompileUnitScope {
protected DwarfDebugInfoProvider provider;
@@ -32,16 +41,29 @@
private List<IPath> fileList;
private boolean rangesDirty;
- // computation unit header
+ /** computation unit header */
protected final CompilationUnitHeader header;
- // whether the computation unit has been parsed to find variables and children with address ranges
+ /** whether the computation unit has been parsed to find variables and children with address ranges */
protected boolean parsedForVarsAndAddresses = false;
- // whether the computation unit has been parsed to find types
+ /** whether the computation unit has been parsed to find types */
protected boolean parsedForTypes = false;
+ /**
+ * DwarfCompileUnit holds the provider, attributes and DWARF header
+ * in addition to other member variables of its super,
+ * {@link CompileUnitScope#CompileUnitScope(IPath, IModuleScope, IAddress, IAddress)}
+ * @param provider
+ * @param parent
+ * @param filePath
+ * @param lowAddress
+ * @param highAddress
+ * @param header
+ * @param hasChildren
+ * @param attributes
+ */
public DwarfCompileUnit(DwarfDebugInfoProvider provider, IModuleScope parent, IPath filePath,
IAddress lowAddress, IAddress highAddress, CompilationUnitHeader header, boolean hasChildren,
AttributeList attributes) {
@@ -58,11 +80,16 @@
}
}
- /* (non-Javadoc)
- * @see java.lang.Object#hashCode()
+ /**
+ * called by {@link CompileUnitScope#hashCode()}.
+ * this implementation further distinguishes the hash-code
+ * by adding the following to the caller hashCode as follows:
+ * <br><code>
+ * (prime+header.debugInfoOffset)*prime+provider.symbolfFile.hashCode()
+ * </code>
+ * @see CompileUnitScope#cuScopeHashCode()
*/
- @Override
- public int hashCode() {
+ protected int cuScopeHashCode() {
final int prime = 31;
int result = 1;
result = prime * result + header.debugInfoOffset;
@@ -70,17 +97,16 @@
return result;
}
- /* (non-Javadoc)
- * @see java.lang.Object#equals(java.lang.Object)
+ /**
+ * called by {@link CompileUnitScope#equals(Object)}.
+ * caller will guarantee objects are not identical, non-null,
+ * of same class, with the same scope name.
+ * This implementation further guarantees equality:
+ * <br>(1) if and only if debugInfoOffset values are equal
+ * <br>(2) if and only if provider symbol file values are equal
+ * @see CompileUnitScope#cuScopeEquals(java.lang.Object)
*/
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
+ protected boolean cuScopeEquals(Object obj) {
DwarfCompileUnit other = (DwarfCompileUnit) obj;
if (header.debugInfoOffset != other.header.debugInfoOffset)
return false;
@@ -89,46 +115,25 @@
return true;
}
+ /**
+ * @return attributes of this DwarfCompileUnit
+ */
public AttributeList getAttributeList() {
return attributes;
}
- @Override
+ /**
+ * utilize DwarfInfoReader to implement abstract declaration in
+ * {@link CompileUnitScope#parseLineTable()}
+ */
protected Collection<ILineEntry> parseLineTable() {
DwarfInfoReader reader = new DwarfInfoReader(provider);
fileList = new ArrayList<IPath>();
return reader.parseLineTable(this, attributes, fileList);
}
- public void setLowAddress(IAddress address) {
- this.lowAddress = address;
- }
-
- public void setHighAddress(IAddress address) {
- this.highAddress = address;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getLowAddress()
- */
- @Override
- public IAddress getLowAddress() {
- // the address is known in the compile unit tag;
- // if anything inside is outside that range, it's a bug.
- return super.getLowAddress();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getHighAddress()
- */
- @Override
- public IAddress getHighAddress() {
- // the address is known in the compile unit tag;
- // if anything inside is outside that range, it's a bug.
- return super.getHighAddress();
- }
-
- /* (non-Javadoc)
+ /** fixup ranges and ensure parsed for addresses before calling
+ * super.getFunctionAtAddress()
* @see org.eclipse.cdt.debug.edc.internal.symbols.CompileUnitScope#getFunctionAtAddress(org.eclipse.cdt.core.IAddress)
*/
@Override
@@ -140,7 +145,7 @@
return super.getFunctionAtAddress(linkAddress);
}
- /* (non-Javadoc)
+ /** ensure parsed for addresses before calling super.getChildren
* @see org.eclipse.cdt.debug.edc.internal.symbols.CompileUnitScope#getFunctions()
*/
@Override
@@ -164,31 +169,45 @@
rangesDirty = false;
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getChildren()
+ /** ensure parsed for addresses before calling super.getChildren()
+ * @return children of this compile unit after it has been parsed for addresses
*/
@Override
public Collection<IScope> getChildren() {
+ ensureParsedForAddresses();
return super.getChildren();
}
-
+
+ /**
+ * allow the caller to establish an attribute list
+ */
public void setAttributes(AttributeList attributes) {
this.attributes = attributes;
}
+ /**
+ * @return whether or not this DwarfCompileUnit has been parsed for addresses
+ */
public boolean isParsedForAddresses() {
return parsedForVarsAndAddresses;
}
+ /**
+ * @return whether or not this DwarfCompileUnit has been parsed for variables
+ */
public boolean isParsedForVariables() {
return parsedForVarsAndAddresses;
}
+ /**
+ * @return whether or not this DwarfCompileUnit has been parsed for types
+ */
public boolean isParsedForTypes() {
return parsedForTypes;
}
- /* (non-Javadoc)
+ /** ensure first parsed for variables before calling
+ * {@link CompileUnitScope#getVariables()}
* @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getVariables()
*/
@Override
@@ -197,14 +216,26 @@
return super.getVariables();
}
+ /**
+ * allow caller to set this DwarfCompileUnit's parsedForVarsAndAddresses flag true
+ * @param parsedForAddresses
+ */
public void setParsedForAddresses(boolean parsedForAddresses) {
this.parsedForVarsAndAddresses = parsedForAddresses;
}
+ /**
+ * allow caller to set this DwarfCompileUnit's parsedForVarsAndAddresses flag true
+ * @param parsedForVariables
+ */
public void setParsedForVariables(boolean parsedForVariables) {
this.parsedForVarsAndAddresses = parsedForVariables;
}
+ /**
+ * allow caller to set this DwarfCompileUnit's parsedForTypes flag true
+ * @param parsedForTypes
+ */
public void setParsedForTypes(boolean parsedForTypes) {
this.parsedForTypes = parsedForTypes;
}
@@ -213,6 +244,7 @@
if (!parsedForVarsAndAddresses) {
DwarfInfoReader reader = new DwarfInfoReader(provider);
reader.parseCompilationUnitForAddresses(this);
+ fixupRanges();
}
}
@@ -236,12 +268,22 @@
}
}
+ /** ensure parsed for addresses before calling super.getScopeAtAddress()
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getScopeAtAddress(org.eclipse.cdt.core.IAddress)
+ */
@Override
public IScope getScopeAtAddress(IAddress linkAddress) {
ensureParsedForAddresses();
return super.getScopeAtAddress(linkAddress);
}
+ /**
+ * DwarfCompileUnit specific version of toString():<br>
+ * <code>
+ * [SymFile=, SectionOffset=, lowAddr=, highAddr=, path=, parsedForVarsAndAddress=, parsedForTypes=]
+ * </code>
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.CompileUnitScope#toString()
+ */
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
@@ -270,8 +312,12 @@
return builder.toString();
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#addChild(org.eclipse.cdt.debug.edc.internal.symbols.IScope)
+
+ /**
+ * 1) calls super.addChild() first<br>
+ * 2) checks whether this has an empty range and merges range with passed child scope if not.<br>
+ * 3) adds line info to the passed child scope
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#addChild(org.eclipse.cdt.debug.edc.symbols.IScope)
*/
@Override
public void addChild(IScope scope) {
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfDebugInfoProvider.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfDebugInfoProvider.java
index e6cbee5..0ee68a0 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfDebugInfoProvider.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfDebugInfoProvider.java
@@ -1,1402 +1,1309 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.IStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
-import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.CommonInformationEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.FrameDescriptionEntry;
-import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
-import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
-import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
-import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
-import org.eclipse.cdt.debug.edc.symbols.IRangeList;
-import org.eclipse.cdt.debug.edc.symbols.IRangeList.Entry;
-import org.eclipse.cdt.debug.edc.symbols.IScope;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.symbols.IVariable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * This class handles the low-level aspects of reading DWARF data.
- * There exists one provider per symbol file.
- */
-public class DwarfDebugInfoProvider implements IDebugInfoProvider {
-
- /**
- * This represents a forward type reference, which is a type
- * that resolves itself when referenced.
- */
- static public class ForwardTypeReference implements IType, IForwardTypeReference {
-
- static public final IType NULL_TYPE_ENTRY = new IType() {
-
- public int getByteSize() {
- return 0;
- }
-
- public String getName() {
- return DwarfMessages.DwarfDebugInfoProvider_UnhandledType;
- }
-
- public Map<Object, Object> getProperties() {
- return Collections.emptyMap();
- }
-
- public IScope getScope() {
- return null;
- }
-
- public IType getType() {
- return null;
- }
-
- public void setType(IType type) {
- throw new IllegalStateException();
- }
-
- public void dispose() {
- }
- };
-
- private DwarfDebugInfoProvider provider;
- private IType type = null;
-
- private final long offset;
-
- public ForwardTypeReference(DwarfDebugInfoProvider provider, long offset) {
- this.provider = provider;
- this.offset = offset;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.dwarf.IForwardTypeReference#getReferencedType()
- */
- public IType getReferencedType() {
- if (type == null) {
- // to prevent recursion
- IType newType = NULL_TYPE_ENTRY;
- newType = provider.resolveTypeReference(this);
- if (newType == null) {
- // FIXME
- newType = NULL_TYPE_ENTRY;
- }
- type = newType;
- }
- return type;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getByteSize()
- */
- public int getByteSize() {
- return getReferencedType().getByteSize();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getName()
- */
- public String getName() {
- return getReferencedType().getName();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getProperties()
- */
- public Map<Object, Object> getProperties() {
- return getReferencedType().getProperties();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getScope()
- */
- public IScope getScope() {
- return getReferencedType().getScope();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getType()
- */
- public IType getType() {
- return getReferencedType().getType();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#setType(org.eclipse.cdt.debug.edc.internal.symbols.IType)
- */
- public void setType(IType type_) {
- getReferencedType().setType(type_);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#dispose()
- */
- public void dispose() {
- type = null;
- provider = null;
- }
- }
-
- static public class CompilationUnitHeader {
- int length;
- short version;
- int abbreviationOffset;
- byte addressSize;
- int debugInfoOffset;
- DwarfCompileUnit scope;
-
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append("Offset: " + debugInfoOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
- sb.append("Length: " + length).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
- sb.append("Version: " + version).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
- sb.append("Abbreviation: " + abbreviationOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
- sb.append("Address size: " + addressSize).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
- return sb.toString();
- }
- }
-
- static class AbbreviationEntry {
- short tag;
- ArrayList<Attribute> attributes;
- boolean hasChildren;
-
- AbbreviationEntry(long code, short tag, boolean hasChildren) {
- // abbreviation code not stored
- this.tag = tag;
- this.hasChildren = hasChildren;
- attributes = new ArrayList<Attribute>();
- }
- }
-
- static class Attribute {
- short tag;
- byte form;
-
- Attribute(short tag, byte form) {
- this.tag = tag;
- this.form = form;
- }
-
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append("tag: " + Long.toHexString(tag)); //$NON-NLS-1$
- sb.append(" form: " + Long.toHexString(form)); //$NON-NLS-1$
- return sb.toString();
- }
- }
-
- static class AttributeValue {
- private Object value;
-
- // for indirect form, this is the actual form
- private byte actualForm;
-
- AttributeValue(byte form, IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) {
- actualForm = form;
-
- try {
- value = readAttribute(in, addressSize, debugStrings);
- } catch (IOException e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- }
- }
-
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer();
- if (value != null) {
- Class<? extends Object> clazz = value.getClass();
- if (clazz.isArray()) {
- int len = Array.getLength(value);
- sb.append(len).append(' ');
- sb.append(clazz.getComponentType().toString());
- sb.append(':');
- for (int i = 0; i < len; i++) {
- byte b = Array.getByte(value, i);
- sb.append(' ').append(Integer.toHexString(b));
- }
- } else {
- if (value instanceof Number) {
- Number n = (Number) value;
- sb.append(Long.toHexString(n.longValue()));
- } else if (value instanceof String) {
- sb.append(value);
- } else {
- sb.append(value);
- }
- }
- }
- return sb.toString();
- }
-
- private Object readAttribute(IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) throws IOException {
- Object obj = null;
- switch (actualForm) {
- case DwarfConstants.DW_FORM_addr:
- case DwarfConstants.DW_FORM_ref_addr:
- obj = DwarfInfoReader.readAddress(in, addressSize);
- break;
-
- case DwarfConstants.DW_FORM_block: {
- int size = (int) DwarfInfoReader.read_unsigned_leb128(in);
- byte[] bytes = new byte[size];
- in.get(bytes);
- obj = bytes;
- }
- break;
-
- case DwarfConstants.DW_FORM_block1: {
- int size = in.get() & 0xff;
- byte[] bytes = new byte[size];
- in.get(bytes);
- obj = bytes;
- }
- break;
-
- case DwarfConstants.DW_FORM_block2: {
- int size = in.getShort();
- byte[] bytes = new byte[size];
- in.get(bytes);
- obj = bytes;
- }
- break;
-
- case DwarfConstants.DW_FORM_block4: {
- int size = in.getInt();
- byte[] bytes = new byte[size];
- in.get(bytes);
- obj = bytes;
- }
- break;
-
- case DwarfConstants.DW_FORM_data1:
- obj = new Byte(in.get());
- break;
-
- case DwarfConstants.DW_FORM_data2:
- obj = new Short(in.getShort());
- break;
-
- case DwarfConstants.DW_FORM_data4:
- obj = new Integer(in.getInt());
- break;
-
- case DwarfConstants.DW_FORM_data8:
- obj = new Long(in.getLong());
- break;
-
- case DwarfConstants.DW_FORM_sdata:
- obj = new Long(DwarfInfoReader.read_signed_leb128(in));
- break;
-
- case DwarfConstants.DW_FORM_udata:
- obj = new Long(DwarfInfoReader.read_unsigned_leb128(in));
- break;
-
- case DwarfConstants.DW_FORM_string: {
- int c;
- StringBuffer sb = new StringBuffer();
- while ((c = (in.get() & 0xff)) != -1) {
- if (c == 0) {
- break;
- }
- sb.append((char) c);
- }
- obj = sb.toString();
- }
- break;
-
- case DwarfConstants.DW_FORM_flag:
- obj = new Byte(in.get());
- break;
-
- case DwarfConstants.DW_FORM_strp: {
- int offset = in.getInt();
- if (debugStrings == null) {
- obj = new String();
- } else if (offset < 0 || offset > debugStrings.capacity()) {
- obj = new String();
- } else {
- debugStrings.position(offset);
- obj = DwarfInfoReader.readString(debugStrings);
- }
- }
- break;
-
- case DwarfConstants.DW_FORM_ref1:
- obj = new Integer(in.get() & 0xff);
- break;
-
- case DwarfConstants.DW_FORM_ref2:
- obj = new Integer(in.getShort() & 0xffff);
- break;
-
- case DwarfConstants.DW_FORM_ref4:
- obj = new Integer(in.getInt());
- break;
-
- case DwarfConstants.DW_FORM_ref8:
- obj = new Long(in.getLong());
- break;
-
- case DwarfConstants.DW_FORM_ref_udata:
- obj = new Long(DwarfInfoReader.read_unsigned_leb128(in));
- break;
-
- case DwarfConstants.DW_FORM_indirect: {
- actualForm = (byte) DwarfInfoReader.read_unsigned_leb128(in);
- return readAttribute(in, addressSize, debugStrings);
- }
-
- default:
- assert (false);
- break;
- }
-
- return obj;
- }
-
- /**
- * @param attr
- * @param in
- * @param addressSize
- * @param debugStrings
- */
- public static void skipAttributeValue(short form, IStreamBuffer in,
- byte addressSize) throws IOException {
- switch (form) {
- case DwarfConstants.DW_FORM_addr:
- case DwarfConstants.DW_FORM_ref_addr:
- in.position(in.position() + addressSize);
- break;
-
- case DwarfConstants.DW_FORM_block: {
- int size = (int) DwarfInfoReader.read_unsigned_leb128(in);
- in.position(in.position() + size);
- }
- break;
-
- case DwarfConstants.DW_FORM_block1: {
- int size = in.get() & 0xff;
- in.position(in.position() + size);
- }
- break;
-
- case DwarfConstants.DW_FORM_block2: {
- int size = in.getShort();
- in.position(in.position() + size);
- }
- break;
-
- case DwarfConstants.DW_FORM_block4: {
- int size = in.getInt();
- in.position(in.position() + size);
- }
- break;
-
- case DwarfConstants.DW_FORM_data1:
- in.position(in.position() + 1);
- break;
-
- case DwarfConstants.DW_FORM_data2:
- in.position(in.position() + 2);
- break;
-
- case DwarfConstants.DW_FORM_data4:
- in.position(in.position() + 4);
- break;
-
- case DwarfConstants.DW_FORM_data8:
- in.position(in.position() + 8);
- break;
-
- case DwarfConstants.DW_FORM_sdata:
- DwarfInfoReader.read_signed_leb128(in);
- break;
-
- case DwarfConstants.DW_FORM_udata:
- DwarfInfoReader.read_unsigned_leb128(in);
- break;
-
- case DwarfConstants.DW_FORM_string: {
- int c;
- while ((c = (in.get() & 0xff)) != -1) {
- if (c == 0) {
- break;
- }
- }
- }
- break;
-
- case DwarfConstants.DW_FORM_flag:
- in.position(in.position() + 1);
- break;
-
- case DwarfConstants.DW_FORM_strp:
- in.position(in.position() + 4);
- break;
-
- case DwarfConstants.DW_FORM_ref1:
- in.position(in.position() + 1);
- break;
-
- case DwarfConstants.DW_FORM_ref2:
- in.position(in.position() + 2);
- break;
-
- case DwarfConstants.DW_FORM_ref4:
- in.position(in.position() + 4);
- break;
-
- case DwarfConstants.DW_FORM_ref8:
- in.position(in.position() + 8);
- break;
-
- case DwarfConstants.DW_FORM_ref_udata:
- DwarfInfoReader.read_unsigned_leb128(in);
- break;
-
- case DwarfConstants.DW_FORM_indirect: {
- form = (short) DwarfInfoReader.read_unsigned_leb128(in);
- skipAttributeValue(form, in, addressSize);
- break;
- }
-
- default:
- assert (false);
- break;
- }
- }
-
- /**
- * Parse attributes and then skip to sibling, if any
- *
- * @param names array to hold up to two names
- * @param entry debug info entry
- * @param in buffer stream of debug info
- * @param addressSize
- * @param debugStrings
- * @return DW_AT_name value, or null if there is no or invalid DW_AT_name attribute
- */
- public static void skipAttributesToSibling(AbbreviationEntry entry, IStreamBuffer in, byte addressSize) {
-
- long sibling = -1;
-
- // go through the attributes and throw away everything except the sibling
- int len = entry.attributes.size();
- for (int i = 0; i < len; i++) {
- Attribute attr = entry.attributes.get(i);
- try {
- if (attr.tag == DwarfConstants.DW_AT_sibling) {
- if (attr.form == DwarfConstants.DW_FORM_ref_udata) {
- sibling = DwarfInfoReader.read_unsigned_leb128(in);
- } else if (attr.form == DwarfConstants.DW_FORM_ref4) {
- sibling = in.getInt();
- } else {
- // TODO: allow other forms for sibling value
- AttributeValue.skipAttributeValue(attr.form, in, addressSize);
- }
- } else {
- AttributeValue.skipAttributeValue(attr.form, in, addressSize);
- }
- } catch (IOException e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- break;
- }
- }
-
- if (sibling != -1)
- in.position(sibling);
- }
-
-
- public byte getActualForm() {
- return actualForm;
- }
-
- /**
- * Get the value as a 64-bit signed long, sign-extending any shorter attribute
- * @return value as signed long
- */
- public long getValueAsSignedLong() {
- if (value instanceof Number) {
- return ((Number) value).longValue();
- }
- return 0;
- }
-
- /**
- * Get the value as a 64-bit long.
- *
- * A Byte, Short, or Integer is zero-extended.
- *
- * @return value as long
- */
- public long getValueAsLong() {
- if (value instanceof Byte) {
- return ((Byte) value).byteValue() & 0xff;
- }
- if (value instanceof Short) {
- return ((Short) value).shortValue() & 0xffff;
- }
- if (value instanceof Integer) {
- return ((Integer) value).intValue() & 0xffffffff;
- }
- // fallthrough
- if (value instanceof Number) {
- return ((Number) value).longValue();
- }
- return 0;
- }
-
- /**
- * Get the value as a 32-bit int.
- *
- * A Byte or Short is zero-extended.
- *
- * @return value as int
- */
- public int getValueAsInt() {
- if (value instanceof Byte) {
- return ((Byte) value).byteValue() & 0xff;
- }
- if (value instanceof Short) {
- return ((Short) value).shortValue() & 0xffff;
- }
- // fallthrough
- if (value instanceof Number) {
- return ((Number) value).intValue();
- }
- return 0;
- }
-
- /**
- * Get the value as a string
- * @return String or "" if not a string
- */
- public String getValueAsString() {
- if (value != null)
- return value.toString();
- return null;
- }
-
- /**
- * Get the byte array value (which is empty if this is not a byte array)
- * @return array
- */
- public byte[] getValueAsBytes() {
- if (value instanceof byte[])
- return (byte[]) value;
- return new byte[0];
- }
- }
-
- static public class AttributeList {
-
- Map<Short, AttributeValue> attributeMap;
-
- AttributeList(AbbreviationEntry entry, IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) {
-
- int len = entry.attributes.size();
- attributeMap = new HashMap<Short, AttributeValue>(len);
- for (int i = 0; i < len; i++) {
- Attribute attr = entry.attributes.get(i);
- attributeMap.put(Short.valueOf(attr.tag), new AttributeValue(attr.form, in, addressSize, debugStrings));
- }
-
- }
-
- public static void skipAttributes(AbbreviationEntry entry, IStreamBuffer in, byte addressSize) {
-
- int len = entry.attributes.size();
- for (int i = 0; i < len; i++) {
- Attribute attr = entry.attributes.get(i);
- try {
- AttributeValue.skipAttributeValue(attr.form, in, addressSize);
- } catch (IOException e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- break;
- }
- }
-
- }
-
- public long getAttributeValueAsLong(short attributeName) {
- AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
- if (attr != null) {
- return attr.getValueAsLong();
- }
- return 0;
- }
-
- public int getAttributeValueAsInt(short attributeName) {
- AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
- if (attr != null) {
- return attr.getValueAsInt();
- }
- return 0;
- }
-
-
- public long getAttributeValueAsSignedLong(short attributeName) {
- AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
- if (attr != null) {
- return attr.getValueAsSignedLong();
- }
- return 0;
- }
-
- public String getAttributeValueAsString(short attributeName) {
- AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
- if (attr != null) {
- return attr.getValueAsString();
- }
- return ""; //$NON-NLS-1$
- }
-
- public byte[] getAttributeValueAsBytes(short attributeName) {
- AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
- if (attr != null) {
- return attr.getValueAsBytes();
- }
- return new byte[0];
- }
-
- public AttributeValue getAttribute(short attributeName) {
- return attributeMap.get(Short.valueOf(attributeName));
- }
-
- /**
- * Tell whether the attributes do not have a code range.
- * <p>
- * Note: a singular DW_AT_low_pc means an entry point
- * <p>
- * Also note: a compile unit can have code represented by DW_AT_stmt_list
- * @return true if the attributes represent code
- */
- public boolean hasCodeRangeAttributes() {
- return attributeMap.containsKey(DwarfConstants.DW_AT_high_pc)
- || attributeMap.containsKey(DwarfConstants.DW_AT_ranges);
- }
- }
-
- static public class PublicNameInfo {
- public final String nameWithNameSpace;
- public final CompilationUnitHeader cuHeader;
- public final short tag; // DW_TAG_xxx
-
- public PublicNameInfo(String nameWithNameSpace, CompilationUnitHeader cuHeader, short tag) {
- this.nameWithNameSpace = nameWithNameSpace;
- this.cuHeader = cuHeader;
- this.tag = tag;
- }
- }
-
- // list of compilation units per source file
- protected HashMap<IPath, List<ICompileUnitScope>> compileUnitsPerFile = new HashMap<IPath, List<ICompileUnitScope>>();
-
- // list of compile units in .debug_info order
- protected ArrayList<DwarfCompileUnit> compileUnits = new ArrayList<DwarfCompileUnit>();
-
- // list of compile units with code (non-zero high address), sorted by low address
- protected ArrayList<DwarfCompileUnit> sortedCompileUnitsWithCode = new ArrayList<DwarfCompileUnit>();
-
- // function and type declarations can be referenced by offsets relative to
- // the compile unit or to the entire .debug_info section. therefore we keep
- // maps by .debug_info offset, and for compile unit relative offsets, we
- // just add the compile unit offset into the .debug_info section.
- protected Map<Long, AttributeList> functionsByOffset = new HashMap<Long, AttributeList>();
- protected Map<Long, IType> typesByOffset = Collections.synchronizedMap(new HashMap<Long, IType>());
-
- // for casting to a type, keep certain types by name
- protected Map<String, List<IType>> typesByName = new HashMap<String, List<IType>>();
- // for casting to a type, track whether the cast name includes an aggregate designator
- enum TypeAggregate { Class, Struct, Union, None };
-
- // map of entities which created scopes
- protected Map<Long, Scope> scopesByOffset = new HashMap<Long, Scope>();
-
- // entry points for CUs in the .debug_info section, used to dynamically parse CUs as needed
- protected TreeMap<Long, CompilationUnitHeader> debugOffsetsToCompileUnits = new TreeMap<Long, CompilationUnitHeader>();
-
- // forward references for tags we have not parsed yet. (These will go into typesByOffset once handled)
- //Map<Long, ForwardDwarfDefinition> forwardDwarfDefinitions = new HashMap<Long, ForwardDwarfDefinition>();
-
- // these are just for faster lookups
- protected Map<String, List<IFunctionScope>> functionsByName = new HashMap<String, List<IFunctionScope>>();
- protected Map<String, List<IVariable>> variablesByName = new HashMap<String, List<IVariable>>();
- protected Map<String, List<PublicNameInfo>> publicFunctions = new HashMap<String, List<PublicNameInfo>>();
- protected Map<String, List<PublicNameInfo>> publicVariables = new HashMap<String, List<PublicNameInfo>>();
-
- // abbreviation tables (lists of abbrev entries), mapped by .debug_abbrev offset
- protected Map<Integer, Map<Long, AbbreviationEntry>> abbreviationMaps = new HashMap<Integer, Map<Long, AbbreviationEntry>>();
-
- // mapping of PC range to frame description entries
- protected TreeMap<IRangeList.Entry, FrameDescriptionEntry> frameDescEntries = new TreeMap<IRangeList.Entry, FrameDescriptionEntry>();
- // mapping of CIE offsets to parsed common info entries
- protected Map<Long, CommonInformationEntry> commonInfoEntries = new HashMap<Long, CommonInformationEntry>();
-
-
- protected Set<String> referencedFiles = new HashSet<String>();
- protected boolean buildReferencedFilesList = true;
-
- private IPath symbolFilePath;
- private long symbolFileLastModified;
- private boolean parsedInitially = false;
- private boolean parsedForVarsAndAddresses = false;
- private boolean parsedForScopesAndAddresses = false;
- private boolean parsedForTypes = false;
- private boolean parsedForGlobalVars = false;
-
- private final IExecutableSymbolicsReader exeReader;
- private final DwarfModuleScope moduleScope;
-
- final DwarfFileHelper fileHelper;
-
- private IFrameRegisterProvider frameRegisterProvider;
-
- private static String SOURCE_FILES_CACHE = "_source_files"; //$NON-NLS-1$
-
- public DwarfDebugInfoProvider(IExecutableSymbolicsReader exeReader) {
- this.exeReader = exeReader;
- this.symbolFilePath = exeReader.getSymbolFile();
- this.symbolFileLastModified = symbolFilePath.toFile().lastModified();
- this.moduleScope = new DwarfModuleScope(this);
- this.fileHelper = new DwarfFileHelper(symbolFilePath);
- this.frameRegisterProvider = new DwarfFrameRegisterProvider(this);
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return DwarfMessages.DwarfDebugInfoProvider_DwarfProviderFor + symbolFilePath;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IDebugInfoProvider#dispose()
- */
- public void dispose() {
- // several views in DSF hold onto all our debug info,
- // so go through and explicitly break links
- if (moduleScope != null) {
- moduleScope.dispose();
- }
-
- // help GC
- compileUnitsPerFile.clear();
- compileUnits.clear();
- functionsByOffset.clear();
- typesByOffset.clear();
- scopesByOffset.clear();
- debugOffsetsToCompileUnits.clear();
- functionsByName.clear();
- variablesByName.clear();
- publicFunctions.clear();
- publicVariables.clear();
- abbreviationMaps.clear();
- referencedFiles.clear();
- moduleScope.dispose();
- parsedInitially = false;
- parsedForTypes = false;
- parsedForVarsAndAddresses = false;
- parsedForScopesAndAddresses = false;
-
- fileHelper.dispose();
- frameRegisterProvider.dispose();
- }
-
- void ensureParsedInitially() {
- if (!parsedInitially) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- parsedInitially = true;
- reader.parseInitial();
- }
- }
-
- void ensureParsedForScopes() {
- if (!parsedForScopesAndAddresses) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- if (!parsedInitially) {
- parsedInitially = true;
- reader.parseInitial();
- }
- parsedForScopesAndAddresses = true;
- reader.parseForAddresses(false);
- }
- }
-
- void ensureParsedForScope(IAddress linkAddress) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- if (!parsedInitially) {
- parsedInitially = true;
- reader.parseInitial();
- }
- reader.parseForAddress(linkAddress);
- }
-
- void ensureParsedForVariables() {
- if (!parsedForVarsAndAddresses) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- if (!parsedInitially) {
- parsedInitially = true;
- reader.parseInitial();
- }
- parsedForVarsAndAddresses = true;
- reader.parseForAddresses(true);
- }
- }
-
- private void ensureParsedForGlobalVariables() {
- if (parsedForGlobalVars)
- return;
- parsedForGlobalVars = true;
-
- if (publicVariables.size() == 0)
- return;
-
- // determine compilation units containing globals
- HashSet<CompilationUnitHeader> cuWithGlobalsArray = new HashSet<CompilationUnitHeader>(publicVariables.size());
- for (List<PublicNameInfo> infoList : publicVariables.values()) {
- for (PublicNameInfo info : infoList) {
- cuWithGlobalsArray.add(info.cuHeader);
- }
- }
-
- // parse compilation units containing global variables
- DwarfInfoReader reader = new DwarfInfoReader(this);
- for (CompilationUnitHeader cuHeader : cuWithGlobalsArray)
- reader.parseCompilationUnitForAddresses(cuHeader.scope);
- }
-
- void ensureParsedForTypes() {
- if (!parsedForTypes) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- if (!parsedInitially) {
- parsedInitially = true;
- reader.parseInitial();
- }
- parsedForTypes = true;
- reader.parseForTypes();
- }
- }
-
- public void setParsedInitially() {
- parsedInitially = true;
- }
-
- public void setParsedForAddresses() {
- parsedForVarsAndAddresses = true;
- }
-
- public IPath getSymbolFile() {
- return symbolFilePath;
- }
-
- public IModuleScope getModuleScope() {
- return moduleScope;
- }
-
- public IAddress getBaseLinkAddress() {
- return exeReader.getBaseLinkAddress();
- }
-
- public Collection<IFunctionScope> getFunctionsByName(String name) {
- List<IFunctionScope> result;
-
- ensureParsedInitially();
-
- String baseName = name;
-
- /* use same semantics as before, where qualified name lookups would fail
- // pubnames uses qualified names but is indexed by basename
- if (name != null) {
- int baseStart = name.lastIndexOf("::");
- if (baseStart != -1)
- baseName = name.substring(baseStart + 2);
- }
- */
-
- // first, match against public function names
- if (publicFunctions.size() > 0) {
- if (name != null) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- List<PublicNameInfo> nameMatches = publicFunctions.get(baseName);
-
- if (nameMatches != null) {
- // parse the compilation units that have matches
- if (nameMatches.size() == 1) { // quick usual case
- reader.parseCompilationUnitForAddresses(nameMatches.get(0).cuHeader.scope);
- } else {
- ArrayList<DwarfCompileUnit> cuList = new ArrayList<DwarfCompileUnit>();
-
- for (PublicNameInfo info : nameMatches) {
- if (!cuList.contains(info.cuHeader.scope)) {
- cuList.add(info.cuHeader.scope);
- }
- }
-
- for (DwarfCompileUnit cu : cuList) {
- reader.parseCompilationUnitForAddresses(cu);
- }
- }
- } else {
- // not a public name, so parse all compilation units looking for functions
- ensureParsedForScopes();
- }
- } else {
- // name is null, so parse all compilation units looking for functions
- ensureParsedForScopes();
- }
- } else {
- // no public names, so parse all compilation units looking for functions
- ensureParsedForScopes();
- }
-
- if (name != null) {
- result = functionsByName.get(baseName);
- if (result == null)
- return new ArrayList<IFunctionScope>(0);
- } else {
- result = new ArrayList<IFunctionScope>(functionsByName.size()); // at least this big
- for (List<IFunctionScope> functions : functionsByName.values())
- result.addAll(functions);
- ((ArrayList<IFunctionScope>) result).trimToSize();
- }
- return Collections.unmodifiableCollection(result);
- }
-
- public Collection<IVariable> getVariablesByName(String name, boolean globalsOnly) {
- List<IVariable> result;
-
- ensureParsedInitially();
-
- if (name == null) {
- if (publicVariables.size() > 0) {
- // name is null, so parse all compilation units looking for variables
- if (globalsOnly)
- ensureParsedForGlobalVariables();
- else
- ensureParsedForVariables();
- }
-
- result = new ArrayList<IVariable>(variablesByName.size()); // at least this big
- for (List<IVariable> variables : variablesByName.values())
- result.addAll(variables);
-
- return Collections.unmodifiableCollection(result);
- }
-
- String baseName = name;
- int baseNameStart = name.lastIndexOf("::"); //$NON-NLS-1$
- if (baseNameStart != -1)
- baseName = name.substring(baseNameStart + 2);
-
- // match against public variable names, which the initial parse populated
- if (publicVariables.size() > 0) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- List<PublicNameInfo> nameMatches = publicVariables.get(baseName);
-
- if (nameMatches != null) {
- // parse the compilation units that have matches
- if (nameMatches.size() == 1) { // quick usual case
- reader.parseCompilationUnitForAddresses(nameMatches.get(0).cuHeader.scope);
- } else {
- ArrayList<DwarfCompileUnit> cuList = new ArrayList<DwarfCompileUnit>();
-
- for (PublicNameInfo info : nameMatches) {
- if (!cuList.contains(info.cuHeader.scope)) {
- cuList.add(info.cuHeader.scope);
- }
- }
-
- for (DwarfCompileUnit cu : cuList) {
- reader.parseCompilationUnitForAddresses(cu);
- }
- }
- } else {
- // not a public name, so parse all compilation units looking for variables
- if (!globalsOnly)
- ensureParsedForVariables();
- }
- }
-
- result = variablesByName.get(name);
-
- // check against unqualified name because RVCT 2.x did not include namespace
- // info for globals that are inside namespaces
- if (result == null && baseNameStart != -1)
- result = variablesByName.get(baseName);
-
- if (result == null)
- return new ArrayList<IVariable>(0);
-
- return Collections.unmodifiableCollection(result);
- }
-
- /**
- * @return the publicFunctions
- */
- public Map<String, List<PublicNameInfo>> getPublicFunctions() {
- ensureParsedInitially();
- return publicFunctions;
- }
- /**
- * @return the publicVariables
- */
- public Map<String, List<PublicNameInfo>> getPublicVariables() {
- ensureParsedInitially();
- return publicVariables;
- }
-
- public ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress) {
- ensureParsedForScope(linkAddress);
-
- IScope scope = moduleScope.getScopeAtAddress(linkAddress);
- while (scope != null && !(scope instanceof ICompileUnitScope)) {
- scope = scope.getParent();
- }
-
- return (ICompileUnitScope) scope;
- }
-
- public List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath) {
- ensureParsedInitially();
-
- List<ICompileUnitScope> cuList = compileUnitsPerFile.get(filePath);
-
- if (cuList != null)
- return cuList;
-
- // FIXME: we need a looser check here: on Windows, we added drive letters to all
- // paths before populating compileUnitsPerFile, even if there is not really a
- // drive (see DwarFileHelper).
- for (Map.Entry<IPath, List<ICompileUnitScope>> entry : compileUnitsPerFile.entrySet()) {
- if (entry.getKey().setDevice(null).equals(filePath.setDevice(null))) {
- return entry.getValue();
- }
- }
-
- return Collections.emptyList();
- }
-
- @SuppressWarnings("unchecked")
- public String[] getSourceFiles(IProgressMonitor monitor) {
- if (referencedFiles.isEmpty()) {
- // Check the persistent cache
- String cacheKey = getSymbolFile().toOSString() + SOURCE_FILES_CACHE;
- Set<String> cachedFiles = EDCDebugger.getDefault().getCache().getCachedData(cacheKey, Set.class, symbolFileLastModified);
- if (cachedFiles == null)
- {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- reader.quickParseDebugInfo(monitor);
- assert referencedFiles.size() > 0;
- EDCDebugger.getDefault().getCache().putCachedData(cacheKey, new HashSet<String>(referencedFiles), symbolFileLastModified);
- }
- else
- referencedFiles = cachedFiles;
- }
-
- return referencedFiles.toArray(new String[referencedFiles.size()]);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IDebugInfoProvider#getTypes()
- */
- public Collection<IType> getTypes() {
- ensureParsedForTypes();
-
- ArrayList<IType> types = new ArrayList<IType>(typesByOffset.values());
- return types;
- }
-
- /////////////////
-
- // Lazy evaluation methods
-
-
- /**
- * Fetch a type lazily. Either we've already parsed the type, or we have
- * a reference to it, or we can find its compilation unit and parse its types.
- * We do not fix up cross references until someone asks for
- * it (e.g. from an IType or IVariable implementation).
- */
- public IType readType(long offset_) {
- Long offset = Long.valueOf(offset_);
- IType type = typesByOffset.get(offset);
- if (type == null) {
- // make sure we've parsed it
- CompilationUnitHeader header = fetchCompileUnitHeader(offset_);
- if (header != null) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- reader.parseCompilationUnitForTypes(header.scope);
- type = typesByOffset.get(offset);
- // may be unhandled currently
- if (type == null) {
- // workaround for GCC-E 3.x bug where some, but not all, type offsets are off by 4
- // assume if you hit this null case that the problem may be the GCC-E bug
- type = typesByOffset.get(offset - 4);
- if (type == null)
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_NotParsingType1 + Long.toHexString(offset_) +
- DwarfMessages.DwarfDebugInfoProvider_NotParsingType2 + symbolFilePath, null);
- }
- } else {
- // may be unhandled currently
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_CannotResolveCompUnit1 + Long.toHexString(offset_) +
- DwarfMessages.DwarfDebugInfoProvider_CannotResolveCompUnit2 + symbolFilePath, null);
- }
- }
- return type;
- }
-
- /**
- * Fetch a referenced type lazily.
- * @param scope
- */
- IType resolveTypeReference(ForwardTypeReference ref) {
- IType type = typesByOffset.get(ref.offset);
- if (type == null) {
- type = readType(ref.offset);
- }
- return type;
- }
- /**
- * @return
- */
- public IExecutableSymbolicsReader getExecutableSymbolicsReader() {
- return exeReader;
- }
-
- /**
- * Remember where a compilation unit header lives in the debug info.
- * @param debugInfoOffset
- * @param currentCUHeader
- */
- public void registerCompileUnitHeader(int debugInfoOffset,
- CompilationUnitHeader currentCUHeader) {
- debugOffsetsToCompileUnits.put((long) debugInfoOffset, currentCUHeader);
- }
-
- /**
- * Get a compilation unit header that contains the given offset.
- * @param debugInfoOffset an offset which is on or after a compilation unit's debug offset
- * @return {@link CompilationUnitHeader} containing the offset
- */
- public CompilationUnitHeader fetchCompileUnitHeader(long debugInfoOffset) {
- CompilationUnitHeader match = debugOffsetsToCompileUnits.get(debugInfoOffset);
- if (match != null)
- return match;
-
- // it's inside one
- SortedMap<Long,CompilationUnitHeader> headMap = debugOffsetsToCompileUnits.headMap(debugInfoOffset);
- // urgh, sorted map... no easy way to get to the end
- for (CompilationUnitHeader header : headMap.values()) {
- match = header;
- }
- return match;
- }
-
- /**
- * Get the frame description entry for the given PC
- * @param framePC
- * @return FDE or <code>null</code>
- */
- public FrameDescriptionEntry findFrameDescriptionEntry(IAddress framePC) {
- DwarfInfoReader reader = new DwarfInfoReader(this);
- if (frameDescEntries.isEmpty()) {
- reader.parseForFrameIndices();
- }
-
- long pc = framePC.getValue().longValue();
- SortedMap<Entry, FrameDescriptionEntry> tailMap = frameDescEntries.tailMap(new IRangeList.Entry(pc, pc));
- if (tailMap.isEmpty())
- return null;
-
- FrameDescriptionEntry entry = tailMap.values().iterator().next();
- if (entry.getCIE() == null) {
- CommonInformationEntry cie = null;
- if (!commonInfoEntries.containsKey(entry.ciePtr)) {
- try {
- cie = reader.parseCommonInfoEntry(entry.ciePtr, entry.addressSize, framePC);
- } catch (IOException e) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_FailedToReadCIE + entry.ciePtr, e);
- }
- commonInfoEntries.put(entry.ciePtr, cie);
- } else {
- cie = commonInfoEntries.get(entry.ciePtr);
- }
- entry.setCIE(cie);
- }
-
- return entry;
- }
-
- /**
- * @return
- */
- public IFrameRegisterProvider getFrameRegisterProvider() {
- return frameRegisterProvider;
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider#getTypesByName(java.lang.String)
- */
- public Collection<IType> getTypesByName(String name) {
- // is name has "struct", "class" or "union", search without that
- name = name.trim();
-
- String baseName = name;
- TypeAggregate aggregate = TypeAggregate.None;
-
- if (baseName.startsWith("class ")) { //$NON-NLS-1$
- aggregate = TypeAggregate.Class;
- baseName = baseName.replace("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- } else if (baseName.startsWith("struct ")) { //$NON-NLS-1$
- aggregate = TypeAggregate.Struct;
- baseName = baseName.replace("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- } else if (baseName.startsWith("union ")) { //$NON-NLS-1$
- aggregate = TypeAggregate.Union;
- baseName = baseName.replace("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- Collection<IType> types = typesByName.get(baseName);
-
- String templateName = null;
- String templateName2 = null;
-
- if (types == null) {
- // if we didn't match and this is a template name,
- // remove extra spaces and composite type names
- if (baseName.indexOf('<') != -1) {
- templateName = baseName;
-
- while (templateName.contains(" ")) //$NON-NLS-1$
- templateName = templateName.replaceAll(" ", " "); //$NON-NLS-1$ //$NON-NLS-2$
- templateName = templateName.replaceAll(", ", ","); //$NON-NLS-1$ //$NON-NLS-2$
- templateName = templateName.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- templateName = templateName.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- templateName = templateName.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
- types = typesByName.get(templateName);
-
- // template name without "<...>", rather than with "<...>", might match
- if (types == null) {
- templateName2 = templateName.substring(0, templateName.indexOf('<'));
-
- types = typesByName.get(templateName2);
-
- // screen out types whose template list does not match
- if (types != null) {
- ArrayList<IType> matchingTypes = null;
- for (Iterator<IType> it = types.iterator(); it.hasNext(); ) {
- IType nextType = it.next();
- String match = nextType.getName();
- // for templates, remove composite type names (e.g., "class")
- match = match.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- match = match.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- match = match.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
- if (match.equals(templateName)) {
- if (matchingTypes == null)
- matchingTypes = new ArrayList<IType>(types.size());
- matchingTypes.add(nextType);
- }
- }
- types = matchingTypes; // may be null
- }
- }
- }
-
- if (types == null) {
- // Maybe we optimistically searched for relevant types;
- // if that fails, do the full parse of types now
- if (!parsedForTypes) {
- ensureParsedForTypes();
- types = getTypesByName(baseName);
- if (types != null)
- return types; // non-template return
-
- if (baseName.indexOf('<') != -1) {
- types = typesByName.get(templateName);
- if (types == null)
- types = typesByName.get(templateName2);
- else
- templateName2 = null; // did not match name without "<...>"
- }
- }
-
- if (types == null)
- return new ArrayList<IType>(0);
- }
- }
-
- // screen out types whose template list does not match
- if (templateName2 != null) {
- ArrayList<IType> matchingTypes = new ArrayList<IType>(types.size());
- for (Iterator<IType> it = types.iterator(); it.hasNext(); ) { // types can't be null
- IType nextType = it.next();
- String match = nextType.getName();
- // for templates, remove composite type names (e.g., "class")
- match = match.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- match = match.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- match = match.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
- if (match.equals(templateName))
- matchingTypes.add(nextType);
- }
- types = matchingTypes;
- }
-
- // make sure that the aggregate type matches as well as the name
- if (aggregate == TypeAggregate.None)
- return Collections.unmodifiableCollection(types);
-
- Iterator<IType> itr = types.iterator();
- while (itr.hasNext()) {
- IType nextType = itr.next();
- if ((aggregate == TypeAggregate.Class && !nextType.getName().contains("class ")) || //$NON-NLS-1$
- (aggregate == TypeAggregate.Struct && !nextType.getName().contains("struct ")) || //$NON-NLS-1$
- (aggregate == TypeAggregate.Union && !nextType.getName().contains("union "))) //$NON-NLS-1$
- types.remove(nextType);
- }
-
- if (types.isEmpty())
- return new ArrayList<IType>(0);
-
- return Collections.unmodifiableCollection(types);
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - Refactored ForwardTypeReference to separate top-level class
+ * Optimized fetchCompileUnitHeader()
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.WeakHashMap;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
+import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.CommonInformationEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.FrameDescriptionEntry;
+import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList.Entry;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * This class handles the low-level aspects of reading DWARF data.
+ * There exists one provider per symbol file.
+ */
+public class DwarfDebugInfoProvider implements IDebugInfoProvider {
+
+ static public class CompilationUnitHeader {
+ int length;
+ short version;
+ int abbreviationOffset;
+ byte addressSize;
+ int debugInfoOffset;
+ DwarfCompileUnit scope;
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("Offset: " + debugInfoOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append("Length: " + length).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append("Version: " + version).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append("Abbreviation: " + abbreviationOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append("Address size: " + addressSize).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ return sb.toString();
+ }
+ }
+
+ static class AbbreviationEntry {
+ short tag;
+ ArrayList<Attribute> attributes;
+ boolean hasChildren;
+
+ AbbreviationEntry(long code, short tag, boolean hasChildren) {
+ // abbreviation code not stored
+ this.tag = tag;
+ this.hasChildren = hasChildren;
+ attributes = new ArrayList<Attribute>();
+ }
+ }
+
+ static class Attribute {
+ short tag;
+ byte form;
+
+ Attribute(short tag, byte form) {
+ this.tag = tag;
+ this.form = form;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("tag: " + Long.toHexString(tag)); //$NON-NLS-1$
+ sb.append(" form: " + Long.toHexString(form)); //$NON-NLS-1$
+ return sb.toString();
+ }
+ }
+
+ static class AttributeValue {
+ private Object value;
+
+ // for indirect form, this is the actual form
+ private byte actualForm;
+
+ AttributeValue(byte form, IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) {
+ actualForm = form;
+
+ try {
+ value = readAttribute(in, addressSize, debugStrings);
+ } catch (IOException e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ if (value != null) {
+ Class<? extends Object> clazz = value.getClass();
+ if (clazz.isArray()) {
+ int len = Array.getLength(value);
+ sb.append(len).append(' ');
+ sb.append(clazz.getComponentType().toString());
+ sb.append(':');
+ for (int i = 0; i < len; i++) {
+ byte b = Array.getByte(value, i);
+ sb.append(' ').append(Integer.toHexString(b));
+ }
+ } else {
+ if (value instanceof Number) {
+ Number n = (Number) value;
+ sb.append(Long.toHexString(n.longValue()));
+ } else if (value instanceof String) {
+ sb.append(value);
+ } else {
+ sb.append(value);
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ private Object readAttribute(IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) throws IOException {
+ Object obj = null;
+ switch (actualForm) {
+ case DwarfConstants.DW_FORM_addr:
+ case DwarfConstants.DW_FORM_ref_addr:
+ obj = DwarfInfoReader.readAddress(in, addressSize);
+ break;
+
+ case DwarfConstants.DW_FORM_block: {
+ int size = (int) DwarfInfoReader.read_unsigned_leb128(in);
+ byte[] bytes = new byte[size];
+ in.get(bytes);
+ obj = bytes;
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block1: {
+ int size = in.get() & 0xff;
+ byte[] bytes = new byte[size];
+ in.get(bytes);
+ obj = bytes;
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block2: {
+ int size = in.getShort();
+ byte[] bytes = new byte[size];
+ in.get(bytes);
+ obj = bytes;
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block4: {
+ int size = in.getInt();
+ byte[] bytes = new byte[size];
+ in.get(bytes);
+ obj = bytes;
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_data1:
+ obj = new Byte(in.get());
+ break;
+
+ case DwarfConstants.DW_FORM_data2:
+ obj = new Short(in.getShort());
+ break;
+
+ case DwarfConstants.DW_FORM_data4:
+ obj = new Integer(in.getInt());
+ break;
+
+ case DwarfConstants.DW_FORM_data8:
+ obj = new Long(in.getLong());
+ break;
+
+ case DwarfConstants.DW_FORM_sdata:
+ obj = new Long(DwarfInfoReader.read_signed_leb128(in));
+ break;
+
+ case DwarfConstants.DW_FORM_udata:
+ obj = new Long(DwarfInfoReader.read_unsigned_leb128(in));
+ break;
+
+ case DwarfConstants.DW_FORM_string: {
+ int c;
+ StringBuffer sb = new StringBuffer();
+ while ((c = (in.get() & 0xff)) != -1) {
+ if (c == 0) {
+ break;
+ }
+ sb.append((char) c);
+ }
+ obj = sb.toString();
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_flag:
+ obj = new Byte(in.get());
+ break;
+
+ case DwarfConstants.DW_FORM_strp: {
+ int offset = in.getInt();
+ if (debugStrings == null) {
+ obj = new String();
+ } else if (offset < 0 || offset > debugStrings.capacity()) {
+ obj = new String();
+ } else {
+ debugStrings.position(offset);
+ obj = DwarfInfoReader.readString(debugStrings);
+ }
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_ref1:
+ obj = new Integer(in.get() & 0xff);
+ break;
+
+ case DwarfConstants.DW_FORM_ref2:
+ obj = new Integer(in.getShort() & 0xffff);
+ break;
+
+ case DwarfConstants.DW_FORM_ref4:
+ obj = new Integer(in.getInt());
+ break;
+
+ case DwarfConstants.DW_FORM_ref8:
+ obj = new Long(in.getLong());
+ break;
+
+ case DwarfConstants.DW_FORM_ref_udata:
+ obj = new Long(DwarfInfoReader.read_unsigned_leb128(in));
+ break;
+
+ case DwarfConstants.DW_FORM_indirect: {
+ actualForm = (byte) DwarfInfoReader.read_unsigned_leb128(in);
+ return readAttribute(in, addressSize, debugStrings);
+ }
+
+ default:
+ assert (false);
+ break;
+ }
+
+ return obj;
+ }
+
+ /**
+ * @param attr
+ * @param in
+ * @param addressSize
+ * @param debugStrings
+ */
+ public static void skipAttributeValue(short form, IStreamBuffer in,
+ byte addressSize) throws IOException {
+ switch (form) {
+ case DwarfConstants.DW_FORM_addr:
+ case DwarfConstants.DW_FORM_ref_addr:
+ in.position(in.position() + addressSize);
+ break;
+
+ case DwarfConstants.DW_FORM_block: {
+ int size = (int) DwarfInfoReader.read_unsigned_leb128(in);
+ in.position(in.position() + size);
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block1: {
+ int size = in.get() & 0xff;
+ in.position(in.position() + size);
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block2: {
+ int size = in.getShort();
+ in.position(in.position() + size);
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_block4: {
+ int size = in.getInt();
+ in.position(in.position() + size);
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_data1:
+ in.position(in.position() + 1);
+ break;
+
+ case DwarfConstants.DW_FORM_data2:
+ in.position(in.position() + 2);
+ break;
+
+ case DwarfConstants.DW_FORM_data4:
+ in.position(in.position() + 4);
+ break;
+
+ case DwarfConstants.DW_FORM_data8:
+ in.position(in.position() + 8);
+ break;
+
+ case DwarfConstants.DW_FORM_sdata:
+ DwarfInfoReader.read_signed_leb128(in);
+ break;
+
+ case DwarfConstants.DW_FORM_udata:
+ DwarfInfoReader.read_unsigned_leb128(in);
+ break;
+
+ case DwarfConstants.DW_FORM_string: {
+ int c;
+ while ((c = (in.get() & 0xff)) != -1) {
+ if (c == 0) {
+ break;
+ }
+ }
+ }
+ break;
+
+ case DwarfConstants.DW_FORM_flag:
+ in.position(in.position() + 1);
+ break;
+
+ case DwarfConstants.DW_FORM_strp:
+ in.position(in.position() + 4);
+ break;
+
+ case DwarfConstants.DW_FORM_ref1:
+ in.position(in.position() + 1);
+ break;
+
+ case DwarfConstants.DW_FORM_ref2:
+ in.position(in.position() + 2);
+ break;
+
+ case DwarfConstants.DW_FORM_ref4:
+ in.position(in.position() + 4);
+ break;
+
+ case DwarfConstants.DW_FORM_ref8:
+ in.position(in.position() + 8);
+ break;
+
+ case DwarfConstants.DW_FORM_ref_udata:
+ DwarfInfoReader.read_unsigned_leb128(in);
+ break;
+
+ case DwarfConstants.DW_FORM_indirect: {
+ form = (short) DwarfInfoReader.read_unsigned_leb128(in);
+ skipAttributeValue(form, in, addressSize);
+ break;
+ }
+
+ default:
+ assert (false);
+ break;
+ }
+ }
+
+ /**
+ * Parse attributes and then skip to sibling, if any
+ *
+ * @param names array to hold up to two names
+ * @param entry debug info entry
+ * @param in buffer stream of debug info
+ * @param addressSize
+ * @param debugStrings
+ * @return DW_AT_name value, or null if there is no or invalid DW_AT_name attribute
+ */
+ public static void skipAttributesToSibling(AbbreviationEntry entry, IStreamBuffer in, byte addressSize) {
+
+ long sibling = -1;
+
+ // go through the attributes and throw away everything except the sibling
+ int len = entry.attributes.size();
+ for (int i = 0; i < len; i++) {
+ Attribute attr = entry.attributes.get(i);
+ try {
+ if (attr.tag == DwarfConstants.DW_AT_sibling) {
+ if (attr.form == DwarfConstants.DW_FORM_ref_udata) {
+ sibling = DwarfInfoReader.read_unsigned_leb128(in);
+ } else if (attr.form == DwarfConstants.DW_FORM_ref4) {
+ sibling = in.getInt();
+ } else {
+ // TODO: allow other forms for sibling value
+ AttributeValue.skipAttributeValue(attr.form, in, addressSize);
+ }
+ } else {
+ AttributeValue.skipAttributeValue(attr.form, in, addressSize);
+ }
+ } catch (IOException e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ break;
+ }
+ }
+
+ if (sibling != -1)
+ in.position(sibling);
+ }
+
+
+ public byte getActualForm() {
+ return actualForm;
+ }
+
+ /**
+ * Get the value as a 64-bit signed long, sign-extending any shorter attribute
+ * @return value as signed long
+ */
+ public long getValueAsSignedLong() {
+ if (value instanceof Number) {
+ return ((Number) value).longValue();
+ }
+ return 0;
+ }
+
+ /**
+ * Get the value as a 64-bit long.
+ *
+ * A Byte, Short, or Integer is zero-extended.
+ *
+ * @return value as long
+ */
+ public long getValueAsLong() {
+ if (value instanceof Byte) {
+ return ((Byte) value).byteValue() & 0xff;
+ }
+ if (value instanceof Short) {
+ return ((Short) value).shortValue() & 0xffff;
+ }
+ if (value instanceof Integer) {
+ return ((Integer) value).intValue() & 0xffffffff;
+ }
+ // fallthrough
+ if (value instanceof Number) {
+ return ((Number) value).longValue();
+ }
+ return 0;
+ }
+
+ /**
+ * Get the value as a 32-bit int.
+ *
+ * A Byte or Short is zero-extended.
+ *
+ * @return value as int
+ */
+ public int getValueAsInt() {
+ if (value instanceof Byte) {
+ return ((Byte) value).byteValue() & 0xff;
+ }
+ if (value instanceof Short) {
+ return ((Short) value).shortValue() & 0xffff;
+ }
+ // fallthrough
+ if (value instanceof Number) {
+ return ((Number) value).intValue();
+ }
+ return 0;
+ }
+
+ /**
+ * Get the value as a string
+ * @return String or "" if not a string
+ */
+ public String getValueAsString() {
+ if (value != null)
+ return value.toString();
+ return null;
+ }
+
+ /**
+ * Get the byte array value (which is empty if this is not a byte array)
+ * @return array
+ */
+ public byte[] getValueAsBytes() {
+ if (value instanceof byte[])
+ return (byte[]) value;
+ return new byte[0];
+ }
+ }
+
+ static public class AttributeList {
+
+ Map<Short, AttributeValue> attributeMap;
+
+ AttributeList(AbbreviationEntry entry, IStreamBuffer in, byte addressSize, IStreamBuffer debugStrings) {
+
+ int len = entry.attributes.size();
+ attributeMap = new HashMap<Short, AttributeValue>(len);
+ for (int i = 0; i < len; i++) {
+ Attribute attr = entry.attributes.get(i);
+ attributeMap.put(Short.valueOf(attr.tag), new AttributeValue(attr.form, in, addressSize, debugStrings));
+ }
+
+ }
+
+ public static void skipAttributes(AbbreviationEntry entry, IStreamBuffer in, byte addressSize) {
+
+ int len = entry.attributes.size();
+ for (int i = 0; i < len; i++) {
+ Attribute attr = entry.attributes.get(i);
+ try {
+ AttributeValue.skipAttributeValue(attr.form, in, addressSize);
+ } catch (IOException e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ break;
+ }
+ }
+
+ }
+
+ public long getAttributeValueAsLong(short attributeName) {
+ AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
+ if (attr != null) {
+ return attr.getValueAsLong();
+ }
+ return 0;
+ }
+
+ public int getAttributeValueAsInt(short attributeName) {
+ AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
+ if (attr != null) {
+ return attr.getValueAsInt();
+ }
+ return 0;
+ }
+
+
+ public long getAttributeValueAsSignedLong(short attributeName) {
+ AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
+ if (attr != null) {
+ return attr.getValueAsSignedLong();
+ }
+ return 0;
+ }
+
+ public String getAttributeValueAsString(short attributeName) {
+ AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
+ if (attr != null) {
+ return attr.getValueAsString();
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ public byte[] getAttributeValueAsBytes(short attributeName) {
+ AttributeValue attr = attributeMap.get(Short.valueOf(attributeName));
+ if (attr != null) {
+ return attr.getValueAsBytes();
+ }
+ return new byte[0];
+ }
+
+ public AttributeValue getAttribute(short attributeName) {
+ return attributeMap.get(Short.valueOf(attributeName));
+ }
+
+ /**
+ * Tell whether the attributes do not have a code range.
+ * <p>
+ * Note: a singular DW_AT_low_pc means an entry point
+ * <p>
+ * Also note: a compile unit can have code represented by DW_AT_stmt_list
+ * @return true if the attributes represent code
+ */
+ public boolean hasCodeRangeAttributes() {
+ return attributeMap.containsKey(DwarfConstants.DW_AT_high_pc)
+ || attributeMap.containsKey(DwarfConstants.DW_AT_ranges);
+ }
+ }
+
+ static public class PublicNameInfo {
+ public final String nameWithNameSpace;
+ public final CompilationUnitHeader cuHeader;
+ public final short tag; // DW_TAG_xxx
+
+ public PublicNameInfo(String nameWithNameSpace, CompilationUnitHeader cuHeader, short tag) {
+ this.nameWithNameSpace = nameWithNameSpace;
+ this.cuHeader = cuHeader;
+ this.tag = tag;
+ }
+ }
+
+ // list of compilation units per source file
+ protected HashMap<IPath, List<ICompileUnitScope>> compileUnitsPerFile = new HashMap<IPath, List<ICompileUnitScope>>();
+
+ // list of compile units in .debug_info order
+ protected ArrayList<DwarfCompileUnit> compileUnits = new ArrayList<DwarfCompileUnit>();
+
+ // list of compile units with code (non-zero high address), sorted by low address
+ protected ArrayList<DwarfCompileUnit> sortedCompileUnitsWithCode = new ArrayList<DwarfCompileUnit>();
+
+ // function and type declarations can be referenced by offsets relative to
+ // the compile unit or to the entire .debug_info section. therefore we keep
+ // maps by .debug_info offset, and for compile unit relative offsets, we
+ // just add the compile unit offset into the .debug_info section.
+ protected Map<Long, AttributeList> functionsByOffset = new HashMap<Long, AttributeList>();
+ protected Map<Long, IType> typesByOffset = Collections.synchronizedMap(new HashMap<Long, IType>());
+ // These references may eventually become pointless so weak reference them
+ protected Map<Long, IForwardTypeReference> referenceTypesByOffset
+ = Collections.synchronizedMap(new WeakHashMap<Long, IForwardTypeReference>());
+
+ // for casting to a type, keep certain types by name
+ protected Map<String, List<IType>> typesByName = new HashMap<String, List<IType>>();
+ // for casting to a type, track whether the cast name includes an aggregate designator
+ enum TypeAggregate { Class, Struct, Union, None };
+
+ // map of entities which created scopes
+ protected Map<Long, Scope> scopesByOffset = new HashMap<Long, Scope>();
+
+ // entry points for CUs in the .debug_info section, used to dynamically parse CUs as needed
+ protected TreeMap<Long, CompilationUnitHeader> debugOffsetsToCompileUnits = new TreeMap<Long, CompilationUnitHeader>();
+
+ // forward references for tags we have not parsed yet. (These will go into typesByOffset once handled)
+ //Map<Long, ForwardDwarfDefinition> forwardDwarfDefinitions = new HashMap<Long, ForwardDwarfDefinition>();
+
+ // these are just for faster lookups
+ protected Map<String, List<IFunctionScope>> functionsByName = new HashMap<String, List<IFunctionScope>>();
+ protected Map<String, List<IVariable>> variablesByName = new HashMap<String, List<IVariable>>();
+ protected Map<String, List<PublicNameInfo>> publicFunctions = new HashMap<String, List<PublicNameInfo>>();
+ protected Map<String, List<PublicNameInfo>> publicVariables = new HashMap<String, List<PublicNameInfo>>();
+
+ // abbreviation tables (lists of abbrev entries), mapped by .debug_abbrev offset
+ protected Map<Integer, Map<Long, AbbreviationEntry>> abbreviationMaps = new HashMap<Integer, Map<Long, AbbreviationEntry>>();
+
+ // mapping of PC range to frame description entries
+ protected TreeMap<IRangeList.Entry, FrameDescriptionEntry> frameDescEntries = new TreeMap<IRangeList.Entry, FrameDescriptionEntry>();
+ // mapping of CIE offsets to parsed common info entries
+ protected Map<Long, CommonInformationEntry> commonInfoEntries = new HashMap<Long, CommonInformationEntry>();
+
+
+ protected Set<String> referencedFiles = new HashSet<String>();
+ protected boolean buildReferencedFilesList = true;
+
+ private IPath symbolFilePath;
+ private long symbolFileLastModified;
+ private boolean parsedInitially = false;
+ private boolean parsedForVarsAndAddresses = false;
+ private boolean parsedForScopesAndAddresses = false;
+ private boolean parsedForTypes = false;
+ private boolean parsedForGlobalVars = false;
+
+ private final IExecutableSymbolicsReader exeReader;
+ private final DwarfModuleScope moduleScope;
+
+ final DwarfFileHelper fileHelper;
+
+ private IFrameRegisterProvider frameRegisterProvider;
+
+ private static String SOURCE_FILES_CACHE = "_source_files"; //$NON-NLS-1$
+
+ public DwarfDebugInfoProvider(IExecutableSymbolicsReader exeReader) {
+ this.exeReader = exeReader;
+ this.symbolFilePath = exeReader.getSymbolFile();
+ this.symbolFileLastModified = symbolFilePath.toFile().lastModified();
+ this.moduleScope = new DwarfModuleScope(this);
+ this.fileHelper = new DwarfFileHelper(symbolFilePath);
+ this.frameRegisterProvider = new DwarfFrameRegisterProvider(this);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return DwarfMessages.DwarfDebugInfoProvider_DwarfProviderFor + symbolFilePath;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IDebugInfoProvider#dispose()
+ */
+ public void dispose() {
+ // several views in DSF hold onto all our debug info,
+ // so go through and explicitly break links
+ if (moduleScope != null) {
+ moduleScope.dispose();
+ }
+
+ // help GC
+ compileUnitsPerFile.clear();
+ compileUnits.clear();
+ functionsByOffset.clear();
+ typesByOffset.clear();
+ referenceTypesByOffset.clear();
+ scopesByOffset.clear();
+ debugOffsetsToCompileUnits.clear();
+ functionsByName.clear();
+ variablesByName.clear();
+ publicFunctions.clear();
+ publicVariables.clear();
+ abbreviationMaps.clear();
+ referencedFiles.clear();
+ parsedInitially = false;
+ parsedForTypes = false;
+ parsedForVarsAndAddresses = false;
+ parsedForScopesAndAddresses = false;
+
+ fileHelper.dispose();
+ frameRegisterProvider.dispose();
+ }
+
+ void ensureParsedInitially() {
+ if (!parsedInitially) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ parsedInitially = true;
+ reader.parseInitial();
+ }
+ }
+
+ void ensureParsedForScopes() {
+ if (!parsedForScopesAndAddresses) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ if (!parsedInitially) {
+ parsedInitially = true;
+ reader.parseInitial();
+ }
+ parsedForScopesAndAddresses = true;
+ reader.parseForAddresses(false);
+ }
+ }
+
+ void ensureParsedForScope(IAddress linkAddress) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ if (!parsedInitially) {
+ parsedInitially = true;
+ reader.parseInitial();
+ }
+ reader.parseForAddress(linkAddress);
+ }
+
+ void ensureParsedForVariables() {
+ if (!parsedForVarsAndAddresses) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ if (!parsedInitially) {
+ parsedInitially = true;
+ reader.parseInitial();
+ }
+ parsedForVarsAndAddresses = true;
+ reader.parseForAddresses(true);
+ }
+ }
+
+ private void ensureParsedForGlobalVariables() {
+ if (parsedForGlobalVars)
+ return;
+ parsedForGlobalVars = true;
+
+ if (publicVariables.size() == 0)
+ return;
+
+ // determine compilation units containing globals
+ HashSet<CompilationUnitHeader> cuWithGlobalsArray = new HashSet<CompilationUnitHeader>(publicVariables.size());
+ for (List<PublicNameInfo> infoList : publicVariables.values()) {
+ for (PublicNameInfo info : infoList) {
+ cuWithGlobalsArray.add(info.cuHeader);
+ }
+ }
+
+ // parse compilation units containing global variables
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ for (CompilationUnitHeader cuHeader : cuWithGlobalsArray)
+ reader.parseCompilationUnitForAddresses(cuHeader.scope);
+ }
+
+ void ensureParsedForTypes() {
+ if (!parsedForTypes) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ if (!parsedInitially) {
+ parsedInitially = true;
+ reader.parseInitial();
+ }
+ parsedForTypes = true;
+ reader.parseForTypes();
+ }
+ }
+
+ public void setParsedInitially() {
+ parsedInitially = true;
+ }
+
+ public void setParsedForAddresses() {
+ parsedForVarsAndAddresses = true;
+ }
+
+ public IPath getSymbolFile() {
+ return symbolFilePath;
+ }
+
+ public IModuleScope getModuleScope() {
+ return moduleScope;
+ }
+
+ public IAddress getBaseLinkAddress() {
+ return exeReader.getBaseLinkAddress();
+ }
+
+ public Collection<IFunctionScope> getFunctionsByName(String name) {
+ List<IFunctionScope> result;
+
+ ensureParsedInitially();
+
+ String baseName = name;
+
+ /* use same semantics as before, where qualified name lookups would fail
+ // pubnames uses qualified names but is indexed by basename
+ if (name != null) {
+ int baseStart = name.lastIndexOf("::");
+ if (baseStart != -1)
+ baseName = name.substring(baseStart + 2);
+ }
+ */
+
+ // first, match against public function names
+ if (publicFunctions.size() > 0) {
+ if (name != null) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ List<PublicNameInfo> nameMatches = publicFunctions.get(baseName);
+
+ if (nameMatches != null) {
+ // parse the compilation units that have matches
+ if (nameMatches.size() == 1) { // quick usual case
+ reader.parseCompilationUnitForAddresses(nameMatches.get(0).cuHeader.scope);
+ } else {
+ ArrayList<DwarfCompileUnit> cuList = new ArrayList<DwarfCompileUnit>();
+
+ for (PublicNameInfo info : nameMatches) {
+ if (!cuList.contains(info.cuHeader.scope)) {
+ cuList.add(info.cuHeader.scope);
+ }
+ }
+
+ for (DwarfCompileUnit cu : cuList) {
+ reader.parseCompilationUnitForAddresses(cu);
+ }
+ }
+ } else {
+ // not a public name, so parse all compilation units looking for functions
+ ensureParsedForScopes();
+ }
+ } else {
+ // name is null, so parse all compilation units looking for functions
+ ensureParsedForScopes();
+ }
+ } else {
+ // no public names, so parse all compilation units looking for functions
+ ensureParsedForScopes();
+ }
+
+ if (name != null) {
+ result = functionsByName.get(baseName);
+ if (result == null)
+ return new ArrayList<IFunctionScope>(0);
+ } else {
+ result = new ArrayList<IFunctionScope>(functionsByName.size()); // at least this big
+ for (List<IFunctionScope> functions : functionsByName.values())
+ result.addAll(functions);
+ ((ArrayList<IFunctionScope>) result).trimToSize();
+ }
+ return Collections.unmodifiableCollection(result);
+ }
+
+ public Collection<IVariable> getVariablesByName(String name, boolean globalsOnly) {
+ List<IVariable> result;
+
+ ensureParsedInitially();
+
+ if (name == null) {
+ if (publicVariables.size() > 0) {
+ // name is null, so parse all compilation units looking for variables
+ if (globalsOnly)
+ ensureParsedForGlobalVariables();
+ else
+ ensureParsedForVariables();
+ }
+
+ result = new ArrayList<IVariable>(variablesByName.size()); // at least this big
+ for (List<IVariable> variables : variablesByName.values())
+ result.addAll(variables);
+
+ } else {
+ String baseName = name;
+ int baseNameStart = name.lastIndexOf("::"); //$NON-NLS-1$
+ if (baseNameStart != -1)
+ baseName = name.substring(baseNameStart + 2);
+
+ // match against public variable names, which the initial parse populated
+ if (publicVariables.size() > 0) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ List<PublicNameInfo> nameMatches = publicVariables.get(baseName);
+
+ if (nameMatches != null) {
+ // parse the compilation units that have matches
+ if (nameMatches.size() == 1) { // quick usual case
+ reader.parseCompilationUnitForAddresses(nameMatches.get(0).cuHeader.scope);
+ } else {
+ ArrayList<DwarfCompileUnit> cuList = new ArrayList<DwarfCompileUnit>();
+
+ for (PublicNameInfo info : nameMatches) {
+ if (!cuList.contains(info.cuHeader.scope)) {
+ cuList.add(info.cuHeader.scope);
+ }
+ }
+
+ for (DwarfCompileUnit cu : cuList) {
+ reader.parseCompilationUnitForAddresses(cu);
+ }
+ }
+ } else {
+ // not a public name, so parse all compilation units looking for variables
+ if (!globalsOnly)
+ ensureParsedForVariables();
+ }
+ }
+
+ result = variablesByName.get(name);
+
+ // check against unqualified name because RVCT 2.x did not include namespace
+ // info for globals that are inside namespaces
+ if (result == null && baseNameStart != -1)
+ result = variablesByName.get(baseName);
+
+ if (result == null)
+ return new ArrayList<IVariable>(0);
+ }
+
+ if (globalsOnly) {
+ filterOutLocalVariables(result);
+ }
+
+ return Collections.unmodifiableCollection(result);
+ }
+
+ private void filterOutLocalVariables(List<IVariable> variables) {
+ List<IVariable> allVariables = new ArrayList<IVariable>(variables);
+ for (IVariable var : allVariables) {
+ if (!(var.getScope() instanceof ICompileUnitScope)) {
+ variables.remove(var);
+ }
+ }
+ }
+
+ /**
+ * @return the publicFunctions
+ */
+ public Map<String, List<PublicNameInfo>> getPublicFunctions() {
+ ensureParsedInitially();
+ return publicFunctions;
+ }
+ /**
+ * @return the publicVariables
+ */
+ public Map<String, List<PublicNameInfo>> getPublicVariables() {
+ ensureParsedInitially();
+ return publicVariables;
+ }
+
+ public ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress) {
+ ensureParsedForScope(linkAddress);
+
+ IScope scope = moduleScope.getScopeAtAddress(linkAddress);
+ while (scope != null && !(scope instanceof ICompileUnitScope)) {
+ scope = scope.getParent();
+ }
+
+ return (ICompileUnitScope) scope;
+ }
+
+ public List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath) {
+ ensureParsedInitially();
+
+ List<ICompileUnitScope> cuList = compileUnitsPerFile.get(filePath);
+
+ if (cuList != null)
+ return cuList;
+
+ // FIXME: we need a looser check here: on Windows, we added drive letters to all
+ // paths before populating compileUnitsPerFile, even if there is not really a
+ // drive (see DwarFileHelper).
+ for (Map.Entry<IPath, List<ICompileUnitScope>> entry : compileUnitsPerFile.entrySet()) {
+ if (entry.getKey().setDevice(null).equals(filePath.setDevice(null))) {
+ return entry.getValue();
+ }
+ }
+
+ return Collections.emptyList();
+ }
+
+ @SuppressWarnings("unchecked")
+ public String[] getSourceFiles(IProgressMonitor monitor) {
+ if (referencedFiles.isEmpty()) {
+ // Check the persistent cache
+ String cacheKey = getSymbolFile().toOSString() + SOURCE_FILES_CACHE;
+ Set<String> cachedFiles = EDCDebugger.getDefault().getCache().getCachedData(cacheKey, Set.class, symbolFileLastModified);
+ if (cachedFiles == null)
+ {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ reader.quickParseDebugInfo(monitor);
+ assert referencedFiles.size() > 0;
+ EDCDebugger.getDefault().getCache().putCachedData(cacheKey, new HashSet<String>(referencedFiles), symbolFileLastModified);
+ }
+ else
+ referencedFiles = cachedFiles;
+ }
+
+ return referencedFiles.toArray(new String[referencedFiles.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IDebugInfoProvider#getTypes()
+ */
+ public Collection<IType> getTypes() {
+ ensureParsedForTypes();
+
+ ArrayList<IType> types = new ArrayList<IType>(typesByOffset.values());
+ return types;
+ }
+
+ /////////////////
+
+ // Lazy evaluation methods
+
+
+ /**
+ * Fetch a type lazily. Either we've already parsed the type, or we have
+ * a reference to it, or we can find its compilation unit and parse its types.
+ * We do not fix up cross references until someone asks for
+ * it (e.g. from an IType or IVariable implementation).
+ */
+ public IType readType(long offset_) {
+ Long offset = Long.valueOf(offset_);
+ IType type = typesByOffset.get(offset);
+ if (type == null) {
+ // make sure we've parsed it
+ CompilationUnitHeader header = fetchCompileUnitHeader(offset_);
+ if (header != null) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ reader.parseCompilationUnitForTypes(header.scope);
+ type = typesByOffset.get(offset);
+ // may be unhandled currently
+ if (type == null) {
+ // workaround for GCC-E 3.x bug where some, but not all, type offsets are off by 4
+ // assume if you hit this null case that the problem may be the GCC-E bug
+ type = typesByOffset.get(offset - 4);
+ if (type == null)
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_NotParsingType1 + Long.toHexString(offset_) +
+ DwarfMessages.DwarfDebugInfoProvider_NotParsingType2 + symbolFilePath, null);
+ }
+ } else {
+ // may be unhandled currently
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_CannotResolveCompUnit1 + Long.toHexString(offset_) +
+ DwarfMessages.DwarfDebugInfoProvider_CannotResolveCompUnit2 + symbolFilePath, null);
+ }
+ }
+ return type;
+ }
+
+ /**
+ * Fetch a referenced type lazily.
+ * @param scope
+ */
+ IType resolveTypeReference(ForwardTypeReference ref) {
+ IType type = typesByOffset.get(ref.offset);
+ if (type == null) {
+ type = readType(ref.offset);
+ }
+ return type;
+ }
+ /**
+ * @return
+ */
+ public IExecutableSymbolicsReader getExecutableSymbolicsReader() {
+ return exeReader;
+ }
+
+ /**
+ * Remember where a compilation unit header lives in the debug info.
+ * @param debugInfoOffset
+ * @param currentCUHeader
+ */
+ public void registerCompileUnitHeader(int debugInfoOffset,
+ CompilationUnitHeader currentCUHeader) {
+ debugOffsetsToCompileUnits.put((long) debugInfoOffset, currentCUHeader);
+ }
+
+ /**
+ * Get a compilation unit header that contains the given offset.
+ * @param debugInfoOffset an offset which is on or after a compilation unit's debug offset
+ * @return {@link CompilationUnitHeader} containing the offset
+ */
+ public CompilationUnitHeader fetchCompileUnitHeader(long debugInfoOffset) {
+ CompilationUnitHeader match = debugOffsetsToCompileUnits.get(debugInfoOffset);
+ if (match != null) {
+ return match;
+ }
+
+ // it's inside one
+ SortedMap<Long,CompilationUnitHeader> headMap = debugOffsetsToCompileUnits.headMap(debugInfoOffset);
+ if (!headMap.isEmpty()) {
+ match = headMap.get(headMap.lastKey());
+ return match;
+ }
+
+ // shouldn't get here; most callers will handle null rather badly
+ return null;
+ }
+
+ /**
+ * Get the frame description entry for the given PC
+ * @param framePC
+ * @return FDE or <code>null</code>
+ */
+ public FrameDescriptionEntry findFrameDescriptionEntry(IAddress framePC) {
+ DwarfInfoReader reader = new DwarfInfoReader(this);
+ if (frameDescEntries.isEmpty()) {
+ reader.parseForFrameIndices();
+ }
+
+ long pc = framePC.getValue().longValue();
+ SortedMap<Entry, FrameDescriptionEntry> tailMap = frameDescEntries.tailMap(new IRangeList.Entry(pc, pc));
+ if (tailMap.isEmpty())
+ return null;
+
+ FrameDescriptionEntry entry = tailMap.values().iterator().next();
+ if (entry.getCIE() == null) {
+ CommonInformationEntry cie = null;
+ if (!commonInfoEntries.containsKey(entry.ciePtr)) {
+ try {
+ cie = reader.parseCommonInfoEntry(entry.ciePtr, entry.addressSize, framePC);
+ } catch (IOException e) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfDebugInfoProvider_FailedToReadCIE + entry.ciePtr, e);
+ }
+ commonInfoEntries.put(entry.ciePtr, cie);
+ } else {
+ cie = commonInfoEntries.get(entry.ciePtr);
+ }
+ entry.setCIE(cie);
+ }
+
+ return entry;
+ }
+
+ /**
+ * @return
+ */
+ public IFrameRegisterProvider getFrameRegisterProvider() {
+ return frameRegisterProvider;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IDebugInfoProvider#getTypesByName(java.lang.String)
+ */
+ public Collection<IType> getTypesByName(String name) {
+ // is name has "struct", "class" or "union", search without that
+ name = name.trim();
+
+ String baseName = name;
+ TypeAggregate aggregate = TypeAggregate.None;
+
+ if (baseName.startsWith("class ")) { //$NON-NLS-1$
+ aggregate = TypeAggregate.Class;
+ baseName = baseName.replace("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ } else if (baseName.startsWith("struct ")) { //$NON-NLS-1$
+ aggregate = TypeAggregate.Struct;
+ baseName = baseName.replace("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ } else if (baseName.startsWith("union ")) { //$NON-NLS-1$
+ aggregate = TypeAggregate.Union;
+ baseName = baseName.replace("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ Collection<IType> types = typesByName.get(baseName);
+
+ String templateName = null;
+ String templateName2 = null;
+
+ if (types == null) {
+ // if we didn't match and this is a template name,
+ // remove extra spaces and composite type names
+ if (baseName.indexOf('<') != -1) {
+ templateName = baseName;
+
+ while (templateName.contains(" ")) //$NON-NLS-1$
+ templateName = templateName.replaceAll(" ", " "); //$NON-NLS-1$ //$NON-NLS-2$
+ templateName = templateName.replaceAll(", ", ","); //$NON-NLS-1$ //$NON-NLS-2$
+ templateName = templateName.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ templateName = templateName.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ templateName = templateName.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ types = typesByName.get(templateName);
+
+ // template name without "<...>", rather than with "<...>", might match
+ if (types == null) {
+ templateName2 = templateName.substring(0, templateName.indexOf('<'));
+
+ types = typesByName.get(templateName2);
+
+ // screen out types whose template list does not match
+ if (types != null) {
+ ArrayList<IType> matchingTypes = null;
+ for (Iterator<IType> it = types.iterator(); it.hasNext(); ) {
+ IType nextType = it.next();
+ String match = nextType.getName();
+ // for templates, remove composite type names (e.g., "class")
+ match = match.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ match = match.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ match = match.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (match.equals(templateName)) {
+ if (matchingTypes == null)
+ matchingTypes = new ArrayList<IType>(types.size());
+ matchingTypes.add(nextType);
+ }
+ }
+ types = matchingTypes; // may be null
+ }
+ }
+ }
+
+ if (types == null) {
+ // Maybe we optimistically searched for relevant types;
+ // if that fails, do the full parse of types now
+ if (!parsedForTypes) {
+ ensureParsedForTypes();
+ types = getTypesByName(baseName);
+ if (types != null)
+ return types; // non-template return
+
+ if (baseName.indexOf('<') != -1) {
+ types = typesByName.get(templateName);
+ if (types == null)
+ types = typesByName.get(templateName2);
+ else
+ templateName2 = null; // did not match name without "<...>"
+ }
+ }
+
+ if (types == null)
+ return new ArrayList<IType>(0);
+ }
+ }
+
+ // screen out types whose template list does not match
+ if (templateName2 != null) {
+ ArrayList<IType> matchingTypes = new ArrayList<IType>(types.size());
+ for (Iterator<IType> it = types.iterator(); it.hasNext(); ) { // types can't be null
+ IType nextType = it.next();
+ String match = nextType.getName();
+ // for templates, remove composite type names (e.g., "class")
+ match = match.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ match = match.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ match = match.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (match.equals(templateName))
+ matchingTypes.add(nextType);
+ }
+ types = matchingTypes;
+ }
+
+ // make sure that the aggregate type matches as well as the name
+ if (aggregate == TypeAggregate.None)
+ return Collections.unmodifiableCollection(types);
+
+ Iterator<IType> itr = types.iterator();
+ while (itr.hasNext()) {
+ IType nextType = itr.next();
+ if ((aggregate == TypeAggregate.Class && !nextType.getName().contains("class ")) || //$NON-NLS-1$
+ (aggregate == TypeAggregate.Struct && !nextType.getName().contains("struct ")) || //$NON-NLS-1$
+ (aggregate == TypeAggregate.Union && !nextType.getName().contains("union "))) //$NON-NLS-1$
+ types.remove(nextType);
+ }
+
+ if (types.isEmpty())
+ return new ArrayList<IType>(0);
+
+ return Collections.unmodifiableCollection(types);
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfFileHelper.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfFileHelper.java
index 87ee718..ed3872d 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfFileHelper.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfFileHelper.java
@@ -1,176 +1,208 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.cdt.debug.edc.internal.HostOS;
-import org.eclipse.cdt.debug.edc.internal.PathUtils;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * An instance of this class per DwarfDebugInfoProvider assists in
- * canonicalizing filepaths (from DW_AT_comp_dir and DW_AT_stmt_list)
- */
-public class DwarfFileHelper {
-
- private boolean DEBUG = false;
-
- @SuppressWarnings("unused") // no longer used, but kept for compatibility and possible futureuse
- private final IPath symbolFile;
-
- private Map<String, IPath> compDirAndNameMap;
-
- private int hits;
- private long nextDump;
-
- public DwarfFileHelper(IPath symbolFile) {
- this.symbolFile = symbolFile;
- this.compDirAndNameMap = new HashMap<String, IPath>();
- }
-
- protected String getKey(String compDir, String name) {
- return compDir + "/" + name;
- }
-
- /**
- * This is to combine the given compDir and file name from Dwarf to form a
- * file path. Some processing is done to canonicalize the path, including <br>
- * -- extra path delimiter are removed. <br>
- * -- "a/b/" and "../c/d" are combined to "/a/c/d". <br>
- * -- change path delimiter to native, namely on Windows "/" => "\\" and the
- * opposite on unix/linux
- *
- * @param compDir
- * compDir from dwarf data.
- * @param name
- * file name from dwarf data with full or partial or no path.
- * @return most complete file path that we can get from Dwarf data, which
- * may still be a partial path. Note letter case of the names
- * remains unchanged. Empty string is returned if the given name is
- * an invalid file name, e.g. <internal>.
- *
- */
- public IPath normalizeFilePath(String compDir, String name) {
- if (name == null || name.length() == 0)
- return null;
-
- // don't count the entry "<internal>" from GCCE compiler
- if (name.charAt(0) == '<')
- return null;
-
- // Create a key for doing a lookup in our IPath cache
- String key = getKey(compDir, name);
-
- // Look in the cache
- IPath path = compDirAndNameMap.get(key);
- if (path == null) {
- path = normalizePath(compDir, name);
- compDirAndNameMap.put(key, path);
- } else {
- hits++;
- }
- if (DEBUG && System.currentTimeMillis() > nextDump) {
- System.out.println("DwarfFileHelper entries: " + compDirAndNameMap.size() + "; hits: " + hits);
- nextDump = System.currentTimeMillis() + 1000;
- }
- return path;
- }
-
- /**
- * Takes a DW_AT_comp_dir and a filename from DWARF,
- * canonicalizes it and creates an IPath.
- *
- * @param compDir the compilation directory, as found in DWARF data
- * @param name the file specification, as found in DWARF data
- * @return IPath, never <code>null</code>
- */
- private IPath normalizePath(String compDir, String name) {
-
- String fullName = name;
-
- IPath path = PathUtils.createPath(name);
-
- // Combine dir & name if needed.
- if (!path.isAbsolute() && compDir.length() > 0) {
- fullName = compDir;
- if (!compDir.endsWith(File.separator))
- fullName += File.separatorChar;
- fullName += name;
-
- path = PathUtils.createPath(fullName);
- }
-
- return path;
- }
-
- /**
- * Convert cygwin path and change path delimiter to native.
- * No longer used but left for backwards compatbility.
- *
- * @param path
- * @return
- */
- public IPath fixUpPath(String path) {
- /*
- * translate cygwin drive path like /cygdrive/c/system/main.c
- * //G/System/main.cpp
- */
- boolean isCygwin = false;
- int deleteTill = 0;
-
- // These paths may appear in Cygwin-compiled code, so check on any host
- if (path.length() > 12 && path.startsWith("/cygdrive/") && ('/' == path.charAt(11))) { //$NON-NLS-1$
- isCygwin = true;
- deleteTill = 10;
- }
-
- // These paths may appear in Cygwin-compiled code, so check on any host
- if (path.length() > 4 && path.startsWith("//") && ('/' == path.charAt(3))) { //$NON-NLS-1$
- isCygwin = true;
- deleteTill = 2;
- }
-
- // New-style Cygwin is different and has neither prefix.
- // But this check only makes sense on a Windows host, since
- // it may be a valid Unix-host path.
- //
- // /C/sources/foo.c --> c:\sources\foo.c
- if (HostOS.IS_WIN32 && path.length() > 3
- && path.charAt(0) == '/'
- && Character.isLetter(path.charAt(1))
- && path.charAt(2) == '/') {
- isCygwin = true;
- deleteTill = 1;
- }
-
- if (isCygwin) {
- StringBuilder buf = new StringBuilder(path);
- buf.delete(0, deleteTill);
- buf.insert(1, ':');
- path = buf.toString();
- }
-
- // convert to path on runtime platform
- //
- return PathUtils.createPath(path);
- }
-
- /**
- *
- */
- public void dispose() {
- compDirAndNameMap.clear();
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.edc.internal.HostOS;
+import org.eclipse.cdt.debug.edc.internal.PathUtils;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * An instance of this class per DwarfDebugInfoProvider assists in
+ * canonicalizing filepaths (from DW_AT_comp_dir and DW_AT_stmt_list)
+ */
+public class DwarfFileHelper {
+
+ private boolean DEBUG = false;
+ private final IPath symbolFile;
+ private Map<String, IPath> compDirAndNameMap;
+
+ private int hits;
+ private long nextDump;
+
+ public DwarfFileHelper(IPath symbolFile) {
+ this.symbolFile = symbolFile;
+ this.compDirAndNameMap = new HashMap<String, IPath>();
+ }
+
+ protected String getKey(String compDir, String name) {
+ return compDir + "/" + name;
+ }
+
+ /**
+ * This is to combine the given compDir and file name from Dwarf to form a
+ * file path. Some processing is done including <br>
+ * -- extra path delimiter are removed. <br>
+ * -- "a/b/" and "../c/d" are combined to "/a/c/d". <br>
+ * -- change path delimiter to native, namely on Windows "/" => "\\" and the
+ * opposite on unix/linux. -- special cygwin paths like "/cygdrive/c/f.c"
+ * are converted to standard path like "c:/f.c" <br>
+ *
+ * @param compDir
+ * compDir from dwarf data.
+ * @param name
+ * file name from dwarf data with full or partial or no path.
+ * @return most complete file path that we can get from Dwarf data, which
+ * may still be a partial path. Note letter case of the names
+ * remains unchanged. Empty string is returned if the given name is
+ * not invalid file name, e.g. <internal>.
+ *
+ */
+ public IPath normalizeFilePath(String compDir, String name) {
+ if (name == null || name.length() == 0)
+ return null;
+
+ // don't count the entry "<internal>" from GCCE compiler
+ if (name.charAt(0) == '<')
+ return null;
+
+ String key = getKey(compDir, name);
+
+ IPath path = compDirAndNameMap.get(key);
+ if (path == null) {
+ path = normalizePath(compDir, name);
+ compDirAndNameMap.put(key, path);
+ } else {
+ hits++;
+ }
+ if (DEBUG && System.currentTimeMillis() > nextDump) {
+ System.out.println("DwarfFileHelper entries: " + compDirAndNameMap.size() + "; hits: " + hits);
+ nextDump = System.currentTimeMillis() + 1000;
+ }
+ return path;
+ }
+
+ /**
+ * Engine for taking a DW_AT_comp_dir and a filename from DWARF
+ * and making sure it's canonical and sensible on the host.
+ * @param compDir
+ * @param name
+ * @return IPath, never <code>null</code>
+ */
+ private IPath normalizePath(String compDir, String name) {
+
+ String fullName = name;
+
+ IPath path = PathUtils.createPath(name);
+
+ // Combine dir & name if needed.
+ if (!path.isAbsolute() && compDir.length() > 0) {
+ fullName = compDir;
+ if (!compDir.endsWith(File.separator))
+ fullName += File.separatorChar;
+ fullName += name;
+ }
+
+ // some fix-up like cygwin style path conversion.
+ path = fixUpPath(fullName);
+
+ // For win32 only.
+ // On Windows, there are cases where the source file itself has the full
+ // path except the drive letter.
+
+ // TODO: we need to put the EPOCROOT as a prefix, really, in this case.
+ if (HostOS.IS_WIN32 && path.isAbsolute() && path.getDevice() == null) {
+ IPath dirPa = new Path(compDir); // on Win32, don't need PathUtils#createPath
+ // Try to get drive letter from comp_dir.
+ if (dirPa.getDevice() != null)
+ path = path.setDevice(dirPa.getDevice());
+ else {
+ // No drive from Dwarf data, which is also possible with RVCT or
+ // GCCE compilers for ARM. A practically good solution is to
+ // assume
+ // drive of the exe file as the drive. Though it's not good in
+ // theory, it does not hurt when the assumption is wrong, as
+ // user still
+ // has the option to locate the file manually...03/15/07
+ String exeWinVolume = symbolFile.getDevice();
+ if (exeWinVolume != null && exeWinVolume.length() > 0) {
+ path = path.setDevice(exeWinVolume);
+ }
+ }
+ }
+
+ // If drive is missing, use current directory (TODO: don't!) and
+ // canonicalize the path for any match on the filesystem.
+ //
+ if (path.isAbsolute() && (HostOS.IS_WIN32 || path.getDevice() == null)) {
+ try {
+ path = new Path(path.toFile().getCanonicalPath());
+ } catch (IOException e) {
+ }
+ }
+
+ return path;
+ }
+
+ /**
+ * Convert cygwin path and change path delimiter to native.
+ *
+ * @param path
+ * @return
+ */
+ public IPath fixUpPath(String path) {
+ /*
+ * translate cygwin drive path like /cygdrive/c/system/main.c
+ * //G/System/main.cpp
+ */
+ boolean isCygwin = false;
+ int deleteTill = 0;
+
+ // These paths may appear in Cygwin-compiled code, so check on any host
+ if (path.length() > 12 && path.startsWith("/cygdrive/") && ('/' == path.charAt(11))) { //$NON-NLS-1$
+ isCygwin = true;
+ deleteTill = 10;
+ }
+
+ // These paths may appear in Cygwin-compiled code, so check on any host
+ if (path.length() > 4 && path.startsWith("//") && ('/' == path.charAt(3))) { //$NON-NLS-1$
+ isCygwin = true;
+ deleteTill = 2;
+ }
+
+ // New-style Cygwin is different and has neither prefix.
+ // But this check only makes sense on a Windows host, since
+ // it may be a valid Unix-host path.
+ //
+ // /C/sources/foo.c --> c:\sources\foo.c
+ if (HostOS.IS_WIN32 && path.length() > 3
+ && path.charAt(0) == '/'
+ && Character.isLetter(path.charAt(1))
+ && path.charAt(2) == '/') {
+ isCygwin = true;
+ deleteTill = 1;
+ }
+
+ if (isCygwin) {
+ StringBuilder buf = new StringBuilder(path);
+ buf.delete(0, deleteTill);
+ buf.insert(1, ':');
+ path = buf.toString();
+ }
+
+ // convert to path on runtime platform
+ //
+ return PathUtils.createPath(path);
+ }
+
+ /**
+ *
+ */
+ public void dispose() {
+ compDirAndNameMap.clear();
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfInfoReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfInfoReader.java
index f491295..674f4c5 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfInfoReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfInfoReader.java
@@ -1,3370 +1,3391 @@
-/**
- * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-import java.util.TreeMap;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.IStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.EDCTrace;
-import org.eclipse.cdt.debug.edc.internal.MemoryStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.PathUtils;
-import org.eclipse.cdt.debug.edc.internal.symbols.ArrayBoundType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.CPPBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ClassType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ConstType;
-import org.eclipse.cdt.debug.edc.internal.symbols.Enumeration;
-import org.eclipse.cdt.debug.edc.internal.symbols.Enumerator;
-import org.eclipse.cdt.debug.edc.internal.symbols.FieldType;
-import org.eclipse.cdt.debug.edc.internal.symbols.FunctionScope;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.internal.symbols.InheritanceType;
-import org.eclipse.cdt.debug.edc.internal.symbols.LexicalBlockScope;
-import org.eclipse.cdt.debug.edc.internal.symbols.LineEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ReferenceType;
-import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
-import org.eclipse.cdt.debug.edc.internal.symbols.StructType;
-import org.eclipse.cdt.debug.edc.internal.symbols.SubroutineType;
-import org.eclipse.cdt.debug.edc.internal.symbols.TemplateParamType;
-import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
-import org.eclipse.cdt.debug.edc.internal.symbols.UnionType;
-import org.eclipse.cdt.debug.edc.internal.symbols.VolatileType;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AbbreviationEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.Attribute;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AttributeList;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AttributeValue;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.CompilationUnitHeader;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.ForwardTypeReference;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.PublicNameInfo;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.CommonInformationEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.FrameDescriptionEntry;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.BaseExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerEABI;
-import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
-import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
-import org.eclipse.cdt.debug.edc.symbols.ILineEntry;
-import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
-import org.eclipse.cdt.debug.edc.symbols.IRangeList;
-import org.eclipse.cdt.debug.edc.symbols.IScope;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
-import org.eclipse.cdt.debug.edc.symbols.IVariable;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * Handle restartable parsing of Dwarf information from a single module.
- * This class may be instantiated multiple times to parse specific subsets
- * of the Dwarf data. The {@link DwarfDebugInfoProvider}
- * holds the global state of everything parsed so far.
- */
-public class DwarfInfoReader {
-
- private class BaseAndScopedNames {
- public String baseName; // e.g., "bar"
- public String nameWithScope; // e.g., "foo::bar"
- }
-
- private BaseAndScopedNames baseAndScopedNames = new BaseAndScopedNames();
-
- // These are only for developer of the reader.
- //
- private static boolean DEBUG = false;
- private static String dumpFileName = "C:\\temp\\_EDC_DwarfReaderDump.txt"; //$NON-NLS-1$
-
- // TODO 64-bit Dwarf currently unsupported
-
- /* Section names. */
- public final static String DWARF_DEBUG_INFO = ".debug_info"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_RANGES = ".debug_ranges"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_ABBREV = ".debug_abbrev"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_ARANGES = ".debug_aranges"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_LINE = ".debug_line"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_FRAME = ".debug_frame"; //$NON-NLS-1$
- public final static String DWARF_EH_FRAME = ".eh_frame"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_LOC = ".debug_loc"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_PUBNAMES = ".debug_pubnames"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_STR = ".debug_str"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_FUNCNAMES = ".debug_funcnames"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_TYPENAMES = ".debug_typenames"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_VARNAMES = ".debug_varnames"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_WEAKNAMES = ".debug_weaknames"; //$NON-NLS-1$
- public final static String DWARF_DEBUG_MACINFO = ".debug_macinfo"; //$NON-NLS-1$
-
- private Map<Long, Collection<LocationEntry>> locationEntriesByOffset = Collections.synchronizedMap(new HashMap<Long, Collection<LocationEntry>>());
-
- // the target for all the reading
- private DwarfDebugInfoProvider provider;
-
- private IExecutableSymbolicsReader exeReader;
- private DwarfModuleScope moduleScope;
- private IPath symbolFilePath;
-
- private IExecutableSection debugInfoSection;
- private IExecutableSection publicNamesSection;
- private CompilationUnitHeader currentCUHeader;
-
- private Map<IType, IType> typeToParentMap = Collections.synchronizedMap(new HashMap<IType, IType>());
- private IType currentParentType;
- private Scope currentParentScope;
- private DwarfCompileUnit currentCompileUnitScope;
-
- private DwarfFileHelper fileHelper;
-
- private RangeList codeRanges;
-
- private ICPPBasicType voidType = null;
-
- private IUnmangler unmangler;
-
- // comparator for sorting and searching based on compilation unit low address
- private static Comparator<DwarfCompileUnit> sComparatorByLowAddress = new Comparator<DwarfCompileUnit>() {
- public int compare(DwarfCompileUnit o1, DwarfCompileUnit o2) {
- return (o1.getLowAddress().compareTo(o2.getLowAddress()));
- }};
-
- /**
- * Create a reader for the provider. This constructor and any methods
- * on this reader class will incrementally update the provider.
- * @param provider
- */
- public DwarfInfoReader(DwarfDebugInfoProvider provider) {
- this.provider = provider;
- exeReader = provider.getExecutableSymbolicsReader();
- if (exeReader instanceof BaseExecutableSymbolicsReader)
- unmangler = ((BaseExecutableSymbolicsReader) exeReader).getUnmangler();
- if (unmangler == null)
- unmangler = new UnmanglerEABI();
-
- symbolFilePath = provider.getSymbolFile();
- fileHelper = provider.fileHelper;
- moduleScope = (DwarfModuleScope) provider.getModuleScope();
- debugInfoSection = exeReader.findExecutableSection(DWARF_DEBUG_INFO);
- publicNamesSection = exeReader.findExecutableSection(DWARF_DEBUG_PUBNAMES);
-
- codeRanges = getCodeRanges();
- }
-
- private String unmangle(String name) {
- if (!unmangler.isMangled(name))
- return name;
-
- try {
- name = unmangler.unmangle(name);
- } catch (UnmanglingException ue) {
- }
-
- return name;
- }
-
-
- private String unmangleType(String name) {
- if (!unmangler.isMangled(name))
- return name;
-
- try {
- name = unmangler.unmangleType(name);
- } catch (UnmanglingException ue) {
- }
-
- return name;
- }
-
- /**
- * @return
- */
- private RangeList getCodeRanges() {
- RangeList codeRanges = new RangeList();
- for (ISection section : exeReader.getSections()) {
- if (section.getProperties().get(ISection.PROPERTY_NAME).equals(ISection.NAME_TEXT)) {
- long start = section.getLinkAddress().getValue().longValue();
- long size = section.getSize();
- codeRanges.addRange(start, start + size);
- }
- }
- return codeRanges;
- }
-
- protected IStreamBuffer getDwarfSection(String sectionName) {
- // the exe reader and section already handle caching this
- IStreamBuffer buffer = null;
- IExecutableSection section = exeReader.findExecutableSection(sectionName);
- if (section != null) {
- buffer = section.getBuffer();
- }
- return buffer;
- }
-
- /**
- * Parse top-level debugging information about compilation units and globally
- * visible objects, but do not expand or gather data about other objects in
- * compilation units.
- */
- public void parseInitial() {
- Job parseInitialJob = new Job(DwarfMessages.DwarfInfoReader_ReadingSymbolInfo + symbolFilePath) {
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceInitialParseFor + symbolFilePath)); }
- synchronized (provider) {
- parseCUDebugInfo(monitor);
- parsePublicNames();
- }
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedInitialParse)); }
- return Status.OK_STATUS;
- }
- };
-
- try {
- parseInitialJob.schedule();
- parseInitialJob.join();
- } catch (InterruptedException e) {
- EDCDebugger.getMessageLogger().logError(null, e);
- }
- }
-
- /**
- * Parse all compilation units for addresses
- *
- * @param includeCUWithoutCode
- * whether to parse compile units without code. For variable
- * info, we need to look into those CUs, whereas for scope
- * info, we don't.
- */
- public void parseForAddresses(boolean includeCUWithoutCode) {
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressesParseFor + symbolFilePath)); }
- synchronized (provider) {
- for (DwarfCompileUnit compileUnit : provider.compileUnits) {
- if (DEBUG) {
- // For internal check.
- if (compileUnit.getHighAddress().isZero())
- assert(compileUnit.getChildren().size() == 0);
- else
- assert(compileUnit.getChildren().size() >= 0);
- }
-
- if (includeCUWithoutCode || // parse every CU
- ! compileUnit.getHighAddress().isZero()) // parse only those with code.
- {
- parseCompilationUnitForAddresses(compileUnit);
- }
- }
- }
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedAddressesParse)); }
-
- moduleScope.fixupRanges(Addr32.ZERO);
-
- if (DEBUG) {
- dumpSymbols();
- }
-
- }
-
- /**
- * Parse compilation unit corresponding to address
- *
- * @param linkAddress
- * address in a compile unit that contains code
- */
- public void parseForAddress(IAddress linkAddress) {
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressParseFor + symbolFilePath)); }
-
- // find compilation unit containing address, and parse it
- synchronized (provider) {
- DwarfCompileUnit cu = new DwarfCompileUnit(provider, null, null, linkAddress, linkAddress, null, false, null);
- int index = Collections.binarySearch (provider.sortedCompileUnitsWithCode, cu, sComparatorByLowAddress);
-
- if (index >= 0) {
- cu = provider.sortedCompileUnitsWithCode.get(index);
- parseCompilationUnitForAddresses(cu);
- } else if (index < -1 && -index - 2 < provider.sortedCompileUnitsWithCode.size()) {
- cu = provider.sortedCompileUnitsWithCode.get(-index - 2);
- if (cu.getLowAddress().compareTo(linkAddress) <= 0 && cu.getHighAddress().compareTo(linkAddress) >= 0)
- parseCompilationUnitForAddresses(cu);
- } else {
- return;
- }
-
- if (moduleScope.getLowAddress().compareTo(cu.getLowAddress()) > 0)
- moduleScope.setLowAddress(cu.getLowAddress());
- if (moduleScope.getHighAddress().compareTo(cu.getHighAddress()) < 0)
- moduleScope.setHighAddress(cu.getHighAddress());
- }
-
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedAddressParse)); }
- }
-
- /**
- * Parse names in the .debug_pubnames section
- */
- private void parsePublicNames() {
-
- if (publicNamesSection == null || debugInfoSection == null) { // no public names and/or debug info
- return;
- }
-
- IStreamBuffer bufferPublicNames = publicNamesSection.getBuffer();
- if (bufferPublicNames == null)
- return;
-
- IStreamBuffer bufferDebuginfo = debugInfoSection.getBuffer();
- if (bufferDebuginfo == null)
- return;
-
- long fileIndex = 0;
- long fileEndIndex = bufferPublicNames.capacity();
-
- // parse all the sets in the .debug_pubnames section
- while (fileIndex < fileEndIndex) {
- fileIndex = parsePublicNamesSet(bufferPublicNames, fileIndex, bufferDebuginfo);
- }
- }
-
- /**
- * Parse one set of global objects and functions
- */
- private long parsePublicNamesSet(IStreamBuffer bufferPublicNames, long fileIndex, IStreamBuffer bufferDebugInfo) {
- bufferPublicNames.position(fileIndex);
-
- // get the set's data length
- int setLength = bufferPublicNames.getInt();
-
- // get the entire set
-
- IStreamBuffer dataPublicNames = bufferPublicNames.wrapSubsection(setLength);
-
- // get header info for set of public names
- // skip over Dwarf version
- dataPublicNames.position(2);
- int debugInfoOffset = dataPublicNames.getInt();
- int debugInfoLength = dataPublicNames.getInt();
-
- try {
- // read the entire compile unit
- bufferDebugInfo.position(debugInfoOffset);
-
- IStreamBuffer dataInfoBytes = bufferDebugInfo.wrapSubsection(debugInfoLength);
-
- CompilationUnitHeader header = provider.debugOffsetsToCompileUnits.get(Long.valueOf(debugInfoOffset));
-
- // get stored abbrev table, or read and parse an abbrev table
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
-
- // read names and corresponding types
- // ignore the 4 bytes of 0 at the end of the set
- while (dataPublicNames.remaining() > 4) {
- // read the object offset and name
- int objectOffset = dataPublicNames.getInt();
- String name = readString(dataPublicNames);
-
- // read the type of object
- dataInfoBytes.position(objectOffset);
- long code = read_unsigned_leb128(dataInfoBytes);
- AbbreviationEntry entry = abbrevs.get(new Long(code));
-
- // ignore empty names, names without debug info, and
- // compiler-generated special symbols
- if (entry != null && name.length() > 0 && !name.startsWith("<")) {
- // if the name is mangled, unmangle it
- name = unmangle(name);
-
- String baseName = name;
- int baseStart = name.lastIndexOf("::"); //$NON-NLS-1$
- if (baseStart != -1)
- baseName = name.substring(baseStart + 2);
- if (entry.tag == DwarfConstants.DW_TAG_variable) {
- List<PublicNameInfo> variables = provider.publicVariables.get(baseName);
- if (variables == null) {
- variables = new ArrayList<PublicNameInfo>();
- }
- variables.add(new PublicNameInfo(name, header, entry.tag));
- provider.publicVariables.put(baseName, variables);
- } else if (entry.tag == DwarfConstants.DW_TAG_subprogram) {
- List<PublicNameInfo> functions = provider.publicFunctions.get(baseName);
- if (functions == null) {
- functions = new ArrayList<PublicNameInfo>();
- functions.add(new PublicNameInfo(name, header, entry.tag));
- } else {
- // we don't store debug info offsets, so polymorphic functions for a compilation
- // unit have identical PublicNameInfo fields; throw all but one away
- ArrayList<PublicNameInfo> arrayList = (ArrayList<PublicNameInfo>)functions;
- boolean found = false;
- for (int i = arrayList.size() - 1;
- !found && (i >= 0) && (arrayList.get(i).cuHeader == header); i--)
- found = arrayList.get(i).nameWithNameSpace.equals(name);
- if (!found)
- functions.add(new PublicNameInfo(name, header, entry.tag));
- }
- provider.publicFunctions.put(baseName, functions);
-
- }
- }
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(null, t);
- }
-
- return fileIndex + setLength + 4;
- }
-
- /**
- * Parse all compilation units for types
- */
- public void parseForTypes() {
- synchronized (provider) {
- for (DwarfCompileUnit compileUnit : provider.compileUnits) {
- parseCompilationUnitForTypes(compileUnit);
- }
- }
- }
- /**
- * Parse compilation unit headers and top-level info in the .debug_info section
- * @param monitor
- */
- private void parseCUDebugInfo(IProgressMonitor monitor) {
-
- if (debugInfoSection == null) { // no Dwarf data.
- return;
- }
-
- // if we haven't built the referenced files list from a quick parse yet,
- // flag it here so we can build the file list as we parse.
- if (provider.referencedFiles.isEmpty()) {
- provider.buildReferencedFilesList = true;
- }
-
- IStreamBuffer buffer = debugInfoSection.getBuffer();
- IStreamBuffer debugStrings = getDebugStrings();
- boolean havePubNames = publicNamesSection != null && publicNamesSection.getBuffer() != null;
-
- int totalWork = (int) (buffer.capacity() / 1024);
- monitor.beginTask(DwarfMessages.DwarfInfoReader_ReadDebugInfo, totalWork);
- try {
- if (buffer != null) {
- long fileIndex = 0;
- long fileEndIndex = buffer.capacity();
-
- while (fileIndex < fileEndIndex) {
- long oldIndex = fileIndex;
- fileIndex = parseCompilationUnitForNames(buffer, fileIndex, debugStrings, fileEndIndex, havePubNames);
- monitor.worked((int) ((fileIndex - oldIndex) / 1024));
- }
- }
- } finally {
- monitor.done();
- }
- provider.compileUnits.trimToSize();
- // sort by low address the list of compilation units with code
- provider.sortedCompileUnitsWithCode.trimToSize();
- Collections.sort(provider.sortedCompileUnitsWithCode, sComparatorByLowAddress);
- provider.buildReferencedFilesList = false;
- }
-
- /**
- * Parse the compile unit quickly looking for variables that are globally visible
- *
- * @return offset of next compilation unit
- */
- private long parseCompilationUnitForNames(IStreamBuffer buffer, long fileIndex, IStreamBuffer debugStrings, long fileEndIndex, boolean havePubNames) {
- buffer.position(fileIndex);
-
- currentCUHeader = new CompilationUnitHeader();
- currentCUHeader.length = buffer.getInt();
- currentCUHeader.version = buffer.getShort();
- currentCUHeader.abbreviationOffset = buffer.getInt();
- currentCUHeader.addressSize = buffer.get();
- currentCUHeader.debugInfoOffset = (int) fileIndex;
-
- /*
- * With certain GCC-E 3.x compilers, some subset of compile unit headers can have unit
- * lengths 4 bytes too long. Before reading compile unit data, make sure there is a
- * valid compile unit header right after this unit's data. Adjust the length if needed.
- * To validate, check that the DWARF version and the address size are
- * the same as the previous compile unit's.
- */
- if (fileIndex + currentCUHeader.length + 8 < fileEndIndex) {
- // try good case
- short nextVersion;
- byte nextAddrSize;
- buffer.position(fileIndex + currentCUHeader.length + 8); // to next version
- nextVersion = buffer.getShort();
- buffer.position(fileIndex + currentCUHeader.length + 14); // to next address size
- nextAddrSize = buffer.get();
-
- if (currentCUHeader.version != nextVersion || currentCUHeader.addressSize != nextAddrSize) {
- // try adjusting back by 4 bytes
- buffer.position(fileIndex + currentCUHeader.length + 4); // to next version
- nextVersion = buffer.getShort();
- buffer.position(fileIndex + currentCUHeader.length + 10); // to next address size
- nextAddrSize = buffer.get();
-
- if (currentCUHeader.version == nextVersion && currentCUHeader.addressSize == nextAddrSize) {
- // all this work to adjust the length...
- currentCUHeader.length -= 4;
- }
- }
- }
-
- // now read the whole compile unit into memory. note that we're
- // reading the whole section including the size that we already
- // read because other code will use the offset of the buffer as
- // the offset of the section to store things by offset (types,
- // function declarations, etc).
- buffer.position(fileIndex);
-
- IStreamBuffer in = buffer.wrapSubsection(currentCUHeader.length + 4);
-
- // skip over the header info we already read
- in.position(11);
-
- try {
- // get stored abbrev table, or read and parse an abbrev table
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(currentCUHeader.abbreviationOffset);
-
- // read the compile unit's attribute list
- long code = read_unsigned_leb128(in);
- AbbreviationEntry entry = abbrevs.get(Long.valueOf(code));
-
- AttributeList attributeList = new AttributeList(entry, in, currentCUHeader.addressSize, debugStrings);
- processCompileUnit(currentCUHeader, entry.hasChildren, attributeList);
-
- if (!havePubNames) {
- // record file scope variables
- byte addressSize = currentCUHeader.addressSize;
- while (in.remaining() > 0) {
- code = read_unsigned_leb128(in);
-
- if (code != 0) {
- entry = abbrevs.get(Long.valueOf(code));
-
- switch (entry.tag) {
- // record names of interest, but not other Dwarf attributes
- case DwarfConstants.DW_TAG_variable:
- {
- // get variable names at the compile unit scope level
- parseAttributesForNames(true, baseAndScopedNames, entry, in, addressSize, debugStrings);
- if (baseAndScopedNames.baseName != null)
- storePublicNames(provider.publicVariables, baseAndScopedNames, currentCUHeader, (short) DwarfConstants.DW_TAG_variable);
- break;
- }
- case DwarfConstants.DW_TAG_imported_declaration: // for possible namespace alias
- case DwarfConstants.DW_TAG_namespace:
- case DwarfConstants.DW_TAG_subprogram:
- case DwarfConstants.DW_TAG_enumerator:
- case DwarfConstants.DW_TAG_class_type:
- case DwarfConstants.DW_TAG_structure_type:
- case DwarfConstants.DW_TAG_array_type:
- case DwarfConstants.DW_TAG_base_type:
- case DwarfConstants.DW_TAG_enumeration_type:
- case DwarfConstants.DW_TAG_pointer_type:
- case DwarfConstants.DW_TAG_ptr_to_member_type:
- case DwarfConstants.DW_TAG_subroutine_type:
- case DwarfConstants.DW_TAG_typedef:
- case DwarfConstants.DW_TAG_union_type:
- case DwarfConstants.DW_TAG_access_declaration:
- case DwarfConstants.DW_TAG_catch_block:
- case DwarfConstants.DW_TAG_common_block:
- case DwarfConstants.DW_TAG_common_inclusion:
- case DwarfConstants.DW_TAG_condition:
- case DwarfConstants.DW_TAG_const_type:
- case DwarfConstants.DW_TAG_constant:
- case DwarfConstants.DW_TAG_entry_point:
- case DwarfConstants.DW_TAG_file_type:
- case DwarfConstants.DW_TAG_formal_parameter:
- case DwarfConstants.DW_TAG_friend:
- case DwarfConstants.DW_TAG_imported_module:
- case DwarfConstants.DW_TAG_inheritance:
- case DwarfConstants.DW_TAG_inlined_subroutine:
- case DwarfConstants.DW_TAG_interface_type:
- case DwarfConstants.DW_TAG_label:
- case DwarfConstants.DW_TAG_lexical_block:
- case DwarfConstants.DW_TAG_member:
- case DwarfConstants.DW_TAG_module:
- case DwarfConstants.DW_TAG_namelist:
- case DwarfConstants.DW_TAG_namelist_item:
- case DwarfConstants.DW_TAG_packed_type:
- case DwarfConstants.DW_TAG_reference_type:
- case DwarfConstants.DW_TAG_restrict_type:
- case DwarfConstants.DW_TAG_set_type:
- case DwarfConstants.DW_TAG_shared_type:
- case DwarfConstants.DW_TAG_string_type:
- case DwarfConstants.DW_TAG_subrange_type:
- case DwarfConstants.DW_TAG_template_type_param:
- case DwarfConstants.DW_TAG_template_value_param:
- case DwarfConstants.DW_TAG_thrown_type:
- case DwarfConstants.DW_TAG_try_block:
- case DwarfConstants.DW_TAG_unspecified_parameters:
- case DwarfConstants.DW_TAG_variant:
- case DwarfConstants.DW_TAG_variant_part:
- case DwarfConstants.DW_TAG_volatile_type:
- case DwarfConstants.DW_TAG_with_stmt:
- {
- AttributeValue.skipAttributesToSibling(entry, in, addressSize);
- break;
- }
- // case DwarfConstants.DW_TAG_compile_unit:
- // case DwarfConstants.DW_TAG_partial_unit:
- // case DwarfConstants.DW_TAG_unspecified_type:
- default:
- // skip entire entries
- AttributeList.skipAttributes(entry, in, addressSize);
- break;
- }
- }
- }
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
- + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
- }
-
- // skip past the compile unit. note that the
- // currentCUHeader.length does not include
- // the size of the unit length itself
- fileIndex += currentCUHeader.length + 4;
-
- return fileIndex;
- }
-
- /**
- * Parse attributes, returning names
- *
- * @param onlyExternal only return names if they have external visibility
- * @param names array to hold up to two names
- * @param entry debug info entry
- * @param in buffer stream of debug info
- * @param addressSize
- * @param debugStrings
- * @return DW_AT_name value in names[0], unmangled DW_AT_MIPS_linkage_name value in
- * names[1], or nulls
- */
- private void parseAttributesForNames(boolean onlyExternal, BaseAndScopedNames baseAndScopedNames, AbbreviationEntry entry, IStreamBuffer in,
- byte addressSize, IStreamBuffer debugStrings) {
-
- String name = null;
- baseAndScopedNames.baseName = null;
- baseAndScopedNames.nameWithScope = null;
- boolean isExternal = false;
-
- // go through the attributes and throw away everything except the names
- int len = entry.attributes.size();
- for (int i = 0; i < len; i++) {
- Attribute attr = entry.attributes.get(i);
- try {
- if ( attr.tag == DwarfConstants.DW_AT_name
- || attr.tag == DwarfConstants.DW_AT_MIPS_linkage_name) {
- // names should be DW_FORM_string or DW_FORM_strp
- if (attr.form == DwarfConstants.DW_FORM_string) {
- int c;
- StringBuffer sb = new StringBuffer();
- while ((c = (in.get() & 0xff)) != -1) {
- if (c == 0) {
- break;
- }
- sb.append((char) c);
- }
- name = sb.toString();
- } else if (attr.form == DwarfConstants.DW_FORM_strp) {
- int debugStringOffset = in.getInt();
- if ( debugStrings != null
- && debugStringOffset >= 0
- && debugStringOffset < debugStrings.capacity()) {
- debugStrings.position(debugStringOffset);
- name = DwarfInfoReader.readString(debugStrings);
- }
- }
-
- if (name != null) {
- if (attr.tag == DwarfConstants.DW_AT_name) {
- baseAndScopedNames.baseName = name;
- baseAndScopedNames.nameWithScope = name;
- } else {
- if (exeReader instanceof BaseExecutableSymbolicsReader) {
- try {
- baseAndScopedNames.nameWithScope = unmangler.unmangle(unmangler.undecorate(name));
- } catch(UnmanglingException ue) {
- }
- }
- }
- name = null;
- }
- } else if (attr.tag == DwarfConstants.DW_AT_external) {
- if (attr.form == DwarfConstants.DW_FORM_flag) {
- isExternal = in.get() != 0;
- } else {
- AttributeValue.skipAttributeValue(attr.form, in, addressSize);
- }
- } else {
- AttributeValue.skipAttributeValue(attr.form, in, addressSize);
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(null, t);
- break;
- }
- }
-
- // if only looking for externals, throw away internals
- if (onlyExternal && !isExternal) {
- baseAndScopedNames.baseName = null;
- baseAndScopedNames.nameWithScope = null;
- } else {
- // if only have the scoped name, derive the base name
- if (baseAndScopedNames.nameWithScope != null && baseAndScopedNames.baseName == null) {
- int baseStart = baseAndScopedNames.nameWithScope.lastIndexOf("::"); //$NON-NLS-1$
- if (baseStart != -1)
- baseAndScopedNames.baseName = baseAndScopedNames.nameWithScope.substring(baseStart + 2);
- else
- baseAndScopedNames.baseName = baseAndScopedNames.nameWithScope;
- }
- }
- }
-
- /**
- * Store compilation unit level names from Dwarf .debug_info
- *
- * @param namesStore
- * @param names
- * @param offset
- */
- private void storePublicNames(Map<String, List<PublicNameInfo>> namesStore, BaseAndScopedNames baseAndScopedNames,
- CompilationUnitHeader cuHeader, short tag) {
-
- List<PublicNameInfo> currentNames = namesStore.get(baseAndScopedNames.baseName);
- if (currentNames == null) {
- currentNames = new ArrayList<PublicNameInfo>();
- namesStore.put(baseAndScopedNames.baseName, currentNames);
- }
- currentNames.add(new PublicNameInfo(baseAndScopedNames.nameWithScope, cuHeader, tag));
- }
-
- private synchronized void parseCompilationUnitForAddressesPrivate(DwarfCompileUnit compileUnit, IProgressMonitor monitor)
- {
- synchronized (compileUnit) {
- if (compileUnit.isParsedForAddresses())
- return;
-
- compileUnit.setParsedForAddresses(true);
-
- CompilationUnitHeader header = compileUnit.header;
-
- if (header == null)
- return;
-
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressParse1 + Integer.toHexString(header.debugInfoOffset) + DwarfMessages.DwarfInfoReader_TraceAddressParse2 + header.scope.getFilePath())); }
-
- IStreamBuffer buffer = debugInfoSection.getBuffer();
-
- if (buffer == null)
- return;
-
- int fileIndex = header.debugInfoOffset;
-
- // read the compile unit debug info into memory
- buffer.position(fileIndex);
-
- IStreamBuffer data = buffer.wrapSubsection(header.length + 4);
-
- // skip over the header, since we've already read it
- data.position(11); // unit length + version + abbrev table offset + address size
-
- currentCompileUnitScope = compileUnit;
- currentParentScope = compileUnit;
- registerScope(header.debugInfoOffset, compileUnit);
- currentCUHeader = header;
-
- try {
- // get stored abbrev table, or read and parse an abbrev table
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
-
- parseForAddresses(data, abbrevs, header, new Stack<Scope>(), monitor);
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
- + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
- }
- }
- }
-
- /**
- * Given compilation unit, parse to get variables and all children that have address ranges.
- *
- * @param compileUnit
- */
- public void parseCompilationUnitForAddresses(final DwarfCompileUnit compileUnit) {
- synchronized (provider) {
- synchronized (compileUnit) {
- if (compileUnit.isParsedForAddresses())
- return;
- }
- parseCompilationUnitForAddressesPrivate(compileUnit, new NullProgressMonitor());
- }
- }
-
- synchronized public void parseCompilationUnitForTypes(DwarfCompileUnit compileUnit) {
- synchronized (provider) {
- synchronized(compileUnit) {
- if (compileUnit.isParsedForTypes())
- return;
-
- compileUnit.setParsedForTypes(true);
-
- CompilationUnitHeader header = compileUnit.header;
-
- if (header == null)
- return;
-
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceTypeParse1 + Integer.toHexString(header.debugInfoOffset) + DwarfMessages.DwarfInfoReader_TraceTypeParse2 + header.scope.getFilePath())); }
-
- IStreamBuffer buffer = debugInfoSection.getBuffer();
-
- if (buffer == null)
- return;
-
- int fileIndex = header.debugInfoOffset;
-
- // read the compile unit debug info into memory
- buffer.position(fileIndex);
-
- IStreamBuffer data = buffer.wrapSubsection(header.length + 4);
-
- // skip over the header, since we've already read it
- data.position(11); // unit length + version + abbrev table offset + address size
-
- currentCompileUnitScope = compileUnit;
- currentParentScope = compileUnit;
- registerScope(header.debugInfoOffset, compileUnit);
- currentCUHeader = header;
-
- try {
- // get stored abbrev table, or read and parse an abbrev table
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
-
- parseForTypes(data, abbrevs, header, new Stack<Scope>());
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseTraceInfoSectionFailed1
- + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseTraceInfoSectionFailed2 + symbolFilePath, t);
- }
- }
- }
- }
-
- public void quickParseDebugInfo(IProgressMonitor monitor) {
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceQuickParse + symbolFilePath)); }
- synchronized (provider) {
- doQuickParseDebugInfo(monitor);
- }
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedQuickParse)); }
- }
-
- /**
- * Does a quick parse of the .debug_info section just to get a list of
- * referenced files from the compile units.
- */
- private void doQuickParseDebugInfo(IProgressMonitor monitor) {
-
- if (debugInfoSection == null) { // no Dwarf data.
- return;
- }
-
- // get the compile units out of the .debug_info section
- IStreamBuffer buffer = debugInfoSection.getBuffer();
- if (buffer == null)
- return;
-
- try {
-
- long fileIndex = 0;
- long fileEndIndex = buffer.capacity();
-
- monitor.beginTask(DwarfMessages.DwarfInfoReader_ReadDebugInfo, (int) (fileEndIndex / 1024));
-
- buffer.position(0);
- while (fileIndex < fileEndIndex) {
- buffer.position(fileIndex);
-
- int unit_length = buffer.getInt();
- short version = buffer.getShort();
- int debug_abbrev_offset = buffer.getInt();
- byte address_size = buffer.get();
-
- /*
- * With certain GCC-E 3.x compilers, some subset of compile unit headers can have unit
- * lengths 4 bytes too long. So before reading this unit's data, make sure there is a
- * valid compile unit header right after this unit's data. Adjust the length if needed.
- * To validate, check that the DWARF version and the address size are
- * the same as the previous compile unit's.
- */
- if (fileIndex + unit_length + 8 < fileEndIndex) {
- // try good case
- short nextVersion;
- byte nextAddrSize;
- buffer.position(fileIndex + unit_length + 8); // to next version
- nextVersion = buffer.getShort();
- buffer.position(fileIndex + unit_length + 14); // to next address size
- nextAddrSize = buffer.get();
-
- if (version != nextVersion || address_size != nextAddrSize) {
- // try adjusting back by 4 bytes
- buffer.position(fileIndex + unit_length + 4); // to next version
- nextVersion = buffer.getShort();
- buffer.position(fileIndex + unit_length + 10); // to next address size
- nextAddrSize = buffer.get();
-
- if (version == nextVersion && address_size == nextAddrSize) {
- unit_length -= 4;
- } // otherwise, just let things bomb
- }
- }
-
- buffer.position(fileIndex + 4);
- IStreamBuffer data = buffer.wrapSubsection(unit_length);
- data.position(7); // skip header info already read
-
- // get the abbreviation entry for the compile unit
- // find the offset to the
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(debug_abbrev_offset);
-
- long code = read_unsigned_leb128(data);
- AbbreviationEntry entry = abbrevs.get(Long.valueOf(code));
- AttributeList attributeList = new AttributeList(entry, data, address_size, getDebugStrings());
-
- // get comp_dir and name and figure out the path
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- String compDir = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
-
- IPath filePath = fileHelper.normalizeFilePath(compDir, name);
- provider.referencedFiles.add(filePath.toOSString());
-
- // do a quick parse of the line table to get any other
- // referenced files
- AttributeValue a = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
- if (a != null) {
- int stmtList = a.getValueAsInt();
- quickParseLineInfo(stmtList, compDir);
- }
-
- // skip past the compile unit. note that the unit_length does
- // not include the size of the unit length itself
- long oldIndex = fileIndex;
- fileIndex += unit_length + 4;
- monitor.worked((int) ((fileIndex - oldIndex) / 1024));
- }
-
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseSectionSourceFilesFailed1
- + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseSectionSourceFilesFailed2 + symbolFilePath, t);
- } finally {
- monitor.done();
- }
- }
-
- /**
- * Get the .debug_strings section.
- * @return ByteBuffer or <code>null</code>
- */
- private IStreamBuffer getDebugStrings() {
- return getDwarfSection(DWARF_DEBUG_STR);
- }
-
- /**
- * Does a quick parse of the .debug_line section just to get a list of
- * referenced files from the line table.
- */
- private void quickParseLineInfo(int lineTableOffset, String compileUnitDirectory) {
- IPath compileUnitDirectoryPath = PathUtils.createPath(compileUnitDirectory);
- try {
- // do a quick parse of the line table just to get referenced files
- IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LINE);
- if (data != null) {
- data.position(lineTableOffset);
-
- /*
- * Skip past the bytes of the header that we don't care about:
- * unit_length (4 bytes), version (2 bytes), header_length (4 bytes),
- * minimum_instruction_length (1 byte), default_is_stmt (1 byte),
- * line_base (1 byte), line_range (1 byte)
- */
- data.position(data.position() + 14);
-
- // we need to get this value so we can skip over
- // standard_opcode_lengths
- int opcode_base = data.get() & 0xff;
- data.position(data.position() + opcode_base - 1);
-
- // include_directories
- ArrayList<String> dirList = new ArrayList<String>();
-
- // add the compilation directory of the CU as the first
- // directory
- dirList.add(compileUnitDirectory);
-
- while (true) {
- String str = readString(data);
- if (str.length() == 0)
- break;
-
- // if the directory is relative, append it to the CU dir
- IPath dir = PathUtils.createPath(str);
- if (!dir.isAbsolute() && dir.getDevice() == null) {
- dir = compileUnitDirectoryPath.append(str);
- }
- dirList.add(dir.toString());
- }
-
- while (true) {
- String fileName = readString(data);
- if (fileName.length() == 0) // no more file entry
- break;
-
- // dir index
- long leb128 = DwarfInfoReader.read_unsigned_leb128(data);
-
- IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) leb128), fileName);
- if (fullPath != null) {
- provider.referencedFiles.add(fullPath.toOSString());
- }
-
- // skip the modification time and file size
- leb128 = read_unsigned_leb128(data);
- leb128 = read_unsigned_leb128(data);
- }
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(null, t);
- }
- }
-
-
- /**
- * Parse the line table for a given compile unit
- * @param attributes
- * @param fileList list for file entries
- * @return new array of ILineEntry
- */
- @SuppressWarnings("unused")
- public Collection<ILineEntry> parseLineTable(IScope scope, AttributeList attributes, List<IPath> fileList) {
- synchronized (provider) {
- List<ILineEntry> lineEntries = new ArrayList<ILineEntry>();
- try {
- IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LINE);
- AttributeValue a = attributes.getAttribute(DwarfConstants.DW_AT_stmt_list);
- if (data != null && a != null) {
- int stmtList = a.getValueAsInt();
- data.position(stmtList);
-
- /*
- * Read line table header:
- *
- * total_length: 4 bytes (excluding itself)
- * version: 2
- * prologue length: 4
- * minimum_instruction_len: 1
- * default_is_stmt: 0 or 1
- * line_base: 1
- * line_range: 1
- * opcode_base: 1
- * standard_opcode_lengths: (value of opcode_base)
- */
-
- // Remember the CU line tables we've parsed.
- int length = data.getInt() + 4;
-
- // Skip the following till "opcode_base"
- int version = data.getShort();
- int prologue_length = data.getInt();
- int minimum_instruction_length = data.get() & 0xff;
- boolean default_is_stmt = data.get() > 0;
- int line_base = data.get(); // signed
- int line_range = data.get() & 0xff;
-
- int opcode_base = data.get() & 0xff;
- byte[] opcodes = new byte[opcode_base - 1];
- data.get(opcodes);
-
- // Read in directories.
- //
- ArrayList<String> dirList = new ArrayList<String>();
-
- // Put the compilation directory of the CU as the first dir
- String compDir = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
- dirList.add(compDir);
-
- IPath compDirPath = PathUtils.createPath(compDir);
-
- String str, fileName;
-
- while (true) {
- str = readString(data);
- if (str.length() == 0)
- break;
- // If the directory is relative, append it to the CU dir
- IPath dir = PathUtils.createPath(str);
- if (!dir.isAbsolute() && dir.getDevice() == null) {
- dir = compDirPath.append(str);
- }
- dirList.add(dir.toString());
- }
-
- // Read file names
- //
- long leb128;
- while (true) {
- fileName = readString(data);
- if (fileName.length() == 0) // no more file entry
- break;
-
- // dir index
- leb128 = read_unsigned_leb128(data);
-
- IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) leb128), fileName);
- // add a null as a placeholder when the filename is enclosed in '<' & '>' (e.g., "<stdin>")
- fileList.add(fullPath);
-
- // Skip the following
- //
- // modification time
- leb128 = read_unsigned_leb128(data);
-
- // file size in bytes
- leb128 = read_unsigned_leb128(data);
- }
-
- long info_address = 0;
- long info_file = 1;
- int info_line = 1;
- int info_column = 0;
- boolean is_stmt = default_is_stmt;
- int info_flags = 0;
- long info_ISA = 0;
-
- long lineInfoEnd = stmtList + length;
- while (data.position() < lineInfoEnd) {
- byte opcodeB = data.get();
- int opcode = 0xFF & opcodeB;
-
- if (opcode >= opcode_base) {
- info_line += (((opcode - opcode_base) % line_range) + line_base);
- info_address += (opcode - opcode_base) / line_range * minimum_instruction_length;
- if (is_stmt && fileList.size() > 0) {
- IPath path = fileList.get((int) info_file - 1);
- // added a null as a placeholder when the filename was enclosed in '<' & '>' (e.g., "<stdin>")
- if (path != null)
- lineEntries.add(new LineEntry(path, info_line, info_column, new Addr32(info_address), null));
- }
- info_flags &= ~(DwarfConstants.LINE_BasicBlock | DwarfConstants.LINE_PrologueEnd | DwarfConstants.LINE_EpilogueBegin);
- } else if (opcode == 0) {
- long op_size = read_unsigned_leb128(data);
- long op_pos = data.position();
- int code = data.get() & 0xff;
- switch (code) {
- case DwarfConstants.DW_LNE_define_file: {
- fileName = readString(data);
- long dir = read_unsigned_leb128(data);
- long modTime = read_unsigned_leb128(data);
- long fileSize = read_unsigned_leb128(data);
- IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) dir), fileName);
- if (fullPath != null) {
- fileList.add(fullPath);
- }
- break;
- }
- case DwarfConstants.DW_LNE_end_sequence:
- info_flags |= DwarfConstants.LINE_EndSequence;
-
- if (lineEntries.size() > 0) {
- // this just marks the end of a line number
- // program sequence. use
- // its address to set the high address of the
- // last line entry
- lineEntries.get(lineEntries.size() - 1).setHighAddress(new Addr32(info_address));
- }
-
- // it also resets the state machine
- info_address = 0;
- info_file = 1;
- info_line = 1;
- info_column = 0;
- is_stmt = default_is_stmt;
- info_flags = 0;
- info_ISA = 0;
- break;
-
- case DwarfConstants.DW_LNE_set_address:
- info_address = data.getInt();
- break;
- default:
- data.position((int) (data.position() + op_size - 1));
- break;
- }
- assert (data.position() == op_pos + op_size);
- } else {
- switch (opcode) {
- case DwarfConstants.DW_LNS_copy:
- if (is_stmt && fileList.size() > 0) {
- lineEntries.add(new LineEntry(fileList.get((int) info_file - 1), info_line,
- info_column, new Addr32(info_address), null));
- }
- info_flags &= ~(DwarfConstants.LINE_BasicBlock | DwarfConstants.LINE_PrologueEnd | DwarfConstants.LINE_EpilogueBegin);
- break;
- case DwarfConstants.DW_LNS_advance_pc:
- info_address += read_unsigned_leb128(data) * minimum_instruction_length;
- break;
- case DwarfConstants.DW_LNS_advance_line:
- info_line += read_signed_leb128(data);
- break;
- case DwarfConstants.DW_LNS_set_file:
- info_file = read_unsigned_leb128(data);
- break;
- case DwarfConstants.DW_LNS_set_column:
- info_column = (int) read_unsigned_leb128(data);
- break;
- case DwarfConstants.DW_LNS_negate_stmt:
- is_stmt = !is_stmt;
- break;
- case DwarfConstants.DW_LNS_set_basic_block:
- info_flags |= DwarfConstants.LINE_BasicBlock;
- break;
- case DwarfConstants.DW_LNS_const_add_pc:
- info_address += (255 - opcode_base) / line_range * minimum_instruction_length;
- break;
- case DwarfConstants.DW_LNS_fixed_advance_pc:
- info_address += data.getShort();
- break;
- case DwarfConstants.DW_LNS_set_prologue_end:
- info_flags |= DwarfConstants.LINE_PrologueEnd;
- break;
- case DwarfConstants.DW_LNS_set_epilogue_begin:
- info_flags |= DwarfConstants.LINE_EpilogueBegin;
- break;
- case DwarfConstants.DW_LNS_set_isa:
- info_ISA = read_unsigned_leb128(data);
- break;
- default:
- break;
- }
- }
- }
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(null, t);
- }
-
- // sort by start address
- Collections.sort(lineEntries);
-
- // fill in the end addresses as needed
- ILineEntry previousEntry = null;
- for (ILineEntry line : lineEntries) {
- if (previousEntry != null && previousEntry.getHighAddress() == null) {
- previousEntry.setHighAddress(line.getLowAddress());
- }
-
- previousEntry = line;
- }
-
- // the last line entry
- if (previousEntry != null) {
- IAddress prevHigh = previousEntry.getHighAddress();
- if (prevHigh == null)
- previousEntry.setHighAddress(scope.getHighAddress());
-// FIXME: the following is causing JUnit tests to fail
-// else if (prevHigh != null && prevHigh.compareTo(scope.getHighAddress()) > 0)
-// previousEntry.setHighAddress(scope.getHighAddress());
- }
-
- return lineEntries;
- }
- }
-
- private void parseForAddresses(IStreamBuffer in, Map<Long, AbbreviationEntry> abbrevs, CompilationUnitHeader header,
- Stack<Scope> nestingStack, IProgressMonitor monitor)
- throws IOException {
-
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceScopeAddressParse1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceScopeAddressParse2 + Long.toHexString(header.debugInfoOffset))); }
-
- try {
- long startWork = in.remaining();
- long lastWork = startWork;
- int workChunk = (int)(startWork / Integer.MAX_VALUE) + 1;
- int work = (int)(startWork / workChunk);
- monitor.beginTask(DwarfMessages.DwarfInfoReader_TraceScopeAddressParse1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceScopeAddressParse2 + Long.toHexString(header.debugInfoOffset), work);
-
- while (in.remaining() > 0) {
-
- work = (int)((lastWork - in.remaining()) / workChunk);
- monitor.worked(work);
- lastWork = in.remaining();
-
- long offset = in.position() + currentCUHeader.debugInfoOffset;
- long code = read_unsigned_leb128(in);
-
- if (code != 0) {
- AbbreviationEntry entry = abbrevs.get(new Long(code));
- if (entry == null) {
- assert false;
- continue;
- }
-
- if (entry.hasChildren) {
- nestingStack.push(currentParentScope);
- }
-
- if (isDebugInfoEntryWithAddressRange(entry.tag)) {
- AttributeList attributeList = new AttributeList(entry, in, header.addressSize, getDebugStrings());
- processDebugInfoEntry(offset, entry, attributeList, header);
-
- // if we didn't create a scope for a routine or lexical block, then ignore its innards
- switch (entry.tag) {
- case DwarfConstants.DW_TAG_subprogram:
- case DwarfConstants.DW_TAG_inlined_subroutine:
- case DwarfConstants.DW_TAG_lexical_block:
- if (entry.hasChildren && (provider.scopesByOffset.get(offset) == null)) {
- // because some versions of GCC-E 3.x produce invalid sibling offsets,
- // always read entry attributes, rather than skipping using siblings
- // keep track of nesting just like in parseForTypes()
- int nesting = 1;
- while ((nesting > 0) && (in.remaining() > 0)) {
- offset = in.position() + currentCUHeader.debugInfoOffset;
- code = read_unsigned_leb128(in);
-
- if (code != 0) {
- entry = abbrevs.get(new Long(code));
- if (entry == null) {
- assert false;
- continue;
- }
- if (entry.hasChildren)
- nesting++;
- // skip the attributes we're not reading...
- AttributeList.skipAttributes(entry, in, header.addressSize);
- } else {
- nesting--;
- }
- }
-
- // nesting loop ends after reading 0 code of skipped entry
- if (nestingStack.isEmpty()) {
- // FIXME
- currentParentScope = null;
- } else {
- currentParentScope = nestingStack.pop();
- }
- }
- break;
- }
- } else {
- // skip the attributes we're not reading...
- AttributeList.skipAttributes(entry, in, header.addressSize);
- }
-
- } else {
- if (code == 0) {
- if (nestingStack.isEmpty()) {
- // FIXME
- currentParentScope = null;
- } else {
- currentParentScope = nestingStack.pop();
- }
- }
- }
- }
- } catch (IOException e) {
- throw e;
- } finally {
- monitor.done();
- }
- }
-
-
- private void parseForTypes(IStreamBuffer in, Map<Long, AbbreviationEntry> abbrevs, CompilationUnitHeader header,
- Stack<Scope> nestingStack)
- throws IOException {
-
- if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceParseTypes1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceParseTypes2 + Long.toHexString(header.debugInfoOffset))); }
-
- Stack<IType> typeStack = new Stack<IType>();
- typeToParentMap.clear();
-
- currentParentScope = currentCompileUnitScope;
-
- while (in.remaining() > 0) {
- long offset = in.position() + currentCUHeader.debugInfoOffset;
- long code = read_unsigned_leb128(in);
-
- if (code != 0) {
- AbbreviationEntry entry = abbrevs.get(new Long(code));
- if (entry == null) {
- assert false;
- continue;
- }
- if (entry.hasChildren) {
- nestingStack.push(currentParentScope);
- typeStack.push(currentParentType);
- }
-
- if (isForwardTypeTag(entry.tag) || isForwardTypeChildTag(entry.tag)) {
-
- processDebugInfoEntry(offset, entry,
- new AttributeList(entry, in, header.addressSize, getDebugStrings()),
- header);
-
- } else {
- switch (entry.tag) {
- case DwarfConstants.DW_TAG_subprogram:
- case DwarfConstants.DW_TAG_inlined_subroutine:
- case DwarfConstants.DW_TAG_lexical_block: {
- Scope scope = provider.scopesByOffset.get(offset); // may be null
- if (scope != null)
- currentParentScope = scope;
- break;
- }
- }
-
- // skip the attributes we're not reading...
- AttributeList.skipAttributes(entry, in, header.addressSize);
- }
- } else {
- // code == 0
- if (nestingStack.isEmpty()) {
- // FIXME
- currentParentType = null;
- currentParentScope = null;
- } else {
- currentParentScope = nestingStack.pop();
- currentParentType = typeStack.pop();
- }
- }
- }
- }
-
- /**
- * Tell if a tag will be parsed on-demand to generate an IType, and will
- * be accessible via provider.getType() or provider.readType().
- * <p>
- * Note: DW_TAG_member is usually considered a child of struct/class/etc., but
- * a static class variable contains a reference to it, so we must be able to
- * locate it.
- * @param tag
- * @return true if type is parsed and should have a ForwardDwarfDefinition
- */
- private boolean isForwardTypeTag(short tag) {
- switch (tag) {
- case DwarfConstants.DW_TAG_array_type:
- case DwarfConstants.DW_TAG_class_type:
- case DwarfConstants.DW_TAG_enumeration_type:
- case DwarfConstants.DW_TAG_member:
- case DwarfConstants.DW_TAG_pointer_type:
- case DwarfConstants.DW_TAG_reference_type:
- case DwarfConstants.DW_TAG_structure_type:
- case DwarfConstants.DW_TAG_subroutine_type:
- case DwarfConstants.DW_TAG_typedef:
- case DwarfConstants.DW_TAG_union_type:
- //case DwarfConstants.DW_TAG_unspecified_parameters:
- case DwarfConstants.DW_TAG_inheritance:
- case DwarfConstants.DW_TAG_ptr_to_member_type:
- //case DwarfConstants.DW_TAG_with_stmt:
- case DwarfConstants.DW_TAG_base_type:
- //case DwarfConstants.DW_TAG_catch_block:
- case DwarfConstants.DW_TAG_const_type:
- //case DwarfConstants.DW_TAG_enumerator:
- //case DwarfConstants.DW_TAG_file_type:
- //case DwarfConstants.DW_TAG_friend:
- case DwarfConstants.DW_TAG_template_type_param:
- //case DwarfConstants.DW_TAG_template_value_param:
- //case DwarfConstants.DW_TAG_thrown_type:
- //case DwarfConstants.DW_TAG_try_block:
- case DwarfConstants.DW_TAG_volatile_type:
- case DwarfConstants.DW_TAG_subrange_type:
- return true;
- }
- return false;
- }
-
-
- /**
- * Tell if a tag is a parsed child of an IType. This should not be explicitly
- * referenced in provider.typesByOffset or .forwardDwarfDefinitions but as
- * children of other ForwardDwarfDefinitions parsed on demand.
- *<p>
- * Note: DW_TAG_member is usually considered a child of struct/class/etc., but
- * a static class variable contains a reference to it, so we must be able to
- * locate it. Thus, it is not listed here.
- * @param tag
- * @return true if component is parsed and a child of a forward definition
- */
- private boolean isForwardTypeChildTag(short tag) {
- switch (tag) {
- //case DwarfConstants.DW_TAG_unspecified_parameters:
- case DwarfConstants.DW_TAG_inheritance:
- case DwarfConstants.DW_TAG_enumerator:
- case DwarfConstants.DW_TAG_member:
- case DwarfConstants.DW_TAG_subrange_type:
- //case DwarfConstants.DW_TAG_friend:
- //case DwarfConstants.DW_TAG_template_type_param:
- //case DwarfConstants.DW_TAG_template_value_param:
- //case DwarfConstants.DW_TAG_thrown_type:
- return true;
- }
- return false;
- }
- /**
- * Fully parse any debug info entry.
- * @param offset
- * @param entry
- * @param attributeList
- * @param header
- * @param compositeNesting
- */
- private void processDebugInfoEntry(long offset, AbbreviationEntry entry, AttributeList attributeList,
- CompilationUnitHeader header) {
- //System.out.println("Handling " + entry.tag + " at " + Long.toHexString(offset));
- short tag = entry.tag;
-
- // We are only interested in certain tags.
- switch (tag) {
- case DwarfConstants.DW_TAG_array_type:
- processArrayType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_class_type:
- processClassType(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_enumeration_type:
- processEnumType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_formal_parameter:
- processVariable(offset, attributeList, true);
- break;
- case DwarfConstants.DW_TAG_lexical_block:
- processLexicalBlock(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_member:
- processField(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_pointer_type:
- processPointerType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_reference_type:
- processReferenceType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_structure_type:
- processStructType(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_subroutine_type:
- processSubroutineType(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_typedef:
- processTypeDef(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_union_type:
- processUnionType(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_unspecified_parameters:
- break;
- case DwarfConstants.DW_TAG_inheritance:
- processInheritance(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_ptr_to_member_type:
- processPtrToMemberType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_with_stmt:
- break;
- case DwarfConstants.DW_TAG_base_type:
- processBasicType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_catch_block:
- break;
- case DwarfConstants.DW_TAG_const_type:
- processConstType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_enumerator:
- processEnumerator(offset, attributeList);
- break;
- case DwarfConstants.DW_TAG_file_type:
- break;
- case DwarfConstants.DW_TAG_friend:
- break;
- case DwarfConstants.DW_TAG_subprogram:
- processSubprogram(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_inlined_subroutine:
- processInlinedSubroutine(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_template_type_param:
- processTemplateTypeParam(offset, attributeList, header, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_template_value_param:
- break;
- case DwarfConstants.DW_TAG_thrown_type:
- break;
- case DwarfConstants.DW_TAG_try_block:
- break;
- case DwarfConstants.DW_TAG_variable:
- processVariable(offset, attributeList, false);
- break;
- case DwarfConstants.DW_TAG_volatile_type:
- processVolatileType(offset, attributeList, entry.hasChildren);
- break;
- case DwarfConstants.DW_TAG_subrange_type:
- processArrayBoundType(offset, attributeList, entry.hasChildren);
- break;
- }
- }
-
- /**
- * Tell whether a tag has or may have content with an address range
- *
- * Note: tag DW_TAG_compile_unit was parsed in the initial parse
- *
- * @param tag
- * @return
- */
- private boolean isDebugInfoEntryWithAddressRange(short tag) {
- switch (tag) {
- // tags allowed to have both DW_AT_low_pc and DW_AT_high_pc or DW_at_ranges
- case DwarfConstants.DW_TAG_catch_block:
- case DwarfConstants.DW_TAG_inlined_subroutine:
- case DwarfConstants.DW_TAG_lexical_block:
- case DwarfConstants.DW_TAG_module:
- case DwarfConstants.DW_TAG_partial_unit:
- case DwarfConstants.DW_TAG_subprogram:
- case DwarfConstants.DW_TAG_try_block:
- case DwarfConstants.DW_TAG_with_stmt:
- return true;
- // TODO: take DW_TAG_variable out of here?
- case DwarfConstants.DW_TAG_variable:
- case DwarfConstants.DW_TAG_formal_parameter:
- return true;
- }
- return false;
- }
-
- static long readAddress(IStreamBuffer in, int addressSize) throws IOException {
- long value = 0;
-
- switch (addressSize) {
- case 2:
- value = in.getShort();
- break;
- case 4:
- value = in.getInt();
- break;
- case 8:
- value = in.getLong();
- break;
- default:
- // ????
- }
- return value;
- }
-
-
- /* unsigned */
- static long read_unsigned_leb128(IStreamBuffer in) throws IOException {
- /* unsigned */
- long result = 0;
- int shift = 0;
- byte b;
-
- while (true) {
- if (!in.hasRemaining())
- break; // throw new IOException("no more data");
- b = in.get();
- result |= ((long) (b & 0x7f) << shift);
- if ((b & 0x80) == 0) {
- break;
- }
- shift += 7;
- }
- return result;
- }
-
- /* signed */
- public static long read_signed_leb128(IStreamBuffer in) throws IOException {
- /* unsigned */
- long result = 0;
- int shift = 0;
- int size = 32;
- byte b;
-
- while (true) {
- if (!in.hasRemaining())
- throw new IOException(CCorePlugin.getResourceString("Util.exception.noData")); //$NON-NLS-1$
- b = in.get();
- result |= ((long) (b & 0x7f) << shift);
- shift += 7;
- if ((b & 0x80) == 0) {
- break;
- }
- }
- if ((shift < size) && (b & 0x40) != 0) {
- result |= -(1 << shift);
- }
- return result;
- }
-
-
- /**
- * Read a null-ended string from the given "data" stream. data : IN, byte
- * buffer
- */
- public static String readString(IStreamBuffer data) {
- String str;
-
- StringBuilder sb = new StringBuilder();
- while (data.hasRemaining()) {
- byte c = data.get();
- if (c == 0) {
- break;
- }
- sb.append((char) c);
- }
-
- str = sb.toString();
- return str;
- }
-
- private Collection<LocationEntry> getLocationRecord(long offset) {
- // first check the cache
- Collection<LocationEntry> entries = locationEntriesByOffset.get(offset);
- if (entries == null) {
- // not found so try to get the entries from the offset
-
- // note: some compilers generate MULTIPLE ENTRIES for the same location,
- // and the last one tends to be more correct... use a map here when reading
- TreeMap<IRangeList.Entry, LocationEntry> entryMap = new TreeMap<IRangeList.Entry, LocationEntry>();
-
- try {
- IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LOC);
- if (data != null) {
- data.position(offset);
-
- boolean first = true;
- long base = 0;
-
- while (data.hasRemaining()) {
-
- long lowPC = readAddress(data, currentCUHeader.addressSize);
- long highPC = readAddress(data, currentCUHeader.addressSize);
-
- if (lowPC == 0 && highPC == 0) {
- // end of list entry
- break;
- } else if (first) {
- first = false;
- long maxaddress = currentCUHeader.addressSize == 4 ? Integer.MAX_VALUE : Long.MAX_VALUE;
- if (lowPC == maxaddress) {
- // base address selection entry
- base = highPC;
- continue;
- } else if (currentCompileUnitScope.getRangeList() == null) {
- // if the compilation unit has a contiguous range, no implicit base is needed
- base = currentCompileUnitScope.getLowAddress().getValue().longValue();
- }
- }
-
- // location list entry
- int numOpCodes = data.getShort();
- byte[] bytes = new byte[numOpCodes];
- data.get(bytes);
- LocationEntry entry = new LocationEntry(lowPC + base, highPC + base, bytes);
- entryMap.put(new IRangeList.Entry(lowPC + base, highPC + base), entry);
- }
-
- entries = entryMap.values();
- locationEntriesByOffset.put(offset, entries);
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(null, t);
- }
- }
-
- return entries;
- }
-
-
- private Map<Long, AbbreviationEntry> parseDebugAbbreviation(int abbreviationOffset) throws IOException {
- Integer key = Integer.valueOf(abbreviationOffset);
- Map<Long, AbbreviationEntry> abbrevs = provider.abbreviationMaps.get(key);
- if (abbrevs == null) {
- abbrevs = new HashMap<Long, AbbreviationEntry>();
- provider.abbreviationMaps.put(key, abbrevs);
- IStreamBuffer data = getDwarfSection(DWARF_DEBUG_ABBREV);
- if (data != null) {
- data.position(abbreviationOffset);
- while (data.remaining() > 0) {
- long code = read_unsigned_leb128(data);
- if (code == 0) {
- break;
- }
- short tag = (short) read_unsigned_leb128(data);
- boolean hasChildren = data.get() == DwarfConstants.DW_CHILDREN_yes;
- AbbreviationEntry entry = new AbbreviationEntry(code, tag, hasChildren);
-
- // attributes
- short name = 0;
- byte form = 0;
- do {
- name = (short) read_unsigned_leb128(data);
- form = (byte) read_unsigned_leb128(data);
- if (name != 0) {
- entry.attributes.add(new Attribute(name, form));
- }
- } while (name != 0 && form != 0);
- entry.attributes.trimToSize();
-
- abbrevs.put(Long.valueOf(code), entry);
- }
- }
- }
- return abbrevs;
- }
-
-
- private void registerType(long offset, IType type, boolean hasChildren) {
- provider.typesByOffset.put(offset, type);
-
- typeToParentMap.put(type, currentParentType);
- if (hasChildren)
- currentParentType = type;
- if (DEBUG) {
- if (type != null) {
- System.out.print(DwarfMessages.DwarfInfoReader_ReadType + type.getName());
- while (type.getType() != null) {
- type = type.getType();
- System.out.print(" " + type.getName()); //$NON-NLS-1$
- }
- System.out.println();
- }
- }
- }
-
- private void registerScope(long offset, Scope scope) {
- provider.scopesByOffset.put(offset, scope);
- }
-
- /**
- * Read a range list referenced from a code scope.
- * @param offset
- * @param base the specified DW_AT_low_pc value (or 0)
- * @return a new RangeList
- */
- public RangeList readRangeList(int offset, AttributeValue baseValue) {
- synchronized (provider) {
- IStreamBuffer data = getDwarfSection(DWARF_DEBUG_RANGES);
- if (data == null) {
- return null;
- }
-
- try {
- data.position(offset);
-
- /*
- * Read range list entry:
- *
- * start: DW_FORM_addr
- * end: DW_FORM_addr
- *
- * When start == all ones, it is a base address selection entry,
- * and end is the base address. The base address does not need to
- * be specified, and is the compialtion unit's base address by default.
- *
- * When start == end == 0, this is the end of the list.
- */
-
- RangeList list = new RangeList();
-
- long base = 0;
- long start = data.getInt();
- long end = data.getInt();
-
- if (start == -1) {
- base = end;
-
- start = data.getInt();
- end = data.getInt();
- } else if (baseValue != null) {
- base = baseValue.getValueAsLong();
- } else if (currentCompileUnitScope != null && currentCompileUnitScope.getRangeList() == null) {
- base = currentCompileUnitScope.getLowAddress().getValue().longValue();
- }
- do {
- if (start == 0 && end == 0) {
- break;
- } else if (start != end) {
- // ignore bogus entries: GCC-E sometimes generates these buggily (for artifical non-inlined functions)
- if (base + start >= codeRanges.getLowAddress()) {
- list.addRange(base + start, base + end);
- }
- }
- start = data.getInt();
- end = data.getInt();
-
- } while (true);
-
- return list;
-
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_RangeReadFailed, t);
- return null;
- }
- }
- }
-
-
-
- /**
- * Set up the address range for a scope by using its DW_AT_low_pc/DW_AT_high_pc
- * or DW_AT_ranges attributes, or DW_AT_stmt_list in a pinch
- * @param attributeList
- * @param scope
- */
- private void setupAddresses(AttributeList attributeList, Scope scope) {
-
- // get the high and low pc from the attributes list
- AttributeValue value
- = attributeList.getAttribute(DwarfConstants.DW_AT_high_pc);
- if (value != null) {
- IAddress low = new Addr32(attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_low_pc));
- scope.setLowAddress(low);
- IAddress high = new Addr32(attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_high_pc));
- IScope parent = scope.getParent();
- if (low.compareTo(high) <= 0) {
- if (parent instanceof DwarfFunctionScope) {
- IAddress parentHigh = parent.getHighAddress();
- if (parentHigh != null && high.compareTo(parentHigh) > 0) {
- ((Scope)parent).setHighAddress(high);
- }
- }
- } else {
- // relying on the following to confirm that this is an RVCT inline DWARF generation bug
- if (scope instanceof DwarfFunctionScope && parent instanceof DwarfFunctionScope) {
- high = fix_Dwarf_InlineHighAddress_Problem(scope);
- if (high == null)
- // at least prevent ecl.bz Bug 329324 from happening
- high = parent.getHighAddress();
-
- // wow, RVCT, you're neat... I think you mean, point to the high PC of the parent
- } else if (parent != null && parent.getHighAddress() != null) {
- high = parent.getHighAddress();
- // may still be bogus, check again next
- }
-
- if (low.compareTo(high) > 0) {
- scope.setLowAddress(high);
- high = low;
- }
- }
- scope.setHighAddress(high);
- return;
- }
-
- // look for a range
- value = attributeList.getAttribute(DwarfConstants.DW_AT_ranges);
- if (value != null) {
- AttributeValue baseValue = attributeList.getAttribute(DwarfConstants.DW_AT_low_pc);
- RangeList ranges = readRangeList(value.getValueAsInt(), baseValue);
- if (ranges != null) {
- scope.setRangeList(ranges);
-
- // if the range list high and low pc extend outside the parent's
- // high/low range, adjust the parent (found in GCC-E)
- if (ranges.getLowAddress() < scope.getParent().getLowAddress().getValue().longValue()) {
- if (scope.getParent() instanceof Scope)
- ((Scope)scope.getParent()).setLowAddress(new Addr32(ranges.getLowAddress()));
- }
- if (ranges.getHighAddress() > scope.getParent().getHighAddress().getValue().longValue()) {
- if (scope.getParent() instanceof Scope)
- ((Scope)scope.getParent()).setHighAddress(new Addr32(ranges.getHighAddress()));
- }
- return;
- }
- }
-
- // in a CU, GCC-E may have only generated this, so we need to dig into the line table
- if (scope instanceof ICompileUnitScope) {
- value = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
- if (value != null) {
- RangeList ranges = new RangeList();
- for (ILineEntry entry : ((ICompileUnitScope) scope).getLineEntries()) {
- // ignore (for now) entries that seem far out of range
- if (entry.getLowAddress().getValue().longValue() >= codeRanges.getLowAddress()) {
- ranges.addRange(entry.getLowAddress().getValue().longValue(),
- entry.getHighAddress().getValue().longValue());
- }
- }
- scope.setRangeList(ranges);
- return;
- }
- }
-
- // no code, apparently
- scope.setLowAddress(new Addr32(0));
- scope.setHighAddress(new Addr32(0));
- }
-
- /**
- * for cases where the compiler generates an incorrect high-address,
- * the line entry provider can give information about the current and
- * subsequent lines within an inline.
- * <br>
- * caveats: this is not meant to handle nested broken inlines. the
- * algorithm assumes
- * - an outer inline nesting another inline will use set of ranges, not a high-low
- * - an inline function will likely be in another file
- * - if not, it will likely be prior to the function that inlines it
- * - and if not, it will likely be more than 32 lines after the function that inlines it
- * @param scope
- * @return high address if determined, or null if prerequisites for finding it aren't met.
- */
- private IAddress fix_Dwarf_InlineHighAddress_Problem(Scope scope) {
- IAddress low = scope.getLowAddress();
- IAddress highest = scope.getParent().getHighAddress();
- Iterator<ILineEntry> lineEntries
- = currentCompileUnitScope.getLineEntries().iterator();
-
- ILineEntry entry = null;
- do {
- if (lineEntries.hasNext())
- entry = lineEntries.next();
- else
- return null;
-
- if (entry == null)
- return null;
- } while (low.compareTo(entry.getHighAddress()) > 0);
-
- IAddress high = null;
- IPath actualPath = entry.getFilePath(), otherPath = null;
- int actualLine = entry.getLineNumber();
- int thisLine = actualLine, lastLine = 0; // XXX false positive on uninitialized variable below causes needless initialization of lastLine = 0
- boolean jumpedBack = false, jumpedAway = false;
- OUTER:do {
- IAddress nextHigh = entry.getHighAddress();
- if (highest != null && nextHigh != null && highest.compareTo(nextHigh) < 0) {
- nextHigh = entry.getLowAddress();
- if (high == null || nextHigh.compareTo(high) < 0)
- high = nextHigh;
- break;
- }
- high = nextHigh;
- if (!jumpedAway && otherPath == null)
- lastLine = thisLine;
-
- if (high == null)
- break OUTER;
-
- do {
- if (lineEntries.hasNext())
- entry = lineEntries.next();
- else
- return null;
- if (entry == null)
- break OUTER;
- } while (high.equals(entry.getHighAddress()));
-
- if (otherPath != null) {
- if (entry.getFilePath().equals(actualPath)) // done with nesting
- break;
- } else if (!entry.getFilePath().equals(actualPath)) {// easiest test for done with inline
- otherPath = entry.getFilePath();
- } else {
- thisLine = entry.getLineNumber();
- if (!jumpedBack && !jumpedAway) {
- if (thisLine < actualLine) {
- jumpedBack = true;
- } else if (thisLine > lastLine + 24) { // XXX false positive here causes needless init of lastLine = 0 above
- jumpedAway = true;
- }
- } else if (jumpedBack) {
- if (thisLine > actualLine) // jumped back ahead; done
- break;
- } else if (jumpedAway) {
- if (thisLine < actualLine
- || thisLine < lastLine
- || thisLine > lastLine + 24)
- break;
- }
- }
- } while (entry != null);
-
- return high;
- }
-
- /**
- * Process a compile unit
- *
- * @param attributeList
- * @param childrenPosition
- */
- private void processCompileUnit(CompilationUnitHeader header, boolean hasChildren, AttributeList attributeList) {
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- String compDir = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
- //System.out.println("processing compile unit: " + Integer.toHexString(header.debugInfoOffset) + ": " + name);
-
- IPath filePath = fileHelper.normalizeFilePath(compDir, name);
-
- currentCompileUnitScope = new DwarfCompileUnit(provider, moduleScope, filePath, null, null, header, hasChildren, attributeList);
- header.scope = currentCompileUnitScope;
- currentParentScope = currentCompileUnitScope;
-
- setupAddresses(attributeList, currentCompileUnitScope);
-
- // some compilers (RVCT) may generate multiple compile units for the
- // same file.
- List<ICompileUnitScope> matchingCompileUnits = provider.compileUnitsPerFile.get(filePath);
-
- if (matchingCompileUnits == null) {
- // first one. create it now.
- matchingCompileUnits = new ArrayList<ICompileUnitScope>();
- }
-
- matchingCompileUnits.add(currentCompileUnitScope);
- provider.compileUnitsPerFile.put(filePath, matchingCompileUnits);
- provider.compileUnits.add(currentCompileUnitScope);
-
- if (!currentCompileUnitScope.getHighAddress().isZero()) // has code
- provider.sortedCompileUnitsWithCode.add(currentCompileUnitScope);
-
- moduleScope.addChild(currentCompileUnitScope);
-
- provider.registerCompileUnitHeader(currentCUHeader.debugInfoOffset, currentCUHeader);
-
- if (provider.buildReferencedFilesList) {
- provider.referencedFiles.add(filePath.toOSString());
-
- // do a quick parse of the line table to get any other referenced files.
- // note that even the full parse doesn't parse the line table information.
- // that is calculated (and then cached) on demand
- AttributeValue a = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
- if (a != null) {
- int stmtList = a.getValueAsInt();
- quickParseLineInfo(stmtList, compDir);
- }
- }
-
- // remove unused attributes
- attributeList.attributeMap.remove(DwarfConstants.DW_AT_name);
- //attributeList.attributeMap.remove(DwarfConstants.DW_AT_comp_dir); // needed later
- attributeList.attributeMap.remove(DwarfConstants.DW_AT_low_pc);
- attributeList.attributeMap.remove(DwarfConstants.DW_AT_high_pc);
- attributeList.attributeMap.remove(DwarfConstants.DW_AT_ranges);
- }
-
- private void processLexicalBlock(long offset, AttributeList attributeList, boolean hasChildren) {
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- if (!attributeList.hasCodeRangeAttributes()) {
- // ignore any that don't have a valid range
- return;
- }
-
- LexicalBlockScope lb = new LexicalBlockScope(name, currentParentScope, null, null);
- setupAddresses(attributeList, lb);
-
- currentParentScope.addChild(lb);
- registerScope(offset, lb);
- if (hasChildren)
- currentParentScope = lb;
- }
-
- static class DereferencedAttributes {
- public CompilationUnitHeader header;
- public AttributeList attributeList;
-
- public DereferencedAttributes(CompilationUnitHeader header,
- AttributeList attributeList) {
- this.header = header;
- this.attributeList = attributeList;
- }
-
- }
-
- /**
- * DW_AT_abstract_origin and DW_AT_specification can refer to types in other
- * compilation units. This will dynamically parse that CU if needed in order
- * to get the attributes for the type.
- *
- * @param debugInfoOffset
- * @return AttributeList or <code>null</code> (should not happen)
- */
- private DereferencedAttributes getDereferencedAttributes(AttributeList attributeList, short tag) {
- CompilationUnitHeader providingCU = currentCUHeader;
- AttributeValue derefLocation = attributeList.getAttribute(tag);
- if (derefLocation == null)
- return null;
-
- // get the offset into the .debug_info section
- long debugInfoOffset = derefLocation.getValueAsLong();
- if (derefLocation.getActualForm() == DwarfConstants.DW_FORM_ref_addr) {
- // this is already relative to the .debug_info section
- } else {
- // relative to the CU
- debugInfoOffset += providingCU.debugInfoOffset;
- }
-
- AttributeList attributes = provider.functionsByOffset.get(debugInfoOffset);
- if (attributes == null) {
- // dereferenced function does not exist yet
- providingCU = provider.fetchCompileUnitHeader(debugInfoOffset);
- attributes = provider.functionsByOffset.get(debugInfoOffset);
- if (attributes == null) {
- // dereferenced entry is not parsed yet, perhaps because it's
- // later in the current compile unit (despite Dwarf 3 spec saying
- // that's not allowed)
- IStreamBuffer buffer = getDwarfSection(DWARF_DEBUG_INFO);
-
- if (buffer != null) {
- buffer.position(debugInfoOffset);
-
- try {
- // get stored abbrev table, or read and parse an abbrev table
- Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(providingCU.abbreviationOffset);
-
- long code = read_unsigned_leb128(buffer);
-
- if (code != 0) {
- AbbreviationEntry entry = abbrevs.get(new Long(code));
- if (entry != null) {
- attributes = new AttributeList(entry, buffer, providingCU.addressSize, getDebugStrings());
- }
- }
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
- + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
- }
- }
- }
- } else {
- providingCU = provider.fetchCompileUnitHeader(debugInfoOffset);
- if (providingCU == null) {
- assert(false);
- return null;
- }
- }
-
- if (attributes == null)
- return null;
-
- return new DereferencedAttributes(providingCU, attributes);
- }
-
- private void processSubprogram(long offset, AttributeList attributeList, boolean hasChildren) {
- // if it's a declaration just add to the offsets map for later lookup
- if (attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_declaration) > 0) {
- provider.functionsByOffset.put(offset, attributeList);
- return;
- }
-
- // functions with no high/low pc aren't real functions. just treat them
- // as declarations as they will be pointed to by abstract_origin from
- // another subprogram tag
- if (!attributeList.hasCodeRangeAttributes()) {
- provider.functionsByOffset.put(offset, attributeList);
- return;
- }
-
- CompilationUnitHeader otherCU = null;
-
- boolean isArtificial = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_artificial) > 0;
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- if (name.length() == 0) {
- // no name. see if we can get it from a declaration
- DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
- if (deref != null) {
- // this should either have a name or point to another
- // declaration
- otherCU = deref.header;
- AttributeList attributes = deref.attributeList;
- name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- isArtificial |= attributes.getAttributeValueAsInt(DwarfConstants. DW_AT_artificial) > 0;
- if (name.length() == 0) {
- deref = getDereferencedAttributes(attributes, DwarfConstants.DW_AT_specification);
- if (deref != null) {
- // this should either have a name or point to another
- // declaration
- otherCU = deref.header;
- attributes = deref.attributeList;
- name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- isArtificial |= attributes.getAttributeValueAsInt(DwarfConstants. DW_AT_artificial) > 0;
- }
- }
- }
- }
- if (name.length() == 0) {
- DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_specification);
- if (deref != null) {
- // this should either have a name or point to another
- // declaration
- otherCU = deref.header;
- AttributeList attributes = deref.attributeList;
- name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- }
- }
-
- if (name.length() == 0) {
- // the name should either be an attribute of the compile unit, or be
- // in the declaration which according to the spec will always be
- // before its definition in the Dwarf.
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_SubprogramNameNotFound1 + Long.toHexString(offset) +
- DwarfMessages.DwarfInfoReader_SubprogramNameNotFound2, null);
- return;
- }
-
- DwarfFunctionScope function = new DwarfFunctionScope(name, currentCompileUnitScope, null, null, null);
- setupAddresses(attributeList, function);
-
- Scope originalParentScope = currentParentScope;
- registerScope(offset, function);
- currentParentScope = function; // needed for getLocationProvider(), etc.
-
- AttributeValue frameBaseAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_frame_base);
- ILocationProvider locationProvider = getLocationProvider(frameBaseAttribute);
- function.setLocationProvider(locationProvider);
-
- // Note: we may still have cases where DW_AT_low_pc and/or DW_AT_high_pc are 0x0
- // (some "ignored inlined" functions in GCC). We want to keep track of their scope
- // (though not store them in the CU), because child tag parses expect to find a parent into
- // which to write their formal parameters and locals.
- if (!function.getLowAddress().isZero() && !function.getHighAddress().isZero() && !isArtificial) {
- // find the declaration location
- int declLine = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_line);
- int declColumn = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_column);
- int declFileNum = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
-
- if (otherCU != null)
- function.setDeclFile(otherCU.scope.getFileEntry(declFileNum));
- else
- function.setDeclFileNum(declFileNum);
- function.setDeclLine(declLine);
- function.setDeclColumn(declColumn);
-
- currentCompileUnitScope.addChild(function);
-
- // keep track of all functions by name for faster lookup
- List<IFunctionScope> functions = provider.functionsByName.get(name);
- if (functions == null) {
- functions = new ArrayList<IFunctionScope>();
- provider.functionsByName.put(name, functions);
- }
- functions.add(function);
- }
-
- // if the entry has no children, then restore the original parent scope
- if (!hasChildren)
- currentParentScope = originalParentScope;
- }
-
- /**
- * Get the already-parsed or forward reference to a type from a DW_AT_type attribute, if present
- * @param attributeMap the map of Long, AttributeValue from AttributeList or Object, Object from Type
- * @return offset to referenced type or 0 if no type attribute
- */
- private IType getTypeOrReference(AttributeList attributeList, CompilationUnitHeader header) {
- AttributeValue typeAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_type);
- if (typeAttribute == null)
- return null;
- return getTypeOrReference(typeAttribute, header);
- }
- /**
- * Get the already-parsed or forward reference to a type from a DW_AT_type attribute, if present
- * @param attributeMap the map of Long, AttributeValue from AttributeList or Object, Object from Type
- * @return offset to referenced type or 0 if no type attribute
- */
- private IType getTypeOrReference(AttributeValue typeAttribute, CompilationUnitHeader header) {
- if (typeAttribute == null)
- return null;
-
- // get the offset into the .debug_info section
- long debugInfoOffset = typeAttribute.getValueAsLong();
- if (typeAttribute.getActualForm() == DwarfConstants.DW_FORM_ref_addr) {
- // this is already relative to the .debug_info section
- } else {
- debugInfoOffset += header.debugInfoOffset;
- }
-
- IType type = provider.typesByOffset.get(debugInfoOffset);
- if (type == null) {
- type = new ForwardTypeReference(provider, debugInfoOffset);
- }
- return type;
- }
-
- private void processInlinedSubroutine(long offset, AttributeList attributeList, boolean hasChildren) {
- // functions with no high/low pc aren't real (probably an error)
- if (!attributeList.hasCodeRangeAttributes()) {
- return;
- }
-
- DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
- if (deref == null) {
- if (attributeList.getAttribute(DwarfConstants.DW_AT_abstract_origin) != null) {
- // TODO: GCC-E can reference forward tags (!) so we need to handle these another way
- } else {
- assert(false);
- }
- return;
- }
-
- CompilationUnitHeader otherCU = deref.header;
- AttributeList origAttributes = deref.attributeList;
-
- // this should either have a name or point to another
- // declaration
- String name = origAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- if (name.length() == 0) {
- deref = getDereferencedAttributes(origAttributes, DwarfConstants.DW_AT_specification);
- if (deref != null) {
- // this should either have a name or point to another
- // declaration
- //otherCU = deref.header;
- AttributeList declarationAttributes = deref.attributeList;
- name = declarationAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- }
- }
-
- if (name.length() == 0) {
- // the name should either be an attribute of the compile unit, or be
- // in the declaration which according to the spec will always be
- // before its definition in the Dwarf.
- return;
- }
-
- // find the declaration location
- int declLine = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_line);
- int declColumn = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_column);
- int declFileNum = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
-
- if (declFileNum == 0) {
- assert(false);
- return;
- }
-
- DwarfFunctionScope function = new DwarfFunctionScope(name, currentParentScope, null, null, null);
- setupAddresses(attributeList, function);
-
- function.setDeclFile(otherCU.scope.getFileEntry(declFileNum));
- function.setDeclLine(declLine);
- function.setDeclColumn(declColumn);
-
- currentParentScope.addChild(function);
-
- registerScope(offset, function);
- if (hasChildren)
- currentParentScope = function;
-
- // keep track of all functions by name for faster lookup
- List<IFunctionScope> functions = provider.functionsByName.get(name);
- if (functions == null) {
- functions = new ArrayList<IFunctionScope>();
- provider.functionsByName.put(name, functions);
- }
- functions.add(function);
- }
-
- private void processSubroutineType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- SubroutineType type = new SubroutineType(currentParentScope, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
-
- // TODO: associate parameters with this type in child tag parse
-
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processClassType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // if the name is mangled, unmangle it
- name = unmangleType(name);
-
- // GCC may put the template parameter of an inherited class at the end of the name,
- // so strip that off
- // TODO: support template parameters at end of name or as separate DW_TAG_template_value_param
- if (name.endsWith(">")) {
- int templateStart = name.indexOf("<");
- if (templateStart != -1)
- name = name.substring(0, templateStart);
- }
-
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- ClassType type = new ClassType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processStructType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // if the name is mangled, unmangle it
- name = unmangleType(name);
-
- StructType type = new StructType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processUnionType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // if the name is mangled, unmangle it
- name = unmangleType(name);
-
- UnionType type = new UnionType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
-
- /*
- * For an anonymous union, which has members accessible by methods in a class, ARM RVCT
- * does not create an unnamed class member so you know the offset of the union's members.
- * Instead, it just gives the anonymous union's type a name of the form "__C" followed
- * by a number. And it places the union's DWARF info after all class member and inherited
- * member DWARF info.
- *
- * E.g., when you have 2 named members and 2 anonymous unions in this order:
- * 4-byte union <anonymous 1>
- * 4-byte long long1
- * 4-byte union <anonymous 2>
- * 4-byte long long2
- * ARM RVCT DWARF info says the class has 2 members:
- * long1 at offset 4
- * long2 at offset 12
- * ARM RVCT DWARF info is in the order:
- * member long1
- * member long2
- * type union <anonymous 1>
- * type union <anonymous 2>
- * So the rules for handling anonymous unions in RVCT DWARF are:
- * 1st read offsets and sizes of non-anonymous members, which leaves offset holes
- * for anonymous unions
- * 2nd read anonymous union type info, which have compiler-generated names of
- * "__C" following by a number, and assign unnamed members to offset holes
- */
- boolean isRVCTAnonymousUnion = false;
- try {
- isRVCTAnonymousUnion = name.startsWith("__C") && (name.length() > 3) && //$NON-NLS-1$
- (name.charAt(3) != '-') && (Long.parseLong(name.substring(3)) > -1);
- } catch (NumberFormatException nfe) {}
-
- // if needed, create an "unnamed" member field with an offset to be determined later
- if (isRVCTAnonymousUnion && getCompositeParent(typeToParentMap.get(currentParentType)) != null) {
- ICompositeType compositeType = getCompositeParent(typeToParentMap.get(currentParentType));
-
- // unnamed member accessibility depends on the enclosing composite's type -
- // public for a struct or union, private for a class
- int accessibility = ICompositeType.ACCESS_PUBLIC;
- if (compositeType instanceof ClassType)
- accessibility = ICompositeType.ACCESS_PRIVATE;
-
- // empty field names confuse the expressions service
- String fieldName = "$unnamed$" + (compositeType.fieldCount() + 1); //$NON-NLS-1$
-
- // since we're generating a field, give it a -1 offset. We cannot tell the real
- // offset until we determine offsets of all previously defined members - which
- // may include inherited types not yet read in Dwarf info
- FieldType fieldType = new FieldType(fieldName, currentParentScope, compositeType, -1, 0, 0,
- byteSize, accessibility, null);
- fieldType.setType(type);
-
- // add the member to the deepest nested (last added) compositeNesting
- // member
- compositeType.addField(fieldType);
- registerType(offset, fieldType, false);
- }
-
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processInheritance(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- ICompositeType compositeType = getCompositeParent();
-
- // The allowed attributes are DW_AT_type, DW_AT_data_member_location,
- // and DW_AT_accessibility
- long fieldsOffset = 0;
- byte[] offsetBlock = attributeList.getAttributeValueAsBytes(DwarfConstants.DW_AT_data_member_location);
- // unsigned LEB128 encoding
- if (offsetBlock.length > 0 && offsetBlock[0] == DwarfConstants.DW_OP_plus_uconst) {
- for (int i = 1, shift = 0; i < offsetBlock.length; i++) {
- fieldsOffset += (offsetBlock[i] & 0x7f) << shift;
- shift += 7;
- }
- }
-
- // default accessibility is private
- int accessibility = ICompositeType.ACCESS_PRIVATE;
- if (attributeList.getAttribute(DwarfConstants.DW_AT_accessibility) != null) {
- accessibility = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_accessibility);
-
- if (accessibility == DwarfConstants.DW_ACCESS_public)
- accessibility = ICompositeType.ACCESS_PUBLIC;
- else if (accessibility == DwarfConstants.DW_ACCESS_private)
- accessibility = ICompositeType.ACCESS_PRIVATE;
- else
- accessibility = ICompositeType.ACCESS_PROTECTED;
- }
-
- InheritanceType type = new InheritanceType(currentParentScope, accessibility, fieldsOffset, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
-
- // add the member to the deepest nested (last added) compositeNesting
- // member
- if (compositeType != null)
- compositeType.addInheritance(type);
-
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processField(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // GCC-E has fields like "_vptr.BaseClass" which will be a problem for us
- // (since '.' is an operator); rename these here
- name = name.replace('.', '$');
-
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
- int bitSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_bit_size);
- int bitOffset = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_bit_offset);
-
- long fieldOffset = 0;
- byte[] offsetBlock = attributeList.getAttributeValueAsBytes(DwarfConstants.DW_AT_data_member_location);
- // unsigned LEB128 encoding
- if (offsetBlock.length > 0 && offsetBlock[0] == DwarfConstants.DW_OP_plus_uconst) {
- for (int i = 1, shift = 0; i < offsetBlock.length; i++) {
- fieldOffset += (offsetBlock[i] & 0x7f) << shift;
- shift += 7;
- }
- }
-
- ICompositeType compositeType = getCompositeParent();
-
- // default accessibility depends on the composite type -
- // public for a struct or union, private for a class
- int accessibility = ICompositeType.ACCESS_PUBLIC;
- if (attributeList.getAttribute(DwarfConstants.DW_AT_accessibility) != null) {
- accessibility = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_accessibility);
-
- if (accessibility == DwarfConstants.DW_ACCESS_public)
- accessibility = ICompositeType.ACCESS_PUBLIC;
- else if (accessibility == DwarfConstants.DW_ACCESS_private)
- accessibility = ICompositeType.ACCESS_PRIVATE;
- else
- accessibility = ICompositeType.ACCESS_PROTECTED;
- } else if (compositeType != null && compositeType instanceof ClassType)
- accessibility = ICompositeType.ACCESS_PRIVATE;
-
- // Empty fields confuse the expressions service (#10369)
- if (name.length() == 0) {
- if (compositeType != null) {
- name = "$unnamed$" + (compositeType.fieldCount() + 1); //$NON-NLS-1$
- } else {
- name = "$unnamed$"; //$NON-NLS-1$
- }
- }
-
- FieldType type = new FieldType(name, currentParentScope, compositeType, fieldOffset, bitSize, bitOffset,
- byteSize, accessibility, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- // add the member to the deepest nested (last added) compositeNesting
- // member
- if (compositeType != null)
- compositeType.addField(type);
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processTemplateTypeParam(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- IType paramType = getTypeOrReference(attributeList.getAttribute(DwarfConstants.DW_AT_type), currentCUHeader);
-
- TemplateParamType type = new TemplateParamType(name, paramType);
-
- ICompositeType compositeType = getCompositeParent();
-
- // add the template param to the deepest nested (last added) compositeNesting
- // member
- if (compositeType != null)
- compositeType.addTemplateParam(type);
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private ICompositeType getCompositeParent() {
- return getCompositeParent(currentParentType);
- }
-
- private ICompositeType getCompositeParent(IType parent) {
- while (parent != null) {
- if (parent instanceof ICompositeType)
- return ((ICompositeType) parent);
- parent = typeToParentMap.get(parent);
- }
- return null;
- }
-
- private void processArrayType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- ArrayType type = new ArrayType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private IArrayType getArrayParent() {
- IType parent = currentParentType;
- while (parent != null) {
- if (parent instanceof IArrayType)
- return ((IArrayType) parent);
- parent = typeToParentMap.get(parent);
- }
- return null;
- }
-
- private void processArrayBoundType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- long arrayBound = 0;
- if (attributeList.getAttribute(DwarfConstants.DW_AT_upper_bound) != null)
- arrayBound = attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_upper_bound) + 1;
-
- ArrayBoundType type = new ArrayBoundType(currentParentScope, arrayBound);
-
- IArrayType array = getArrayParent();
- if (array == null)
- throw new IllegalStateException();
- array.addBound(type);
-
- registerType(offset, type, hasChildren);
-
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processReferenceType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- if (byteSize == 0)
- byteSize = currentCUHeader.addressSize;
-
- ReferenceType type = new ReferenceType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processPointerType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- if (byteSize == 0)
- byteSize = currentCUHeader.addressSize;
-
- PointerType type = new PointerType(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReferenceOrVoid(attributeList));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processPtrToMemberType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // unnamed data types don't get stored by name
- if (name.length() == 0)
- name = "" + offset;
-
- PointerType type = new PointerType(name, currentParentScope, currentCUHeader.addressSize, null);
- type.setType(getTypeOrReferenceOrVoid(attributeList));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processConstType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- ConstType type = new ConstType(currentParentScope, null);
- type.setType(getTypeOrReferenceOrVoid(attributeList));
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processVolatileType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- VolatileType type = new VolatileType(currentParentScope, null);
- type.setType(getTypeOrReferenceOrVoid(attributeList));
- registerType(offset, type, hasChildren);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- // for void pointers, GCC will produce qualifiers and pointers without types or references,
- // so create a void to be qualified or pointed to
- private IType getTypeOrReferenceOrVoid(AttributeList attributeList) {
- IType typeOrReference = getTypeOrReference(attributeList, currentCUHeader);
- if (typeOrReference != null)
- return typeOrReference;
-
- if (moduleScope != null && voidType == null) {
- voidType = new CPPBasicType("void", moduleScope, IBasicType.t_void, 0, 0, null);
- }
-
- if (voidType != null)
- return voidType;
-
- return new CPPBasicType("void", currentParentScope, IBasicType.t_void, 0, 0, null);
- }
-
- private void processEnumType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- // if the name is mangled, unmangle it
- name = unmangleType(name);
-
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- Enumeration type = new Enumeration(name, currentParentScope, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private Enumeration getEnumerationParent() {
- IType parent = currentParentType;
- while (parent != null) {
- if (parent instanceof Enumeration)
- return ((Enumeration) parent);
- parent = typeToParentMap.get(parent);
- }
- return null;
- }
-
- private void processEnumerator(long offset, AttributeList attributeList) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- if (unmangler.isMangled(name)) {
- try {
- name = unmangler.unmangle(name);
- } catch (UnmanglingException ue) {
- }
- }
- long value = attributeList.getAttributeValueAsSignedLong(DwarfConstants.DW_AT_const_value);
-
- Enumerator enumerator = new Enumerator(name, value);
-
- Enumeration enumeration = getEnumerationParent();
- if (enumeration == null)
- throw new IllegalStateException();
- enumeration.addEnumerator(enumerator);
- ((Scope)enumeration.getScope()).addEnumerator(enumerator);
-
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(enumerator)); }
- }
-
- private void processTypeDef(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
-
- // if the name is mangled, unmangle it
- name = unmangleType(name);
-
- TypedefType type = new TypedefType(name, currentParentScope, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processBasicType(long offset, AttributeList attributeList, boolean hasChildren) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
-
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
-
- int baseType = IBasicType.t_unspecified;
- int qualifierBits = 0;
- int encoding = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_encoding);
-
- switch (encoding) {
- case DwarfConstants.DW_ATE_boolean:
- baseType = ICPPBasicType.t_bool;
- break;
- case DwarfConstants.DW_ATE_float:
- if (name.contains("float")) { //$NON-NLS-1$
- baseType = IBasicType.t_float;
- } else if (name.contains("long double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- qualifierBits |= ICPPBasicType.IS_LONG;
- } else if (name.contains("double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- }
- break;
- case DwarfConstants.DW_ATE_signed:
- baseType = IBasicType.t_int;
- qualifierBits |= ICPPBasicType.IS_SIGNED;
- if (name.contains("short")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_SHORT;
- } else if (name.contains("long long")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_LONG_LONG;
- } else if (name.contains("long")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_LONG;
- }
- break;
- case DwarfConstants.DW_ATE_signed_char:
- baseType = IBasicType.t_char;
- qualifierBits |= ICPPBasicType.IS_SIGNED;
- break;
- case DwarfConstants.DW_ATE_unsigned:
- baseType = IBasicType.t_int;
- qualifierBits |= ICPPBasicType.IS_UNSIGNED;
- if (name.contains("short")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_SHORT;
- } else if (name.contains("long long")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_LONG_LONG;
- } else if (name.contains("long")) { //$NON-NLS-1$
- qualifierBits |= ICPPBasicType.IS_LONG;
- }
- break;
- case DwarfConstants.DW_ATE_unsigned_char:
- baseType = IBasicType.t_char;
- qualifierBits |= ICPPBasicType.IS_UNSIGNED;
- break;
- case DwarfConstants.DW_ATE_complex_float:
- qualifierBits |= ICPPBasicType.IS_COMPLEX;
- if (name.contains("float")) { //$NON-NLS-1$
- baseType = IBasicType.t_float;
- } else if (name.contains("long double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- qualifierBits |= ICPPBasicType.IS_LONG;
- } else if (name.contains("double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- }
- break;
- case DwarfConstants.DW_ATE_imaginary_float:
- qualifierBits |= ICPPBasicType.IS_IMAGINARY;
- if (name.contains("float")) { //$NON-NLS-1$
- baseType = IBasicType.t_float;
- } else if (name.contains("long double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- qualifierBits |= ICPPBasicType.IS_LONG;
- } else if (name.contains("double")) { //$NON-NLS-1$
- baseType = IBasicType.t_double;
- }
- break;
- case DwarfConstants.DW_ATE_void:
- baseType = IBasicType.t_void;
- break;
- case DwarfConstants.DW_ATE_address:
- case DwarfConstants.DW_ATE_packed_decimal:
- case DwarfConstants.DW_ATE_numeric_string:
- case DwarfConstants.DW_ATE_edited:
- case DwarfConstants.DW_ATE_signed_fixed:
- case DwarfConstants.DW_ATE_unsigned_fixed:
- case DwarfConstants.DW_ATE_decimal_float:
- default:
- break;
- }
-
- // RVCT has interesting conceptions about "encoding" here. Be sure not to get confused later.
- if (name.equals("void") && byteSize == 0) //$NON-NLS-1$
- baseType = IBasicType.t_void;
-
- CPPBasicType type = new CPPBasicType(name, currentParentScope, baseType, qualifierBits, byteSize, null);
- type.setType(getTypeOrReference(attributeList, currentCUHeader));
- registerType(offset, type, hasChildren);
- storeTypeByName(name, type);
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
- }
-
- private void processVariable(long offset, AttributeList attributeList, boolean isParameter) {
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(attributeList)); }
-
- AttributeValue locationAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_location);
- ILocationProvider locationProvider = getLocationProvider(locationAttribute);
- if (locationProvider == null) {
- // No location means either this is a placeholder (in a subprogram declaration)
- // or it may have been optimized out. See section
- // 2.6 of the Dwarf3 spec. for now we're ignoring it but we may be able
- // to show it in the view with some special decoration to indicate that
- // it's been optimized out
-
- // assume it is a forward reference if we're inside a function (formal_parameter or local)...
- provider.functionsByOffset.put(offset, attributeList);
- return;
- }
-
- // variables can have abstract origins with most of their contents
- CompilationUnitHeader otherCU = currentCUHeader;
- AttributeList otherAttributes = attributeList;
- String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- if (name.length() == 0) {
- // no name.
- // if there is a DW_AT_specification or DW_AT_abstract_origin attribute, use it to get variable attributes
- DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_specification);
- if (deref == null)
- deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
- if (deref != null) {
- // this should either have a name or point to another
- // declaration
- otherCU = deref.header;
- otherAttributes = deref.attributeList;
- name = otherAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
- }
- }
-
- boolean global = (otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_external) == 1);
-
- // if the name is mangled, unmangle it
- if (name.startsWith("_Z")) {
- name = unmangle(name);
- } else if (global) {
- // GCCE uses DW_AT_MIPS_linkage_name for the mangled name of an externally visible variable
- String mangledName = otherAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_MIPS_linkage_name);
- if (unmangler.isMangled(mangledName)) {
- try {
- name = unmangler.unmangle(mangledName);
- } catch (UnmanglingException ue) {
- }
- }
- }
-
- IType type = getTypeOrReference(otherAttributes.getAttribute(DwarfConstants.DW_AT_type), otherCU);
- if (type != null) {
- long startScope = attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_start_scope);
- boolean isDeclared = otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_artificial) <= 0;
-
- int definingFileNum = otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
- if (definingFileNum > 0 && attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_declaration) > 0) {
- // variable is declared here, but not defined here
- definingFileNum = 0;
- }
-
- IPath definingFile = null;
-
- // find the file it's defined in
- if (definingFileNum > 0) {
- // find the enclosing compile unit to get access to its list of
- // .debug_line file names
- IScope cuScope = currentParentScope;
- while (cuScope != null && !(cuScope instanceof DwarfCompileUnit))
- cuScope = cuScope.getParent();
-
- if (cuScope != null) {
- definingFile = ((DwarfCompileUnit) cuScope).getFileEntry(definingFileNum);
- }
- }
-
- DwarfVariable variable = new DwarfVariable(name,
- global ? moduleScope : currentParentScope,
- locationProvider,
- type,
- isDeclared,
- definingFile);
-
- variable.setStartScope(startScope);
-
- if (isParameter) {
- if (currentParentScope instanceof FunctionScope) {
- ((FunctionScope) currentParentScope).addParameter(variable);
- } else {
- assert (false);
- }
- } else {
- if (global) {
- // add global variables to the module scope
- moduleScope.addVariable(variable);
- // AND to the CU scope
- if (currentCompileUnitScope != null) {
- currentCompileUnitScope.addVariable(variable);
- }
- } else {
- // the parent scope could be compile unit, function or
- // lexical block
- currentParentScope.addVariable(variable);
- }
-
- // keep track of all variables by name for faster lookup
- List<IVariable> variables = provider.variablesByName.get(name);
- if (variables == null) {
- variables = new ArrayList<IVariable>();
- provider.variablesByName.put(name, variables);
- }
- variables.add(variable);
- }
-
- if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(variable)); }
- }
- }
-
-
- private ILocationProvider getLocationProvider(AttributeValue locationValue) {
- if (locationValue != null) {
- byte actualForm = locationValue.getActualForm();
- if (actualForm == DwarfConstants.DW_FORM_data4) {
- // location list
- Collection<LocationEntry> entryList = getLocationRecord(locationValue.getValueAsLong());
- if (entryList != null) {
- return new LocationList(entryList.toArray(new LocationEntry[entryList.size()]),
- exeReader.getByteOrder(),
- currentCUHeader.addressSize, currentParentScope);
- }
- } else if (actualForm == DwarfConstants.DW_FORM_block
- || actualForm == DwarfConstants.DW_FORM_block1
- || actualForm == DwarfConstants.DW_FORM_block2
- || actualForm == DwarfConstants.DW_FORM_block4) {
- // location expression
- IStreamBuffer locationData = new MemoryStreamBuffer(locationValue.getValueAsBytes(), exeReader.getByteOrder());
- return new LocationExpression(locationData,
- currentCUHeader.addressSize,
- currentParentScope);
- } else {
- // should not happen according to the spec
- assert (false);
- }
- }
-
- return null;
- }
-
- private void dumpSymbols() {
- if (DEBUG) {
- PrintStream out = null;
- try {
- out = new PrintStream(new File(dumpFileName));
- } catch (FileNotFoundException e) {
- System.out.println(DwarfMessages.DwarfInfoReader_DumpFileOpenOrCreateFailed + dumpFileName);
- return;
- }
-
- // If to write to console
- // PrintStream out = System.out;
-
- out.println("Module - " + symbolFilePath);
- out.println(" Variables - " + moduleScope.getVariables().size());
- out.println(" Compile units - " + moduleScope.getChildren().size());
- out.println();
-
- for (IScope cu : moduleScope.getChildren()) {
- out.println(" Compile unit - " + cu.toString());
- out.println(" Variables - " + cu.getVariables().size());
- out.println(" Functions - " + cu.getChildren().size());
- out.println();
-
- for (IScope func : cu.getChildren()) {
- out.println(" Function - " + func.toString());
- out.println(" Variables - " + func.getVariables().size());
- out.println(" Parameters - " + ((IFunctionScope) func).getParameters().size());
- out.println(" Lexical blocks - " + func.getChildren().size());
- out.println();
-
- // not accurate: can contain IFunctionScope too!
- for (IScope block : func.getChildren()) {
- out.println(" Lexical block - " + block.toString());
- out.println(" Variables - " + block.getVariables().size());
- out.println();
- }
- }
- }
-
- out.close();
- }
- }
-
- public void parseForFrameIndices() {
- synchronized (provider) {
- if (!provider.frameDescEntries.isEmpty())
- return;
-
- IExecutableSection frameSection = exeReader.findExecutableSection(DWARF_DEBUG_FRAME);
- if (frameSection == null)
- return;
-
- IStreamBuffer buffer = frameSection.getBuffer();
- buffer.position(0);
-
- int addressSize = 4; // TODO: 64-bit Dwarf
- long cie_id = addressSize == 4 ? 0xffffffff : ~0L;
-
- // in the first pass, just get a mapping of PC ranges to FDEs,
- // so we can locate entries quickly (don't pre-parse CIEs or decompile FDE instructions yet)
- while (buffer.position() < buffer.capacity()) {
- try {
- long fdePtr = buffer.position();
- long headerLength = readAddress(buffer, addressSize);
- long nextPosition = buffer.position() + headerLength;
-
- long ciePtr = readAddress(buffer, addressSize);
- if (ciePtr != cie_id) {
- long initialLocation = readAddress(buffer, addressSize);
- long addressRange = readAddress(buffer, addressSize);
- IStreamBuffer instructions = buffer.wrapSubsection(nextPosition - buffer.position());
- IRangeList.Entry entry = new IRangeList.Entry(initialLocation, initialLocation + addressRange);
- FrameDescriptionEntry fde = new FrameDescriptionEntry(fdePtr, ciePtr,
- entry.low, entry.high,
- instructions, addressSize);
- provider.frameDescEntries.put(entry, fde);
- }
-
- buffer.position(nextPosition);
- } catch (Throwable t) {
- EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_FrameIndicesReadFailed, t);
- break;
- }
-
- }
- }
- }
-
- /**
- * Parse a CIE
- * @param ciePtr
- * @param addressSize
- * @param framePC
- * @return the CIE or <code>null</code> in case of error
- */
- public CommonInformationEntry parseCommonInfoEntry(Long ciePtr, int addressSize, IAddress framePC) throws IOException {
- synchronized (provider) {
- IExecutableSection frameSection = exeReader.findExecutableSection(DWARF_DEBUG_FRAME);
- if (frameSection == null)
- return null;
-
- IStreamBuffer buffer = frameSection.getBuffer();
- buffer.position(ciePtr);
-
- long headerLength = readAddress(buffer, addressSize);
- if (headerLength > buffer.capacity()) {
- assert(false);
- return null;
- }
-
- long nextPosition = buffer.position() + headerLength;
-
- /* cie_id = */ readAddress(buffer, addressSize);
-
- byte version = buffer.get();
- String augmentation = readString(buffer);
- long codeAlignmentFactor = read_unsigned_leb128(buffer);
- long dataAlignmentFactor = read_signed_leb128(buffer);
- int returnAddressRegister = version < 3 ? buffer.get() & 0xff : (int) read_unsigned_leb128(buffer);
-
-
- IStreamBuffer instructions = buffer.wrapSubsection(nextPosition - buffer.position());
-
- String producer = null;
- ICompileUnitScope cuScope = provider.getCompileUnitForAddress(framePC);
- if (cuScope instanceof DwarfCompileUnit)
- producer = ((DwarfCompileUnit) cuScope).getAttributeList().getAttributeValueAsString(DwarfConstants.DW_AT_producer);
-
- return new CommonInformationEntry(codeAlignmentFactor, dataAlignmentFactor,
- returnAddressRegister, version, instructions, addressSize,
- producer, augmentation);
- }
- }
-
- private void storeTypeByName(String name, IType type) {
- if (name.length() == 0)
- return;
-
- // Don't store opaque types as they are not useful in user-defined
- // type casting nor in opaque type resolution. And storing it would
- // screw up opaque type resolution.
- if (type instanceof ICompositeType && ((ICompositeType)type).isOpaque())
- return;
-
- List<IType> typeList = provider.typesByName.get(name);
- if (typeList == null) {
- typeList = new ArrayList<IType>();
-
- // for a template, remove extra spaces and composite type names (e.g., "class")
- if (name.indexOf('<') != -1) {
- while (name.contains(" ")) //$NON-NLS-1$
- name = name.replaceAll(" ", " "); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll(", ", ","); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- provider.typesByName.put(name, typeList);
- }
- typeList.add(type);
- }
-}
+/**
+ * Copyright (c) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ * Broadcom - Refactored ForwardTypeReference to separate top-level class
+ * - optimized Variable list
+ *
+ * Description:
+ *
+ */
+
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+import java.util.TreeMap;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.EDCTrace;
+import org.eclipse.cdt.debug.edc.internal.MemoryStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.PathUtils;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.CPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ClassType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ConstType;
+import org.eclipse.cdt.debug.edc.internal.symbols.Enumeration;
+import org.eclipse.cdt.debug.edc.internal.symbols.Enumerator;
+import org.eclipse.cdt.debug.edc.internal.symbols.FieldType;
+import org.eclipse.cdt.debug.edc.internal.symbols.FunctionScope;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.InheritanceType;
+import org.eclipse.cdt.debug.edc.internal.symbols.LexicalBlockScope;
+import org.eclipse.cdt.debug.edc.internal.symbols.LineEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ReferenceType;
+import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
+import org.eclipse.cdt.debug.edc.internal.symbols.StructType;
+import org.eclipse.cdt.debug.edc.internal.symbols.SubroutineType;
+import org.eclipse.cdt.debug.edc.internal.symbols.TemplateParamType;
+import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
+import org.eclipse.cdt.debug.edc.internal.symbols.UnionType;
+import org.eclipse.cdt.debug.edc.internal.symbols.VolatileType;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AbbreviationEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.Attribute;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AttributeList;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.AttributeValue;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.CompilationUnitHeader;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.PublicNameInfo;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.CommonInformationEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfFrameRegisterProvider.FrameDescriptionEntry;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.BaseExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerEABI;
+import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.ILineEntry;
+import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
+import org.eclipse.cdt.debug.edc.symbols.IRangeList;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * Handle restartable parsing of Dwarf information from a single module.
+ * This class may be instantiated multiple times to parse specific subsets
+ * of the Dwarf data. The {@link DwarfDebugInfoProvider}
+ * holds the global state of everything parsed so far.
+ */
+public class DwarfInfoReader {
+
+ private class BaseAndScopedNames {
+ public String baseName; // e.g., "bar"
+ public String nameWithScope; // e.g., "foo::bar"
+ }
+
+ private BaseAndScopedNames baseAndScopedNames = new BaseAndScopedNames();
+
+ // These are only for developer of the reader.
+ //
+ private static boolean DEBUG = false;
+ private static String dumpFileName = "C:\\temp\\_EDC_DwarfReaderDump.txt"; //$NON-NLS-1$
+
+ // TODO 64-bit Dwarf currently unsupported
+
+ /* Section names. */
+ public final static String DWARF_DEBUG_INFO = ".debug_info"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_RANGES = ".debug_ranges"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_ABBREV = ".debug_abbrev"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_ARANGES = ".debug_aranges"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_LINE = ".debug_line"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_FRAME = ".debug_frame"; //$NON-NLS-1$
+ public final static String DWARF_EH_FRAME = ".eh_frame"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_LOC = ".debug_loc"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_PUBNAMES = ".debug_pubnames"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_STR = ".debug_str"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_FUNCNAMES = ".debug_funcnames"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_TYPENAMES = ".debug_typenames"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_VARNAMES = ".debug_varnames"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_WEAKNAMES = ".debug_weaknames"; //$NON-NLS-1$
+ public final static String DWARF_DEBUG_MACINFO = ".debug_macinfo"; //$NON-NLS-1$
+
+ private Map<Long, Collection<LocationEntry>> locationEntriesByOffset = Collections.synchronizedMap(new HashMap<Long, Collection<LocationEntry>>());
+
+ // the target for all the reading
+ private DwarfDebugInfoProvider provider;
+
+ private IExecutableSymbolicsReader exeReader;
+ private DwarfModuleScope moduleScope;
+ private IPath symbolFilePath;
+
+ private IExecutableSection debugInfoSection;
+ private IExecutableSection publicNamesSection;
+ private CompilationUnitHeader currentCUHeader;
+
+ private Map<IType, IType> typeToParentMap = Collections.synchronizedMap(new HashMap<IType, IType>());
+ private IType currentParentType;
+ private Scope currentParentScope;
+ private DwarfCompileUnit currentCompileUnitScope;
+
+ private DwarfFileHelper fileHelper;
+
+ private RangeList codeRanges;
+
+ private ICPPBasicType voidType = null;
+
+ private IUnmangler unmangler;
+
+ // comparator for sorting and searching based on compilation unit low address
+ private static Comparator<DwarfCompileUnit> sComparatorByLowAddress = new Comparator<DwarfCompileUnit>() {
+ public int compare(DwarfCompileUnit o1, DwarfCompileUnit o2) {
+ return (o1.getLowAddress().compareTo(o2.getLowAddress()));
+ }};
+
+ /**
+ * Create a reader for the provider. This constructor and any methods
+ * on this reader class will incrementally update the provider.
+ * @param provider
+ */
+ public DwarfInfoReader(DwarfDebugInfoProvider provider) {
+ this.provider = provider;
+ exeReader = provider.getExecutableSymbolicsReader();
+ if (exeReader instanceof BaseExecutableSymbolicsReader)
+ unmangler = ((BaseExecutableSymbolicsReader) exeReader).getUnmangler();
+ if (unmangler == null)
+ unmangler = new UnmanglerEABI();
+
+ symbolFilePath = provider.getSymbolFile();
+ fileHelper = provider.fileHelper;
+ moduleScope = (DwarfModuleScope) provider.getModuleScope();
+ debugInfoSection = exeReader.findExecutableSection(DWARF_DEBUG_INFO);
+ publicNamesSection = exeReader.findExecutableSection(DWARF_DEBUG_PUBNAMES);
+
+ codeRanges = getCodeRanges();
+ }
+
+ private String unmangle(String name) {
+ if (!unmangler.isMangled(name))
+ return name;
+
+ try {
+ name = unmangler.unmangle(name);
+ } catch (UnmanglingException ue) {
+ }
+
+ return name;
+ }
+
+
+ private String unmangleType(String name) {
+ if (!unmangler.isMangled(name))
+ return name;
+
+ try {
+ name = unmangler.unmangleType(name);
+ } catch (UnmanglingException ue) {
+ }
+
+ return name;
+ }
+
+ /**
+ * @return
+ */
+ private RangeList getCodeRanges() {
+ RangeList codeRanges = new RangeList();
+ for (ISection section : exeReader.getSections()) {
+ if (section.getProperties().get(ISection.PROPERTY_NAME).equals(ISection.NAME_TEXT)) {
+ long start = section.getLinkAddress().getValue().longValue();
+ long size = section.getSize();
+ codeRanges.addRange(start, start + size);
+ }
+ }
+ return codeRanges;
+ }
+
+ protected IStreamBuffer getDwarfSection(String sectionName) {
+ // the exe reader and section already handle caching this
+ IStreamBuffer buffer = null;
+ IExecutableSection section = exeReader.findExecutableSection(sectionName);
+ if (section != null) {
+ buffer = section.getBuffer();
+ }
+ return buffer;
+ }
+
+ /**
+ * Parse top-level debugging information about compilation units and globally
+ * visible objects, but do not expand or gather data about other objects in
+ * compilation units.
+ */
+ public void parseInitial() {
+ Job parseInitialJob = new Job(DwarfMessages.DwarfInfoReader_ReadingSymbolInfo + symbolFilePath) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceInitialParseFor + symbolFilePath)); }
+ synchronized (provider) {
+ parseCUDebugInfo(monitor);
+ parsePublicNames();
+ }
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedInitialParse)); }
+ return Status.OK_STATUS;
+ }
+ };
+
+ try {
+ parseInitialJob.schedule();
+ parseInitialJob.join();
+ } catch (InterruptedException e) {
+ EDCDebugger.getMessageLogger().logError(null, e);
+ }
+ }
+
+ /**
+ * Parse all compilation units for addresses
+ *
+ * @param includeCUWithoutCode
+ * whether to parse compile units without code. For variable
+ * info, we need to look into those CUs, whereas for scope
+ * info, we don't.
+ */
+ public void parseForAddresses(boolean includeCUWithoutCode) {
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressesParseFor + symbolFilePath)); }
+ synchronized (provider) {
+ for (DwarfCompileUnit compileUnit : provider.compileUnits) {
+ if (DEBUG) {
+ // For internal check.
+ if (compileUnit.getHighAddress().isZero())
+ assert(compileUnit.getChildren().size() == 0);
+ else
+ assert(compileUnit.getChildren().size() >= 0);
+ }
+
+ if (includeCUWithoutCode || // parse every CU
+ ! compileUnit.getHighAddress().isZero()) // parse only those with code.
+ {
+ parseCompilationUnitForAddresses(compileUnit);
+ }
+ }
+ }
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedAddressesParse)); }
+
+ moduleScope.fixupRanges(Addr32.ZERO);
+
+ if (DEBUG) {
+ dumpSymbols();
+ }
+
+ }
+
+ /**
+ * Parse compilation unit corresponding to address
+ *
+ * @param linkAddress
+ * address in a compile unit that contains code
+ */
+ public void parseForAddress(IAddress linkAddress) {
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressParseFor + symbolFilePath)); }
+
+ // find compilation unit containing address, and parse it
+ synchronized (provider) {
+ DwarfCompileUnit cu = new DwarfCompileUnit(provider, null, null, linkAddress, linkAddress, null, false, null);
+ int index = Collections.binarySearch (provider.sortedCompileUnitsWithCode, cu, sComparatorByLowAddress);
+
+ if (index >= 0) {
+ cu = provider.sortedCompileUnitsWithCode.get(index);
+ parseCompilationUnitForAddresses(cu);
+ } else if (index < -1 && -index - 2 < provider.sortedCompileUnitsWithCode.size()) {
+ cu = provider.sortedCompileUnitsWithCode.get(-index - 2);
+ if (cu.getLowAddress().compareTo(linkAddress) <= 0 && cu.getHighAddress().compareTo(linkAddress) >= 0)
+ parseCompilationUnitForAddresses(cu);
+ } else {
+ return;
+ }
+
+ if (moduleScope.getLowAddress().compareTo(cu.getLowAddress()) > 0)
+ moduleScope.setLowAddress(cu.getLowAddress());
+ if (moduleScope.getHighAddress().compareTo(cu.getHighAddress()) < 0)
+ moduleScope.setHighAddress(cu.getHighAddress());
+ }
+
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedAddressParse)); }
+ }
+
+ /**
+ * Parse names in the .debug_pubnames section
+ */
+ private void parsePublicNames() {
+
+ if (publicNamesSection == null || debugInfoSection == null) { // no public names and/or debug info
+ return;
+ }
+
+ IStreamBuffer bufferPublicNames = publicNamesSection.getBuffer();
+ if (bufferPublicNames == null)
+ return;
+
+ IStreamBuffer bufferDebuginfo = debugInfoSection.getBuffer();
+ if (bufferDebuginfo == null)
+ return;
+
+ long fileIndex = 0;
+ long fileEndIndex = bufferPublicNames.capacity();
+
+ // parse all the sets in the .debug_pubnames section
+ while (fileIndex < fileEndIndex) {
+ fileIndex = parsePublicNamesSet(bufferPublicNames, fileIndex, bufferDebuginfo);
+ }
+ }
+
+ /**
+ * Parse one set of global objects and functions
+ */
+ private long parsePublicNamesSet(IStreamBuffer bufferPublicNames, long fileIndex, IStreamBuffer bufferDebugInfo) {
+ bufferPublicNames.position(fileIndex);
+
+ // get the set's data length
+ int setLength = bufferPublicNames.getInt();
+
+ // get the entire set
+
+ IStreamBuffer dataPublicNames = bufferPublicNames.wrapSubsection(setLength);
+
+ // get header info for set of public names
+ // skip over Dwarf version
+ dataPublicNames.position(2);
+ int debugInfoOffset = dataPublicNames.getInt();
+ int debugInfoLength = dataPublicNames.getInt();
+
+ try {
+ // read the entire compile unit
+ bufferDebugInfo.position(debugInfoOffset);
+
+ IStreamBuffer dataInfoBytes = bufferDebugInfo.wrapSubsection(debugInfoLength);
+
+ CompilationUnitHeader header = provider.debugOffsetsToCompileUnits.get(Long.valueOf(debugInfoOffset));
+
+ // get stored abbrev table, or read and parse an abbrev table
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
+
+ // read names and corresponding types
+ // ignore the 4 bytes of 0 at the end of the set
+ while (dataPublicNames.remaining() > 4) {
+ // read the object offset and name
+ int objectOffset = dataPublicNames.getInt();
+ String name = readString(dataPublicNames);
+
+ // read the type of object
+ dataInfoBytes.position(objectOffset);
+ long code = read_unsigned_leb128(dataInfoBytes);
+ AbbreviationEntry entry = abbrevs.get(new Long(code));
+
+ // ignore empty names, names without debug info, and
+ // compiler-generated special symbols
+ if (entry != null && name.length() > 0 && !name.startsWith("<")) {
+ // if the name is mangled, unmangle it
+ name = unmangle(name);
+
+ String baseName = name;
+ int baseStart = name.lastIndexOf("::"); //$NON-NLS-1$
+ if (baseStart != -1)
+ baseName = name.substring(baseStart + 2);
+ if (entry.tag == DwarfConstants.DW_TAG_variable) {
+ List<PublicNameInfo> variables = provider.publicVariables.get(baseName);
+ if (variables == null) {
+ variables = new ArrayList<PublicNameInfo>();
+ }
+ variables.add(new PublicNameInfo(name, header, entry.tag));
+ provider.publicVariables.put(baseName, variables);
+ } else if (entry.tag == DwarfConstants.DW_TAG_subprogram) {
+ List<PublicNameInfo> functions = provider.publicFunctions.get(baseName);
+ if (functions == null) {
+ functions = new ArrayList<PublicNameInfo>();
+ functions.add(new PublicNameInfo(name, header, entry.tag));
+ } else {
+ // we don't store debug info offsets, so polymorphic functions for a compilation
+ // unit have identical PublicNameInfo fields; throw all but one away
+ ArrayList<PublicNameInfo> arrayList = (ArrayList<PublicNameInfo>)functions;
+ boolean found = false;
+ for (int i = arrayList.size() - 1;
+ !found && (i >= 0) && (arrayList.get(i).cuHeader == header); i--)
+ found = arrayList.get(i).nameWithNameSpace.equals(name);
+ if (!found)
+ functions.add(new PublicNameInfo(name, header, entry.tag));
+ }
+ provider.publicFunctions.put(baseName, functions);
+
+ }
+ }
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(null, t);
+ }
+
+ return fileIndex + setLength + 4;
+ }
+
+ /**
+ * Parse all compilation units for types
+ */
+ public void parseForTypes() {
+ synchronized (provider) {
+ for (DwarfCompileUnit compileUnit : provider.compileUnits) {
+ parseCompilationUnitForTypes(compileUnit);
+ }
+ }
+ }
+ /**
+ * Parse compilation unit headers and top-level info in the .debug_info section
+ * @param monitor
+ */
+ private void parseCUDebugInfo(IProgressMonitor monitor) {
+
+ if (debugInfoSection == null) { // no Dwarf data.
+ return;
+ }
+
+ // if we haven't built the referenced files list from a quick parse yet,
+ // flag it here so we can build the file list as we parse.
+ if (provider.referencedFiles.isEmpty()) {
+ provider.buildReferencedFilesList = true;
+ }
+
+ IStreamBuffer buffer = debugInfoSection.getBuffer();
+ IStreamBuffer debugStrings = getDebugStrings();
+ boolean havePubNames = publicNamesSection != null && publicNamesSection.getBuffer() != null;
+
+ int totalWork = (int) (buffer.capacity() / 1024);
+ monitor.beginTask(DwarfMessages.DwarfInfoReader_ReadDebugInfo, totalWork);
+ try {
+ if (buffer != null) {
+ long fileIndex = 0;
+ long fileEndIndex = buffer.capacity();
+
+ while (fileIndex < fileEndIndex) {
+ long oldIndex = fileIndex;
+ fileIndex = parseCompilationUnitForNames(buffer, fileIndex, debugStrings, fileEndIndex, havePubNames);
+ monitor.worked((int) ((fileIndex - oldIndex) / 1024));
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ provider.compileUnits.trimToSize();
+ // sort by low address the list of compilation units with code
+ provider.sortedCompileUnitsWithCode.trimToSize();
+ Collections.sort(provider.sortedCompileUnitsWithCode, sComparatorByLowAddress);
+ provider.buildReferencedFilesList = false;
+ }
+
+ /**
+ * Parse the compile unit quickly looking for variables that are globally visible
+ *
+ * @return offset of next compilation unit
+ */
+ private long parseCompilationUnitForNames(IStreamBuffer buffer, long fileIndex, IStreamBuffer debugStrings, long fileEndIndex, boolean havePubNames) {
+ buffer.position(fileIndex);
+
+ currentCUHeader = new CompilationUnitHeader();
+ currentCUHeader.length = buffer.getInt();
+ currentCUHeader.version = buffer.getShort();
+ currentCUHeader.abbreviationOffset = buffer.getInt();
+ currentCUHeader.addressSize = buffer.get();
+ currentCUHeader.debugInfoOffset = (int) fileIndex;
+
+ /*
+ * With certain GCC-E 3.x compilers, some subset of compile unit headers can have unit
+ * lengths 4 bytes too long. Before reading compile unit data, make sure there is a
+ * valid compile unit header right after this unit's data. Adjust the length if needed.
+ * To validate, check that the DWARF version and the address size are
+ * the same as the previous compile unit's.
+ */
+ if (fileIndex + currentCUHeader.length + 8 < fileEndIndex) {
+ // try good case
+ short nextVersion;
+ byte nextAddrSize;
+ buffer.position(fileIndex + currentCUHeader.length + 8); // to next version
+ nextVersion = buffer.getShort();
+ buffer.position(fileIndex + currentCUHeader.length + 14); // to next address size
+ nextAddrSize = buffer.get();
+
+ if (currentCUHeader.version != nextVersion || currentCUHeader.addressSize != nextAddrSize) {
+ // try adjusting back by 4 bytes
+ buffer.position(fileIndex + currentCUHeader.length + 4); // to next version
+ nextVersion = buffer.getShort();
+ buffer.position(fileIndex + currentCUHeader.length + 10); // to next address size
+ nextAddrSize = buffer.get();
+
+ if (currentCUHeader.version == nextVersion && currentCUHeader.addressSize == nextAddrSize) {
+ // all this work to adjust the length...
+ currentCUHeader.length -= 4;
+ }
+ }
+ }
+
+ // now read the whole compile unit into memory. note that we're
+ // reading the whole section including the size that we already
+ // read because other code will use the offset of the buffer as
+ // the offset of the section to store things by offset (types,
+ // function declarations, etc).
+ buffer.position(fileIndex);
+
+ IStreamBuffer in = buffer.wrapSubsection(currentCUHeader.length + 4);
+
+ // skip over the header info we already read
+ in.position(11);
+
+ try {
+ // get stored abbrev table, or read and parse an abbrev table
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(currentCUHeader.abbreviationOffset);
+
+ // read the compile unit's attribute list
+ long code = read_unsigned_leb128(in);
+ AbbreviationEntry entry = abbrevs.get(Long.valueOf(code));
+
+ AttributeList attributeList = new AttributeList(entry, in, currentCUHeader.addressSize, debugStrings);
+ processCompileUnit(currentCUHeader, entry.hasChildren, attributeList);
+
+ if (!havePubNames) {
+ // record file scope variables
+ byte addressSize = currentCUHeader.addressSize;
+ while (in.remaining() > 0) {
+ code = read_unsigned_leb128(in);
+
+ if (code != 0) {
+ entry = abbrevs.get(Long.valueOf(code));
+
+ switch (entry.tag) {
+ // record names of interest, but not other Dwarf attributes
+ case DwarfConstants.DW_TAG_variable:
+ {
+ // get variable names at the compile unit scope level
+ parseAttributesForNames(true, baseAndScopedNames, entry, in, addressSize, debugStrings);
+ if (baseAndScopedNames.baseName != null)
+ storePublicNames(provider.publicVariables, baseAndScopedNames, currentCUHeader, (short) DwarfConstants.DW_TAG_variable);
+ break;
+ }
+ case DwarfConstants.DW_TAG_imported_declaration: // for possible namespace alias
+ case DwarfConstants.DW_TAG_namespace:
+ case DwarfConstants.DW_TAG_subprogram:
+ case DwarfConstants.DW_TAG_enumerator:
+ case DwarfConstants.DW_TAG_class_type:
+ case DwarfConstants.DW_TAG_structure_type:
+ case DwarfConstants.DW_TAG_array_type:
+ case DwarfConstants.DW_TAG_base_type:
+ case DwarfConstants.DW_TAG_enumeration_type:
+ case DwarfConstants.DW_TAG_pointer_type:
+ case DwarfConstants.DW_TAG_ptr_to_member_type:
+ case DwarfConstants.DW_TAG_subroutine_type:
+ case DwarfConstants.DW_TAG_typedef:
+ case DwarfConstants.DW_TAG_union_type:
+ case DwarfConstants.DW_TAG_access_declaration:
+ case DwarfConstants.DW_TAG_catch_block:
+ case DwarfConstants.DW_TAG_common_block:
+ case DwarfConstants.DW_TAG_common_inclusion:
+ case DwarfConstants.DW_TAG_condition:
+ case DwarfConstants.DW_TAG_const_type:
+ case DwarfConstants.DW_TAG_constant:
+ case DwarfConstants.DW_TAG_entry_point:
+ case DwarfConstants.DW_TAG_file_type:
+ case DwarfConstants.DW_TAG_formal_parameter:
+ case DwarfConstants.DW_TAG_friend:
+ case DwarfConstants.DW_TAG_imported_module:
+ case DwarfConstants.DW_TAG_inheritance:
+ case DwarfConstants.DW_TAG_inlined_subroutine:
+ case DwarfConstants.DW_TAG_interface_type:
+ case DwarfConstants.DW_TAG_label:
+ case DwarfConstants.DW_TAG_lexical_block:
+ case DwarfConstants.DW_TAG_member:
+ case DwarfConstants.DW_TAG_module:
+ case DwarfConstants.DW_TAG_namelist:
+ case DwarfConstants.DW_TAG_namelist_item:
+ case DwarfConstants.DW_TAG_packed_type:
+ case DwarfConstants.DW_TAG_reference_type:
+ case DwarfConstants.DW_TAG_restrict_type:
+ case DwarfConstants.DW_TAG_set_type:
+ case DwarfConstants.DW_TAG_shared_type:
+ case DwarfConstants.DW_TAG_string_type:
+ case DwarfConstants.DW_TAG_subrange_type:
+ case DwarfConstants.DW_TAG_template_type_param:
+ case DwarfConstants.DW_TAG_template_value_param:
+ case DwarfConstants.DW_TAG_thrown_type:
+ case DwarfConstants.DW_TAG_try_block:
+ case DwarfConstants.DW_TAG_unspecified_parameters:
+ case DwarfConstants.DW_TAG_variant:
+ case DwarfConstants.DW_TAG_variant_part:
+ case DwarfConstants.DW_TAG_volatile_type:
+ case DwarfConstants.DW_TAG_with_stmt:
+ {
+ AttributeValue.skipAttributesToSibling(entry, in, addressSize);
+ break;
+ }
+ // case DwarfConstants.DW_TAG_compile_unit:
+ // case DwarfConstants.DW_TAG_partial_unit:
+ // case DwarfConstants.DW_TAG_unspecified_type:
+ default:
+ // skip entire entries
+ AttributeList.skipAttributes(entry, in, addressSize);
+ break;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
+ + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
+ }
+
+ // skip past the compile unit. note that the
+ // currentCUHeader.length does not include
+ // the size of the unit length itself
+ fileIndex += currentCUHeader.length + 4;
+
+ return fileIndex;
+ }
+
+ /**
+ * Parse attributes, returning names
+ *
+ * @param onlyExternal only return names if they have external visibility
+ * @param names array to hold up to two names
+ * @param entry debug info entry
+ * @param in buffer stream of debug info
+ * @param addressSize
+ * @param debugStrings
+ * @return DW_AT_name value in names[0], unmangled DW_AT_MIPS_linkage_name value in
+ * names[1], or nulls
+ */
+ private void parseAttributesForNames(boolean onlyExternal, BaseAndScopedNames baseAndScopedNames, AbbreviationEntry entry, IStreamBuffer in,
+ byte addressSize, IStreamBuffer debugStrings) {
+
+ String name = null;
+ baseAndScopedNames.baseName = null;
+ baseAndScopedNames.nameWithScope = null;
+ boolean isExternal = false;
+
+ // go through the attributes and throw away everything except the names
+ int len = entry.attributes.size();
+ for (int i = 0; i < len; i++) {
+ Attribute attr = entry.attributes.get(i);
+ try {
+ if ( attr.tag == DwarfConstants.DW_AT_name
+ || attr.tag == DwarfConstants.DW_AT_MIPS_linkage_name) {
+ // names should be DW_FORM_string or DW_FORM_strp
+ if (attr.form == DwarfConstants.DW_FORM_string) {
+ int c;
+ StringBuffer sb = new StringBuffer();
+ while ((c = (in.get() & 0xff)) != -1) {
+ if (c == 0) {
+ break;
+ }
+ sb.append((char) c);
+ }
+ name = sb.toString();
+ } else if (attr.form == DwarfConstants.DW_FORM_strp) {
+ int debugStringOffset = in.getInt();
+ if ( debugStrings != null
+ && debugStringOffset >= 0
+ && debugStringOffset < debugStrings.capacity()) {
+ debugStrings.position(debugStringOffset);
+ name = DwarfInfoReader.readString(debugStrings);
+ }
+ }
+
+ if (name != null) {
+ if (attr.tag == DwarfConstants.DW_AT_name) {
+ baseAndScopedNames.baseName = name;
+ baseAndScopedNames.nameWithScope = name;
+ } else {
+ if (exeReader instanceof BaseExecutableSymbolicsReader) {
+ try {
+ baseAndScopedNames.nameWithScope = unmangler.unmangle(unmangler.undecorate(name));
+ } catch(UnmanglingException ue) {
+ }
+ }
+ }
+ name = null;
+ }
+ } else if (attr.tag == DwarfConstants.DW_AT_external) {
+ if (attr.form == DwarfConstants.DW_FORM_flag) {
+ isExternal = in.get() != 0;
+ } else {
+ AttributeValue.skipAttributeValue(attr.form, in, addressSize);
+ }
+ } else {
+ AttributeValue.skipAttributeValue(attr.form, in, addressSize);
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(null, t);
+ break;
+ }
+ }
+
+ // if only looking for externals, throw away internals
+ if (onlyExternal && !isExternal) {
+ baseAndScopedNames.baseName = null;
+ baseAndScopedNames.nameWithScope = null;
+ } else {
+ // if only have the scoped name, derive the base name
+ if (baseAndScopedNames.nameWithScope != null && baseAndScopedNames.baseName == null) {
+ int baseStart = baseAndScopedNames.nameWithScope.lastIndexOf("::"); //$NON-NLS-1$
+ if (baseStart != -1)
+ baseAndScopedNames.baseName = baseAndScopedNames.nameWithScope.substring(baseStart + 2);
+ else
+ baseAndScopedNames.baseName = baseAndScopedNames.nameWithScope;
+ }
+ }
+ }
+
+ /**
+ * Store compilation unit level names from Dwarf .debug_info
+ *
+ * @param namesStore
+ * @param names
+ * @param offset
+ */
+ private void storePublicNames(Map<String, List<PublicNameInfo>> namesStore, BaseAndScopedNames baseAndScopedNames,
+ CompilationUnitHeader cuHeader, short tag) {
+
+ List<PublicNameInfo> currentNames = namesStore.get(baseAndScopedNames.baseName);
+ if (currentNames == null) {
+ currentNames = new ArrayList<PublicNameInfo>();
+ namesStore.put(baseAndScopedNames.baseName, currentNames);
+ }
+ currentNames.add(new PublicNameInfo(baseAndScopedNames.nameWithScope, cuHeader, tag));
+ }
+
+ private synchronized void parseCompilationUnitForAddressesPrivate(DwarfCompileUnit compileUnit, IProgressMonitor monitor)
+ {
+ synchronized (compileUnit) {
+ if (compileUnit.isParsedForAddresses())
+ return;
+
+ compileUnit.setParsedForAddresses(true);
+
+ CompilationUnitHeader header = compileUnit.header;
+
+ if (header == null)
+ return;
+
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceAddressParse1 + Integer.toHexString(header.debugInfoOffset) + DwarfMessages.DwarfInfoReader_TraceAddressParse2 + header.scope.getFilePath())); }
+
+ IStreamBuffer buffer = debugInfoSection.getBuffer();
+
+ if (buffer == null)
+ return;
+
+ int fileIndex = header.debugInfoOffset;
+
+ // read the compile unit debug info into memory
+ buffer.position(fileIndex);
+
+ IStreamBuffer data = buffer.wrapSubsection(header.length + 4);
+
+ // skip over the header, since we've already read it
+ data.position(11); // unit length + version + abbrev table offset + address size
+
+ currentCompileUnitScope = compileUnit;
+ currentParentScope = compileUnit;
+ registerScope(header.debugInfoOffset, compileUnit);
+ currentCUHeader = header;
+
+ try {
+ // get stored abbrev table, or read and parse an abbrev table
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
+
+ parseForAddresses(data, abbrevs, header, new Stack<Scope>(), monitor);
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
+ + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
+ }
+ }
+ }
+
+ /**
+ * Given compilation unit, parse to get variables and all children that have address ranges.
+ *
+ * @param compileUnit
+ */
+ public void parseCompilationUnitForAddresses(final DwarfCompileUnit compileUnit) {
+ synchronized (provider) {
+ synchronized (compileUnit) {
+ if (compileUnit.isParsedForAddresses())
+ return;
+ }
+ parseCompilationUnitForAddressesPrivate(compileUnit, new NullProgressMonitor());
+ }
+ }
+
+ synchronized public void parseCompilationUnitForTypes(DwarfCompileUnit compileUnit) {
+ synchronized (provider) {
+ synchronized(compileUnit) {
+ if (compileUnit.isParsedForTypes())
+ return;
+
+ compileUnit.setParsedForTypes(true);
+
+ CompilationUnitHeader header = compileUnit.header;
+
+ if (header == null)
+ return;
+
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceTypeParse1 + Integer.toHexString(header.debugInfoOffset) + DwarfMessages.DwarfInfoReader_TraceTypeParse2 + header.scope.getFilePath())); }
+
+ IStreamBuffer buffer = debugInfoSection.getBuffer();
+
+ if (buffer == null)
+ return;
+
+ int fileIndex = header.debugInfoOffset;
+
+ // read the compile unit debug info into memory
+ buffer.position(fileIndex);
+
+ IStreamBuffer data = buffer.wrapSubsection(header.length + 4);
+
+ // skip over the header, since we've already read it
+ data.position(11); // unit length + version + abbrev table offset + address size
+
+ currentCompileUnitScope = compileUnit;
+ currentParentScope = compileUnit;
+ registerScope(header.debugInfoOffset, compileUnit);
+ currentCUHeader = header;
+
+ try {
+ // get stored abbrev table, or read and parse an abbrev table
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header.abbreviationOffset);
+
+ parseForTypes(data, abbrevs, header, new Stack<Scope>());
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseTraceInfoSectionFailed1
+ + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseTraceInfoSectionFailed2 + symbolFilePath, t);
+ }
+ }
+ }
+ }
+
+ public void quickParseDebugInfo(IProgressMonitor monitor) {
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceQuickParse + symbolFilePath)); }
+ synchronized (provider) {
+ doQuickParseDebugInfo(monitor);
+ }
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceFinishedQuickParse)); }
+ }
+
+ /**
+ * Does a quick parse of the .debug_info section just to get a list of
+ * referenced files from the compile units.
+ */
+ private void doQuickParseDebugInfo(IProgressMonitor monitor) {
+
+ if (debugInfoSection == null) { // no Dwarf data.
+ return;
+ }
+
+ // get the compile units out of the .debug_info section
+ IStreamBuffer buffer = debugInfoSection.getBuffer();
+ if (buffer == null)
+ return;
+
+ try {
+
+ long fileIndex = 0;
+ long fileEndIndex = buffer.capacity();
+
+ monitor.beginTask(DwarfMessages.DwarfInfoReader_ReadDebugInfo, (int) (fileEndIndex / 1024));
+
+ buffer.position(0);
+ while (fileIndex < fileEndIndex) {
+ buffer.position(fileIndex);
+
+ int unit_length = buffer.getInt();
+ short version = buffer.getShort();
+ int debug_abbrev_offset = buffer.getInt();
+ byte address_size = buffer.get();
+
+ /*
+ * With certain GCC-E 3.x compilers, some subset of compile unit headers can have unit
+ * lengths 4 bytes too long. So before reading this unit's data, make sure there is a
+ * valid compile unit header right after this unit's data. Adjust the length if needed.
+ * To validate, check that the DWARF version and the address size are
+ * the same as the previous compile unit's.
+ */
+ if (fileIndex + unit_length + 8 < fileEndIndex) {
+ // try good case
+ short nextVersion;
+ byte nextAddrSize;
+ buffer.position(fileIndex + unit_length + 8); // to next version
+ nextVersion = buffer.getShort();
+ buffer.position(fileIndex + unit_length + 14); // to next address size
+ nextAddrSize = buffer.get();
+
+ if (version != nextVersion || address_size != nextAddrSize) {
+ // try adjusting back by 4 bytes
+ buffer.position(fileIndex + unit_length + 4); // to next version
+ nextVersion = buffer.getShort();
+ buffer.position(fileIndex + unit_length + 10); // to next address size
+ nextAddrSize = buffer.get();
+
+ if (version == nextVersion && address_size == nextAddrSize) {
+ unit_length -= 4;
+ } // otherwise, just let things bomb
+ }
+ }
+
+ buffer.position(fileIndex + 4);
+ IStreamBuffer data = buffer.wrapSubsection(unit_length);
+ data.position(7); // skip header info already read
+
+ // get the abbreviation entry for the compile unit
+ // find the offset to the
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(debug_abbrev_offset);
+
+ long code = read_unsigned_leb128(data);
+ AbbreviationEntry entry = abbrevs.get(Long.valueOf(code));
+ AttributeList attributeList = new AttributeList(entry, data, address_size, getDebugStrings());
+
+ // get comp_dir and name and figure out the path
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ String compDir = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
+
+ IPath filePath = fileHelper.normalizeFilePath(compDir, name);
+ provider.referencedFiles.add(filePath.toOSString());
+
+ // do a quick parse of the line table to get any other
+ // referenced files
+ AttributeValue a = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
+ if (a != null) {
+ int stmtList = a.getValueAsInt();
+ quickParseLineInfo(stmtList, compDir);
+ }
+
+ // skip past the compile unit. note that the unit_length does
+ // not include the size of the unit length itself
+ long oldIndex = fileIndex;
+ fileIndex += unit_length + 4;
+ monitor.worked((int) ((fileIndex - oldIndex) / 1024));
+ }
+
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseSectionSourceFilesFailed1
+ + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseSectionSourceFilesFailed2 + symbolFilePath, t);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Get the .debug_strings section.
+ * @return ByteBuffer or <code>null</code>
+ */
+ private IStreamBuffer getDebugStrings() {
+ return getDwarfSection(DWARF_DEBUG_STR);
+ }
+
+ /**
+ * Does a quick parse of the .debug_line section just to get a list of
+ * referenced files from the line table.
+ */
+ private void quickParseLineInfo(int lineTableOffset, String compileUnitDirectory) {
+ IPath compileUnitDirectoryPath = PathUtils.createPath(compileUnitDirectory);
+ try {
+ // do a quick parse of the line table just to get referenced files
+ IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LINE);
+ if (data != null) {
+ data.position(lineTableOffset);
+
+ /*
+ * Skip past the bytes of the header that we don't care about:
+ * unit_length (4 bytes), version (2 bytes), header_length (4 bytes),
+ * minimum_instruction_length (1 byte), default_is_stmt (1 byte),
+ * line_base (1 byte), line_range (1 byte)
+ */
+ data.position(data.position() + 14);
+
+ // we need to get this value so we can skip over
+ // standard_opcode_lengths
+ int opcode_base = data.get() & 0xff;
+ data.position(data.position() + opcode_base - 1);
+
+ // include_directories
+ ArrayList<String> dirList = new ArrayList<String>();
+
+ // add the compilation directory of the CU as the first
+ // directory
+ dirList.add(compileUnitDirectory);
+
+ while (true) {
+ String str = readString(data);
+ if (str.length() == 0)
+ break;
+
+ // if the directory is relative, append it to the CU dir
+ IPath dir = PathUtils.createPath(str);
+ if (!dir.isAbsolute() && dir.getDevice() == null) {
+ dir = compileUnitDirectoryPath.append(str);
+ }
+ dirList.add(dir.toString());
+ }
+
+ while (true) {
+ String fileName = readString(data);
+ if (fileName.length() == 0) // no more file entry
+ break;
+
+ // dir index
+ long leb128 = DwarfInfoReader.read_unsigned_leb128(data);
+
+ IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) leb128), fileName);
+ if (fullPath != null) {
+ provider.referencedFiles.add(fullPath.toOSString());
+ }
+
+ // skip the modification time and file size
+ leb128 = read_unsigned_leb128(data);
+ leb128 = read_unsigned_leb128(data);
+ }
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(null, t);
+ }
+ }
+
+
+ /**
+ * Parse the line table for a given compile unit
+ * @param attributes
+ * @param fileList list for file entries
+ * @return new array of ILineEntry
+ */
+ public Collection<ILineEntry> parseLineTable(IScope scope, AttributeList attributes, List<IPath> fileList) {
+ synchronized (provider) {
+ List<ILineEntry> lineEntries = new ArrayList<ILineEntry>();
+ try {
+ IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LINE);
+ AttributeValue a = attributes.getAttribute(DwarfConstants.DW_AT_stmt_list);
+ if (data != null && a != null) {
+ int stmtList = a.getValueAsInt();
+ data.position(stmtList);
+
+ /*
+ * Read line table header:
+ *
+ * total_length: 4 bytes (excluding itself)
+ * version: 2
+ * prologue length: 4
+ * minimum_instruction_len: 1
+ * default_is_stmt: 0 or 1
+ * line_base: 1
+ * line_range: 1
+ * opcode_base: 1
+ * standard_opcode_lengths: (value of opcode_base)
+ */
+
+ // Remember the CU line tables we've parsed.
+ int length = data.getInt() + 4;
+
+ // Skip the following till "opcode_base"
+ @SuppressWarnings("unused")
+ int version = data.getShort();
+ @SuppressWarnings("unused")
+ int prologue_length = data.getInt();
+ int minimum_instruction_length = data.get() & 0xff;
+ boolean default_is_stmt = data.get() > 0;
+ int line_base = data.get(); // signed
+ int line_range = data.get() & 0xff;
+
+ int opcode_base = data.get() & 0xff;
+ byte[] opcodes = new byte[opcode_base - 1];
+ data.get(opcodes);
+
+ // Read in directories.
+ //
+ ArrayList<String> dirList = new ArrayList<String>();
+
+ // Put the compilation directory of the CU as the first dir
+ String compDir = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
+ dirList.add(compDir);
+
+ IPath compDirPath = PathUtils.createPath(compDir);
+
+ String str, fileName;
+
+ while (true) {
+ str = readString(data);
+ if (str.length() == 0)
+ break;
+ // If the directory is relative, append it to the CU dir
+ IPath dir = PathUtils.createPath(str);
+ if (!dir.isAbsolute() && dir.getDevice() == null) {
+ dir = compDirPath.append(str);
+ }
+ dirList.add(dir.toString());
+ }
+
+ // Read file names
+ //
+ long leb128;
+ while (true) {
+ fileName = readString(data);
+ if (fileName.length() == 0) // no more file entry
+ break;
+
+ // dir index
+ leb128 = read_unsigned_leb128(data);
+
+ IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) leb128), fileName);
+ // add a null as a placeholder when the filename is enclosed in '<' & '>' (e.g., "<stdin>")
+ fileList.add(fullPath);
+
+ // Skip the following
+ //
+ // modification time
+ leb128 = read_unsigned_leb128(data);
+
+ // file size in bytes
+ leb128 = read_unsigned_leb128(data);
+ }
+
+ long info_address = 0;
+ long info_file = 1;
+ int info_line = 1;
+ int info_column = 0;
+ boolean is_stmt = default_is_stmt;
+ @SuppressWarnings("unused")
+ int info_flags = 0;
+ @SuppressWarnings("unused")
+ long info_ISA = 0;
+
+ long lineInfoEnd = stmtList + length;
+ while (data.position() < lineInfoEnd) {
+ byte opcodeB = data.get();
+ int opcode = 0xFF & opcodeB;
+
+ if (opcode >= opcode_base) {
+ info_line += (((opcode - opcode_base) % line_range) + line_base);
+ info_address += (opcode - opcode_base) / line_range * minimum_instruction_length;
+ if (is_stmt && fileList.size() > 0) {
+ IPath path = fileList.get((int) info_file - 1);
+ // added a null as a placeholder when the filename was enclosed in '<' & '>' (e.g., "<stdin>")
+ if (path != null)
+ lineEntries.add(new LineEntry(path, info_line, info_column, new Addr32(info_address), null));
+ }
+ info_flags &= ~(DwarfConstants.LINE_BasicBlock | DwarfConstants.LINE_PrologueEnd | DwarfConstants.LINE_EpilogueBegin);
+ } else if (opcode == 0) {
+ long op_size = read_unsigned_leb128(data);
+ long op_pos = data.position();
+ int code = data.get() & 0xff;
+ switch (code) {
+ case DwarfConstants.DW_LNE_define_file: {
+ fileName = readString(data);
+ long dir = read_unsigned_leb128(data);
+ @SuppressWarnings("unused")
+ long modTime = read_unsigned_leb128(data);
+ @SuppressWarnings("unused")
+ long fileSize = read_unsigned_leb128(data);
+ IPath fullPath = fileHelper.normalizeFilePath(dirList.get((int) dir), fileName);
+ if (fullPath != null) {
+ fileList.add(fullPath);
+ }
+ break;
+ }
+ case DwarfConstants.DW_LNE_end_sequence:
+ info_flags |= DwarfConstants.LINE_EndSequence;
+
+ if (lineEntries.size() > 0) {
+ // this just marks the end of a line number
+ // program sequence. use
+ // its address to set the high address of the
+ // last line entry
+ lineEntries.get(lineEntries.size() - 1).setHighAddress(new Addr32(info_address));
+ }
+
+ // it also resets the state machine
+ info_address = 0;
+ info_file = 1;
+ info_line = 1;
+ info_column = 0;
+ is_stmt = default_is_stmt;
+ info_flags = 0;
+ info_ISA = 0;
+ break;
+
+ case DwarfConstants.DW_LNE_set_address:
+ info_address = data.getInt();
+ break;
+ default:
+ data.position((int) (data.position() + op_size - 1));
+ break;
+ }
+ assert (data.position() == op_pos + op_size);
+ } else {
+ switch (opcode) {
+ case DwarfConstants.DW_LNS_copy:
+ if (is_stmt && fileList.size() > 0) {
+ lineEntries.add(new LineEntry(fileList.get((int) info_file - 1), info_line,
+ info_column, new Addr32(info_address), null));
+ }
+ info_flags &= ~(DwarfConstants.LINE_BasicBlock | DwarfConstants.LINE_PrologueEnd | DwarfConstants.LINE_EpilogueBegin);
+ break;
+ case DwarfConstants.DW_LNS_advance_pc:
+ info_address += read_unsigned_leb128(data) * minimum_instruction_length;
+ break;
+ case DwarfConstants.DW_LNS_advance_line:
+ info_line += read_signed_leb128(data);
+ break;
+ case DwarfConstants.DW_LNS_set_file:
+ info_file = read_unsigned_leb128(data);
+ break;
+ case DwarfConstants.DW_LNS_set_column:
+ info_column = (int) read_unsigned_leb128(data);
+ break;
+ case DwarfConstants.DW_LNS_negate_stmt:
+ is_stmt = !is_stmt;
+ break;
+ case DwarfConstants.DW_LNS_set_basic_block:
+ info_flags |= DwarfConstants.LINE_BasicBlock;
+ break;
+ case DwarfConstants.DW_LNS_const_add_pc:
+ info_address += (255 - opcode_base) / line_range * minimum_instruction_length;
+ break;
+ case DwarfConstants.DW_LNS_fixed_advance_pc:
+ info_address += data.getShort();
+ break;
+ case DwarfConstants.DW_LNS_set_prologue_end:
+ info_flags |= DwarfConstants.LINE_PrologueEnd;
+ break;
+ case DwarfConstants.DW_LNS_set_epilogue_begin:
+ info_flags |= DwarfConstants.LINE_EpilogueBegin;
+ break;
+ case DwarfConstants.DW_LNS_set_isa:
+ info_ISA = read_unsigned_leb128(data);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(null, t);
+ }
+
+ // sort by start address
+ Collections.sort(lineEntries);
+
+ // fill in the end addresses as needed
+ ILineEntry previousEntry = null;
+ for (ILineEntry line : lineEntries) {
+ if (previousEntry != null && previousEntry.getHighAddress() == null) {
+ previousEntry.setHighAddress(line.getLowAddress());
+ }
+
+ previousEntry = line;
+ }
+
+ // the last line entry
+ if (previousEntry != null) {
+ IAddress prevHigh = previousEntry.getHighAddress();
+ if (prevHigh == null)
+ previousEntry.setHighAddress(scope.getHighAddress());
+// FIXME: the following is causing JUnit tests to fail
+// else if (prevHigh != null && prevHigh.compareTo(scope.getHighAddress()) > 0)
+// previousEntry.setHighAddress(scope.getHighAddress());
+ }
+
+ return lineEntries;
+ }
+ }
+
+ private void parseForAddresses(IStreamBuffer in, Map<Long, AbbreviationEntry> abbrevs, CompilationUnitHeader header,
+ Stack<Scope> nestingStack, IProgressMonitor monitor)
+ throws IOException {
+
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceScopeAddressParse1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceScopeAddressParse2 + Long.toHexString(header.debugInfoOffset))); }
+
+ try {
+ long startWork = in.remaining();
+ long lastWork = startWork;
+ int workChunk = (int)(startWork / Integer.MAX_VALUE) + 1;
+ int work = (int)(startWork / workChunk);
+ monitor.beginTask(DwarfMessages.DwarfInfoReader_TraceScopeAddressParse1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceScopeAddressParse2 + Long.toHexString(header.debugInfoOffset), work);
+
+ while (in.remaining() > 0) {
+
+ work = (int)((lastWork - in.remaining()) / workChunk);
+ monitor.worked(work);
+ lastWork = in.remaining();
+
+ long offset = in.position() + currentCUHeader.debugInfoOffset;
+ long code = read_unsigned_leb128(in);
+
+ if (code != 0) {
+ AbbreviationEntry entry = abbrevs.get(new Long(code));
+ if (entry == null) {
+ assert false;
+ continue;
+ }
+
+ if (entry.hasChildren) {
+ nestingStack.push(currentParentScope);
+ }
+
+ if (isDebugInfoEntryWithAddressRange(entry.tag)) {
+ AttributeList attributeList = new AttributeList(entry, in, header.addressSize, getDebugStrings());
+ processDebugInfoEntry(offset, entry, attributeList, header);
+
+ // if we didn't create a scope for a routine or lexical block, then ignore its innards
+ switch (entry.tag) {
+ case DwarfConstants.DW_TAG_subprogram:
+ case DwarfConstants.DW_TAG_inlined_subroutine:
+ case DwarfConstants.DW_TAG_lexical_block:
+ if (entry.hasChildren && (provider.scopesByOffset.get(offset) == null)) {
+ // because some versions of GCC-E 3.x produce invalid sibling offsets,
+ // always read entry attributes, rather than skipping using siblings
+ // keep track of nesting just like in parseForTypes()
+ int nesting = 1;
+ while ((nesting > 0) && (in.remaining() > 0)) {
+ offset = in.position() + currentCUHeader.debugInfoOffset;
+ code = read_unsigned_leb128(in);
+
+ if (code != 0) {
+ entry = abbrevs.get(new Long(code));
+ if (entry == null) {
+ assert false;
+ continue;
+ }
+ if (entry.hasChildren)
+ nesting++;
+ // skip the attributes we're not reading...
+ AttributeList.skipAttributes(entry, in, header.addressSize);
+ } else {
+ nesting--;
+ }
+ }
+
+ // nesting loop ends after reading 0 code of skipped entry
+ if (nestingStack.isEmpty()) {
+ // FIXME
+ currentParentScope = null;
+ } else {
+ currentParentScope = nestingStack.pop();
+ }
+ }
+ break;
+ }
+ } else {
+ // skip the attributes we're not reading...
+ AttributeList.skipAttributes(entry, in, header.addressSize);
+ }
+
+ } else {
+ if (code == 0) {
+ if (nestingStack.isEmpty()) {
+ // FIXME
+ currentParentScope = null;
+ } else {
+ currentParentScope = nestingStack.pop();
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw e;
+ } finally {
+ monitor.done();
+ }
+ }
+
+
+ private void parseForTypes(IStreamBuffer in, Map<Long, AbbreviationEntry> abbrevs, CompilationUnitHeader header,
+ Stack<Scope> nestingStack)
+ throws IOException {
+
+ if (EDCTrace.SYMBOL_READER_TRACE_ON) { EDCTrace.getTrace().trace(null, EDCTrace.fixArg(DwarfMessages.DwarfInfoReader_TraceParseTypes1 + header.scope.getName() + DwarfMessages.DwarfInfoReader_TraceParseTypes2 + Long.toHexString(header.debugInfoOffset))); }
+
+ Stack<IType> typeStack = new Stack<IType>();
+ typeToParentMap.clear();
+
+ currentParentScope = currentCompileUnitScope;
+
+ while (in.remaining() > 0) {
+ long offset = in.position() + currentCUHeader.debugInfoOffset;
+ long code = read_unsigned_leb128(in);
+
+ if (code != 0) {
+ AbbreviationEntry entry = abbrevs.get(new Long(code));
+ if (entry == null) {
+ assert false;
+ continue;
+ }
+ if (entry.hasChildren) {
+ nestingStack.push(currentParentScope);
+ typeStack.push(currentParentType);
+ }
+
+ if (isForwardTypeTag(entry.tag) || isForwardTypeChildTag(entry.tag)) {
+
+ processDebugInfoEntry(offset, entry,
+ new AttributeList(entry, in, header.addressSize, getDebugStrings()),
+ header);
+
+ } else {
+ switch (entry.tag) {
+ case DwarfConstants.DW_TAG_subprogram:
+ case DwarfConstants.DW_TAG_inlined_subroutine:
+ case DwarfConstants.DW_TAG_lexical_block: {
+ Scope scope = provider.scopesByOffset.get(offset); // may be null
+ if (scope != null)
+ currentParentScope = scope;
+ break;
+ }
+ }
+
+ // skip the attributes we're not reading...
+ AttributeList.skipAttributes(entry, in, header.addressSize);
+ }
+ } else {
+ // code == 0
+ if (nestingStack.isEmpty()) {
+ // FIXME
+ currentParentType = null;
+ currentParentScope = null;
+ } else {
+ currentParentScope = nestingStack.pop();
+ currentParentType = typeStack.pop();
+ }
+ }
+ }
+ }
+
+ /**
+ * Tell if a tag will be parsed on-demand to generate an IType, and will
+ * be accessible via provider.getType() or provider.readType().
+ * <p>
+ * Note: DW_TAG_member is usually considered a child of struct/class/etc., but
+ * a static class variable contains a reference to it, so we must be able to
+ * locate it.
+ * @param tag
+ * @return true if type is parsed and should have a ForwardDwarfDefinition
+ */
+ private boolean isForwardTypeTag(short tag) {
+ switch (tag) {
+ case DwarfConstants.DW_TAG_array_type:
+ case DwarfConstants.DW_TAG_class_type:
+ case DwarfConstants.DW_TAG_enumeration_type:
+ case DwarfConstants.DW_TAG_member:
+ case DwarfConstants.DW_TAG_pointer_type:
+ case DwarfConstants.DW_TAG_reference_type:
+ case DwarfConstants.DW_TAG_structure_type:
+ case DwarfConstants.DW_TAG_subroutine_type:
+ case DwarfConstants.DW_TAG_typedef:
+ case DwarfConstants.DW_TAG_union_type:
+ //case DwarfConstants.DW_TAG_unspecified_parameters:
+ case DwarfConstants.DW_TAG_inheritance:
+ case DwarfConstants.DW_TAG_ptr_to_member_type:
+ //case DwarfConstants.DW_TAG_with_stmt:
+ case DwarfConstants.DW_TAG_base_type:
+ //case DwarfConstants.DW_TAG_catch_block:
+ case DwarfConstants.DW_TAG_const_type:
+ //case DwarfConstants.DW_TAG_enumerator:
+ //case DwarfConstants.DW_TAG_file_type:
+ //case DwarfConstants.DW_TAG_friend:
+ case DwarfConstants.DW_TAG_template_type_param:
+ //case DwarfConstants.DW_TAG_template_value_param:
+ //case DwarfConstants.DW_TAG_thrown_type:
+ //case DwarfConstants.DW_TAG_try_block:
+ case DwarfConstants.DW_TAG_volatile_type:
+ case DwarfConstants.DW_TAG_subrange_type:
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Tell if a tag is a parsed child of an IType. This should not be explicitly
+ * referenced in provider.typesByOffset or .forwardDwarfDefinitions but as
+ * children of other ForwardDwarfDefinitions parsed on demand.
+ *<p>
+ * Note: DW_TAG_member is usually considered a child of struct/class/etc., but
+ * a static class variable contains a reference to it, so we must be able to
+ * locate it. Thus, it is not listed here.
+ * @param tag
+ * @return true if component is parsed and a child of a forward definition
+ */
+ private boolean isForwardTypeChildTag(short tag) {
+ switch (tag) {
+ //case DwarfConstants.DW_TAG_unspecified_parameters:
+ case DwarfConstants.DW_TAG_inheritance:
+ case DwarfConstants.DW_TAG_enumerator:
+ case DwarfConstants.DW_TAG_member:
+ case DwarfConstants.DW_TAG_subrange_type:
+ //case DwarfConstants.DW_TAG_friend:
+ //case DwarfConstants.DW_TAG_template_type_param:
+ //case DwarfConstants.DW_TAG_template_value_param:
+ //case DwarfConstants.DW_TAG_thrown_type:
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Fully parse any debug info entry.
+ * @param offset
+ * @param entry
+ * @param attributeList
+ * @param header
+ * @param compositeNesting
+ */
+ private void processDebugInfoEntry(long offset, AbbreviationEntry entry, AttributeList attributeList,
+ CompilationUnitHeader header) {
+ //System.out.println("Handling " + entry.tag + " at " + Long.toHexString(offset));
+ short tag = entry.tag;
+
+ // We are only interested in certain tags.
+ switch (tag) {
+ case DwarfConstants.DW_TAG_array_type:
+ processArrayType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_class_type:
+ processClassType(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_enumeration_type:
+ processEnumType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_formal_parameter:
+ processVariable(offset, attributeList, true);
+ break;
+ case DwarfConstants.DW_TAG_lexical_block:
+ processLexicalBlock(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_member:
+ processField(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_pointer_type:
+ processPointerType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_reference_type:
+ processReferenceType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_structure_type:
+ processStructType(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_subroutine_type:
+ processSubroutineType(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_typedef:
+ processTypeDef(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_union_type:
+ processUnionType(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_unspecified_parameters:
+ break;
+ case DwarfConstants.DW_TAG_inheritance:
+ processInheritance(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_ptr_to_member_type:
+ processPtrToMemberType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_with_stmt:
+ break;
+ case DwarfConstants.DW_TAG_base_type:
+ processBasicType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_catch_block:
+ break;
+ case DwarfConstants.DW_TAG_const_type:
+ processConstType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_enumerator:
+ processEnumerator(offset, attributeList);
+ break;
+ case DwarfConstants.DW_TAG_file_type:
+ break;
+ case DwarfConstants.DW_TAG_friend:
+ break;
+ case DwarfConstants.DW_TAG_subprogram:
+ processSubprogram(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_inlined_subroutine:
+ processInlinedSubroutine(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_template_type_param:
+ processTemplateTypeParam(offset, attributeList, header, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_template_value_param:
+ break;
+ case DwarfConstants.DW_TAG_thrown_type:
+ break;
+ case DwarfConstants.DW_TAG_try_block:
+ break;
+ case DwarfConstants.DW_TAG_variable:
+ processVariable(offset, attributeList, false);
+ break;
+ case DwarfConstants.DW_TAG_volatile_type:
+ processVolatileType(offset, attributeList, entry.hasChildren);
+ break;
+ case DwarfConstants.DW_TAG_subrange_type:
+ processArrayBoundType(offset, attributeList, entry.hasChildren);
+ break;
+ }
+ }
+
+ /**
+ * Tell whether a tag has or may have content with an address range
+ *
+ * Note: tag DW_TAG_compile_unit was parsed in the initial parse
+ *
+ * @param tag
+ * @return
+ */
+ private boolean isDebugInfoEntryWithAddressRange(short tag) {
+ switch (tag) {
+ // tags allowed to have both DW_AT_low_pc and DW_AT_high_pc or DW_at_ranges
+ case DwarfConstants.DW_TAG_catch_block:
+ case DwarfConstants.DW_TAG_inlined_subroutine:
+ case DwarfConstants.DW_TAG_lexical_block:
+ case DwarfConstants.DW_TAG_module:
+ case DwarfConstants.DW_TAG_partial_unit:
+ case DwarfConstants.DW_TAG_subprogram:
+ case DwarfConstants.DW_TAG_try_block:
+ case DwarfConstants.DW_TAG_with_stmt:
+ return true;
+ // TODO: take DW_TAG_variable out of here?
+ case DwarfConstants.DW_TAG_variable:
+ case DwarfConstants.DW_TAG_formal_parameter:
+ return true;
+ }
+ return false;
+ }
+
+ static long readAddress(IStreamBuffer in, int addressSize) throws IOException {
+ long value = 0;
+
+ switch (addressSize) {
+ case 2:
+ value = in.getShort();
+ break;
+ case 4:
+ value = in.getInt();
+ break;
+ case 8:
+ value = in.getLong();
+ break;
+ default:
+ // ????
+ }
+ return value;
+ }
+
+
+ /* unsigned */
+ static long read_unsigned_leb128(IStreamBuffer in) throws IOException {
+ /* unsigned */
+ long result = 0;
+ int shift = 0;
+ byte b;
+
+ while (true) {
+ if (!in.hasRemaining())
+ break; // throw new IOException("no more data");
+ b = in.get();
+ result |= ((long) (b & 0x7f) << shift);
+ if ((b & 0x80) == 0) {
+ break;
+ }
+ shift += 7;
+ }
+ return result;
+ }
+
+ /* signed */
+ public static long read_signed_leb128(IStreamBuffer in) throws IOException {
+ /* unsigned */
+ long result = 0;
+ int shift = 0;
+ int size = 32;
+ byte b;
+
+ while (true) {
+ if (!in.hasRemaining())
+ throw new IOException(CCorePlugin.getResourceString("Util.exception.noData")); //$NON-NLS-1$
+ b = in.get();
+ result |= ((long) (b & 0x7f) << shift);
+ shift += 7;
+ if ((b & 0x80) == 0) {
+ break;
+ }
+ }
+ if ((shift < size) && (b & 0x40) != 0) {
+ result |= -(1 << shift);
+ }
+ return result;
+ }
+
+
+ /**
+ * Read a null-ended string from the given "data" stream. data : IN, byte
+ * buffer
+ */
+ public static String readString(IStreamBuffer data) {
+ String str;
+
+ StringBuilder sb = new StringBuilder();
+ while (data.hasRemaining()) {
+ byte c = data.get();
+ if (c == 0) {
+ break;
+ }
+ sb.append((char) c);
+ }
+
+ str = sb.toString();
+ return str;
+ }
+
+ private Collection<LocationEntry> getLocationRecord(long offset) {
+ // first check the cache
+ Collection<LocationEntry> entries = locationEntriesByOffset.get(offset);
+ if (entries == null) {
+ // not found so try to get the entries from the offset
+
+ // note: some compilers generate MULTIPLE ENTRIES for the same location,
+ // and the last one tends to be more correct... use a map here when reading
+ TreeMap<IRangeList.Entry, LocationEntry> entryMap = new TreeMap<IRangeList.Entry, LocationEntry>();
+
+ try {
+ IStreamBuffer data = getDwarfSection(DWARF_DEBUG_LOC);
+ if (data != null) {
+ data.position(offset);
+
+ boolean first = true;
+ long base = 0;
+
+ while (data.hasRemaining()) {
+
+ long lowPC = readAddress(data, currentCUHeader.addressSize);
+ long highPC = readAddress(data, currentCUHeader.addressSize);
+
+ if (lowPC == 0 && highPC == 0) {
+ // end of list entry
+ break;
+ } else if (first) {
+ first = false;
+ long maxaddress = currentCUHeader.addressSize == 4 ? Integer.MAX_VALUE : Long.MAX_VALUE;
+ if (lowPC == maxaddress) {
+ // base address selection entry
+ base = highPC;
+ continue;
+ } else if (currentCompileUnitScope.getRangeList() == null) {
+ // if the compilation unit has a contiguous range, no implicit base is needed
+ base = currentCompileUnitScope.getLowAddress().getValue().longValue();
+ }
+ }
+
+ // location list entry
+ int numOpCodes = data.getShort();
+ byte[] bytes = new byte[numOpCodes];
+ data.get(bytes);
+ LocationEntry entry = new LocationEntry(lowPC + base, highPC + base, bytes);
+ entryMap.put(new IRangeList.Entry(lowPC + base, highPC + base), entry);
+ }
+
+ entries = entryMap.values();
+ locationEntriesByOffset.put(offset, entries);
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(null, t);
+ }
+ }
+
+ return entries;
+ }
+
+
+ private Map<Long, AbbreviationEntry> parseDebugAbbreviation(int abbreviationOffset) throws IOException {
+ Integer key = Integer.valueOf(abbreviationOffset);
+ Map<Long, AbbreviationEntry> abbrevs = provider.abbreviationMaps.get(key);
+ if (abbrevs == null) {
+ abbrevs = new HashMap<Long, AbbreviationEntry>();
+ provider.abbreviationMaps.put(key, abbrevs);
+ IStreamBuffer data = getDwarfSection(DWARF_DEBUG_ABBREV);
+ if (data != null) {
+ data.position(abbreviationOffset);
+ while (data.remaining() > 0) {
+ long code = read_unsigned_leb128(data);
+ if (code == 0) {
+ break;
+ }
+ short tag = (short) read_unsigned_leb128(data);
+ boolean hasChildren = data.get() == DwarfConstants.DW_CHILDREN_yes;
+ AbbreviationEntry entry = new AbbreviationEntry(code, tag, hasChildren);
+
+ // attributes
+ short name = 0;
+ byte form = 0;
+ do {
+ name = (short) read_unsigned_leb128(data);
+ form = (byte) read_unsigned_leb128(data);
+ if (name != 0) {
+ entry.attributes.add(new Attribute(name, form));
+ }
+ } while (name != 0 && form != 0);
+ entry.attributes.trimToSize();
+
+ abbrevs.put(Long.valueOf(code), entry);
+ }
+ }
+ }
+ return abbrevs;
+ }
+
+
+ private void registerType(long offset, IType type, boolean hasChildren) {
+ provider.typesByOffset.put(offset, type);
+ provider.referenceTypesByOffset.remove(offset);
+
+ typeToParentMap.put(type, currentParentType);
+ if (hasChildren)
+ currentParentType = type;
+ if (DEBUG) {
+ if (type != null) {
+ System.out.print(DwarfMessages.DwarfInfoReader_ReadType + type.getName());
+ while (type.getType() != null) {
+ type = type.getType();
+ System.out.print(" " + type.getName()); //$NON-NLS-1$
+ }
+ System.out.println();
+ }
+ }
+ }
+
+ private void registerScope(long offset, Scope scope) {
+ provider.scopesByOffset.put(offset, scope);
+ }
+
+ /**
+ * Read a range list referenced from a code scope.
+ * @param offset
+ * @param base the specified DW_AT_low_pc value (or 0)
+ * @return a new RangeList
+ */
+ public RangeList readRangeList(int offset, AttributeValue baseValue) {
+ synchronized (provider) {
+ IStreamBuffer data = getDwarfSection(DWARF_DEBUG_RANGES);
+ if (data == null) {
+ return null;
+ }
+
+ try {
+ data.position(offset);
+
+ /*
+ * Read range list entry:
+ *
+ * start: DW_FORM_addr
+ * end: DW_FORM_addr
+ *
+ * When start == all ones, it is a base address selection entry,
+ * and end is the base address. The base address does not need to
+ * be specified, and is the compialtion unit's base address by default.
+ *
+ * When start == end == 0, this is the end of the list.
+ */
+
+ RangeList list = new RangeList();
+ //Whether the list actually got anything added - otherwise we should return null
+ boolean listAddedTo = false;
+
+ long base = 0;
+ long start = data.getInt();
+ long end = data.getInt();
+
+ if (start == -1) {
+ base = end;
+
+ start = data.getInt();
+ end = data.getInt();
+ } else if (baseValue != null) {
+ base = baseValue.getValueAsLong();
+ } else if (currentCompileUnitScope != null && currentCompileUnitScope.getRangeList() == null) {
+ base = currentCompileUnitScope.getLowAddress().getValue().longValue();
+ }
+ do {
+ if (start == 0 && end == 0) {
+ break;
+ } else if (start != end) {
+ // ignore bogus entries: GCC-E sometimes generates these buggily (for artifical non-inlined functions)
+ if (base + start >= codeRanges.getLowAddress()) {
+ list.addRange(base + start, base + end);
+ listAddedTo = true;
+ }
+ }
+ start = data.getInt();
+ end = data.getInt();
+
+ } while (true);
+
+ return (listAddedTo) ? list : null;
+
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_RangeReadFailed, t);
+ return null;
+ }
+ }
+ }
+
+
+
+ /**
+ * Set up the address range for a scope by using its DW_AT_low_pc/DW_AT_high_pc
+ * or DW_AT_ranges attributes, or DW_AT_stmt_list in a pinch
+ * @param attributeList
+ * @param scope
+ */
+ private void setupAddresses(AttributeList attributeList, Scope scope) {
+
+ // get the high and low pc from the attributes list
+ AttributeValue value
+ = attributeList.getAttribute(DwarfConstants.DW_AT_high_pc);
+ if (value != null) {
+ IAddress low = new Addr32(attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_low_pc));
+ scope.setLowAddress(low);
+ IAddress high = new Addr32(attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_high_pc));
+ IScope parent = scope.getParent();
+ if (low.compareTo(high) <= 0) {
+ if (parent instanceof DwarfFunctionScope) {
+ IAddress parentHigh = parent.getHighAddress();
+ if (parentHigh != null && high.compareTo(parentHigh) > 0) {
+ ((Scope)parent).setHighAddress(high);
+ }
+ }
+ } else {
+ // relying on the following to confirm that this is an RVCT inline DWARF generation bug
+ if (scope instanceof DwarfFunctionScope && parent instanceof DwarfFunctionScope) {
+ high = fix_Dwarf_InlineHighAddress_Problem(scope);
+ if (high == null)
+ // at least prevent ecl.bz Bug 329324 from happening
+ high = parent.getHighAddress();
+
+ // wow, RVCT, you're neat... I think you mean, point to the high PC of the parent
+ } else if (parent != null && parent.getHighAddress() != null) {
+ high = parent.getHighAddress();
+ // may still be bogus, check again next
+ }
+
+ if (low.compareTo(high) > 0) {
+ scope.setLowAddress(high);
+ high = low;
+ }
+ }
+ scope.setHighAddress(high);
+ return;
+ }
+
+ // look for a range
+ value = attributeList.getAttribute(DwarfConstants.DW_AT_ranges);
+ if (value != null) {
+ AttributeValue baseValue = attributeList.getAttribute(DwarfConstants.DW_AT_low_pc);
+ RangeList ranges = readRangeList(value.getValueAsInt(), baseValue);
+ if (ranges != null) {
+ scope.setRangeList(ranges);
+
+ // if the range list high and low pc extend outside the parent's
+ // high/low range, adjust the parent (found in GCC-E)
+ if (ranges.getLowAddress() < scope.getParent().getLowAddress().getValue().longValue()) {
+ if (scope.getParent() instanceof Scope)
+ ((Scope)scope.getParent()).setLowAddress(new Addr32(ranges.getLowAddress()));
+ }
+ if (ranges.getHighAddress() > scope.getParent().getHighAddress().getValue().longValue()) {
+ if (scope.getParent() instanceof Scope)
+ ((Scope)scope.getParent()).setHighAddress(new Addr32(ranges.getHighAddress()));
+ }
+ return;
+ }
+ }
+
+ // in a CU, GCC-E may have only generated this, so we need to dig into the line table
+ if (scope instanceof ICompileUnitScope) {
+ value = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
+ if (value != null) {
+ RangeList ranges = new RangeList();
+ for (ILineEntry entry : ((ICompileUnitScope) scope).getLineEntries()) {
+ // ignore (for now) entries that seem far out of range
+ if (entry.getLowAddress().getValue().longValue() >= codeRanges.getLowAddress()) {
+ ranges.addRange(entry.getLowAddress().getValue().longValue(),
+ entry.getHighAddress().getValue().longValue());
+ }
+ }
+ scope.setRangeList(ranges);
+ scope.fixupRanges(provider.getBaseLinkAddress());
+ return;
+ }
+ }
+
+ // no code, apparently
+ scope.setLowAddress(new Addr32(0));
+ scope.setHighAddress(new Addr32(0));
+ }
+
+ /**
+ * for cases where the compiler generates an incorrect high-address,
+ * the line entry provider can give information about the current and
+ * subsequent lines within an inline.
+ * <br>
+ * caveats: this is not meant to handle nested broken inlines. the
+ * algorithm assumes
+ * - an outer inline nesting another inline will use set of ranges, not a high-low
+ * - an inline function will likely be in another file
+ * - if not, it will likely be prior to the function that inlines it
+ * - and if not, it will likely be more than 32 lines after the function that inlines it
+ * @param scope
+ * @return high address if determined, or null if prerequisites for finding it aren't met.
+ */
+ private IAddress fix_Dwarf_InlineHighAddress_Problem(Scope scope) {
+ IAddress low = scope.getLowAddress();
+ IAddress highest = scope.getParent().getHighAddress();
+ Iterator<ILineEntry> lineEntries
+ = currentCompileUnitScope.getLineEntries().iterator();
+
+ ILineEntry entry = null;
+ do {
+ if (lineEntries.hasNext())
+ entry = lineEntries.next();
+ else
+ return null;
+
+ if (entry == null)
+ return null;
+ } while (low.compareTo(entry.getHighAddress()) > 0);
+
+ IAddress high = null;
+ IPath actualPath = entry.getFilePath(), otherPath = null;
+ int actualLine = entry.getLineNumber();
+ int thisLine = actualLine, lastLine = 0; // XXX false positive on uninitialized variable below causes needless initialization of lastLine = 0
+ boolean jumpedBack = false, jumpedAway = false;
+ OUTER:do {
+ IAddress nextHigh = entry.getHighAddress();
+ if (highest != null && nextHigh != null && highest.compareTo(nextHigh) < 0) {
+ nextHigh = entry.getLowAddress();
+ if (high == null || nextHigh.compareTo(high) < 0)
+ high = nextHigh;
+ break;
+ }
+ high = nextHigh;
+ if (!jumpedAway && otherPath == null)
+ lastLine = thisLine;
+
+ if (high == null)
+ break OUTER;
+
+ do {
+ if (lineEntries.hasNext())
+ entry = lineEntries.next();
+ else
+ return null;
+ if (entry == null)
+ break OUTER;
+ } while (high.equals(entry.getHighAddress()));
+
+ if (otherPath != null) {
+ if (entry.getFilePath().equals(actualPath)) // done with nesting
+ break;
+ } else if (!entry.getFilePath().equals(actualPath)) {// easiest test for done with inline
+ otherPath = entry.getFilePath();
+ } else {
+ thisLine = entry.getLineNumber();
+ if (!jumpedBack && !jumpedAway) {
+ if (thisLine < actualLine) {
+ jumpedBack = true;
+ } else if (thisLine > lastLine + 24) { // XXX false positive here causes needless init of lastLine = 0 above
+ jumpedAway = true;
+ }
+ } else if (jumpedBack) {
+ if (thisLine > actualLine) // jumped back ahead; done
+ break;
+ } else if (jumpedAway) {
+ if (thisLine < actualLine
+ || thisLine < lastLine
+ || thisLine > lastLine + 24)
+ break;
+ }
+ }
+ } while (entry != null);
+
+ return high;
+ }
+
+ /**
+ * Process a compile unit
+ *
+ * @param attributeList
+ * @param childrenPosition
+ */
+ private void processCompileUnit(CompilationUnitHeader header, boolean hasChildren, AttributeList attributeList) {
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ String compDir = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_comp_dir);
+ //System.out.println("processing compile unit: " + Integer.toHexString(header.debugInfoOffset) + ": " + name);
+
+ IPath filePath = fileHelper.normalizeFilePath(compDir, name);
+
+ currentCompileUnitScope = new DwarfCompileUnit(provider, moduleScope, filePath, null, null, header, hasChildren, attributeList);
+ header.scope = currentCompileUnitScope;
+ currentParentScope = currentCompileUnitScope;
+
+ // Needs to be registered before setupAddresses.
+ provider.registerCompileUnitHeader(currentCUHeader.debugInfoOffset, currentCUHeader);
+
+ setupAddresses(attributeList, currentCompileUnitScope);
+
+ // some compilers (RVCT) may generate multiple compile units for the
+ // same file.
+ List<ICompileUnitScope> matchingCompileUnits = provider.compileUnitsPerFile.get(filePath);
+
+ if (matchingCompileUnits == null) {
+ // first one. create it now.
+ matchingCompileUnits = new ArrayList<ICompileUnitScope>();
+ }
+
+ matchingCompileUnits.add(currentCompileUnitScope);
+ provider.compileUnitsPerFile.put(filePath, matchingCompileUnits);
+ provider.compileUnits.add(currentCompileUnitScope);
+
+ if (!currentCompileUnitScope.getHighAddress().isZero()) // has code
+ provider.sortedCompileUnitsWithCode.add(currentCompileUnitScope);
+
+ moduleScope.addChild(currentCompileUnitScope);
+
+ if (provider.buildReferencedFilesList) {
+ provider.referencedFiles.add(filePath.toOSString());
+
+ // do a quick parse of the line table to get any other referenced files.
+ // note that even the full parse doesn't parse the line table information.
+ // that is calculated (and then cached) on demand
+ AttributeValue a = attributeList.getAttribute(DwarfConstants.DW_AT_stmt_list);
+ if (a != null) {
+ int stmtList = a.getValueAsInt();
+ quickParseLineInfo(stmtList, compDir);
+ }
+ }
+
+ // remove unused attributes
+ attributeList.attributeMap.remove(DwarfConstants.DW_AT_name);
+ //attributeList.attributeMap.remove(DwarfConstants.DW_AT_comp_dir); // needed later
+ attributeList.attributeMap.remove(DwarfConstants.DW_AT_low_pc);
+ attributeList.attributeMap.remove(DwarfConstants.DW_AT_high_pc);
+ attributeList.attributeMap.remove(DwarfConstants.DW_AT_ranges);
+ }
+
+ private void processLexicalBlock(long offset, AttributeList attributeList, boolean hasChildren) {
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ if (!attributeList.hasCodeRangeAttributes()) {
+ // ignore any that don't have a valid range
+ return;
+ }
+
+ LexicalBlockScope lb = new LexicalBlockScope(name, currentParentScope, null, null);
+ setupAddresses(attributeList, lb);
+
+ currentParentScope.addChild(lb);
+ registerScope(offset, lb);
+ if (hasChildren)
+ currentParentScope = lb;
+ }
+
+ static class DereferencedAttributes {
+ public CompilationUnitHeader header;
+ public AttributeList attributeList;
+
+ public DereferencedAttributes(CompilationUnitHeader header,
+ AttributeList attributeList) {
+ this.header = header;
+ this.attributeList = attributeList;
+ }
+
+ }
+
+ /**
+ * DW_AT_abstract_origin and DW_AT_specification can refer to types in other
+ * compilation units. This will dynamically parse that CU if needed in order
+ * to get the attributes for the type.
+ *
+ * @param debugInfoOffset
+ * @return AttributeList or <code>null</code> (should not happen)
+ */
+ private DereferencedAttributes getDereferencedAttributes(AttributeList attributeList, short tag) {
+ CompilationUnitHeader providingCU = currentCUHeader;
+ AttributeValue derefLocation = attributeList.getAttribute(tag);
+ if (derefLocation == null)
+ return null;
+
+ // get the offset into the .debug_info section
+ long debugInfoOffset = derefLocation.getValueAsLong();
+ if (derefLocation.getActualForm() == DwarfConstants.DW_FORM_ref_addr) {
+ // this is already relative to the .debug_info section
+ } else {
+ // relative to the CU
+ debugInfoOffset += providingCU.debugInfoOffset;
+ }
+
+ AttributeList attributes = provider.functionsByOffset.get(debugInfoOffset);
+ if (attributes == null) {
+ // dereferenced function does not exist yet
+ providingCU = provider.fetchCompileUnitHeader(debugInfoOffset);
+ attributes = provider.functionsByOffset.get(debugInfoOffset);
+ if (attributes == null) {
+ // dereferenced entry is not parsed yet, perhaps because it's
+ // later in the current compile unit (despite Dwarf 3 spec saying
+ // that's not allowed)
+ IStreamBuffer buffer = getDwarfSection(DWARF_DEBUG_INFO);
+
+ if (buffer != null) {
+ buffer.position(debugInfoOffset);
+
+ try {
+ // get stored abbrev table, or read and parse an abbrev table
+ Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(providingCU.abbreviationOffset);
+
+ long code = read_unsigned_leb128(buffer);
+
+ if (code != 0) {
+ AbbreviationEntry entry = abbrevs.get(new Long(code));
+ if (entry != null) {
+ attributes = new AttributeList(entry, buffer, providingCU.addressSize, getDebugStrings());
+ }
+ }
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed1
+ + debugInfoSection.getName() + DwarfMessages.DwarfInfoReader_ParseDebugInfoSectionFailed2 + symbolFilePath, t);
+ }
+ }
+ }
+ } else {
+ providingCU = provider.fetchCompileUnitHeader(debugInfoOffset);
+ if (providingCU == null) {
+ assert(false);
+ return null;
+ }
+ }
+
+ if (attributes == null)
+ return null;
+
+ return new DereferencedAttributes(providingCU, attributes);
+ }
+
+ private void processSubprogram(long offset, AttributeList attributeList, boolean hasChildren) {
+ // if it's a declaration just add to the offsets map for later lookup
+ if (attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_declaration) > 0) {
+ provider.functionsByOffset.put(offset, attributeList);
+ return;
+ }
+
+ // functions with no high/low pc aren't real functions. just treat them
+ // as declarations as they will be pointed to by abstract_origin from
+ // another subprogram tag
+ if (!attributeList.hasCodeRangeAttributes()) {
+ provider.functionsByOffset.put(offset, attributeList);
+ return;
+ }
+
+ CompilationUnitHeader otherCU = null;
+
+ boolean isArtificial = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_artificial) > 0;
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ if (name.length() == 0) {
+ // no name. see if we can get it from a declaration
+ DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
+ if (deref != null) {
+ // this should either have a name or point to another
+ // declaration
+ otherCU = deref.header;
+ AttributeList attributes = deref.attributeList;
+ name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ isArtificial |= attributes.getAttributeValueAsInt(DwarfConstants. DW_AT_artificial) > 0;
+ if (name.length() == 0) {
+ deref = getDereferencedAttributes(attributes, DwarfConstants.DW_AT_specification);
+ if (deref != null) {
+ // this should either have a name or point to another
+ // declaration
+ otherCU = deref.header;
+ attributes = deref.attributeList;
+ name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ isArtificial |= attributes.getAttributeValueAsInt(DwarfConstants. DW_AT_artificial) > 0;
+ }
+ }
+ }
+ }
+ if (name.length() == 0) {
+ DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_specification);
+ if (deref != null) {
+ // this should either have a name or point to another
+ // declaration
+ otherCU = deref.header;
+ AttributeList attributes = deref.attributeList;
+ name = attributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ }
+ }
+
+ if (name.length() == 0) {
+ // the name should either be an attribute of the compile unit, or be
+ // in the declaration which according to the spec will always be
+ // before its definition in the Dwarf.
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_SubprogramNameNotFound1 + Long.toHexString(offset) +
+ DwarfMessages.DwarfInfoReader_SubprogramNameNotFound2, null);
+ return;
+ }
+
+ DwarfFunctionScope function = new DwarfFunctionScope(name, currentCompileUnitScope, null, null, null);
+ setupAddresses(attributeList, function);
+
+ Scope originalParentScope = currentParentScope;
+ registerScope(offset, function);
+ currentParentScope = function; // needed for getLocationProvider(), etc.
+
+ AttributeValue frameBaseAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_frame_base);
+ ILocationProvider locationProvider = getLocationProvider(frameBaseAttribute);
+ function.setLocationProvider(locationProvider);
+
+ // Note: we may still have cases where DW_AT_low_pc and/or DW_AT_high_pc are 0x0
+ // (some "ignored inlined" functions in GCC). We want to keep track of their scope
+ // (though not store them in the CU), because child tag parses expect to find a parent into
+ // which to write their formal parameters and locals.
+ if (!function.getLowAddress().isZero() && !function.getHighAddress().isZero() && !isArtificial) {
+ // find the declaration location
+ int declLine = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_line);
+ int declColumn = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_column);
+ int declFileNum = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
+
+ if (otherCU != null)
+ function.setDeclFile(otherCU.scope.getFileEntry(declFileNum));
+ else
+ function.setDeclFileNum(declFileNum);
+ function.setDeclLine(declLine);
+ function.setDeclColumn(declColumn);
+
+ currentCompileUnitScope.addChild(function);
+
+ // keep track of all functions by name for faster lookup
+ List<IFunctionScope> functions = provider.functionsByName.get(name);
+ if (functions == null) {
+ functions = new ArrayList<IFunctionScope>();
+ provider.functionsByName.put(name, functions);
+ }
+ functions.add(function);
+ }
+
+ // if the entry has no children, then restore the original parent scope
+ if (!hasChildren)
+ currentParentScope = originalParentScope;
+ }
+
+ /**
+ * Get the already-parsed or forward reference to a type from a DW_AT_type attribute, if present
+ * @param attributeMap the map of Long, AttributeValue from AttributeList or Object, Object from Type
+ * @return offset to referenced type or 0 if no type attribute
+ */
+ private IType getTypeOrReference(AttributeList attributeList, CompilationUnitHeader header) {
+ AttributeValue typeAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_type);
+ if (typeAttribute == null)
+ return null;
+ return getTypeOrReference(typeAttribute, header);
+ }
+ /**
+ * Get the already-parsed or forward reference to a type from a DW_AT_type attribute, if present
+ * @param attributeMap the map of Long, AttributeValue from AttributeList or Object, Object from Type
+ * @return offset to referenced type or 0 if no type attribute
+ */
+ private IType getTypeOrReference(AttributeValue typeAttribute, CompilationUnitHeader header) {
+ if (typeAttribute == null)
+ return null;
+
+ // get the offset into the .debug_info section
+ long debugInfoOffset = typeAttribute.getValueAsLong();
+ if (typeAttribute.getActualForm() == DwarfConstants.DW_FORM_ref_addr) {
+ // this is already relative to the .debug_info section
+ } else {
+ debugInfoOffset += header.debugInfoOffset;
+ }
+
+ IType type = provider.typesByOffset.get(debugInfoOffset);
+ if (type == null) {
+ // So that we only create one ForwardTypeReference per type we want to reference.
+ IForwardTypeReference refType = provider.referenceTypesByOffset.get(debugInfoOffset);
+ if (type == null) {
+ refType = new ForwardTypeReference(provider, debugInfoOffset);
+ provider.referenceTypesByOffset.put(Long.valueOf(debugInfoOffset), refType);
+ }
+ type = refType;
+ }
+ return type;
+ }
+
+ private void processInlinedSubroutine(long offset, AttributeList attributeList, boolean hasChildren) {
+ // functions with no high/low pc aren't real (probably an error)
+ if (!attributeList.hasCodeRangeAttributes()) {
+ return;
+ }
+
+ DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
+ if (deref == null) {
+ if (attributeList.getAttribute(DwarfConstants.DW_AT_abstract_origin) != null) {
+ // TODO: GCC-E can reference forward tags (!) so we need to handle these another way
+ } else {
+ assert(false);
+ }
+ return;
+ }
+
+ CompilationUnitHeader otherCU = deref.header;
+ AttributeList origAttributes = deref.attributeList;
+
+ // this should either have a name or point to another
+ // declaration
+ String name = origAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ if (name.length() == 0) {
+ deref = getDereferencedAttributes(origAttributes, DwarfConstants.DW_AT_specification);
+ if (deref != null) {
+ // this should either have a name or point to another
+ // declaration
+ //otherCU = deref.header;
+ AttributeList declarationAttributes = deref.attributeList;
+ name = declarationAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ }
+ }
+
+ if (name.length() == 0) {
+ // the name should either be an attribute of the compile unit, or be
+ // in the declaration which according to the spec will always be
+ // before its definition in the Dwarf.
+ return;
+ }
+
+ // find the declaration location
+ int declLine = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_line);
+ int declColumn = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_column);
+ int declFileNum = origAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
+
+ if (declFileNum == 0) {
+ assert(false);
+ return;
+ }
+
+ DwarfFunctionScope function = new DwarfFunctionScope(name, currentParentScope, null, null, null);
+ setupAddresses(attributeList, function);
+
+ function.setDeclFile(otherCU.scope.getFileEntry(declFileNum));
+ function.setDeclLine(declLine);
+ function.setDeclColumn(declColumn);
+
+ currentParentScope.addChild(function);
+
+ registerScope(offset, function);
+ if (hasChildren)
+ currentParentScope = function;
+
+ // keep track of all functions by name for faster lookup
+ List<IFunctionScope> functions = provider.functionsByName.get(name);
+ if (functions == null) {
+ functions = new ArrayList<IFunctionScope>();
+ provider.functionsByName.put(name, functions);
+ }
+ functions.add(function);
+ }
+
+ private void processSubroutineType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ SubroutineType type = new SubroutineType(currentParentScope, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+
+ // TODO: associate parameters with this type in child tag parse
+
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processClassType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // if the name is mangled, unmangle it
+ name = unmangleType(name);
+
+ // GCC may put the template parameter of an inherited class at the end of the name,
+ // so strip that off
+ // TODO: support template parameters at end of name or as separate DW_TAG_template_value_param
+ if (name.endsWith(">")) {
+ int templateStart = name.indexOf("<");
+ if (templateStart != -1)
+ name = name.substring(0, templateStart);
+ }
+
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ ClassType type = new ClassType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processStructType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // if the name is mangled, unmangle it
+ name = unmangleType(name);
+
+ StructType type = new StructType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processUnionType(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // if the name is mangled, unmangle it
+ name = unmangleType(name);
+
+ UnionType type = new UnionType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+
+ /*
+ * For an anonymous union, which has members accessible by methods in a class, ARM RVCT
+ * does not create an unnamed class member so you know the offset of the union's members.
+ * Instead, it just gives the anonymous union's type a name of the form "__C" followed
+ * by a number. And it places the union's DWARF info after all class member and inherited
+ * member DWARF info.
+ *
+ * E.g., when you have 2 named members and 2 anonymous unions in this order:
+ * 4-byte union <anonymous 1>
+ * 4-byte long long1
+ * 4-byte union <anonymous 2>
+ * 4-byte long long2
+ * ARM RVCT DWARF info says the class has 2 members:
+ * long1 at offset 4
+ * long2 at offset 12
+ * ARM RVCT DWARF info is in the order:
+ * member long1
+ * member long2
+ * type union <anonymous 1>
+ * type union <anonymous 2>
+ * So the rules for handling anonymous unions in RVCT DWARF are:
+ * 1st read offsets and sizes of non-anonymous members, which leaves offset holes
+ * for anonymous unions
+ * 2nd read anonymous union type info, which have compiler-generated names of
+ * "__C" following by a number, and assign unnamed members to offset holes
+ */
+ boolean isRVCTAnonymousUnion = false;
+ try {
+ isRVCTAnonymousUnion = name.startsWith("__C") && (name.length() > 3) && //$NON-NLS-1$
+ (name.charAt(3) != '-') && (Long.parseLong(name.substring(3)) > -1);
+ } catch (NumberFormatException nfe) {}
+
+ // if needed, create an "unnamed" member field with an offset to be determined later
+ if (isRVCTAnonymousUnion && getCompositeParent(typeToParentMap.get(currentParentType)) != null) {
+ ICompositeType compositeType = getCompositeParent(typeToParentMap.get(currentParentType));
+
+ // unnamed member accessibility depends on the enclosing composite's type -
+ // public for a struct or union, private for a class
+ int accessibility = ICompositeType.ACCESS_PUBLIC;
+ if (compositeType instanceof ClassType)
+ accessibility = ICompositeType.ACCESS_PRIVATE;
+
+ // empty field names confuse the expressions service
+ String fieldName = "$unnamed$" + (compositeType.fieldCount() + 1); //$NON-NLS-1$
+
+ // since we're generating a field, give it a -1 offset. We cannot tell the real
+ // offset until we determine offsets of all previously defined members - which
+ // may include inherited types not yet read in Dwarf info
+ FieldType fieldType = new FieldType(fieldName, currentParentScope, compositeType, -1, 0, 0,
+ byteSize, accessibility, null);
+ fieldType.setType(type);
+
+ // add the member to the deepest nested (last added) compositeNesting
+ // member
+ compositeType.addField(fieldType);
+ registerType(offset, fieldType, false);
+ }
+
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processInheritance(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ ICompositeType compositeType = getCompositeParent();
+
+ // The allowed attributes are DW_AT_type, DW_AT_data_member_location,
+ // and DW_AT_accessibility
+ long fieldsOffset = 0;
+ byte[] offsetBlock = attributeList.getAttributeValueAsBytes(DwarfConstants.DW_AT_data_member_location);
+ // unsigned LEB128 encoding
+ if (offsetBlock.length > 0 && offsetBlock[0] == DwarfConstants.DW_OP_plus_uconst) {
+ for (int i = 1, shift = 0; i < offsetBlock.length; i++) {
+ fieldsOffset += (offsetBlock[i] & 0x7f) << shift;
+ shift += 7;
+ }
+ }
+
+ // default accessibility is private
+ int accessibility = ICompositeType.ACCESS_PRIVATE;
+ if (attributeList.getAttribute(DwarfConstants.DW_AT_accessibility) != null) {
+ accessibility = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_accessibility);
+
+ if (accessibility == DwarfConstants.DW_ACCESS_public)
+ accessibility = ICompositeType.ACCESS_PUBLIC;
+ else if (accessibility == DwarfConstants.DW_ACCESS_private)
+ accessibility = ICompositeType.ACCESS_PRIVATE;
+ else
+ accessibility = ICompositeType.ACCESS_PROTECTED;
+ }
+
+ InheritanceType type = new InheritanceType(currentParentScope, accessibility, fieldsOffset, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+
+ // add the member to the deepest nested (last added) compositeNesting
+ // member
+ if (compositeType != null)
+ compositeType.addInheritance(type);
+
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processField(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // GCC-E has fields like "_vptr.BaseClass" which will be a problem for us
+ // (since '.' is an operator); rename these here
+ name = name.replace('.', '$');
+
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+ int bitSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_bit_size);
+ int bitOffset = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_bit_offset);
+
+ long fieldOffset = 0;
+ byte[] offsetBlock = attributeList.getAttributeValueAsBytes(DwarfConstants.DW_AT_data_member_location);
+ // unsigned LEB128 encoding
+ if (offsetBlock.length > 0 && offsetBlock[0] == DwarfConstants.DW_OP_plus_uconst) {
+ for (int i = 1, shift = 0; i < offsetBlock.length; i++) {
+ fieldOffset += (offsetBlock[i] & 0x7f) << shift;
+ shift += 7;
+ }
+ }
+
+ ICompositeType compositeType = getCompositeParent();
+
+ // default accessibility depends on the composite type -
+ // public for a struct or union, private for a class
+ int accessibility = ICompositeType.ACCESS_PUBLIC;
+ if (attributeList.getAttribute(DwarfConstants.DW_AT_accessibility) != null) {
+ accessibility = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_accessibility);
+
+ if (accessibility == DwarfConstants.DW_ACCESS_public)
+ accessibility = ICompositeType.ACCESS_PUBLIC;
+ else if (accessibility == DwarfConstants.DW_ACCESS_private)
+ accessibility = ICompositeType.ACCESS_PRIVATE;
+ else
+ accessibility = ICompositeType.ACCESS_PROTECTED;
+ } else if (compositeType != null && compositeType instanceof ClassType)
+ accessibility = ICompositeType.ACCESS_PRIVATE;
+
+ // Empty fields confuse the expressions service (#10369)
+ if (name.length() == 0) {
+ if (compositeType != null) {
+ name = "$unnamed$" + (compositeType.fieldCount() + 1); //$NON-NLS-1$
+ } else {
+ name = "$unnamed$"; //$NON-NLS-1$
+ }
+ }
+
+ FieldType type = new FieldType(name, currentParentScope, compositeType, fieldOffset, bitSize, bitOffset,
+ byteSize, accessibility, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ // add the member to the deepest nested (last added) compositeNesting
+ // member
+ if (compositeType != null)
+ compositeType.addField(type);
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processTemplateTypeParam(long offset, AttributeList attributeList, CompilationUnitHeader header, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ IType paramType = getTypeOrReference(attributeList.getAttribute(DwarfConstants.DW_AT_type), currentCUHeader);
+
+ TemplateParamType type = new TemplateParamType(name, paramType);
+
+ ICompositeType compositeType = getCompositeParent();
+
+ // add the template param to the deepest nested (last added) compositeNesting
+ // member
+ if (compositeType != null)
+ compositeType.addTemplateParam(type);
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private ICompositeType getCompositeParent() {
+ return getCompositeParent(currentParentType);
+ }
+
+ private ICompositeType getCompositeParent(IType parent) {
+ while (parent != null) {
+ if (parent instanceof ICompositeType)
+ return ((ICompositeType) parent);
+ parent = typeToParentMap.get(parent);
+ }
+ return null;
+ }
+
+ private void processArrayType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ ArrayType type = new ArrayType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private IArrayType getArrayParent() {
+ IType parent = currentParentType;
+ while (parent != null) {
+ if (parent instanceof IArrayType)
+ return ((IArrayType) parent);
+ parent = typeToParentMap.get(parent);
+ }
+ return null;
+ }
+
+ private void processArrayBoundType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ long arrayBound = 0;
+ if (attributeList.getAttribute(DwarfConstants.DW_AT_upper_bound) != null)
+ arrayBound = attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_upper_bound) + 1;
+
+ ArrayBoundType type = new ArrayBoundType(currentParentScope, arrayBound);
+
+ IArrayType array = getArrayParent();
+ if (array == null)
+ throw new IllegalStateException();
+ array.addBound(type);
+
+ registerType(offset, type, hasChildren);
+
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processReferenceType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ if (byteSize == 0)
+ byteSize = currentCUHeader.addressSize;
+
+ ReferenceType type = new ReferenceType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processPointerType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ if (byteSize == 0)
+ byteSize = currentCUHeader.addressSize;
+
+ PointerType type = new PointerType(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReferenceOrVoid(attributeList));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processPtrToMemberType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // unnamed data types don't get stored by name
+ if (name.length() == 0)
+ name = "" + offset;
+
+ PointerType type = new PointerType(name, currentParentScope, currentCUHeader.addressSize, null);
+ type.setType(getTypeOrReferenceOrVoid(attributeList));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processConstType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ ConstType type = new ConstType(currentParentScope, null);
+ type.setType(getTypeOrReferenceOrVoid(attributeList));
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processVolatileType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ VolatileType type = new VolatileType(currentParentScope, null);
+ type.setType(getTypeOrReferenceOrVoid(attributeList));
+ registerType(offset, type, hasChildren);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ // for void pointers, GCC will produce qualifiers and pointers without types or references,
+ // so create a void to be qualified or pointed to
+ private IType getTypeOrReferenceOrVoid(AttributeList attributeList) {
+ IType typeOrReference = getTypeOrReference(attributeList, currentCUHeader);
+ if (typeOrReference != null)
+ return typeOrReference;
+
+ if (moduleScope != null && voidType == null) {
+ voidType = new CPPBasicType("void", moduleScope, IBasicType.t_void, 0, 0, null);
+ }
+
+ if (voidType != null)
+ return voidType;
+
+ return new CPPBasicType("void", currentParentScope, IBasicType.t_void, 0, 0, null);
+ }
+
+ private void processEnumType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ // if the name is mangled, unmangle it
+ name = unmangleType(name);
+
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ Enumeration type = new Enumeration(name, currentParentScope, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private Enumeration getEnumerationParent() {
+ IType parent = currentParentType;
+ while (parent != null) {
+ if (parent instanceof Enumeration)
+ return ((Enumeration) parent);
+ parent = typeToParentMap.get(parent);
+ }
+ return null;
+ }
+
+ private void processEnumerator(long offset, AttributeList attributeList) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ if (unmangler.isMangled(name)) {
+ try {
+ name = unmangler.unmangle(name);
+ } catch (UnmanglingException ue) {
+ }
+ }
+ long value = attributeList.getAttributeValueAsSignedLong(DwarfConstants.DW_AT_const_value);
+
+ Enumerator enumerator = new Enumerator(name, value);
+
+ Enumeration enumeration = getEnumerationParent();
+ if (enumeration == null)
+ throw new IllegalStateException();
+ enumeration.addEnumerator(enumerator);
+ ((Scope)enumeration.getScope()).addEnumerator(enumerator);
+
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(enumerator)); }
+ }
+
+ private void processTypeDef(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+
+ // if the name is mangled, unmangle it
+ name = unmangleType(name);
+
+ TypedefType type = new TypedefType(name, currentParentScope, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processBasicType(long offset, AttributeList attributeList, boolean hasChildren) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(offset)); }
+
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ int byteSize = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_byte_size);
+
+ int baseType = IBasicType.t_unspecified;
+ int qualifierBits = 0;
+ int encoding = attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_encoding);
+
+ switch (encoding) {
+ case DwarfConstants.DW_ATE_boolean:
+ baseType = ICPPBasicType.t_bool;
+ break;
+ case DwarfConstants.DW_ATE_float:
+ if (name.contains("float")) { //$NON-NLS-1$
+ baseType = IBasicType.t_float;
+ } else if (name.contains("long double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ qualifierBits |= ICPPBasicType.IS_LONG;
+ } else if (name.contains("double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ }
+ break;
+ case DwarfConstants.DW_ATE_signed:
+ baseType = IBasicType.t_int;
+ qualifierBits |= ICPPBasicType.IS_SIGNED;
+ if (name.contains("short")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_SHORT;
+ } else if (name.contains("long long")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_LONG_LONG;
+ } else if (name.contains("long")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_LONG;
+ }
+ break;
+ case DwarfConstants.DW_ATE_signed_char:
+ baseType = IBasicType.t_char;
+ qualifierBits |= ICPPBasicType.IS_SIGNED;
+ break;
+ case DwarfConstants.DW_ATE_unsigned:
+ baseType = IBasicType.t_int;
+ qualifierBits |= ICPPBasicType.IS_UNSIGNED;
+ if (name.contains("short")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_SHORT;
+ } else if (name.contains("long long")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_LONG_LONG;
+ } else if (name.contains("long")) { //$NON-NLS-1$
+ qualifierBits |= ICPPBasicType.IS_LONG;
+ }
+ break;
+ case DwarfConstants.DW_ATE_unsigned_char:
+ baseType = IBasicType.t_char;
+ qualifierBits |= ICPPBasicType.IS_UNSIGNED;
+ break;
+ case DwarfConstants.DW_ATE_complex_float:
+ qualifierBits |= ICPPBasicType.IS_COMPLEX;
+ if (name.contains("float")) { //$NON-NLS-1$
+ baseType = IBasicType.t_float;
+ } else if (name.contains("long double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ qualifierBits |= ICPPBasicType.IS_LONG;
+ } else if (name.contains("double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ }
+ break;
+ case DwarfConstants.DW_ATE_imaginary_float:
+ qualifierBits |= ICPPBasicType.IS_IMAGINARY;
+ if (name.contains("float")) { //$NON-NLS-1$
+ baseType = IBasicType.t_float;
+ } else if (name.contains("long double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ qualifierBits |= ICPPBasicType.IS_LONG;
+ } else if (name.contains("double")) { //$NON-NLS-1$
+ baseType = IBasicType.t_double;
+ }
+ break;
+ case DwarfConstants.DW_ATE_void:
+ baseType = IBasicType.t_void;
+ break;
+ case DwarfConstants.DW_ATE_address:
+ case DwarfConstants.DW_ATE_packed_decimal:
+ case DwarfConstants.DW_ATE_numeric_string:
+ case DwarfConstants.DW_ATE_edited:
+ case DwarfConstants.DW_ATE_signed_fixed:
+ case DwarfConstants.DW_ATE_unsigned_fixed:
+ case DwarfConstants.DW_ATE_decimal_float:
+ default:
+ break;
+ }
+
+ // RVCT has interesting conceptions about "encoding" here. Be sure not to get confused later.
+ if (name.equals("void") && byteSize == 0) //$NON-NLS-1$
+ baseType = IBasicType.t_void;
+
+ CPPBasicType type = new CPPBasicType(name, currentParentScope, baseType, qualifierBits, byteSize, null);
+ type.setType(getTypeOrReference(attributeList, currentCUHeader));
+ registerType(offset, type, hasChildren);
+ storeTypeByName(name, type);
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(type)); }
+ }
+
+ private void processVariable(long offset, AttributeList attributeList, boolean isParameter) {
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceEntry(null, EDCTrace.fixArg(attributeList)); }
+
+ AttributeValue locationAttribute = attributeList.getAttribute(DwarfConstants.DW_AT_location);
+ ILocationProvider locationProvider = getLocationProvider(locationAttribute);
+ if (locationProvider == null) {
+ // No location means either this is a placeholder (in a subprogram declaration)
+ // or it may have been optimized out. See section
+ // 2.6 of the Dwarf3 spec. for now we're ignoring it but we may be able
+ // to show it in the view with some special decoration to indicate that
+ // it's been optimized out
+
+ // assume it is a forward reference if we're inside a function (formal_parameter or local)...
+ provider.functionsByOffset.put(offset, attributeList);
+ return;
+ }
+
+ // variables can have abstract origins with most of their contents
+ CompilationUnitHeader otherCU = currentCUHeader;
+ AttributeList otherAttributes = attributeList;
+ String name = attributeList.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ if (name.length() == 0) {
+ // no name.
+ // if there is a DW_AT_specification or DW_AT_abstract_origin attribute, use it to get variable attributes
+ DereferencedAttributes deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_specification);
+ if (deref == null)
+ deref = getDereferencedAttributes(attributeList, DwarfConstants.DW_AT_abstract_origin);
+ if (deref != null) {
+ // this should either have a name or point to another
+ // declaration
+ otherCU = deref.header;
+ otherAttributes = deref.attributeList;
+ name = otherAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_name);
+ }
+ }
+
+ boolean global = (otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_external) == 1);
+
+ // if the name is mangled, unmangle it
+ if (name.startsWith("_Z")) {
+ name = unmangle(name);
+ } else if (global) {
+ // GCCE uses DW_AT_MIPS_linkage_name for the mangled name of an externally visible variable
+ String mangledName = otherAttributes.getAttributeValueAsString(DwarfConstants.DW_AT_MIPS_linkage_name);
+ if (unmangler.isMangled(mangledName)) {
+ try {
+ name = unmangler.unmangle(mangledName);
+ } catch (UnmanglingException ue) {
+ }
+ }
+ }
+
+ IType type = getTypeOrReference(otherAttributes.getAttribute(DwarfConstants.DW_AT_type), otherCU);
+ if (type != null) {
+ long startScope = attributeList.getAttributeValueAsLong(DwarfConstants.DW_AT_start_scope);
+ boolean isDeclared = otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_artificial) <= 0;
+
+ int definingFileNum = otherAttributes.getAttributeValueAsInt(DwarfConstants.DW_AT_decl_file);
+ if (definingFileNum > 0 && attributeList.getAttributeValueAsInt(DwarfConstants.DW_AT_declaration) > 0) {
+ // variable is declared here, but not defined here
+ definingFileNum = 0;
+ }
+
+ IPath definingFile = null;
+
+ // find the file it's defined in
+ if (definingFileNum > 0) {
+ // find the enclosing compile unit to get access to its list of
+ // .debug_line file names
+ IScope cuScope = currentParentScope;
+ while (cuScope != null && !(cuScope instanceof DwarfCompileUnit))
+ cuScope = cuScope.getParent();
+
+ if (cuScope != null) {
+ definingFile = ((DwarfCompileUnit) cuScope).getFileEntry(definingFileNum);
+ }
+ }
+
+ DwarfVariable variable = new DwarfVariable(name,
+ global ? moduleScope : currentParentScope,
+ locationProvider,
+ type,
+ isDeclared,
+ definingFile);
+
+ variable.setStartScope(startScope);
+
+ if (isParameter) {
+ if (currentParentScope instanceof FunctionScope) {
+ ((FunctionScope) currentParentScope).addParameter(variable);
+ } else {
+ assert (false);
+ }
+ } else {
+ if (global) {
+ // add global variables to the module scope
+ moduleScope.addVariable(variable);
+ // AND to the CU scope
+ if (currentCompileUnitScope != null) {
+ currentCompileUnitScope.addVariable(variable);
+ }
+ } else {
+ // the parent scope could be compile unit, function or
+ // lexical block
+ currentParentScope.addVariable(variable);
+ }
+
+ // keep track of all variables by name for faster lookup
+ List<IVariable> variables = provider.variablesByName.get(name);
+ if (variables == null) {
+ variables = new ArrayList<IVariable>();
+ provider.variablesByName.put(name, variables);
+ }
+ if (!variables.contains(variable)) {
+ variables.add(variable);
+ }
+ }
+
+ if (EDCTrace.SYMBOL_READER_VERBOSE_TRACE_ON) { EDCTrace.getTrace().traceExit(null, EDCTrace.fixArg(variable)); }
+ }
+ }
+
+
+ private ILocationProvider getLocationProvider(AttributeValue locationValue) {
+ if (locationValue != null) {
+ byte actualForm = locationValue.getActualForm();
+ if (actualForm == DwarfConstants.DW_FORM_data4) {
+ // location list
+ Collection<LocationEntry> entryList = getLocationRecord(locationValue.getValueAsLong());
+ if (entryList != null) {
+ return new LocationList(entryList.toArray(new LocationEntry[entryList.size()]),
+ exeReader.getByteOrder(),
+ currentCUHeader.addressSize, currentParentScope);
+ }
+ } else if (actualForm == DwarfConstants.DW_FORM_block
+ || actualForm == DwarfConstants.DW_FORM_block1
+ || actualForm == DwarfConstants.DW_FORM_block2
+ || actualForm == DwarfConstants.DW_FORM_block4) {
+ // location expression
+ IStreamBuffer locationData = new MemoryStreamBuffer(locationValue.getValueAsBytes(), exeReader.getByteOrder());
+ return new LocationExpression(locationData,
+ currentCUHeader.addressSize,
+ currentParentScope);
+ } else {
+ // should not happen according to the spec
+ assert (false);
+ }
+ }
+
+ return null;
+ }
+
+ private void dumpSymbols() {
+ if (DEBUG) {
+ PrintStream out = null;
+ try {
+ out = new PrintStream(new File(dumpFileName));
+ } catch (FileNotFoundException e) {
+ System.out.println(DwarfMessages.DwarfInfoReader_DumpFileOpenOrCreateFailed + dumpFileName);
+ return;
+ }
+
+ // If to write to console
+ // PrintStream out = System.out;
+
+ out.println("Module - " + symbolFilePath);
+ out.println(" Variables - " + moduleScope.getVariables().size());
+ out.println(" Compile units - " + moduleScope.getChildren().size());
+ out.println();
+
+ for (IScope cu : moduleScope.getChildren()) {
+ out.println(" Compile unit - " + cu.toString());
+ out.println(" Variables - " + cu.getVariables().size());
+ out.println(" Functions - " + cu.getChildren().size());
+ out.println();
+
+ for (IScope func : cu.getChildren()) {
+ out.println(" Function - " + func.toString());
+ out.println(" Variables - " + func.getVariables().size());
+ out.println(" Parameters - " + ((IFunctionScope) func).getParameters().size());
+ out.println(" Lexical blocks - " + func.getChildren().size());
+ out.println();
+
+ // not accurate: can contain IFunctionScope too!
+ for (IScope block : func.getChildren()) {
+ out.println(" Lexical block - " + block.toString());
+ out.println(" Variables - " + block.getVariables().size());
+ out.println();
+ }
+ }
+ }
+
+ out.close();
+ }
+ }
+
+ public void parseForFrameIndices() {
+ synchronized (provider) {
+ if (!provider.frameDescEntries.isEmpty())
+ return;
+
+ IExecutableSection frameSection = exeReader.findExecutableSection(DWARF_DEBUG_FRAME);
+ if (frameSection == null)
+ return;
+
+ IStreamBuffer buffer = frameSection.getBuffer();
+ buffer.position(0);
+
+ int addressSize = 4; // TODO: 64-bit Dwarf
+ long cie_id = addressSize == 4 ? 0xffffffff : ~0L;
+
+ // in the first pass, just get a mapping of PC ranges to FDEs,
+ // so we can locate entries quickly (don't pre-parse CIEs or decompile FDE instructions yet)
+ while (buffer.position() < buffer.capacity()) {
+ try {
+ long fdePtr = buffer.position();
+ long headerLength = readAddress(buffer, addressSize);
+ long nextPosition = buffer.position() + headerLength;
+
+ long ciePtr = readAddress(buffer, addressSize);
+ if (ciePtr != cie_id) {
+ long initialLocation = readAddress(buffer, addressSize);
+ long addressRange = readAddress(buffer, addressSize);
+ IStreamBuffer instructions = buffer.wrapSubsection(nextPosition - buffer.position());
+ IRangeList.Entry entry = new IRangeList.Entry(initialLocation, initialLocation + addressRange);
+ FrameDescriptionEntry fde = new FrameDescriptionEntry(fdePtr, ciePtr,
+ entry.low, entry.high,
+ instructions, addressSize);
+ provider.frameDescEntries.put(entry, fde);
+ }
+
+ buffer.position(nextPosition);
+ } catch (Throwable t) {
+ EDCDebugger.getMessageLogger().logError(DwarfMessages.DwarfInfoReader_FrameIndicesReadFailed, t);
+ break;
+ }
+
+ }
+ }
+ }
+
+ /**
+ * Parse a CIE
+ * @param ciePtr
+ * @param addressSize
+ * @param framePC
+ * @return the CIE or <code>null</code> in case of error
+ */
+ public CommonInformationEntry parseCommonInfoEntry(Long ciePtr, int addressSize, IAddress framePC) throws IOException {
+ synchronized (provider) {
+ IExecutableSection frameSection = exeReader.findExecutableSection(DWARF_DEBUG_FRAME);
+ if (frameSection == null)
+ return null;
+
+ IStreamBuffer buffer = frameSection.getBuffer();
+ buffer.position(ciePtr);
+
+ long headerLength = readAddress(buffer, addressSize);
+ if (headerLength > buffer.capacity()) {
+ assert(false);
+ return null;
+ }
+
+ long nextPosition = buffer.position() + headerLength;
+
+ /* cie_id = */ readAddress(buffer, addressSize);
+
+ byte version = buffer.get();
+ String augmentation = readString(buffer);
+ long codeAlignmentFactor = read_unsigned_leb128(buffer);
+ long dataAlignmentFactor = read_signed_leb128(buffer);
+ int returnAddressRegister = version < 3 ? buffer.get() & 0xff : (int) read_unsigned_leb128(buffer);
+
+
+ IStreamBuffer instructions = buffer.wrapSubsection(nextPosition - buffer.position());
+
+ String producer = null;
+ ICompileUnitScope cuScope = provider.getCompileUnitForAddress(framePC);
+ if (cuScope instanceof DwarfCompileUnit)
+ producer = ((DwarfCompileUnit) cuScope).getAttributeList().getAttributeValueAsString(DwarfConstants.DW_AT_producer);
+
+ return new CommonInformationEntry(codeAlignmentFactor, dataAlignmentFactor,
+ returnAddressRegister, version, instructions, addressSize,
+ producer, augmentation);
+ }
+ }
+
+ private void storeTypeByName(String name, IType type) {
+ if (name.length() == 0)
+ return;
+
+ // Don't store opaque types as they are not useful in user-defined
+ // type casting nor in opaque type resolution. And storing it would
+ // screw up opaque type resolution.
+ if (type instanceof ICompositeType && ((ICompositeType)type).isOpaque())
+ return;
+
+ List<IType> typeList = provider.typesByName.get(name);
+ if (typeList == null) {
+ typeList = new ArrayList<IType>();
+
+ // for a template, remove extra spaces and composite type names (e.g., "class")
+ if (name.indexOf('<') != -1) {
+ while (name.contains(" ")) //$NON-NLS-1$
+ name = name.replaceAll(" ", " "); //$NON-NLS-1$ //$NON-NLS-2$
+ name = name.replaceAll(", ", ","); //$NON-NLS-1$ //$NON-NLS-2$
+ name = name.replaceAll("class ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ name = name.replaceAll("struct ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ name = name.replaceAll("union ", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ provider.typesByName.put(name, typeList);
+ }
+ typeList.add(type);
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfModuleScope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfModuleScope.java
index 4cfc086..db026af 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfModuleScope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfModuleScope.java
@@ -1,271 +1,286 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.internal.symbols.ModuleLineEntryProvider;
-import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
-import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
-import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
-import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
-import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
-import org.eclipse.cdt.debug.edc.symbols.IModuleLineEntryProvider;
-import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
-import org.eclipse.cdt.debug.edc.symbols.IScope;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.cdt.debug.edc.symbols.IVariable;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * This represents the high-level view of an executable module's symbolics.
- */
-public class DwarfModuleScope extends Scope implements IModuleScope {
-
- private final DwarfDebugInfoProvider provider;
- private ModuleLineEntryProvider lineEntryMapper;
-
- public DwarfModuleScope(DwarfDebugInfoProvider provider) {
- super("", null, null, null);
- this.provider = provider;
-
- if (provider == null) {
- lowAddress = Addr32.ZERO;
- highAddress = Addr32.ZERO;
- } else {
- name = provider.getSymbolFile().lastSegment();
-
- // for now, use the code sections' ranges
- lowAddress = Addr32.MAX;
- highAddress = Addr32.ZERO;
- for (ISection section : provider.getExecutableSymbolicsReader().getSections()) {
- if (section.getProperties().get(ISection.PROPERTY_NAME).equals(ISection.NAME_DATA)) {
- if (section.getLinkAddress().compareTo(lowAddress) < 0)
- lowAddress = section.getLinkAddress();
- IAddress end = section.getLinkAddress().add(section.getSize());
- if (end.compareTo(highAddress) > 0)
- highAddress = end;
- }
- }
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getSymbolFile()
- */
- public IPath getSymbolFile() {
- if (provider != null)
- return provider.getSymbolFile();
- else
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getCompileUnitForAddress(org.eclipse.cdt.core.IAddress)
- */
- public ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress) {
- if (provider != null)
- return provider.getCompileUnitForAddress(linkAddress);
- else
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getCompileUnitForFile(org.eclipse.core.runtime.IPath)
- */
- public List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath) {
- if (provider != null)
- return provider.getCompileUnitsForFile(filePath);
- else
- return Collections.emptyList();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getFunctionsByName(java.lang.String)
- */
- public Collection<IFunctionScope> getFunctionsByName(String name) {
- if (provider != null)
- return provider.getFunctionsByName(name);
- else
- return Collections.emptyList();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getVariablesByName(java.lang.String)
- */
- public Collection<IVariable> getVariablesByName(String name, boolean globalsOnly) {
- // at the module scope, the variables we want are global
- if (provider != null)
- return provider.getVariablesByName(name, globalsOnly);
- else
- return Collections.emptyList();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getScopeAtAddress(org.eclipse.cdt.core.IAddress)
- */
- @Override
- public IScope getScopeAtAddress(IAddress linkAddress) {
- ensureParsed();
- return super.getScopeAtAddress(linkAddress);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getEnumerators()
- */
- @Override
- public Collection<IEnumerator> getEnumerators() {
- ensureParsed();
- return super.getEnumerators();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getChildren()
- */
- @Override
- public Collection<IScope> getChildren() {
- ensureParsed();
- return super.getChildren();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getVariables()
- */
- @Override
- public Collection<IVariable> getVariables() {
- ensureParsedForVariables();
- return super.getVariables();
- }
-
- private void ensureParsed() {
- if (provider != null)
- provider.ensureParsedInitially();
- }
-
- private void ensureParsedForVariables() {
- if (provider != null)
- provider.ensureParsedForVariables();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getTypes()
- */
- public Collection<IType> getTypes() {
- if (provider != null)
- return provider.getTypes();
- else
- return Collections.emptyList();
- }
-
- /**
- * Fixup ranges after a full-module address parse.
- */
- /*
- public void fixupRanges() {
- System.out.println("Fixing up ranges for " + getChildren().size() + " children");
-
- // fix up scope addresses in case compiler doesn't generate them.
- for (IScope cu : getChildren()) {
- ((DwarfCompileUnit) cu).fixupRanges();
- }
-
- IAddress newLowAddress = new Addr64(BigInteger.valueOf(0xFFFFFFFFL));
- IAddress newHighAddress = new Addr64(BigInteger.valueOf(0));
-
- // now fix up the module scope
- for (IScope cu : getChildren()) {
- if (cu.getLowAddress().compareTo(newLowAddress) < 0) {
- newLowAddress = cu.getLowAddress();
- }
-
- if (cu.getHighAddress().compareTo(newHighAddress) > 0) {
- newHighAddress = cu.getHighAddress();
- }
- }
-
- this.lowAddress = newLowAddress;
- this.highAddress = newHighAddress;
- }
- */
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.IModuleScope#getModuleLineEntryProvider()
- */
- public IModuleLineEntryProvider getModuleLineEntryProvider() {
- if (lineEntryMapper == null) {
- lineEntryMapper = new ModuleLineEntryProvider();
-
- // handle the currently parsed children
- for (IScope scope : getChildren()) {
- if (scope instanceof ICompileUnitScope) {
- lineEntryMapper.addCompileUnit((ICompileUnitScope) scope);
- }
- }
- }
- return lineEntryMapper;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#addChild(org.eclipse.cdt.debug.edc.internal.symbols.IScope)
- */
- @Override
- public void addChild(IScope scope) {
- super.addChild(scope);
-
- // initial module scope range is a guess
- mergeScopeRange(scope);
-
- if (scope instanceof ICompileUnitScope && lineEntryMapper != null) {
- lineEntryMapper.addCompileUnit((ICompileUnitScope) scope);
- }
- }
-
- /**
- * Update info when a compile unit has been fully parsed.
- * @param scope
- */
- public void updateLineInfoForCU(ICompileUnitScope scope) {
- // be sure the decl entries for inlined functions are detected
- if (lineEntryMapper != null)
- lineEntryMapper.addCompileUnit(scope);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getFrameRegisterProvider()
- */
- public IFrameRegisterProvider getFrameRegisterProvider() {
- if (provider != null)
- return provider.getFrameRegisterProvider();
- else
- return null;
- }
-
- /**
- * Help garbage collection
- */
- public void dispose() {
- lineEntryMapper = null;
- super.dispose();
- }
-}
-
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.ModuleLineEntryProvider;
+import org.eclipse.cdt.debug.edc.internal.symbols.Scope;
+import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
+import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope;
+import org.eclipse.cdt.debug.edc.symbols.IEnumerator;
+import org.eclipse.cdt.debug.edc.symbols.IFunctionScope;
+import org.eclipse.cdt.debug.edc.symbols.IModuleLineEntryProvider;
+import org.eclipse.cdt.debug.edc.symbols.IModuleScope;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.cdt.debug.edc.symbols.IVariable;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This represents the high-level view of an executable module's symbolics.
+ */
+public class DwarfModuleScope extends Scope implements IModuleScope {
+
+ private final DwarfDebugInfoProvider provider;
+ private ModuleLineEntryProvider lineEntryMapper;
+
+ public DwarfModuleScope(DwarfDebugInfoProvider provider) {
+ super("", null, null, null);
+ this.provider = provider;
+
+ if (provider == null) {
+ lowAddress = Addr32.ZERO;
+ highAddress = Addr32.ZERO;
+ } else {
+ name = provider.getSymbolFile().lastSegment();
+
+ // for now, use the code sections' ranges
+ lowAddress = Addr32.MAX;
+ highAddress = Addr32.ZERO;
+ for (ISection section : provider.getExecutableSymbolicsReader().getSections()) {
+ Object name = section.getProperties().get(ISection.PROPERTY_NAME);
+ if (name.equals(ISection.NAME_DATA) || name.equals(ISection.NAME_TEXT)) {
+ if (section.getLinkAddress().compareTo(lowAddress) < 0)
+ lowAddress = section.getLinkAddress();
+ IAddress end = section.getLinkAddress().add(section.getSize());
+ if (end.compareTo(highAddress) > 0)
+ highAddress = end;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getSymbolFile()
+ */
+ public IPath getSymbolFile() {
+ if (provider != null)
+ return provider.getSymbolFile();
+ else
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getCompileUnitForAddress(org.eclipse.cdt.core.IAddress)
+ */
+ public ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress) {
+ if (provider != null)
+ return provider.getCompileUnitForAddress(linkAddress);
+ else
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getCompileUnitForFile(org.eclipse.core.runtime.IPath)
+ */
+ public List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath) {
+ if (provider != null)
+ return provider.getCompileUnitsForFile(filePath);
+ else
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getFunctionsByName(java.lang.String)
+ */
+ public Collection<IFunctionScope> getFunctionsByName(String name) {
+ if (provider != null)
+ return provider.getFunctionsByName(name);
+ else
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getFunctionByName(java.lang.String)
+ */
+ public IFunctionScope getFunctionByName(String name) {
+ IFunctionScope function = null;
+ if (provider != null) {
+ Collection<IFunctionScope> functions = provider.getFunctionsByName(name);
+ if (!functions.isEmpty())
+ return functions.iterator().next();
+ }
+
+ return function;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getVariablesByName(java.lang.String)
+ */
+ public Collection<IVariable> getVariablesByName(String name, boolean globalsOnly) {
+ // at the module scope, the variables we want are global
+ if (provider != null)
+ return provider.getVariablesByName(name, globalsOnly);
+ else
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getScopeAtAddress(org.eclipse.cdt.core.IAddress)
+ */
+ @Override
+ public IScope getScopeAtAddress(IAddress linkAddress) {
+ ensureParsed();
+ return super.getScopeAtAddress(linkAddress);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getEnumerators()
+ */
+ @Override
+ public Collection<IEnumerator> getEnumerators() {
+ ensureParsed();
+ return super.getEnumerators();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getChildren()
+ */
+ @Override
+ public Collection<IScope> getChildren() {
+ ensureParsed();
+ return super.getChildren();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#getVariables()
+ */
+ @Override
+ public Collection<IVariable> getVariables() {
+ ensureParsedForVariables();
+ return super.getVariables();
+ }
+
+ private void ensureParsed() {
+ if (provider != null)
+ provider.ensureParsedInitially();
+ }
+
+ private void ensureParsedForVariables() {
+ if (provider != null)
+ provider.ensureParsedForVariables();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getTypes()
+ */
+ public Collection<IType> getTypes() {
+ if (provider != null)
+ return provider.getTypes();
+ else
+ return Collections.emptyList();
+ }
+
+ /**
+ * Fixup ranges after a full-module address parse.
+ */
+ /*
+ public void fixupRanges() {
+ System.out.println("Fixing up ranges for " + getChildren().size() + " children");
+
+ // fix up scope addresses in case compiler doesn't generate them.
+ for (IScope cu : getChildren()) {
+ ((DwarfCompileUnit) cu).fixupRanges();
+ }
+
+ IAddress newLowAddress = new Addr64(BigInteger.valueOf(0xFFFFFFFFL));
+ IAddress newHighAddress = new Addr64(BigInteger.valueOf(0));
+
+ // now fix up the module scope
+ for (IScope cu : getChildren()) {
+ if (cu.getLowAddress().compareTo(newLowAddress) < 0) {
+ newLowAddress = cu.getLowAddress();
+ }
+
+ if (cu.getHighAddress().compareTo(newHighAddress) > 0) {
+ newHighAddress = cu.getHighAddress();
+ }
+ }
+
+ this.lowAddress = newLowAddress;
+ this.highAddress = newHighAddress;
+ }
+ */
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getModuleLineEntryProvider()
+ */
+ public IModuleLineEntryProvider getModuleLineEntryProvider() {
+ if (lineEntryMapper == null) {
+ lineEntryMapper = new ModuleLineEntryProvider();
+
+ // handle the currently parsed children
+ for (IScope scope : getChildren()) {
+ if (scope instanceof ICompileUnitScope) {
+ lineEntryMapper.addCompileUnit((ICompileUnitScope) scope);
+ }
+ }
+ }
+ return lineEntryMapper;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.Scope#addChild(org.eclipse.cdt.debug.edc.internal.symbols.IScope)
+ */
+ @Override
+ public void addChild(IScope scope) {
+ super.addChild(scope);
+
+ // initial module scope range is a guess
+ mergeScopeRange(scope);
+
+ if (scope instanceof ICompileUnitScope && lineEntryMapper != null) {
+ lineEntryMapper.addCompileUnit((ICompileUnitScope) scope);
+ }
+ }
+
+ /**
+ * Update info when a compile unit has been fully parsed.
+ * @param scope
+ */
+ public void updateLineInfoForCU(ICompileUnitScope scope) {
+ // be sure the decl entries for inlined functions are detected
+ if (lineEntryMapper != null)
+ lineEntryMapper.addCompileUnit(scope);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.symbols.IModuleScope#getFrameRegisterProvider()
+ */
+ public IFrameRegisterProvider getFrameRegisterProvider() {
+ if (provider != null)
+ return provider.getFrameRegisterProvider();
+ else
+ return null;
+ }
+
+ /**
+ * Help garbage collection
+ */
+ public void dispose() {
+ lineEntryMapper = null;
+ super.dispose();
+ }
+}
+
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfVariable.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfVariable.java
index c74d7cb..4015529 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfVariable.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/DwarfVariable.java
@@ -1,35 +1,34 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import org.eclipse.cdt.debug.edc.internal.symbols.Variable;
-import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
-import org.eclipse.cdt.debug.edc.symbols.IScope;
-import org.eclipse.cdt.debug.edc.symbols.IType;
-import org.eclipse.core.runtime.IPath;
-
-public class DwarfVariable extends Variable {
-
- public DwarfVariable(String name, IScope scope, ILocationProvider locationProvider,
- IType type, boolean isDeclared, IPath definingFile) {
- super(name, scope, null, locationProvider, isDeclared, definingFile);
-
- this.type = type;
- }
-
- /*
- * Method to gain access to an IForwardTypeReference's original type
- * (must be called before other access functions, which may cause this to return the resolved type)
- */
- public IType getRawType() {
- return type;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - constructor implementation fix
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.Variable;
+import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+import org.eclipse.core.runtime.IPath;
+
+public class DwarfVariable extends Variable {
+
+ public DwarfVariable(String name, IScope scope, ILocationProvider locationProvider,
+ IType type, boolean isDeclared, IPath definingFile) {
+ super(name, scope, type, locationProvider, isDeclared, definingFile);
+ }
+
+ /**
+ * Method to gain access to an IForwardTypeReference's original type
+ * (must be called before other access functions, which may cause this to return the resolved type)
+ */
+ public IType getRawType() {
+ return type;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/ForwardTypeReference.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/ForwardTypeReference.java
new file mode 100644
index 0000000..bf9b657
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/ForwardTypeReference.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - Refactored ForwardTypeReference to separate top-level class
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
+import org.eclipse.cdt.debug.edc.symbols.IScope;
+import org.eclipse.cdt.debug.edc.symbols.IType;
+
+/**
+ * This represents a forward type reference, which is a type
+ * that resolves itself when referenced.
+ */
+public class ForwardTypeReference implements IType, IForwardTypeReference {
+
+ static public final IType NULL_TYPE_ENTRY = new IType() {
+
+ public int getByteSize() {
+ return 0;
+ }
+
+ public String getName() {
+ return DwarfMessages.DwarfDebugInfoProvider_UnhandledType;
+ }
+
+ public Map<Object, Object> getProperties() {
+ return Collections.emptyMap();
+ }
+
+ public IScope getScope() {
+ return null;
+ }
+
+ public IType getType() {
+ return null;
+ }
+
+ public void setType(IType type) {
+ throw new IllegalStateException();
+ }
+
+ public void dispose() {
+ }
+ };
+
+ private DwarfDebugInfoProvider provider;
+ private IType type = null;
+
+ protected final long offset;
+
+ public ForwardTypeReference(DwarfDebugInfoProvider provider, long offset) {
+ this.provider = provider;
+ this.offset = offset;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.dwarf.IForwardTypeReference#getReferencedType()
+ */
+ public IType getReferencedType() {
+ if (type == null) {
+ synchronized (this){// Instances are globally visible and so can be accessed from multiple threads
+ if (type == null) {
+ // to prevent recursion
+ IType newType = NULL_TYPE_ENTRY;
+ newType = provider.resolveTypeReference(this);
+ if (newType == null) {
+ // FIXME
+ newType = NULL_TYPE_ENTRY;
+ }
+ type = newType;
+ }
+ }
+ }
+ return type;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getByteSize()
+ */
+ public int getByteSize() {
+ return getReferencedType().getByteSize();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getName()
+ */
+ public String getName() {
+ return getReferencedType().getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getProperties()
+ */
+ public Map<Object, Object> getProperties() {
+ return getReferencedType().getProperties();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getScope()
+ */
+ public IScope getScope() {
+ return getReferencedType().getScope();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#getType()
+ */
+ public IType getType() {
+ return getReferencedType().getType();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#setType(org.eclipse.cdt.debug.edc.internal.symbols.IType)
+ */
+ public void setType(IType type_) {
+ getReferencedType().setType(type_);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.IType#dispose()
+ */
+ public void dispose() {
+ type = null;
+ provider = null;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (int) (offset ^ (offset >>> 32));
+ result = prime * result + ((provider == null) ? 0 : provider.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ForwardTypeReference other = (ForwardTypeReference) obj;
+ if (offset != other.offset)
+ return false;
+ if (provider == null) {
+ if (other.provider != null)
+ return false;
+ } else if (!provider.equals(other.provider))
+ return false;
+ return true;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/RangeList.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/RangeList.java
index 51f77c4..a0e61f0 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/RangeList.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/dwarf/RangeList.java
@@ -1,132 +1,185 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.eclipse.cdt.debug.edc.symbols.IRangeList;
-
-/**
- * This is a range of non-contiguous addresses
- */
-public class RangeList implements IRangeList {
- /** consecutive start, end entries */
- private List<Long> ranges = new ArrayList<Long>();
- private long low = Long.MAX_VALUE, high = Long.MIN_VALUE;
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "[0x" + Long.toHexString(getLowAddress()) + " to 0x" + Long.toHexString(getHighAddress()) + ")";
- }
-
- public void addRange(long start, long end) {
- if (!ranges.isEmpty()) {
- if (ranges.get(ranges.size() - 1) == start) {
- ranges.set(ranges.size() - 1, end);
- if (end > high)
- high = end;
- return;
- }
- }
- ranges.add(start);
- ranges.add(end);
-
- // track these dynamically since the list is not guaranteed to be ordered
- if (start < low)
- low = start;
- if (end > high)
- high = end;
- }
-
- public long getLowAddress() {
- if (ranges.isEmpty())
- return 0;
- else
- return low;
- }
-
- public long getHighAddress() {
- if (ranges.isEmpty())
- return 0;
- else
- return high;
- }
-
- /** Get an iterator over the ranges. Fetch two entries at a time,
- * which describe a [start, end) range. */
- public Iterator<Entry> iterator() {
- return new Iterator<Entry>() {
- int index = 0;
-
- public boolean hasNext() {
- return index < ranges.size();
- }
-
- public Entry next() {
- if (index >= ranges.size())
- throw new NoSuchElementException();
- index += 2;
- return new IRangeList.Entry(ranges.get(index - 2), ranges.get(index - 1));
- }
-
- public void remove() {
- // TODO Auto-generated method stub
-
- }
-
- };
- }
-
- /**
- * Fixup a range list by adding a new low range
- * @param addr
- */
- public void addLowRange(long addr) {
- if (low > addr) {
- low = addr;
- if (!ranges.isEmpty()) {
- ranges.set(0, low);
- }
- }
- }
-
- /**
- * Fixup a range list by adding a new high range
- * @param addr
- */
- public void addHighRange(long addr) {
- if (high < addr) {
- high = addr;
- if (!ranges.isEmpty()) {
- ranges.set(ranges.size() - 1, addr);
- }
- }
-
- }
-
- /**
- * Tell if an address is in a range.
- * @param addr
- */
- public boolean isInRange(long addr) {
- for (Entry entry : this) {
- if (entry.low >= addr && addr < entry.high)
- return true;
- }
- return false;
- }
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.dwarf;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.eclipse.cdt.debug.edc.symbols.IRangeList;
+
+/**
+ * This is a range of non-contiguous addresses
+ */
+public class RangeList implements IRangeList {
+ /** consecutive start, end entries */
+ private List<Long> ranges = new ArrayList<Long>();
+ private long low = Long.MAX_VALUE, high = Long.MIN_VALUE;
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "[0x" + Long.toHexString(getLowAddress()) + " to 0x" + Long.toHexString(getHighAddress()) + ")";
+ }
+
+ public void addRange(long start, long end) {
+ if (!ranges.isEmpty()) {
+ if (ranges.get(ranges.size() - 1) == start) {
+ ranges.set(ranges.size() - 1, end);
+ if (end > high)
+ high = end;
+ return;
+ }
+ }
+ ranges.add(start);
+ ranges.add(end);
+
+ // track these dynamically since the list is not guaranteed to be ordered
+ if (start < low)
+ low = start;
+ if (end > high)
+ high = end;
+ }
+
+ public long getLowAddress() {
+ if (ranges.isEmpty())
+ return 0;
+ else
+ return low;
+ }
+
+ public long getHighAddress() {
+ if (ranges.isEmpty())
+ return 0;
+ else
+ return high;
+ }
+
+ /** Get an iterator over the ranges. Fetch two entries at a time,
+ * which describe a [start, end) range. */
+ public Iterator<Entry> iterator() {
+ return new Iterator<Entry>() {
+ int index = 0;
+
+ public boolean hasNext() {
+ return index < ranges.size();
+ }
+
+ public Entry next() {
+ if (index >= ranges.size())
+ throw new NoSuchElementException();
+ index += 2;
+ return new IRangeList.Entry(ranges.get(index - 2), ranges.get(index - 1));
+ }
+
+ public void remove() {
+ // TODO Auto-generated method stub
+
+ }
+
+ };
+ }
+
+ /**
+ * Fixup a range list by adding a new low range
+ * @param addr
+ */
+ public void addLowRange(long addr) {
+ if (low > addr) {
+ low = addr;
+ if (!ranges.isEmpty()) {
+ ranges.set(0, low);
+ }
+ }
+ }
+
+ /**
+ * Fixup a range list by adding a new high range
+ * @param addr
+ */
+ public void addHighRange(long addr) {
+ if (high < addr) {
+ high = addr;
+ if (!ranges.isEmpty()) {
+ ranges.set(ranges.size() - 1, addr);
+ }
+ }
+
+ }
+
+ /**
+ * Tell if an address is in a range.
+ * @param addr
+ */
+ public boolean isInRange(long addr) {
+ for (Entry entry : this) {
+ if (entry.low <= addr && addr < entry.high)
+ return true;
+ }
+ return false;
+ }
+
+ public static RangeList mergeRangeLists(IRangeList first, IRangeList second){
+ Iterator<IRangeList.Entry> firstIterator = first.iterator();
+ Iterator<IRangeList.Entry> secondIterator = second.iterator();
+ RangeList answer = new RangeList();
+ IRangeList.Entry firstHead = null;
+ IRangeList.Entry secondHead = null;
+ while (firstIterator.hasNext() || secondIterator.hasNext()
+ || firstHead != null || secondHead != null){
+ if (firstHead == null && firstIterator.hasNext()){
+ firstHead = firstIterator.next();
+ }
+ if (secondHead == null && secondIterator.hasNext()){
+ secondHead = secondIterator.next();
+ }
+ if (firstHead == null){
+ if (secondHead != null){
+ answer.addRange(secondHead.low, secondHead.high);
+ secondHead = null;
+ }// else we have no more work to do and will exit at the end of the loop
+ } else {
+ if (secondHead == null){
+ answer.addRange(firstHead.low,firstHead.high);
+ firstHead = null;
+ } else {// both not null so work to do
+ long low,high;
+ if (firstHead.low <= secondHead.low){
+ low = firstHead.low;
+ if (firstHead.high < secondHead.low){// we are just using firstHead
+ high = firstHead.high;
+ firstHead = null;
+ } else {// overlap so use both
+ high = Math.max(firstHead.high, secondHead.high);
+ firstHead = null;
+ secondHead = null;
+ }
+ } else {
+ low = secondHead.low;
+ if (secondHead.high < firstHead.low){// just using secondHead
+ high = secondHead.high;
+ secondHead = null;
+ } else { // overlap so use both
+ high = Math.max(firstHead.high, secondHead.high);
+ firstHead = null;
+ secondHead = null;
+ }
+ }
+ answer.addRange(low,high);
+ }
+ }
+ }
+ return answer;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/elf/Elf.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/elf/Elf.java
index 88759f2..9eb12f7 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/elf/Elf.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/elf/Elf.java
@@ -1,1231 +1,1355 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2010 QNX Software Systems 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * QNX Software Systems - initial API and implementation
- * Markus Schorn (Wind River Systems)
- * Ed Swartz (Nokia) - temporary fork into EDC to adapt to IRandomReadAccessFile
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.elf;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.core.IAddressFactory;
-import org.eclipse.cdt.core.ISymbolReader;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.cdt.utils.Addr32Factory;
-import org.eclipse.cdt.utils.Addr64;
-import org.eclipse.cdt.utils.Addr64Factory;
-
-public class Elf {
- public final static int ELF32_ADDR_SIZE = 4;
- public final static int ELF32_OFF_SIZE = 4;
- public final static int ELF64_ADDR_SIZE = 8;
- public final static int ELF64_OFF_SIZE = 8;
-
- protected IRandomReadAccessFile efile;
-
- protected ELFhdr ehdr;
- protected Section[] sections;
- protected String file;
- protected byte[] section_strtab;
-
- private int syms = 0;
- private Symbol[] symbols;
- private Symbol[] symtab_symbols;
- private Section symtab_sym;
- private Symbol[] dynsym_symbols;
- private Section dynsym_sym;
- private boolean sections_mapped; // Have sections been mapped? Used to clean up properly in Elf.Dispose.
-
- protected String EMPTY_STRING = ""; //$NON-NLS-1$
-
- public class ELFhdr {
-
- /* e_ident offsets */
- public final static int EI_MAG0 = 0;
- public final static int EI_MAG1 = 1;
- public final static int EI_MAG2 = 2;
- public final static int EI_MAG3 = 3;
- public final static int EI_CLASS = 4;
- public final static int EI_DATA = 5;
- public final static int EI_VERSION = 6;
- public final static int EI_PAD = 7;
- public final static int EI_NDENT = 16;
-
- /* e_ident[EI_CLASS] */
- public final static int ELFCLASSNONE = 0;
- public final static int ELFCLASS32 = 1;
- public final static int ELFCLASS64 = 2;
-
- /* e_ident[EI_DATA] */
- public final static int ELFDATANONE = 0;
- public final static int ELFDATA2LSB = 1;
- public final static int ELFDATA2MSB = 2;
-
- /* values of e_type */
- public final static int ET_NONE = 0;
- public final static int ET_REL = 1;
- public final static int ET_EXEC = 2;
- public final static int ET_DYN = 3;
- public final static int ET_CORE = 4;
- public final static int ET_LOPROC = 0xff00;
- public final static int ET_HIPROC = 0xffff;
-
- /* values of e_machine */
- public final static int EM_NONE = 0;
- public final static int EM_M32 = 1;
- public final static int EM_SPARC = 2;
- public final static int EM_386 = 3;
- public final static int EM_68K = 4;
- public final static int EM_88K = 5;
- public final static int EM_486 = 6;
- public final static int EM_860 = 7;
- public final static int EM_MIPS = 8;
- public final static int EM_MIPS_RS3_LE = 10;
- public final static int EM_RS6000 = 11;
- public final static int EM_PARISC = 15;
- public final static int EM_nCUBE = 16;
- public final static int EM_VPP550 = 17;
- public final static int EM_SPARC32PLUS = 18;
- public final static int EM_PPC = 20;
- public final static int EM_PPC64 = 21;
- public final static int EM_ARM = 40;
- public final static int EM_SH = 42;
- public final static int EM_SPARCV9 = 43;
- public final static int EM_TRICORE = 44;
- public final static int EM_H8_300 = 46;
- public final static int EM_H8_300H = 47;
- public final static int EM_IA_64 = 50;
- public final static int EM_COLDFIRE = 52;
- public final static int EM_STARCORE = 58;
- public final static int EM_X86_64 = 62;
- public final static int EM_ST100 = 60;
-
- /** @since 5.2 */
- public final static int EM_68HC08 = 71; /* Freescale MC68HC08 Microcontroller */
-
- public final static int EM_AVR = 83;
- public final static int EM_FR30 = 84; /* Fujitsu FR30 */
- public final static int EM_V850 = 87;
- public final static int EM_M32R = 88;
- public final static int EM_MN10300 = 89;
- public final static int EM_MN10200 = 90;
- public final static int EM_XTENSA = 94;
- public final static int EM_MSP430 = 105;
- public final static int EM_BLACKFIN = 106;
- public final static int EM_EXCESS = 111;
- public final static int EM_NIOSII = 113;
- public final static int EM_C166 = 116;
- public final static int EM_M16C = 117;
-
- /** @since 5.2 */
- public final static int EM_RS08 = 132; /* Freescale RS08 embedded processor */
-
- public final static int EM_MMDSP = 160;
- public final static int EM_NIOS = 0xFEBB;
- public final static int EM_CYGNUS_POWERPC = 0x9025;
- public final static int EM_CYGNUS_M32R = 0x9041;
- public final static int EM_CYGNUS_V850 = 0x9080;
- public final static int EM_CYGNUS_MN10200 = 0xdead;
- public final static int EM_CYGNUS_MN10300 = 0xbeef;
- public final static int EM_CYGNUS_FR30 = 0x3330;
- public final static int EM_XSTORMY16 = 0xad45;
- public final static int EM_CYGNUS_FRV = 0x5441;
- public final static int EM_IQ2000 = 0xFEBA;
- public static final int EM_XILINX_MICROBLAZE = 0xbaab;
- public static final int EM_SDMA = 0xcafe;
- public static final int EM_CRADLE = 0x4d55;
-
- public byte e_ident[] = new byte[EI_NDENT];
- public int e_type; /* file type (Elf32_Half) */
- public int e_machine; /* machine type (Elf32_Half) */
- public long e_version; /* version number (Elf32_Word) */
- public IAddress e_entry; /* entry point (Elf32_Addr) */
- public long e_phoff; /* Program hdr offset (Elf32_Off) */
- public long e_shoff; /* Section hdr offset (Elf32_Off) */
- public long e_flags; /* Processor flags (Elf32_Word) */
- public short e_ehsize; /* sizeof ehdr (Elf32_Half) */
- public short e_phentsize; /* Program header entry size (Elf32_Half) */
- public short e_phnum; /* Number of program headers (Elf32_Half) */
- public short e_shentsize; /* Section header entry size (Elf32_Half) */
- public short e_shnum; /* Number of section headers (Elf32_Half) */
- public short e_shstrndx; /* String table index (Elf32_Half) */
-
- protected ELFhdr() throws IOException {
- efile.seek(0);
- efile.readFully(e_ident);
- if (e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E' || e_ident[ELFhdr.EI_MAG2] != 'L'
- || e_ident[ELFhdr.EI_MAG3] != 'F')
- throw new IOException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
- efile.setEndian(e_ident[ELFhdr.EI_DATA] == ELFhdr.ELFDATA2LSB);
- e_type = efile.readShortE();
- e_machine = efile.readShortE();
- e_version = efile.readIntE();
- switch (e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- byte[] addrArray = new byte[ELF32_ADDR_SIZE];
- efile.readFullyE(addrArray);
- e_entry = new Addr32(addrArray);
- e_phoff = efile.readIntE();
- e_shoff = efile.readIntE();
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- byte[] addrArray = new byte[ELF64_ADDR_SIZE];
- efile.readFullyE(addrArray);
- e_entry = new Addr64(addrArray);
- e_phoff = readUnsignedLong(efile);
- e_shoff = readUnsignedLong(efile);
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
- e_flags = efile.readIntE();
- e_ehsize = efile.readShortE();
- e_phentsize = efile.readShortE();
- e_phnum = efile.readShortE();
- e_shentsize = efile.readShortE();
- e_shnum = efile.readShortE();
- e_shstrndx = efile.readShortE();
- }
-
- protected ELFhdr(byte[] bytes) throws IOException {
- if (bytes.length <= e_ident.length) {
- throw new EOFException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
- }
- System.arraycopy(bytes, 0, e_ident, 0, e_ident.length);
- if (e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E' || e_ident[ELFhdr.EI_MAG2] != 'L'
- || e_ident[ELFhdr.EI_MAG3] != 'F')
- throw new IOException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
- boolean isle = (e_ident[ELFhdr.EI_DATA] == ELFhdr.ELFDATA2LSB);
- int offset = e_ident.length;
- e_type = makeShort(bytes, offset, isle);
- offset += 2;
- e_machine = makeShort(bytes, offset, isle);
- offset += 2;
- e_version = makeInt(bytes, offset, isle);
- offset += 4;
- switch (e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- byte[] addrArray = new byte[ELF32_ADDR_SIZE];
- System.arraycopy(bytes, offset, addrArray, 0, ELF32_ADDR_SIZE);
- offset += ELF32_ADDR_SIZE;
- e_entry = new Addr32(addrArray);
- e_phoff = makeInt(bytes, offset, isle);
- offset += ELF32_OFF_SIZE;
- e_shoff = makeInt(bytes, offset, isle);
- offset += ELF32_OFF_SIZE;
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- byte[] addrArray = new byte[ELF64_ADDR_SIZE];
- System.arraycopy(bytes, offset, addrArray, 0, ELF64_ADDR_SIZE);
- offset += ELF64_ADDR_SIZE;
- e_entry = new Addr64(addrArray);
- e_phoff = makeUnsignedLong(bytes, offset, isle);
- offset += ELF64_OFF_SIZE;
- e_shoff = makeUnsignedLong(bytes, offset, isle);
- offset += ELF64_OFF_SIZE;
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
- e_flags = makeInt(bytes, offset, isle);
- offset += 4;
- e_ehsize = makeShort(bytes, offset, isle);
- offset += 2;
- e_phentsize = makeShort(bytes, offset, isle);
- offset += 2;
- e_phnum = makeShort(bytes, offset, isle);
- offset += 2;
- e_shentsize = makeShort(bytes, offset, isle);
- offset += 2;
- e_shnum = makeShort(bytes, offset, isle);
- offset += 2;
- e_shstrndx = makeShort(bytes, offset, isle);
- offset += 2;
- }
-
- private final short makeShort(byte[] val, int offset, boolean isle) throws IOException {
- if (val.length < offset + 2)
- throw new IOException();
- if (isle) {
- return (short) ( (val[offset + 1] << 8) + val[offset + 0]);
- }
- return (short) ( (val[offset + 0] << 8) + val[offset + 1]);
- }
-
- private final long makeInt(byte[] val, int offset, boolean isle) throws IOException {
- if (val.length < offset + 4)
- throw new IOException();
- if (isle) {
- return ( (val[offset + 3] << 24) + (val[offset + 2] << 16) + (val[offset + 1] << 8) + val[offset + 0]);
- }
- return ( (val[offset + 0] << 24) + (val[offset + 1] << 16) + (val[offset + 2] << 8) + val[offset + 3]);
- }
-
- private final long makeLong(byte[] val, int offset, boolean isle) throws IOException {
- long result = 0;
- int shift = 0;
- if (isle)
- for (int i = 7; i >= 0; i--) {
- shift = i * 8;
- result += ( ((long)val[offset + i]) << shift) & (0xffL << shift);
- }
- else
- for (int i = 0; i <= 7; i++) {
- shift = (7 - i) * 8;
- result += ( ((long)val[offset + i]) << shift) & (0xffL << shift);
- }
- return result;
- }
-
- private final long makeUnsignedLong(byte[] val, int offset, boolean isle) throws IOException {
- long result = makeLong(val, offset, isle);
- if (result < 0) {
- throw new IOException("Maximal file offset is " + Long.toHexString(Long.MAX_VALUE) + //$NON-NLS-1$
- " given offset is " + Long.toHexString(result)); //$NON-NLS-1$
- }
- return result;
-
- }
-
- }
-
- public class Section {
-
- /* sh_type */
- public final static int SHT_NULL = 0;
- public final static int SHT_PROGBITS = 1;
- public final static int SHT_SYMTAB = 2;
- public final static int SHT_STRTAB = 3;
- public final static int SHT_RELA = 4;
- public final static int SHT_HASH = 5;
- public final static int SHT_DYNAMIC = 6;
- public final static int SHT_NOTE = 7;
- public final static int SHT_NOBITS = 8;
- public final static int SHT_REL = 9;
- public final static int SHT_SHLIB = 10;
- public final static int SHT_DYNSYM = 11;
-
- public final static int SHT_LOPROC = 0x70000000;
-
- /* sh_flags */
- public final static int SHF_WRITE = 1;
- public final static int SHF_ALLOC = 2;
- public final static int SHF_EXECINTR = 4;
-
- public long sh_name;
- public long sh_type;
- public long sh_flags;
- public IAddress sh_addr;
- public long sh_offset;
- public long sh_size;
- public long sh_link;
- public long sh_info;
- public long sh_addralign;
- public long sh_entsize;
-
- /**
- * @since 5.1
- */
- public ByteBuffer mapSectionData() throws IOException {
- sections_mapped = true;
- return efile.createReadByteBuffer(sh_offset, sh_size);
- }
-
- public byte[] loadSectionData() throws IOException {
- byte[] data = new byte[(int)sh_size];
- efile.seek(sh_offset);
- efile.read(data);
- return data;
- }
-
- @Override
- public String toString() {
- try {
- if (section_strtab == null) {
- final int shstrndx= ehdr.e_shstrndx & 0xffff; // unsigned short
- if (shstrndx > sections.length || shstrndx < 0)
- return EMPTY_STRING;
- int size = (int)sections[shstrndx].sh_size;
- if (size <= 0 || size > efile.length())
- return EMPTY_STRING;
- section_strtab = new byte[size];
- efile.seek(sections[shstrndx].sh_offset);
- efile.read(section_strtab);
- }
- int str_size = 0;
- if (sh_name > section_strtab.length) {
- return EMPTY_STRING;
- }
- while (section_strtab[(int)sh_name + str_size] != 0)
- str_size++;
- return new String(section_strtab, (int)sh_name, str_size);
- } catch (IOException e) {
- return EMPTY_STRING;
- }
- }
- }
-
- protected String string_from_elf_section(Elf.Section section, int index) throws IOException {
- if (index > section.sh_size) {
- return EMPTY_STRING;
- }
-
- StringBuffer str = new StringBuffer();
- //Most string symbols will be less than 50 bytes in size
- byte [] tmp = new byte[50];
-
- efile.seek(section.sh_offset + index);
- while(true) {
- int len = efile.read(tmp);
- for(int i = 0; i < len; i++) {
- if(tmp[i] == 0) {
- len = 0;
- break;
- }
- str.append((char)tmp[i]);
- }
- if(len <= 0) {
- break;
- }
- }
-
- return str.toString();
- }
-
- public class Symbol implements Comparable<Object> {
-
- /* Symbol bindings */
- public final static int STB_LOCAL = 0;
- public final static int STB_GLOBAL = 1;
- public final static int STB_WEAK = 2;
- /* Symbol type */
- public final static int STT_NOTYPE = 0;
- public final static int STT_OBJECT = 1;
- public final static int STT_FUNC = 2;
- public final static int STT_SECTION = 3;
- public final static int STT_FILE = 4;
- /* Special Indexes */
- public final static int SHN_UNDEF = 0;
- public final static int SHN_LORESERVE = 0xffffff00;
- public final static int SHN_LOPROC = 0xffffff00;
- public final static int SHN_HIPROC = 0xffffff1f;
- public final static int SHN_LOOS = 0xffffff20;
- public final static int SHN_HIOS = 0xffffff3f;
- public final static int SHN_ABS = 0xfffffff1;
- public final static int SHN_COMMON = 0xfffffff2;
- public final static int SHN_XINDEX = 0xffffffff;
- public final static int SHN_HIRESERVE = 0xffffffff;
-
- /* NOTE: 64 bit and 32 bit ELF sections has different order */
- public long st_name;
- public IAddress st_value;
- public long st_size;
- public short st_info;
- public short st_other;
- public short st_shndx;
-
- private String name = null;
-
- private final Section sym_section;
-
- public Symbol(Section section) {
- sym_section = section;
- }
-
- public int st_type() {
- return st_info & 0xf;
- }
-
- public int st_bind() {
- return (st_info >> 4) & 0xf;
- }
-
- public int compareTo(Object obj) {
- /*
- * long thisVal = 0; long anotherVal = 0; if ( obj instanceof Symbol ) {
- * Symbol sym = (Symbol)obj; thisVal = this.st_value; anotherVal =
- * sym.st_value; } else if ( obj instanceof Long ) { Long val =
- * (Long)obj; anotherVal = val.longValue(); thisVal = this.st_value; }
- * return (thisVal <anotherVal ? -1 : (thisVal==anotherVal ? 0 :
- * 1));
- */
- return this.st_value.compareTo( ((Symbol)obj).st_value);
- }
-
- @Override
- public String toString() {
- if (name == null) {
- try {
- Section sections[] = getSections();
- Section symstr = sections[(int)sym_section.sh_link];
- name = string_from_elf_section(symstr, (int)st_name);
- } catch (IOException e) {
- return EMPTY_STRING;
- }
- }
- return name;
- }
-
- }
-
- /**
- * We have to implement a separate compararator since when we do the binary
- * search down below we are using a Long and a Symbol object and the Long
- * doesn't know how to compare against a Symbol so if we compare Symbol vs
- * Long it is ok, but not if we do Long vs Symbol.
- */
-
- class SymbolComparator implements Comparator<Object> {
-
- IAddress val1, val2;
- public int compare(Object o1, Object o2) {
-
- if (o1 instanceof IAddress) {
- val1 = (IAddress)o1;
- } else if (o1 instanceof Symbol) {
- val1 = ((Symbol)o1).st_value;
- } else {
- return -1;
- }
-
- if (o2 instanceof IAddress) {
- val2 = (IAddress)o2;
- } else if (o2 instanceof Symbol) {
- val2 = ((Symbol)o2).st_value;
- } else {
- return -1;
- }
- return val1.compareTo(val2);
- }
- }
-
- public class PHdr {
-
- public final static int PT_NULL = 0;
- public final static int PT_LOAD = 1;
- public final static int PT_DYNAMIC = 2;
- public final static int PT_INTERP = 3;
- public final static int PT_NOTE = 4;
- public final static int PT_SHLIB = 5;
- public final static int PT_PHDR = 6;
-
- public final static int PF_X = 1;
- public final static int PF_W = 2;
- public final static int PF_R = 4;
- /* NOTE: 64 bit and 32 bit ELF have different order and size of elements */
- public long p_type;
- public long p_offset;
- public IAddress p_vaddr;
- public IAddress p_paddr;
- public long p_filesz;
- public long p_memsz;
- public long p_flags;
- public long p_align;
- }
-
- public PHdr[] getPHdrs() throws IOException {
- if (ehdr.e_phnum == 0) {
- return new PHdr[0];
- }
- efile.seek(ehdr.e_phoff);
- final int length= ehdr.e_phnum & 0xffff; // interpret as unsigned short
- PHdr phdrs[] = new PHdr[length];
- for (int i = 0; i < length; i++) {
- phdrs[i] = new PHdr();
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- byte[] addrArray = new byte[ELF32_ADDR_SIZE];
-
- phdrs[i].p_type = efile.readIntE();
- phdrs[i].p_offset = efile.readIntE();
- efile.readFullyE(addrArray);
- phdrs[i].p_vaddr = new Addr32(addrArray);
- efile.readFullyE(addrArray);
- phdrs[i].p_paddr = new Addr32(addrArray);
- phdrs[i].p_filesz = efile.readIntE();
- phdrs[i].p_memsz = efile.readIntE();
- phdrs[i].p_flags = efile.readIntE();
- phdrs[i].p_align = efile.readIntE();
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- byte[] addrArray = new byte[ELF64_ADDR_SIZE];
-
- phdrs[i].p_type = efile.readIntE();
- phdrs[i].p_flags = efile.readIntE();
- phdrs[i].p_offset = readUnsignedLong(efile);
- efile.readFullyE(addrArray);
- phdrs[i].p_vaddr = new Addr64(addrArray);
- efile.readFullyE(addrArray);
- phdrs[i].p_paddr = new Addr64(addrArray);
- phdrs[i].p_filesz = readUnsignedLong(efile);
- phdrs[i].p_memsz = readUnsignedLong(efile);
- phdrs[i].p_align = readUnsignedLong(efile);
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
-
- }
- return phdrs;
- }
-
- public class Dynamic {
-
- public final static int DYN_ENT_SIZE_32 = 8;
- public final static int DYN_ENT_SIZE_64 = 16;
-
- public final static int DT_NULL = 0;
- public final static int DT_NEEDED = 1;
- public final static int DT_PLTRELSZ = 2;
- public final static int DT_PLTGOT = 3;
- public final static int DT_HASH = 4;
- public final static int DT_STRTAB = 5;
- public final static int DT_SYMTAB = 6;
- public final static int DT_RELA = 7;
- public final static int DT_RELASZ = 8;
- public final static int DT_RELAENT = 9;
- public final static int DT_STRSZ = 10;
- public final static int DT_SYMENT = 11;
- public final static int DT_INIT = 12;
- public final static int DT_FINI = 13;
- public final static int DT_SONAME = 14;
- public final static int DT_RPATH = 15;
- public long d_tag;
- public long d_val;
- private final Section section;
- private String name;
-
- protected Dynamic(Section section) {
- this.section = section;
- }
-
- @Override
- public String toString() {
- if (name == null) {
- switch ((int)d_tag) {
- case DT_NEEDED :
- case DT_SONAME :
- case DT_RPATH :
- try {
- Section symstr = sections[(int)section.sh_link];
- name = string_from_elf_section(symstr, (int)d_val);
- } catch (IOException e) {
- name = EMPTY_STRING;
- }
- break;
- default :
- name = EMPTY_STRING;
- }
- }
- return name;
- }
- }
-
- public Dynamic[] getDynamicSections(Section section) throws IOException {
- if (section.sh_type != Section.SHT_DYNAMIC) {
- return new Dynamic[0];
- }
- ArrayList<Dynamic> dynList = new ArrayList<Dynamic>();
- efile.seek(section.sh_offset);
- int off = 0;
- // We must assume the section is a table ignoring the sh_entsize as it
- // is not
- // set for MIPS.
- while (off < section.sh_size) {
- Dynamic dynEnt = new Dynamic(section);
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- dynEnt.d_tag = efile.readIntE();
- dynEnt.d_val = efile.readIntE();
- off += Dynamic.DYN_ENT_SIZE_32;
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- dynEnt.d_tag = efile.readLongE();
- dynEnt.d_val = efile.readLongE();
- off += Dynamic.DYN_ENT_SIZE_64;
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
-
- if (dynEnt.d_tag != Dynamic.DT_NULL)
- dynList.add(dynEnt);
- }
- return dynList.toArray(new Dynamic[0]);
- }
-
- private void commonSetup(IRandomReadAccessFile rraFile, String file, long offset) throws IOException {
- try {
- efile = rraFile;
- efile.seek(offset);
- ehdr = new ELFhdr();
- this.file = file;
- } finally {
- if (ehdr == null) {
- dispose();
- }
- }
- }
-
- //A hollow entry, to be used with caution in controlled situations
- protected Elf() {
- }
-
- public Elf(String file, long offset) throws IOException {
- commonSetup(new ERandomAccessFile(file, "r"), file, offset); //$NON-NLS-1$
- }
-
- public Elf(String file) throws IOException {
- commonSetup(new ERandomAccessFile(file, "r"), file, 0); //$NON-NLS-1$
- }
-
- public Elf(IRandomReadAccessFile rraFile, String file, long offset) throws IOException {
- commonSetup(rraFile, file, offset);
- }
-
- public ELFhdr getELFhdr() throws IOException {
- return ehdr;
- }
-
- public class Attribute {
-
- public static final int ELF_TYPE_EXE = 1;
- public static final int ELF_TYPE_SHLIB = 2;
- public static final int ELF_TYPE_OBJ = 3;
- public static final int ELF_TYPE_CORE = 4;
-
- public static final int DEBUG_TYPE_NONE = 0;
- public static final int DEBUG_TYPE_STABS = 1;
- public static final int DEBUG_TYPE_DWARF = 2;
-
- String cpu;
- int type;
- int debugType;
- boolean bDebug;
- boolean isle;
- IAddressFactory addressFactory;
-
- public String getCPU() {
- return cpu;
- }
-
- public int getType() {
- return type;
- }
-
- public boolean hasDebug() {
- return debugType != DEBUG_TYPE_NONE;
- }
-
- public int getDebugType() {
- return debugType;
- }
-
- public boolean isLittleEndian() {
- return isle;
- }
-
- public IAddressFactory getAddressFactory() {
- return addressFactory;
- }
- }
-
- public Attribute getAttributes() throws IOException {
- Attribute attrib = new Attribute();
-
- switch (ehdr.e_type) {
- case Elf.ELFhdr.ET_CORE :
- attrib.type = Attribute.ELF_TYPE_CORE;
- break;
- case Elf.ELFhdr.ET_EXEC :
- attrib.type = Attribute.ELF_TYPE_EXE;
- break;
- case Elf.ELFhdr.ET_REL :
- attrib.type = Attribute.ELF_TYPE_OBJ;
- break;
- case Elf.ELFhdr.ET_DYN :
- attrib.type = Attribute.ELF_TYPE_SHLIB;
- break;
- }
-
- switch (ehdr.e_machine & 0xFFFF) {
- case Elf.ELFhdr.EM_386 :
- case Elf.ELFhdr.EM_486 :
- attrib.cpu = "x86"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_68K :
- attrib.cpu = "m68k"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_PPC :
- case Elf.ELFhdr.EM_CYGNUS_POWERPC :
- case Elf.ELFhdr.EM_RS6000 :
- attrib.cpu = "ppc"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_PPC64 :
- attrib.cpu = "ppc64"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_SH :
- attrib.cpu = "sh"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_ARM :
- attrib.cpu = "arm"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_MIPS_RS3_LE :
- case Elf.ELFhdr.EM_MIPS :
- attrib.cpu = "mips"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_SPARC32PLUS :
- case Elf.ELFhdr.EM_SPARC :
- case Elf.ELFhdr.EM_SPARCV9 :
- attrib.cpu = "sparc"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_H8_300 :
- case Elf.ELFhdr.EM_H8_300H :
- attrib.cpu = "h8300"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_V850 :
- case Elf.ELFhdr.EM_CYGNUS_V850 :
- attrib.cpu = "v850"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_MN10300 :
- case Elf.ELFhdr.EM_CYGNUS_MN10300 :
- attrib.cpu = "mn10300"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_MN10200 :
- case Elf.ELFhdr.EM_CYGNUS_MN10200 :
- attrib.cpu = "mn10200"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_M32R :
- attrib.cpu = "m32r"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_FR30 :
- case Elf.ELFhdr.EM_CYGNUS_FR30 :
- attrib.cpu = "fr30"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_XSTORMY16 :
- attrib.cpu = "xstormy16"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_CYGNUS_FRV :
- attrib.cpu = "frv"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_IQ2000 :
- attrib.cpu = "iq2000"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_EXCESS :
- attrib.cpu = "excess"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_NIOSII :
- attrib.cpu = "alteranios2"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_NIOS :
- attrib.cpu = "alteranios"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_IA_64 :
- attrib.cpu = "ia64"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_COLDFIRE:
- attrib.cpu = "coldfire"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_AVR :
- attrib.cpu = "avr"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_MSP430 :
- attrib.cpu = "msp430"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_XTENSA:
- attrib.cpu = "xtensa"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_ST100:
- attrib.cpu = "st100"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_X86_64:
- attrib.cpu = "x86_64"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_XILINX_MICROBLAZE:
- attrib.cpu = "microblaze"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_C166:
- attrib.cpu = "c166"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_TRICORE:
- attrib.cpu = "TriCore"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_M16C:
- attrib.cpu = "M16C"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_STARCORE:
- attrib.cpu = "StarCore"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_BLACKFIN :
- attrib.cpu = "bfin"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_SDMA:
- attrib.cpu = "sdma"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_CRADLE:
- attrib.cpu = "cradle"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_MMDSP:
- attrib.cpu = "mmdsp"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_68HC08:
- attrib.cpu = "hc08"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_RS08:
- attrib.cpu = "rs08"; //$NON-NLS-1$
- break;
- case Elf.ELFhdr.EM_NONE :
- default :
- attrib.cpu = "none"; //$NON-NLS-1$
- }
- switch (ehdr.e_ident[Elf.ELFhdr.EI_DATA]) {
- case Elf.ELFhdr.ELFDATA2LSB :
- attrib.isle = true;
- break;
- case Elf.ELFhdr.ELFDATA2MSB :
- attrib.isle = false;
- break;
- }
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 :
- attrib.addressFactory = new Addr32Factory();
- break;
- case ELFhdr.ELFCLASS64 :
- attrib.addressFactory = new Addr64Factory();
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- attrib.addressFactory = null;
- }
- // getSections
- // find .debug using toString
- Section[] sec = getSections();
- if (sec != null) {
- for (int i = 0; i < sec.length; i++) {
- String s = sec[i].toString();
- if (s.startsWith(".debug")) { //$NON-NLS-1$
- attrib.debugType = Attribute.DEBUG_TYPE_DWARF;
- break;
- } else if (s.equals(".stab")) { //$NON-NLS-1$
- attrib.debugType = Attribute.DEBUG_TYPE_STABS;
- break;
- }
- }
- }
- return attrib;
- }
-
- public static Attribute getAttributes(String file) throws IOException {
- Elf elf = new Elf(file);
- Attribute attrib = elf.getAttributes();
- elf.dispose();
- return attrib;
- }
-
- public static Attribute getAttributes(byte[] array) throws IOException {
-
- Elf emptyElf = new Elf();
- emptyElf.ehdr = emptyElf.new ELFhdr(array);
- emptyElf.sections = new Elf.Section[0];
- Attribute attrib = emptyElf.getAttributes();
- emptyElf.dispose();
-
- return attrib;
- }
-
- public static boolean isElfHeader(byte[] e_ident) {
- if (e_ident.length < 4 || e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E'
- || e_ident[ELFhdr.EI_MAG2] != 'L' || e_ident[ELFhdr.EI_MAG3] != 'F')
- return false;
- return true;
- }
-
- public void dispose() {
- try {
- if (efile != null) {
- efile.close();
- efile = null;
-
- // ensure the mappings get cleaned up
- if (sections_mapped)
- System.gc();
- }
- } catch (IOException e) {
- }
- }
-
- /**
- * Make sure we do not leak the fds.
- */
- @Override
- protected void finalize() throws Throwable {
- try {
- dispose();
- } finally {
- super.finalize();
- }
- }
-
- public Section getSectionByName(String name) throws IOException {
- if (sections == null)
- getSections();
- for (int i = 0; i < sections.length; i++) {
- if (sections[i].toString().equals(name)) {
- return sections[i];
- }
- }
- return null;
- }
-
- public Section[] getSections(int type) throws IOException {
- if (sections == null)
- getSections();
- ArrayList<Section> slist = new ArrayList<Section>();
- for (int i = 0; i < sections.length; i++) {
- if (sections[i].sh_type == type)
- slist.add(sections[i]);
- }
- return slist.toArray(new Section[0]);
- }
-
- public Section[] getSections() throws IOException {
- if (sections == null) {
- if (ehdr.e_shoff == 0) {
- sections = new Section[0];
- return sections;
- }
- final int length= ehdr.e_shnum & 0xffff; // unsigned short
- sections = new Section[length];
- for (int i = 0; i < length; i++) {
- efile.seek(ehdr.e_shoff + i * (ehdr.e_shentsize & 0xffff)); // unsigned short
- sections[i] = new Section();
- sections[i].sh_name = efile.readIntE();
- sections[i].sh_type = efile.readIntE();
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- byte[] addrArray = new byte[ELF32_ADDR_SIZE];
- sections[i].sh_flags = efile.readIntE();
- efile.readFullyE(addrArray);
- sections[i].sh_addr = new Addr32(addrArray);
- sections[i].sh_offset = efile.readIntE();
- sections[i].sh_size = efile.readIntE();
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- byte[] addrArray = new byte[ELF64_ADDR_SIZE];
- sections[i].sh_flags = efile.readLongE();
- efile.readFullyE(addrArray);
- sections[i].sh_addr = new Addr64(addrArray);
- sections[i].sh_offset = readUnsignedLong(efile);
- sections[i].sh_size = readUnsignedLong(efile);
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
-
- sections[i].sh_link = efile.readIntE();
- sections[i].sh_info = efile.readIntE();
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- sections[i].sh_addralign = efile.readIntE();
- sections[i].sh_entsize = efile.readIntE();
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- sections[i].sh_addralign = efile.readLongE();
- sections[i].sh_entsize = readUnsignedLong(efile);
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
- if (sections[i].sh_type == Section.SHT_SYMTAB)
- syms = i;
- if (syms == 0 && sections[i].sh_type == Section.SHT_DYNSYM)
- syms = i;
- }
- }
- return sections;
- }
-
- private Symbol[] loadSymbolsBySection(Section section) throws IOException {
- int numSyms = 1;
- if (section.sh_entsize != 0) {
- numSyms = (int)section.sh_size / (int)section.sh_entsize;
- }
- ArrayList<Symbol> symList = new ArrayList<Symbol>(numSyms);
- long offset = section.sh_offset;
- for (int c = 0; c < numSyms; offset += section.sh_entsize, c++) {
- efile.seek(offset);
- Symbol symbol = new Symbol(section);
- switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
- case ELFhdr.ELFCLASS32 : {
- byte[] addrArray = new byte[ELF32_ADDR_SIZE];
-
- symbol.st_name = efile.readIntE();
- efile.readFullyE(addrArray);
- symbol.st_value = new Addr32(addrArray);
- symbol.st_size = efile.readIntE();
- symbol.st_info = efile.readByte();
- symbol.st_other = efile.readByte();
- symbol.st_shndx = efile.readShortE();
- }
- break;
- case ELFhdr.ELFCLASS64 : {
- byte[] addrArray = new byte[ELF64_ADDR_SIZE];
-
- symbol.st_name = efile.readIntE();
- symbol.st_info = efile.readByte();
- symbol.st_other = efile.readByte();
- symbol.st_shndx = efile.readShortE();
- efile.readFullyE(addrArray);
- symbol.st_value = new Addr64(addrArray);
- symbol.st_size = readUnsignedLong(efile);
- }
- break;
- case ELFhdr.ELFCLASSNONE :
- default :
- throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
- }
- if (symbol.st_info == 0)
- continue;
- symList.add(symbol);
- }
- Symbol[] results = symList.toArray(new Symbol[0]);
- Arrays.sort(results);
- return results;
- }
-
- public void loadSymbols() throws IOException {
- if (symbols == null) {
- Section section[] = getSections(Section.SHT_SYMTAB);
- if (section.length > 0) {
- symtab_sym = section[0];
- symtab_symbols = loadSymbolsBySection(section[0]);
- } else {
- symtab_sym = null;
- symtab_symbols = new Symbol[0];
- }
-
- section = getSections(Section.SHT_DYNSYM);
- if (section.length > 0) {
- dynsym_sym = section[0];
- dynsym_symbols = loadSymbolsBySection(section[0]);
- } else {
- dynsym_sym = null;
- dynsym_symbols = new Symbol[0];
- }
-
- if (symtab_sym != null) {
- // sym = symtab_sym;
- symbols = symtab_symbols;
- } else if (dynsym_sym != null) {
- // sym = dynsym_sym;
- symbols = dynsym_symbols;
- }
- }
- }
-
- public Symbol[] getSymbols() {
- return symbols;
- }
-
- public Symbol[] getDynamicSymbols() {
- return dynsym_symbols;
- }
-
- public Symbol[] getSymtabSymbols() {
- return symtab_symbols;
- }
-
- /* return the address of the function that address is in */
- public Symbol getSymbol(IAddress vma) {
- if (symbols == null) {
- return null;
- }
-
- //@@@ If this works, move it to a single instance in this class.
- SymbolComparator symbol_comparator = new SymbolComparator();
-
- int ndx = Arrays.binarySearch(symbols, vma, symbol_comparator);
- if (ndx > 0)
- return symbols[ndx];
- if (ndx == -1) {
- return null;
- }
- ndx = -ndx - 1;
- return symbols[ndx - 1];
- }
- /*
- * public long swapInt( long val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] ==
- * ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[4]; tmp[0] = (short)(val &
- * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); tmp[2] = (short)((val >>
- * 16) & 0x00ff); tmp[3] = (short)((val >> 24) & 0x00ff); return ((tmp[0] < <
- * 24) + (tmp[1] < < 16) + (tmp[2] < < 8) + tmp[3]); } return val; }
- *
- * public int swapShort( short val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] ==
- * ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[2]; tmp[0] = (short)(val &
- * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); return (short)((tmp[0] < <
- * 8) + tmp[1]); } return val; }
- */
- public String getFilename() {
- return file;
- }
-
- protected long readUnsignedLong(IRandomReadAccessFile file) throws IOException {
- long result = file.readLongE();
- if (result < 0) {
- throw new IOException("Maximal file offset is " + Long.toHexString(Long.MAX_VALUE) + //$NON-NLS-1$
- " given offset is " + Long.toHexString(result)); //$NON-NLS-1$
- }
- return result;
- }
-
- /* TODO: not used in EDC
- private ISymbolReader createDwarfReader() {
- DwarfReader reader = null;
- // Check if Dwarf data exists
- try {
- reader = new DwarfReader(this);
- } catch (IOException e) {
- // No Dwarf data in the Elf.
- }
- return reader;
- }
- */
-
- public ISymbolReader getSymbolReader() {
- ISymbolReader reader = null;
- //reader = createDwarfReader(); // TODO: not used in EDC
- return reader;
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2000, 2010, 2011 QNX Software Systems 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - initial API and implementation
+ * Markus Schorn (Wind River Systems)
+ * Ed Swartz (Nokia) - temporary fork into EDC to adapt to IRandomReadAccessFile
+ * Broadcom - additional JavaDoc
+ * TODO: merge this fork.
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.elf;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.core.IAddressFactory;
+import org.eclipse.cdt.core.ISymbolReader;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.cdt.utils.Addr32Factory;
+import org.eclipse.cdt.utils.Addr64;
+import org.eclipse.cdt.utils.Addr64Factory;
+
+public class Elf {
+ public final static int ELF32_ADDR_SIZE = 4;
+ public final static int ELF32_OFF_SIZE = 4;
+ public final static int ELF64_ADDR_SIZE = 8;
+ public final static int ELF64_OFF_SIZE = 8;
+
+ protected IRandomReadAccessFile efile;
+
+ protected ELFhdr ehdr;
+ protected Section[] sections;
+ protected String file;
+ protected byte[] section_strtab;
+
+ private int syms = 0;
+ private Symbol[] symbols;
+ private Symbol[] symtab_symbols;
+ private Section symtab_sym;
+ private Symbol[] dynsym_symbols;
+ private Section dynsym_sym;
+ private boolean sections_mapped; // Have sections been mapped? Used to clean up properly in Elf.Dispose.
+
+ protected String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ public class ELFhdr {
+
+ /* e_ident offsets */
+ public final static int EI_MAG0 = 0;
+ public final static int EI_MAG1 = 1;
+ public final static int EI_MAG2 = 2;
+ public final static int EI_MAG3 = 3;
+ public final static int EI_CLASS = 4;
+ public final static int EI_DATA = 5;
+ public final static int EI_VERSION = 6;
+ public final static int EI_PAD = 7;
+ public final static int EI_NDENT = 16;
+
+ /* e_ident[EI_CLASS] */
+ public final static int ELFCLASSNONE = 0;
+ public final static int ELFCLASS32 = 1;
+ public final static int ELFCLASS64 = 2;
+
+ /* e_ident[EI_DATA] */
+ public final static int ELFDATANONE = 0;
+ public final static int ELFDATA2LSB = 1;
+ public final static int ELFDATA2MSB = 2;
+
+ /* values of e_type */
+ public final static int ET_NONE = 0;
+ public final static int ET_REL = 1;
+ public final static int ET_EXEC = 2;
+ public final static int ET_DYN = 3;
+ public final static int ET_CORE = 4;
+ public final static int ET_LOPROC = 0xff00;
+ public final static int ET_HIPROC = 0xffff;
+
+ /* values of e_machine */
+ public final static int EM_NONE = 0;
+ public final static int EM_M32 = 1;
+ public final static int EM_SPARC = 2;
+ public final static int EM_386 = 3;
+ public final static int EM_68K = 4;
+ public final static int EM_88K = 5;
+ public final static int EM_486 = 6;
+ public final static int EM_860 = 7;
+ public final static int EM_MIPS = 8;
+ public final static int EM_MIPS_RS3_LE = 10;
+ public final static int EM_RS6000 = 11;
+ public final static int EM_PARISC = 15;
+ public final static int EM_nCUBE = 16;
+ public final static int EM_VPP550 = 17;
+ public final static int EM_SPARC32PLUS = 18;
+ public final static int EM_PPC = 20;
+ public final static int EM_PPC64 = 21;
+ public final static int EM_ARM = 40;
+ public final static int EM_SH = 42;
+ public final static int EM_SPARCV9 = 43;
+ public final static int EM_TRICORE = 44;
+ public final static int EM_H8_300 = 46;
+ public final static int EM_H8_300H = 47;
+ public final static int EM_IA_64 = 50;
+ public final static int EM_COLDFIRE = 52;
+ public final static int EM_STARCORE = 58;
+ public final static int EM_X86_64 = 62;
+ public final static int EM_ST100 = 60;
+
+ /** @since 5.2 */
+ public final static int EM_68HC08 = 71; /* Freescale MC68HC08 Microcontroller */
+
+ public final static int EM_AVR = 83;
+ public final static int EM_FR30 = 84; /* Fujitsu FR30 */
+ public final static int EM_V850 = 87;
+ public final static int EM_M32R = 88;
+ public final static int EM_MN10300 = 89;
+ public final static int EM_MN10200 = 90;
+ public final static int EM_XTENSA = 94;
+ public final static int EM_MSP430 = 105;
+ public final static int EM_BLACKFIN = 106;
+ public final static int EM_EXCESS = 111;
+ public final static int EM_NIOSII = 113;
+ public final static int EM_C166 = 116;
+ public final static int EM_M16C = 117;
+
+ /** @since 5.2 */
+ public final static int EM_RS08 = 132; /* Freescale RS08 embedded processor */
+
+ public final static int EM_MMDSP = 160;
+ public final static int EM_NIOS = 0xFEBB;
+ public final static int EM_CYGNUS_POWERPC = 0x9025;
+ public final static int EM_CYGNUS_M32R = 0x9041;
+ public final static int EM_CYGNUS_V850 = 0x9080;
+ public final static int EM_CYGNUS_MN10200 = 0xdead;
+ public final static int EM_CYGNUS_MN10300 = 0xbeef;
+ public final static int EM_CYGNUS_FR30 = 0x3330;
+ public final static int EM_XSTORMY16 = 0xad45;
+ public final static int EM_CYGNUS_FRV = 0x5441;
+ public final static int EM_IQ2000 = 0xFEBA;
+ public static final int EM_XILINX_MICROBLAZE = 0xbaab;
+ public static final int EM_SDMA = 0xcafe;
+ public static final int EM_CRADLE = 0x4d55;
+
+ /** Machine-independent data for decoding the file's contents */
+ public byte e_ident[] = new byte[EI_NDENT];
+ /** file type (Elf32_Half) */
+ public int e_type;
+ /** machine type (Elf32_Half) */
+ public int e_machine;
+ /** version number (Elf32_Word) */
+ public long e_version;
+ /** entry point (Elf32_Addr) virtual address where system transfers control*/
+ public IAddress e_entry;
+ /** Program hdr offset (Elf32_Off) (zero if no table)*/
+ public long e_phoff;
+ /** Section hdr offset (Elf32_Off) (zero if no table)*/
+ public long e_shoff;
+ /** Processor flags (Elf32_Word) */
+ public long e_flags;
+ /** sizeof ehdr (Elf32_Half) */
+ public short e_ehsize;
+ /** Program header entry size (Elf32_Half) */
+ public short e_phentsize;
+ /** Number of program headers (Elf32_Half) */
+ public short e_phnum;
+ /** Section header entry size (Elf32_Half) */
+ public short e_shentsize;
+ /** Number of section headers (Elf32_Half) */
+ public short e_shnum;
+ /**
+ * String table index (Elf32_Half) index into the section header table
+ * associated with section name string table or {@link Symbol#SHN_UNDEF}
+ * if none.
+ */
+ public short e_shstrndx;
+
+ protected ELFhdr() throws IOException {
+ efile.seek(0);
+ efile.readFully(e_ident);
+ if (e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E' || e_ident[ELFhdr.EI_MAG2] != 'L'
+ || e_ident[ELFhdr.EI_MAG3] != 'F')
+ throw new IOException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
+ efile.setEndian(e_ident[ELFhdr.EI_DATA] == ELFhdr.ELFDATA2LSB);
+ e_type = efile.readShortE();
+ e_machine = efile.readShortE();
+ e_version = efile.readIntE();
+ switch (e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ byte[] addrArray = new byte[ELF32_ADDR_SIZE];
+ efile.readFullyE(addrArray);
+ e_entry = new Addr32(addrArray);
+ e_phoff = efile.readIntE();
+ e_shoff = efile.readIntE();
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ byte[] addrArray = new byte[ELF64_ADDR_SIZE];
+ efile.readFullyE(addrArray);
+ e_entry = new Addr64(addrArray);
+ e_phoff = readUnsignedLong(efile);
+ e_shoff = readUnsignedLong(efile);
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+ e_flags = efile.readIntE();
+ e_ehsize = efile.readShortE();
+ e_phentsize = efile.readShortE();
+ e_phnum = efile.readShortE();
+ e_shentsize = efile.readShortE();
+ e_shnum = efile.readShortE();
+ e_shstrndx = efile.readShortE();
+ }
+
+ protected ELFhdr(byte[] bytes) throws IOException {
+ if (bytes.length <= e_ident.length) {
+ throw new EOFException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
+ }
+ System.arraycopy(bytes, 0, e_ident, 0, e_ident.length);
+ if (e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E' || e_ident[ELFhdr.EI_MAG2] != 'L'
+ || e_ident[ELFhdr.EI_MAG3] != 'F')
+ throw new IOException(CCorePlugin.getResourceString("Util.exception.notELF")); //$NON-NLS-1$
+ boolean isle = (e_ident[ELFhdr.EI_DATA] == ELFhdr.ELFDATA2LSB);
+ int offset = e_ident.length;
+ e_type = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_machine = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_version = makeInt(bytes, offset, isle);
+ offset += 4;
+ switch (e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ byte[] addrArray = new byte[ELF32_ADDR_SIZE];
+ System.arraycopy(bytes, offset, addrArray, 0, ELF32_ADDR_SIZE);
+ offset += ELF32_ADDR_SIZE;
+ e_entry = new Addr32(addrArray);
+ e_phoff = makeInt(bytes, offset, isle);
+ offset += ELF32_OFF_SIZE;
+ e_shoff = makeInt(bytes, offset, isle);
+ offset += ELF32_OFF_SIZE;
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ byte[] addrArray = new byte[ELF64_ADDR_SIZE];
+ System.arraycopy(bytes, offset, addrArray, 0, ELF64_ADDR_SIZE);
+ offset += ELF64_ADDR_SIZE;
+ e_entry = new Addr64(addrArray);
+ e_phoff = makeUnsignedLong(bytes, offset, isle);
+ offset += ELF64_OFF_SIZE;
+ e_shoff = makeUnsignedLong(bytes, offset, isle);
+ offset += ELF64_OFF_SIZE;
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+ e_flags = makeInt(bytes, offset, isle);
+ offset += 4;
+ e_ehsize = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_phentsize = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_phnum = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_shentsize = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_shnum = makeShort(bytes, offset, isle);
+ offset += 2;
+ e_shstrndx = makeShort(bytes, offset, isle);
+ offset += 2;
+ }
+
+ private final short makeShort(byte[] val, int offset, boolean isle) throws IOException {
+ if (val.length < offset + 2)
+ throw new IOException();
+ if (isle) {
+ return (short) ( (val[offset + 1] << 8) + val[offset + 0]);
+ }
+ return (short) ( (val[offset + 0] << 8) + val[offset + 1]);
+ }
+
+ private final long makeInt(byte[] val, int offset, boolean isle) throws IOException {
+ if (val.length < offset + 4)
+ throw new IOException();
+ if (isle) {
+ return ( (val[offset + 3] << 24) + (val[offset + 2] << 16) + (val[offset + 1] << 8) + val[offset + 0]);
+ }
+ return ( (val[offset + 0] << 24) + (val[offset + 1] << 16) + (val[offset + 2] << 8) + val[offset + 3]);
+ }
+
+ private final long makeLong(byte[] val, int offset, boolean isle) throws IOException {
+ long result = 0;
+ int shift = 0;
+ if (isle)
+ for (int i = 7; i >= 0; i--) {
+ shift = i * 8;
+ result += ( ((long)val[offset + i]) << shift) & (0xffL << shift);
+ }
+ else
+ for (int i = 0; i <= 7; i++) {
+ shift = (7 - i) * 8;
+ result += ( ((long)val[offset + i]) << shift) & (0xffL << shift);
+ }
+ return result;
+ }
+
+ private final long makeUnsignedLong(byte[] val, int offset, boolean isle) throws IOException {
+ long result = makeLong(val, offset, isle);
+ if (result < 0) {
+ throw new IOException("Maximal file offset is " + Long.toHexString(Long.MAX_VALUE) + //$NON-NLS-1$
+ " given offset is " + Long.toHexString(result)); //$NON-NLS-1$
+ }
+ return result;
+
+ }
+
+ }
+
+ public class Section {
+
+ /* sh_type */
+ /** section header inactive, other members undefined*/
+ public final static int SHT_NULL = 0;
+ /** information defined by program */
+ public final static int SHT_PROGBITS = 1;
+ /** holds a symbol table */
+ public final static int SHT_SYMTAB = 2;
+ /** holds a string table */
+ public final static int SHT_STRTAB = 3;
+ /** holds relocation entries with explicit addends */
+ public final static int SHT_RELA = 4;
+ /** holds symbol hash table */
+ public final static int SHT_HASH = 5;
+ /** holds information for dynamic linking */
+ public final static int SHT_DYNAMIC = 6;
+ /** marks the file in some way */
+ public final static int SHT_NOTE = 7;
+ /** occupies no space in file but resembles {@link #SHT_PROGBITS} */
+ public final static int SHT_NOBITS = 8;
+ /** holds relocation entries without explicit addends */
+ public final static int SHT_REL = 9;
+ /** reserved */
+ public final static int SHT_SHLIB = 10;
+ /** holds a symbol table */
+ public final static int SHT_DYNSYM = 11;
+
+ /* reserved section types */
+ /** Reserved for processor specific semantics to {@link #SHT_HIPROC} */
+ public final static int SHT_LOPROC = 0x70000000;
+ public final static int SHT_HIPROC = 0x7fffffff;
+ /** Reserved for use by the application programs to {@link #SHT_HIUSER} */
+ public final static int SHT_LOUSER = 0x80000000;
+ public final static int SHT_HIUSER = 0xffffffff;
+
+ /* sh_flags */
+ /** Section should be writable during program execution */
+ public final static int SHF_WRITE = 1;
+ /** Section occupies memory during execution */
+ public final static int SHF_ALLOC = 2;
+ /** Section contains executable machine instructions */
+ public final static int SHF_EXECINTR = 4;
+ /** All bits in this mask reserved for processor-specific semantics */
+ public final static int SHF_MASKPROC = 0xf0000000;
+
+ /** name of string as index into section header string table
+ * @see #SHT_STRTAB
+ * @see ELFhdr#e_shstrndx */
+ public long sh_name;
+ /** Categorizes sections content and semantics see SHT_* */
+ public long sh_type;
+ /** 1-bit flags that describe attributes */
+ public long sh_flags;
+ /** First byte of section in memory image of process or 0 if not in memory image */
+ public IAddress sh_addr;
+ /** Offset from beginning of file to first byte in section */
+ public long sh_offset;
+ /** Section's size in bytes */
+ public long sh_size;
+ /** section header table index link */
+ public long sh_link;
+ /** extra information. Semantics depends on section type */
+ public long sh_info;
+ /** address alignment constraints of section */
+ public long sh_addralign;
+ /** If section contains fixed size entries then the size of an entry else 0 */
+ public long sh_entsize;
+
+ /**
+ * @since 5.1
+ */
+ public ByteBuffer mapSectionData() throws IOException {
+ sections_mapped = true;
+ return efile.createReadByteBuffer(sh_offset, sh_size);
+ }
+
+ public byte[] loadSectionData() throws IOException {
+ byte[] data = new byte[(int)sh_size];
+ efile.seek(sh_offset);
+ efile.read(data);
+ return data;
+ }
+
+ @Override
+ public String toString() {
+ try {
+ if (section_strtab == null) {
+ final int shstrndx= ehdr.e_shstrndx & 0xffff; // unsigned short
+ if (shstrndx > sections.length || shstrndx < 0)
+ return EMPTY_STRING;
+ int size = (int)sections[shstrndx].sh_size;
+ if (size <= 0 || size > efile.length())
+ return EMPTY_STRING;
+ section_strtab = new byte[size];
+ efile.seek(sections[shstrndx].sh_offset);
+ efile.read(section_strtab);
+ }
+ int str_size = 0;
+ if (sh_name > section_strtab.length) {
+ return EMPTY_STRING;
+ }
+ while (section_strtab[(int)sh_name + str_size] != 0)
+ str_size++;
+ return new String(section_strtab, (int)sh_name, str_size);
+ } catch (IOException e) {
+ return EMPTY_STRING;
+ }
+ }
+ }
+
+ protected String string_from_elf_section(Elf.Section section, int index) throws IOException {
+ if (index > section.sh_size) {
+ return EMPTY_STRING;
+ }
+
+ StringBuffer str = new StringBuffer();
+ //Most string symbols will be less than 50 bytes in size
+ byte [] tmp = new byte[50];
+
+ efile.seek(section.sh_offset + index);
+ while(true) {
+ int len = efile.read(tmp);
+ for(int i = 0; i < len; i++) {
+ if(tmp[i] == 0) {
+ len = 0;
+ break;
+ }
+ str.append((char)tmp[i]);
+ }
+ if(len <= 0) {
+ break;
+ }
+ }
+
+ return str.toString();
+ }
+
+ public class Symbol implements Comparable<Object> {
+
+ /* Symbol bindings */
+ /**
+ * Not visible outside the object containing their definition
+ */
+ public final static int STB_LOCAL = 0;
+ /**
+ * Visible to all object files
+ */
+ public final static int STB_GLOBAL = 1;
+ /**
+ * As {@link #STB_GLOBAL} but at lower precedence
+ */
+ public final static int STB_WEAK = 2;
+
+ /* Symbol type */
+ /**
+ * Type not specified
+ */
+ public final static int STT_NOTYPE = 0;
+ /**
+ * Associated with data object
+ */
+ public final static int STT_OBJECT = 1;
+ /**
+ * Associated with function or other code
+ */
+ public final static int STT_FUNC = 2;
+ /**
+ * Associated with a section @see #STB_LOCAL
+ */
+ public final static int STT_SECTION = 3;
+ /**
+ * Associated with a file, is {@link #STB_LOCAL}
+ */
+ public final static int STT_FILE = 4;
+
+ /* Special Indexes */
+ /**
+ * Symbol is undefined
+ */
+ public final static int SHN_UNDEF = 0;
+ public final static int SHN_LORESERVE = 0xffffff00;
+ public final static int SHN_LOPROC = 0xffffff00;
+ public final static int SHN_HIPROC = 0xffffff1f;
+ public final static int SHN_LOOS = 0xffffff20;
+ public final static int SHN_HIOS = 0xffffff3f;
+ /**
+ * Absolute - will not change because of relocation
+ */
+ public final static int SHN_ABS = 0xfffffff1;
+ /**
+ * Common block not yet allocated
+ */
+ public final static int SHN_COMMON = 0xfffffff2;
+ public final static int SHN_XINDEX = 0xffffffff;
+ public final static int SHN_HIRESERVE = 0xffffffff;
+
+ /* NOTE: 64 bit and 32 bit ELF sections has different order */
+ /**
+ * Index into symbol string table holding name
+ */
+ public long st_name;
+ /**
+ * May be absolute value or address
+ */
+ public IAddress st_value;
+ /**
+ * Number of bytes of object or 0 if no size or unknown
+ */
+ public long st_size;
+ /**
+ * Type and binding attributes
+ */
+ public short st_info;
+ /**
+ * Holds 0 and has no meaning
+ */
+ public short st_other;
+ /**
+ * Index into section header table for he section this symbol is defined in.
+ */
+ public short st_shndx;
+
+ private String name = null;
+
+ private final Section sym_section;
+
+ public Symbol(Section section) {
+ sym_section = section;
+ }
+
+ public int st_type() {
+ return st_info & 0xf;
+ }
+
+ public int st_bind() {
+ return (st_info >> 4) & 0xf;
+ }
+
+ public int compareTo(Object obj) {
+ /*
+ * long thisVal = 0; long anotherVal = 0; if ( obj instanceof Symbol ) {
+ * Symbol sym = (Symbol)obj; thisVal = this.st_value; anotherVal =
+ * sym.st_value; } else if ( obj instanceof Long ) { Long val =
+ * (Long)obj; anotherVal = val.longValue(); thisVal = this.st_value; }
+ * return (thisVal <anotherVal ? -1 : (thisVal==anotherVal ? 0 :
+ * 1));
+ */
+ return this.st_value.compareTo( ((Symbol)obj).st_value);
+ }
+
+ @Override
+ public String toString() {
+ if (name == null) {
+ try {
+ Section sections[] = getSections();
+ Section symstr = sections[(int)sym_section.sh_link];
+ name = string_from_elf_section(symstr, (int)st_name);
+ } catch (IOException e) {
+ return EMPTY_STRING;
+ }
+ }
+ return name;
+ }
+
+ }
+
+ /**
+ * We have to implement a separate compararator since when we do the binary
+ * search down below we are using a Long and a Symbol object and the Long
+ * doesn't know how to compare against a Symbol so if we compare Symbol vs
+ * Long it is ok, but not if we do Long vs Symbol.
+ */
+
+ class SymbolComparator implements Comparator<Object> {
+
+ IAddress val1, val2;
+ public int compare(Object o1, Object o2) {
+
+ if (o1 instanceof IAddress) {
+ val1 = (IAddress)o1;
+ } else if (o1 instanceof Symbol) {
+ val1 = ((Symbol)o1).st_value;
+ } else {
+ return -1;
+ }
+
+ if (o2 instanceof IAddress) {
+ val2 = (IAddress)o2;
+ } else if (o2 instanceof Symbol) {
+ val2 = ((Symbol)o2).st_value;
+ } else {
+ return -1;
+ }
+ return val1.compareTo(val2);
+ }
+ }
+
+ /** Program header describing a segment or other information needed to prepare the program for execution */
+ public class PHdr {
+
+ /** element unused, other members undefined */
+ public final static int PT_NULL = 0;
+ /** Specifies loadable segment */
+ public final static int PT_LOAD = 1;
+ /** dynamic linking information */
+ public final static int PT_DYNAMIC = 2;
+ /** element specifies null terminated path name to invoke an interpreter */
+ public final static int PT_INTERP = 3;
+ /** location and size of auxiliary information */
+ public final static int PT_NOTE = 4;
+ /** reserved */
+ public final static int PT_SHLIB = 5;
+ /** specifies location and size of program header table */
+ public final static int PT_PHDR = 6;
+
+ public final static int PF_X = 1;
+ public final static int PF_W = 2;
+ public final static int PF_R = 4;
+ /* NOTE: 64 bit and 32 bit ELF have different order and size of elements */
+ /** what kind of segment */
+ public long p_type;
+ /** offset in the file of the first byte */
+ public long p_offset;
+ /** virtual address of first byte in memory */
+ public IAddress p_vaddr;
+ /** reserved for physical address in memory */
+ public IAddress p_paddr;
+ /** number of bytes of file image of segment */
+ public long p_filesz;
+ /** number of bytes of memory image of segment */
+ public long p_memsz;
+ /** flags relevant to the segment */
+ public long p_flags;
+ /** Alignment constraints of segment both in file and in memory */
+ public long p_align;
+ }
+
+ public PHdr[] getPHdrs() throws IOException {
+ if (ehdr.e_phnum == 0) {
+ return new PHdr[0];
+ }
+ efile.seek(ehdr.e_phoff);
+ final int length= ehdr.e_phnum & 0xffff; // interpret as unsigned short
+ PHdr phdrs[] = new PHdr[length];
+ for (int i = 0; i < length; i++) {
+ phdrs[i] = new PHdr();
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ byte[] addrArray = new byte[ELF32_ADDR_SIZE];
+
+ phdrs[i].p_type = efile.readIntE();
+ phdrs[i].p_offset = efile.readIntE();
+ efile.readFullyE(addrArray);
+ phdrs[i].p_vaddr = new Addr32(addrArray);
+ efile.readFullyE(addrArray);
+ phdrs[i].p_paddr = new Addr32(addrArray);
+ phdrs[i].p_filesz = efile.readIntE();
+ phdrs[i].p_memsz = efile.readIntE();
+ phdrs[i].p_flags = efile.readIntE();
+ phdrs[i].p_align = efile.readIntE();
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ byte[] addrArray = new byte[ELF64_ADDR_SIZE];
+
+ phdrs[i].p_type = efile.readIntE();
+ phdrs[i].p_flags = efile.readIntE();
+ phdrs[i].p_offset = readUnsignedLong(efile);
+ efile.readFullyE(addrArray);
+ phdrs[i].p_vaddr = new Addr64(addrArray);
+ efile.readFullyE(addrArray);
+ phdrs[i].p_paddr = new Addr64(addrArray);
+ phdrs[i].p_filesz = readUnsignedLong(efile);
+ phdrs[i].p_memsz = readUnsignedLong(efile);
+ phdrs[i].p_align = readUnsignedLong(efile);
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+
+ }
+ return phdrs;
+ }
+
+ public class Dynamic {
+
+ public final static int DYN_ENT_SIZE_32 = 8;
+ public final static int DYN_ENT_SIZE_64 = 16;
+
+ public final static int DT_NULL = 0;
+ public final static int DT_NEEDED = 1;
+ public final static int DT_PLTRELSZ = 2;
+ public final static int DT_PLTGOT = 3;
+ public final static int DT_HASH = 4;
+ public final static int DT_STRTAB = 5;
+ public final static int DT_SYMTAB = 6;
+ public final static int DT_RELA = 7;
+ public final static int DT_RELASZ = 8;
+ public final static int DT_RELAENT = 9;
+ public final static int DT_STRSZ = 10;
+ public final static int DT_SYMENT = 11;
+ public final static int DT_INIT = 12;
+ public final static int DT_FINI = 13;
+ public final static int DT_SONAME = 14;
+ public final static int DT_RPATH = 15;
+ public long d_tag;
+ public long d_val;
+ private final Section section;
+ private String name;
+
+ protected Dynamic(Section section) {
+ this.section = section;
+ }
+
+ @Override
+ public String toString() {
+ if (name == null) {
+ switch ((int)d_tag) {
+ case DT_NEEDED :
+ case DT_SONAME :
+ case DT_RPATH :
+ try {
+ Section symstr = sections[(int)section.sh_link];
+ name = string_from_elf_section(symstr, (int)d_val);
+ } catch (IOException e) {
+ name = EMPTY_STRING;
+ }
+ break;
+ default :
+ name = EMPTY_STRING;
+ }
+ }
+ return name;
+ }
+ }
+
+ public Dynamic[] getDynamicSections(Section section) throws IOException {
+ if (section.sh_type != Section.SHT_DYNAMIC) {
+ return new Dynamic[0];
+ }
+ ArrayList<Dynamic> dynList = new ArrayList<Dynamic>();
+ efile.seek(section.sh_offset);
+ int off = 0;
+ // We must assume the section is a table ignoring the sh_entsize as it
+ // is not
+ // set for MIPS.
+ while (off < section.sh_size) {
+ Dynamic dynEnt = new Dynamic(section);
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ dynEnt.d_tag = efile.readIntE();
+ dynEnt.d_val = efile.readIntE();
+ off += Dynamic.DYN_ENT_SIZE_32;
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ dynEnt.d_tag = efile.readLongE();
+ dynEnt.d_val = efile.readLongE();
+ off += Dynamic.DYN_ENT_SIZE_64;
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+
+ if (dynEnt.d_tag != Dynamic.DT_NULL)
+ dynList.add(dynEnt);
+ }
+ return dynList.toArray(new Dynamic[0]);
+ }
+
+ private void commonSetup(IRandomReadAccessFile rraFile, String file, long offset) throws IOException {
+ try {
+ efile = rraFile;
+ efile.seek(offset);
+ ehdr = new ELFhdr();
+ this.file = file;
+ } finally {
+ if (ehdr == null) {
+ dispose();
+ }
+ }
+ }
+
+ //A hollow entry, to be used with caution in controlled situations
+ protected Elf() {
+ }
+
+ public Elf(String file, long offset) throws IOException {
+ commonSetup(new ERandomAccessFile(file, "r"), file, offset); //$NON-NLS-1$
+ }
+
+ public Elf(String file) throws IOException {
+ commonSetup(new ERandomAccessFile(file, "r"), file, 0); //$NON-NLS-1$
+ }
+
+ public Elf(IRandomReadAccessFile rraFile, String file, long offset) throws IOException {
+ commonSetup(rraFile, file, offset);
+ }
+
+ public ELFhdr getELFhdr() throws IOException {
+ return ehdr;
+ }
+
+ public class Attribute {
+
+ public static final int ELF_TYPE_EXE = 1;
+ public static final int ELF_TYPE_SHLIB = 2;
+ public static final int ELF_TYPE_OBJ = 3;
+ public static final int ELF_TYPE_CORE = 4;
+
+ public static final int DEBUG_TYPE_NONE = 0;
+ public static final int DEBUG_TYPE_STABS = 1;
+ public static final int DEBUG_TYPE_DWARF = 2;
+
+ String cpu;
+ int type;
+ int debugType;
+ boolean bDebug;
+ boolean isle;
+ IAddressFactory addressFactory;
+
+ public String getCPU() {
+ return cpu;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public boolean hasDebug() {
+ return debugType != DEBUG_TYPE_NONE;
+ }
+
+ public int getDebugType() {
+ return debugType;
+ }
+
+ public boolean isLittleEndian() {
+ return isle;
+ }
+
+ public IAddressFactory getAddressFactory() {
+ return addressFactory;
+ }
+ }
+
+ public Attribute getAttributes() throws IOException {
+ Attribute attrib = new Attribute();
+
+ switch (ehdr.e_type) {
+ case Elf.ELFhdr.ET_CORE :
+ attrib.type = Attribute.ELF_TYPE_CORE;
+ break;
+ case Elf.ELFhdr.ET_EXEC :
+ attrib.type = Attribute.ELF_TYPE_EXE;
+ break;
+ case Elf.ELFhdr.ET_REL :
+ attrib.type = Attribute.ELF_TYPE_OBJ;
+ break;
+ case Elf.ELFhdr.ET_DYN :
+ attrib.type = Attribute.ELF_TYPE_SHLIB;
+ break;
+ }
+
+ switch (ehdr.e_machine & 0xFFFF) {
+ case Elf.ELFhdr.EM_386 :
+ case Elf.ELFhdr.EM_486 :
+ attrib.cpu = "x86"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_68K :
+ attrib.cpu = "m68k"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_PPC :
+ case Elf.ELFhdr.EM_CYGNUS_POWERPC :
+ case Elf.ELFhdr.EM_RS6000 :
+ attrib.cpu = "ppc"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_PPC64 :
+ attrib.cpu = "ppc64"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_SH :
+ attrib.cpu = "sh"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_ARM :
+ attrib.cpu = "arm"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_MIPS_RS3_LE :
+ case Elf.ELFhdr.EM_MIPS :
+ attrib.cpu = "mips"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_SPARC32PLUS :
+ case Elf.ELFhdr.EM_SPARC :
+ case Elf.ELFhdr.EM_SPARCV9 :
+ attrib.cpu = "sparc"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_H8_300 :
+ case Elf.ELFhdr.EM_H8_300H :
+ attrib.cpu = "h8300"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_V850 :
+ case Elf.ELFhdr.EM_CYGNUS_V850 :
+ attrib.cpu = "v850"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_MN10300 :
+ case Elf.ELFhdr.EM_CYGNUS_MN10300 :
+ attrib.cpu = "mn10300"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_MN10200 :
+ case Elf.ELFhdr.EM_CYGNUS_MN10200 :
+ attrib.cpu = "mn10200"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_M32R :
+ attrib.cpu = "m32r"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_FR30 :
+ case Elf.ELFhdr.EM_CYGNUS_FR30 :
+ attrib.cpu = "fr30"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_XSTORMY16 :
+ attrib.cpu = "xstormy16"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_CYGNUS_FRV :
+ attrib.cpu = "frv"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_IQ2000 :
+ attrib.cpu = "iq2000"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_EXCESS :
+ attrib.cpu = "excess"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_NIOSII :
+ attrib.cpu = "alteranios2"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_NIOS :
+ attrib.cpu = "alteranios"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_IA_64 :
+ attrib.cpu = "ia64"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_COLDFIRE:
+ attrib.cpu = "coldfire"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_AVR :
+ attrib.cpu = "avr"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_MSP430 :
+ attrib.cpu = "msp430"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_XTENSA:
+ attrib.cpu = "xtensa"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_ST100:
+ attrib.cpu = "st100"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_X86_64:
+ attrib.cpu = "x86_64"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_XILINX_MICROBLAZE:
+ attrib.cpu = "microblaze"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_C166:
+ attrib.cpu = "c166"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_TRICORE:
+ attrib.cpu = "TriCore"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_M16C:
+ attrib.cpu = "M16C"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_STARCORE:
+ attrib.cpu = "StarCore"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_BLACKFIN :
+ attrib.cpu = "bfin"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_SDMA:
+ attrib.cpu = "sdma"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_CRADLE:
+ attrib.cpu = "cradle"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_MMDSP:
+ attrib.cpu = "mmdsp"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_68HC08:
+ attrib.cpu = "hc08"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_RS08:
+ attrib.cpu = "rs08"; //$NON-NLS-1$
+ break;
+ case Elf.ELFhdr.EM_NONE :
+ default :
+ attrib.cpu = "none"; //$NON-NLS-1$
+ }
+ switch (ehdr.e_ident[Elf.ELFhdr.EI_DATA]) {
+ case Elf.ELFhdr.ELFDATA2LSB :
+ attrib.isle = true;
+ break;
+ case Elf.ELFhdr.ELFDATA2MSB :
+ attrib.isle = false;
+ break;
+ }
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 :
+ attrib.addressFactory = new Addr32Factory();
+ break;
+ case ELFhdr.ELFCLASS64 :
+ attrib.addressFactory = new Addr64Factory();
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ attrib.addressFactory = null;
+ }
+ // getSections
+ // find .debug using toString
+ Section[] sec = getSections();
+ if (sec != null) {
+ for (int i = 0; i < sec.length; i++) {
+ String s = sec[i].toString();
+ if (s.startsWith(".debug")) { //$NON-NLS-1$
+ attrib.debugType = Attribute.DEBUG_TYPE_DWARF;
+ break;
+ } else if (s.equals(".stab")) { //$NON-NLS-1$
+ attrib.debugType = Attribute.DEBUG_TYPE_STABS;
+ break;
+ }
+ }
+ }
+ return attrib;
+ }
+
+ public static Attribute getAttributes(String file) throws IOException {
+ Elf elf = new Elf(file);
+ Attribute attrib = elf.getAttributes();
+ elf.dispose();
+ return attrib;
+ }
+
+ public static Attribute getAttributes(byte[] array) throws IOException {
+
+ Elf emptyElf = new Elf();
+ emptyElf.ehdr = emptyElf.new ELFhdr(array);
+ emptyElf.sections = new Elf.Section[0];
+ Attribute attrib = emptyElf.getAttributes();
+ emptyElf.dispose();
+
+ return attrib;
+ }
+
+ public static boolean isElfHeader(byte[] e_ident) {
+ if (e_ident.length < 4 || e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E'
+ || e_ident[ELFhdr.EI_MAG2] != 'L' || e_ident[ELFhdr.EI_MAG3] != 'F')
+ return false;
+ return true;
+ }
+
+ public void dispose() {
+ try {
+ if (efile != null) {
+ efile.close();
+ efile = null;
+
+ // ensure the mappings get cleaned up
+ if (sections_mapped)
+ System.gc();
+ }
+ } catch (IOException e) {
+ }
+ }
+
+ /**
+ * Make sure we do not leak the fds.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ dispose();
+ } finally {
+ super.finalize();
+ }
+ }
+
+ public Section getSectionByName(String name) throws IOException {
+ if (sections == null)
+ getSections();
+ for (int i = 0; i < sections.length; i++) {
+ if (sections[i].toString().equals(name)) {
+ return sections[i];
+ }
+ }
+ return null;
+ }
+
+ public Section[] getSections(int type) throws IOException {
+ if (sections == null)
+ getSections();
+ ArrayList<Section> slist = new ArrayList<Section>();
+ for (int i = 0; i < sections.length; i++) {
+ if (sections[i].sh_type == type)
+ slist.add(sections[i]);
+ }
+ return slist.toArray(new Section[0]);
+ }
+
+ public Section[] getSections() throws IOException {
+ if (sections == null) {
+ if (ehdr.e_shoff == 0) {
+ sections = new Section[0];
+ return sections;
+ }
+ final int length= ehdr.e_shnum & 0xffff; // unsigned short
+ sections = new Section[length];
+ for (int i = 0; i < length; i++) {
+ efile.seek(ehdr.e_shoff + i * (ehdr.e_shentsize & 0xffff)); // unsigned short
+ sections[i] = new Section();
+ sections[i].sh_name = efile.readIntE();
+ sections[i].sh_type = efile.readIntE();
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ byte[] addrArray = new byte[ELF32_ADDR_SIZE];
+ sections[i].sh_flags = efile.readIntE();
+ efile.readFullyE(addrArray);
+ sections[i].sh_addr = new Addr32(addrArray);
+ sections[i].sh_offset = efile.readIntE();
+ sections[i].sh_size = efile.readIntE();
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ byte[] addrArray = new byte[ELF64_ADDR_SIZE];
+ sections[i].sh_flags = efile.readLongE();
+ efile.readFullyE(addrArray);
+ sections[i].sh_addr = new Addr64(addrArray);
+ sections[i].sh_offset = readUnsignedLong(efile);
+ sections[i].sh_size = readUnsignedLong(efile);
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+
+ sections[i].sh_link = efile.readIntE();
+ sections[i].sh_info = efile.readIntE();
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ sections[i].sh_addralign = efile.readIntE();
+ sections[i].sh_entsize = efile.readIntE();
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ sections[i].sh_addralign = efile.readLongE();
+ sections[i].sh_entsize = readUnsignedLong(efile);
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+ if (sections[i].sh_type == Section.SHT_SYMTAB)
+ syms = i;
+ if (syms == 0 && sections[i].sh_type == Section.SHT_DYNSYM)
+ syms = i;
+ }
+ }
+ return sections;
+ }
+
+ private Symbol[] loadSymbolsBySection(Section section) throws IOException {
+ int numSyms = 1;
+ if (section.sh_entsize != 0) {
+ numSyms = (int)section.sh_size / (int)section.sh_entsize;
+ }
+ ArrayList<Symbol> symList = new ArrayList<Symbol>(numSyms);
+ long offset = section.sh_offset;
+ for (int c = 0; c < numSyms; offset += section.sh_entsize, c++) {
+ efile.seek(offset);
+ Symbol symbol = new Symbol(section);
+ switch (ehdr.e_ident[ELFhdr.EI_CLASS]) {
+ case ELFhdr.ELFCLASS32 : {
+ byte[] addrArray = new byte[ELF32_ADDR_SIZE];
+
+ symbol.st_name = efile.readIntE();
+ efile.readFullyE(addrArray);
+ symbol.st_value = new Addr32(addrArray);
+ symbol.st_size = efile.readIntE();
+ symbol.st_info = efile.readByte();
+ symbol.st_other = efile.readByte();
+ symbol.st_shndx = efile.readShortE();
+ }
+ break;
+ case ELFhdr.ELFCLASS64 : {
+ byte[] addrArray = new byte[ELF64_ADDR_SIZE];
+
+ symbol.st_name = efile.readIntE();
+ symbol.st_info = efile.readByte();
+ symbol.st_other = efile.readByte();
+ symbol.st_shndx = efile.readShortE();
+ efile.readFullyE(addrArray);
+ symbol.st_value = new Addr64(addrArray);
+ symbol.st_size = readUnsignedLong(efile);
+ }
+ break;
+ case ELFhdr.ELFCLASSNONE :
+ default :
+ throw new IOException("Unknown ELF class " + ehdr.e_ident[ELFhdr.EI_CLASS]); //$NON-NLS-1$
+ }
+ if (symbol.st_info == 0)
+ continue;
+ symList.add(symbol);
+ }
+ Symbol[] results = symList.toArray(new Symbol[0]);
+ Arrays.sort(results);
+ return results;
+ }
+
+ public void loadSymbols() throws IOException {
+ if (symbols == null) {
+ Section section[] = getSections(Section.SHT_SYMTAB);
+ if (section.length > 0) {
+ symtab_sym = section[0];
+ symtab_symbols = loadSymbolsBySection(section[0]);
+ } else {
+ symtab_sym = null;
+ symtab_symbols = new Symbol[0];
+ }
+
+ section = getSections(Section.SHT_DYNSYM);
+ if (section.length > 0) {
+ dynsym_sym = section[0];
+ dynsym_symbols = loadSymbolsBySection(section[0]);
+ } else {
+ dynsym_sym = null;
+ dynsym_symbols = new Symbol[0];
+ }
+
+ if (symtab_sym != null) {
+ // sym = symtab_sym;
+ symbols = symtab_symbols;
+ } else if (dynsym_sym != null) {
+ // sym = dynsym_sym;
+ symbols = dynsym_symbols;
+ }
+ }
+ }
+
+ public Symbol[] getSymbols() {
+ return symbols;
+ }
+
+ public Symbol[] getDynamicSymbols() {
+ return dynsym_symbols;
+ }
+
+ public Symbol[] getSymtabSymbols() {
+ return symtab_symbols;
+ }
+
+ /* return the address of the function that address is in */
+ public Symbol getSymbol(IAddress vma) {
+ if (symbols == null) {
+ return null;
+ }
+
+ //@@@ If this works, move it to a single instance in this class.
+ SymbolComparator symbol_comparator = new SymbolComparator();
+
+ int ndx = Arrays.binarySearch(symbols, vma, symbol_comparator);
+ if (ndx > 0)
+ return symbols[ndx];
+ if (ndx == -1) {
+ return null;
+ }
+ ndx = -ndx - 1;
+ return symbols[ndx - 1];
+ }
+ /*
+ * public long swapInt( long val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] ==
+ * ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[4]; tmp[0] = (short)(val &
+ * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); tmp[2] = (short)((val >>
+ * 16) & 0x00ff); tmp[3] = (short)((val >> 24) & 0x00ff); return ((tmp[0] < <
+ * 24) + (tmp[1] < < 16) + (tmp[2] < < 8) + tmp[3]); } return val; }
+ *
+ * public int swapShort( short val ) { if ( ehdr.e_ident[ELFhdr.EI_DATA] ==
+ * ELFhdr.ELFDATA2LSB ) { short tmp[] = new short[2]; tmp[0] = (short)(val &
+ * 0x00ff); tmp[1] = (short)((val >> 8) & 0x00ff); return (short)((tmp[0] < <
+ * 8) + tmp[1]); } return val; }
+ */
+ public String getFilename() {
+ return file;
+ }
+
+ protected long readUnsignedLong(IRandomReadAccessFile file) throws IOException {
+ long result = file.readLongE();
+ if (result < 0) {
+ throw new IOException("Maximal file offset is " + Long.toHexString(Long.MAX_VALUE) + //$NON-NLS-1$
+ " given offset is " + Long.toHexString(result)); //$NON-NLS-1$
+ }
+ return result;
+ }
+
+ /* TODO: not used in EDC
+ private ISymbolReader createDwarfReader() {
+ DwarfReader reader = null;
+ // Check if Dwarf data exists
+ try {
+ reader = new DwarfReader(this);
+ } catch (IOException e) {
+ // No Dwarf data in the Elf.
+ }
+ return reader;
+ }
+ */
+
+ public ISymbolReader getSymbolReader() {
+ ISymbolReader reader = null;
+ //reader = createDwarfReader(); // TODO: not used in EDC
+ return reader;
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/BaseExecutableSymbolicsReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/BaseExecutableSymbolicsReader.java
index 0f3ce6b..7edb048 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/BaseExecutableSymbolicsReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/BaseExecutableSymbolicsReader.java
@@ -1,205 +1,261 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
-import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Base implementation of a symbolics reader. Subclasses populae sections and symbols
- * on construction.
- */
-public abstract class BaseExecutableSymbolicsReader implements IExecutableSymbolicsReader {
-
- protected final IPath binaryFile;
-
- protected Map<String, IExecutableSection> executableSections = new HashMap<String, IExecutableSection>();
- protected List<ISection> sections = new ArrayList<ISection>();
- protected List<ISymbol> symbols = new ArrayList<ISymbol>();
- protected IAddress exeBaseAddress;
- protected long modificationDate;
- protected ISectionMapper sectionMapper;
-
- protected IUnmangler unmangler;
-
- /**
- *
- */
- public BaseExecutableSymbolicsReader(IPath binaryFile) {
- this.binaryFile = binaryFile;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#dispose()
- */
- public void dispose() {
- if (sectionMapper != null) {
- sectionMapper.dispose();
- sectionMapper = null;
- }
- sections.clear();
- symbols.clear();
- }
-
- public IPath getSymbolFile() {
- return binaryFile;
- }
-
- public Collection<IExecutableSection> getExecutableSections() {
- return Collections.unmodifiableCollection(executableSections.values());
- }
-
- public IExecutableSection findExecutableSection(String sectionName) {
- return executableSections.get(sectionName);
- }
-
- public Collection<ISection> getSections() {
- return Collections.unmodifiableCollection(sections);
- }
-
- public Collection<ISymbol> getSymbols() {
- return Collections.unmodifiableCollection(symbols);
- }
-
- public ISymbol getSymbolAtAddress(IAddress linkAddress) {
- int insertion = Collections.binarySearch(symbols, linkAddress);
- if (insertion >= 0) {
- return symbols.get(insertion);
- }
-
- if (insertion == -1) {
- return null;
- }
-
- insertion = -insertion - 1;
-
- ISymbol symbol = symbols.get(insertion - 1);
- if (linkAddress.compareTo(symbol.getAddress().add(symbol.getSize())) < 0) {
- return symbol;
- }
-
- return null;
- }
-
- public IAddress getBaseLinkAddress() {
- return exeBaseAddress;
- }
-
- public long getModificationDate() {
- return modificationDate;
- }
-
- public Collection<ISymbol> findSymbols(String name) {
- List<ISymbol> matchSymbols = new ArrayList<ISymbol>();
-
- // look for exact symbols
- for (ISymbol symbol : symbols) {
- String symName = symbol.getName();
- if (symName.equals(name)) {
- matchSymbols.add(symbol);
- }
- }
- if (!matchSymbols.isEmpty())
- return matchSymbols;
-
- // try for a decorated symbol if no match
- if (unmangler != null) {
- for (ISymbol symbol : symbols) {
- String symName = unmangler.undecorate(symbol.getName());
- if (symName.equals(name)) {
- matchSymbols.add(symbol);
- }
- }
- }
-
- return matchSymbols;
- }
-
- public Collection<ISymbol> findUnmangledSymbols(String name) {
- List<ISymbol> matchSymbols = new ArrayList<ISymbol>();
-
- if (unmangler != null) {
- name = unmangler.undecorate(name);
-
- String nameNoSpaces = name.replaceAll("\\s", "");
-
- // remove full qualifier
- if (nameNoSpaces.startsWith("::"))
- nameNoSpaces = nameNoSpaces.substring(2);
-
- boolean nameNoArguments = !nameNoSpaces.endsWith(")");
-
- // avoid unmangling a lot of irrelevant symbols by filtering out symbols not containing the base name
- String undecoratedBase = nameNoSpaces;
- int idx = undecoratedBase.lastIndexOf(':');
- if (idx >= 0)
- undecoratedBase = undecoratedBase.substring(idx+1);
- idx = undecoratedBase.indexOf('(');
- if (idx >= 0)
- undecoratedBase = undecoratedBase.substring(0, idx);
-
- for (ISymbol symbol : symbols) {
- String symName = symbol.getName();
- if (!symName.contains(undecoratedBase))
- continue;
-
- try {
- String unmangled = unmangler.unmangle(unmangler.undecorate(symName));
- if (unmangled != null) {
- String unmangledNoSpaces;
- // remove any 'const' which is in front of '(' for now
- unmangledNoSpaces = unmangled.replaceAll("\\bconst\\s*(?=\\()", "");
- unmangledNoSpaces = unmangledNoSpaces.replaceAll("\\s", "");
-
- // remove full qualifier
- if (unmangledNoSpaces.startsWith("::"))
- unmangledNoSpaces = unmangledNoSpaces.substring(2);
-
- if (nameNoSpaces.equals(unmangledNoSpaces)) {
- matchSymbols.add(symbol);
- } else if (nameNoArguments) {
- // try to match the name against a function
- idx = unmangledNoSpaces.lastIndexOf('(');
- if (idx >= 0) {
- String unmangledNoArguments = unmangledNoSpaces.substring(0, idx);
- if (unmangledNoArguments.equals(nameNoSpaces)) {
- matchSymbols.add(symbol);
- }
- }
- }
- }
- } catch (UnmanglingException e) {
- // nope
- }
- }
- if (!matchSymbols.isEmpty())
- return matchSymbols;
- }
-
- return matchSymbols;
- }
-
- public IUnmangler getUnmangler() {
- return unmangler;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - executableSectionsList optimization
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Base implementation of a symbolics reader. Subclasses populate sections and symbols
+ * on construction.
+ */
+public abstract class BaseExecutableSymbolicsReader implements IExecutableSymbolicsReader {
+
+ protected final IPath binaryFile;
+
+ protected Map<String, IExecutableSection> executableSections = new HashMap<String, IExecutableSection>();
+ protected List<IExecutableSection> executableSectionsList = new ArrayList<IExecutableSection>();
+ protected List<ISection> sections = new ArrayList<ISection>();
+ protected SortedMap<IAddress,List<ISymbol>> symbols = new TreeMap<IAddress,List<ISymbol>>();
+ protected IAddress exeBaseAddress;
+ protected long modificationDate;
+ protected ISectionMapper sectionMapper;
+
+ protected IUnmangler unmangler;
+
+ /**
+ * must be set using storeSymbol() and retrieved using getSymbols()
+ */
+ private List<ISymbol> symbolsList = new ArrayList<ISymbol>();
+
+ /**
+ * @param binaryFile
+ */
+ public BaseExecutableSymbolicsReader(IPath binaryFile) {
+ this.binaryFile = binaryFile;
+ }
+
+ /**
+ * Each symbol must be stored using this method
+ * @param symbol the symbol to store
+ * @param linkAddress the address of the (start of the) symbol
+ */
+ protected void storeSymbol(ISymbol symbol, IAddress linkAddress){
+ List<ISymbol> symbolsAtAddress = symbols.get(linkAddress);
+ if (symbolsAtAddress == null) {
+ symbolsAtAddress = new ArrayList<ISymbol>(1);
+ symbols.put(linkAddress, symbolsAtAddress);
+ }
+ symbolsAtAddress.add(symbol);
+ symbolsList.add(symbol);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#dispose()
+ */
+ public void dispose() {
+ if (sectionMapper != null) {
+ sectionMapper.dispose();
+ sectionMapper = null;
+ }
+ sections.clear();
+ symbols.clear();
+ symbolsList.clear();
+ }
+
+ public IPath getSymbolFile() {
+ return binaryFile;
+ }
+
+ public Collection<IExecutableSection> getExecutableSections() {
+ return Collections.unmodifiableCollection(executableSectionsList);
+ }
+
+ public IExecutableSection findExecutableSection(String sectionName) {
+ return executableSections.get(sectionName);
+ }
+
+ public Collection<ISection> getSections() {
+ return Collections.unmodifiableCollection(sections);
+ }
+
+ public Collection<ISymbol> getSymbols() {
+ return Collections.unmodifiableCollection(symbolsList);
+ }
+
+ /**
+ * @return the first symbol at that address unless the first one is zero
+ * sized and there is another non-zero sized one - in that case
+ * return the non-zero sized one. Null if there is no symbol at this address.
+ * @see #getSymbolsAtAddress(IAddress)
+ */
+ public ISymbol getSymbolAtAddress(IAddress linkAddress) {
+ Collection<ISymbol> symbolsAtAddress = getSymbolsAtAddress(linkAddress);
+ ISymbol first = null;
+ for (ISymbol symbol : symbolsAtAddress) {
+ if (!symbol.hasEmptyRange())
+ return symbol;
+ if (null == first)
+ first = symbol;
+ }
+ return first;
+ }
+
+ public Collection<ISymbol> getSymbolsAtAddress(IAddress linkAddress) {
+ {// Try for an exact match
+ SortedMap<IAddress, List<ISymbol>> tail = symbols.tailMap(linkAddress);
+ if (!tail.isEmpty()) {
+ IAddress firstKey = tail.firstKey();
+ if (firstKey.equals(linkAddress)) {
+ // We have an exact match
+ return Collections.unmodifiableCollection(tail.get(firstKey));
+ }
+ }
+ }
+
+ // No exact match
+ {
+ // we need to try entries before linkAddress which might be large
+ // enough
+ SortedMap<IAddress, List<ISymbol>> head = symbols.headMap(linkAddress);
+ if (!head.isEmpty()) {
+ IAddress lastKey = head.lastKey();
+ List<ISymbol> lastList = head.get(lastKey);
+ List<ISymbol> validList = new ArrayList<ISymbol>(lastList.size());
+ for (ISymbol symbol : lastList) {
+ if (linkAddress.compareTo(symbol.getAddress().add(symbol.getSize())) < 0) {
+ validList.add(symbol);
+ }
+ }
+ return validList;
+ }
+ }
+
+ return Collections.emptyList();
+ }
+
+ public IAddress getBaseLinkAddress() {
+ return exeBaseAddress;
+ }
+
+ public long getModificationDate() {
+ return modificationDate;
+ }
+
+ public Collection<ISymbol> findSymbols(String name) {
+ List<ISymbol> matchSymbols = new ArrayList<ISymbol>();
+
+ // look for exact symbols
+ for (ISymbol symbol : symbolsList) {
+ String symName = symbol.getName();
+ if (symName.equals(name)) {
+ matchSymbols.add(symbol);
+ }
+ }
+ if (!matchSymbols.isEmpty())
+ return matchSymbols;
+
+ // try for a decorated symbol if no match
+ if (unmangler != null) {
+ for (ISymbol symbol : symbolsList) {
+ String symName = unmangler.undecorate(symbol.getName());
+ if (symName.equals(name)) {
+ matchSymbols.add(symbol);
+ }
+ }
+ }
+
+ return matchSymbols;
+ }
+
+ public Collection<ISymbol> findUnmangledSymbols(String name) {
+ List<ISymbol> matchSymbols = new ArrayList<ISymbol>();
+
+ if (unmangler != null) {
+ name = unmangler.undecorate(name);
+
+ String nameNoSpaces = name.replaceAll("\\s", "");
+
+ // remove full qualifier
+ if (nameNoSpaces.startsWith("::"))
+ nameNoSpaces = nameNoSpaces.substring(2);
+
+ boolean nameNoArguments = !nameNoSpaces.endsWith(")");
+
+ // avoid unmangling a lot of irrelevant symbols by filtering out symbols not containing the base name
+ String undecoratedBase = nameNoSpaces;
+ int idx = undecoratedBase.lastIndexOf(':');
+ if (idx >= 0)
+ undecoratedBase = undecoratedBase.substring(idx+1);
+ idx = undecoratedBase.indexOf('(');
+ if (idx >= 0)
+ undecoratedBase = undecoratedBase.substring(0, idx);
+
+ for (ISymbol symbol : symbolsList) {
+ String symName = symbol.getName();
+ if (!symName.contains(undecoratedBase))
+ continue;
+
+ try {
+ String unmangled = unmangler.unmangle(unmangler.undecorate(symName));
+ if (unmangled != null) {
+ String unmangledNoSpaces;
+ // remove any 'const' which is in front of '(' for now
+ unmangledNoSpaces = unmangled.replaceAll("\\bconst\\s*(?=\\()", "");
+ unmangledNoSpaces = unmangledNoSpaces.replaceAll("\\s", "");
+
+ // remove full qualifier
+ if (unmangledNoSpaces.startsWith("::"))
+ unmangledNoSpaces = unmangledNoSpaces.substring(2);
+
+ if (nameNoSpaces.equals(unmangledNoSpaces)) {
+ matchSymbols.add(symbol);
+ } else if (nameNoArguments) {
+ // try to match the name against a function
+ idx = unmangledNoSpaces.lastIndexOf('(');
+ if (idx >= 0) {
+ String unmangledNoArguments = unmangledNoSpaces.substring(0, idx);
+ if (unmangledNoArguments.equals(nameNoSpaces)) {
+ matchSymbols.add(symbol);
+ }
+ }
+ }
+ }
+ } catch (UnmanglingException e) {
+ // nope
+ }
+ }
+ if (!matchSymbols.isEmpty())
+ return matchSymbols;
+ }
+
+ return matchSymbols;
+ }
+
+ public IUnmangler getUnmangler() {
+ return unmangler;
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ElfExecutableSymbolicsReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ElfExecutableSymbolicsReader.java
index 901b5e6..94164a7 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ElfExecutableSymbolicsReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ElfExecutableSymbolicsReader.java
@@ -1,159 +1,245 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.io.IOException;
-import java.nio.ByteOrder;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.internal.symbols.Section;
-import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
-import org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf;
-import org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf.PHdr;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * This class handles reading ELF files for the purposes of detecting symbolics.
- */
-public class ElfExecutableSymbolicsReader extends BaseExecutableSymbolicsReader {
- protected boolean isLE;
-
- public ElfExecutableSymbolicsReader(IPath binaryFile, Elf elf) throws IOException {
- super(binaryFile);
-
- Elf.ELFhdr header = elf.getELFhdr();
- isLE = header.e_ident[Elf.ELFhdr.EI_DATA] == Elf.ELFhdr.ELFDATA2LSB;
- exeBaseAddress = getExeSegment(elf).p_vaddr;
- modificationDate = binaryFile.toFile().lastModified();
-
- sectionMapper = new SectionMapper(binaryFile, isLE);
-
- recordSections(elf);
- readSymbols(elf);
-
- // TODO: better selection. We assume for now that all ELF targets we know about (ARM, Linux) use the same mangling.
- unmangler = new UnmanglerEABI();
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "ELF symbolics reader for " + binaryFile; //$NON-NLS-1$
- }
-
- /**
- * Determine the executable format and record the sections.
- * @param elfFile
- *
- * @throws IOException if file contents cannot be read
- */
- private void recordSections(Elf elfFile) throws IOException {
-
- // start from zero so that we can use it as index to the array list
- // for quick access.
- int id = 0;
- Map<String, Object> props;
-
- // Use segments instead of sections in the Elf file.
- PHdr[] segments = elfFile.getPHdrs();
-
- for (PHdr s : segments) {
- if (s.p_type == PHdr.PT_LOAD) {
- props = new HashMap<String, Object>();
-
- if ((s.p_flags & PHdr.PF_X) != 0)
- props.put(ISection.PROPERTY_NAME, ISection.NAME_TEXT);
- else
- // There is no clear way to tell if a segment is
- // data or bss segment.
- props.put(ISection.PROPERTY_NAME, ISection.NAME_DATA);
-
- Section section = new Section(id++, s.p_memsz, s.p_vaddr, props);
- sections.add(section);
- }
- }
-
- // remember how to map the sections
- Elf.Section[] sections = elfFile.getSections();
- for (Elf.Section section : sections) {
- String name = section.toString();
-
- if (name.length() > 0) {
- if (executableSections.containsKey(name))
- throw new IllegalStateException("duplicate section " + name);
- IExecutableSection exeSection = new ExecutableSection(sectionMapper, name,
- new SectionInfo(section.sh_offset, section.sh_size));
- executableSections.put(name, exeSection);
- }
- }
- }
-
- protected void readSymbols(Elf elfFile) throws IOException {
- // load the symbol table
- elfFile.loadSymbols();
- Set<IAddress> symbolAddressSet = new TreeSet<IAddress>();
-
- for (Elf.Symbol symbol : elfFile.getSymtabSymbols()) {
- String name = symbol.toString();
- // Multiple symbol entries for the same address are generated.
- // Do not add duplicate symbols with 0 size to the list since it confuses
- // debugger
- if (name.length() > 0) {
- if (symbol.st_size != 0 || !symbolAddressSet.contains(symbol.st_value)) {
- // need to get rid of labels with size 0
- if (symbol.st_size != 0 || !name.startsWith("|")) {
- symbols.add(new Symbol(symbol.toString(), symbol.st_value, symbol.st_size));
- symbolAddressSet.add(symbol.st_value);
- }
- }
- }
- }
-
- // now sort it by address for faster lookups
- Collections.sort(symbols);
- }
-
- /**
- * Find the executable (text) segment of the elf file, assuming there is
- * only one that segment.
- *
- * @param elf
- * @return exe segment header or null on error.
- * @throws IOException
- */
- private PHdr getExeSegment(Elf elf) throws IOException {
- PHdr[] segments = elf.getPHdrs();
-
- for (PHdr s : segments) {
- if (s.p_type == PHdr.PT_LOAD && ((s.p_flags & PHdr.PF_X) != 0))
- return s;
- }
-
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IExecutableSymbolicsReader#getByteOrder()
- */
- public ByteOrder getByteOrder() {
- return isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * refactoring of initSymbolProperties() & added newSymbol()
+ * Broadcom - processing of phyiscal address and other additional properties
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.Section;
+import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
+import org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf;
+import org.eclipse.cdt.debug.edc.internal.symbols.elf.Elf.PHdr;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This class handles reading ELF files for the purposes of detecting symbolics.
+ */
+public class ElfExecutableSymbolicsReader extends BaseExecutableSymbolicsReader {
+ protected boolean isLE;
+
+ /**
+ * Represents whether multiple zero size symbols at the same
+ * address should be included or only the first one.
+ *
+ * Some compilers generate many zero length symbols at the same address.
+ *
+ * TODO: this needs to default to false for backwards compatibility
+ * and have a way of being specified
+ */
+ protected boolean includeRepeatZeroSizeSymbols = true;
+
+ public ElfExecutableSymbolicsReader(IPath binaryFile, Elf elf) throws IOException {
+ super(binaryFile);
+
+ Elf.ELFhdr header = elf.getELFhdr();
+ isLE = header.e_ident[Elf.ELFhdr.EI_DATA] == Elf.ELFhdr.ELFDATA2LSB;
+ exeBaseAddress = getExeSegment(elf).p_vaddr;
+ modificationDate = binaryFile.toFile().lastModified();
+
+ sectionMapper = new SectionMapper(binaryFile, isLE);
+
+ recordSections(elf);
+ readSymbols(elf);
+
+ // TODO: better selection. We assume for now that all ELF targets we know about (ARM, Linux) use the same mangling.
+ unmangler = new UnmanglerEABI();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "ELF symbolics reader for " + binaryFile; //$NON-NLS-1$
+ }
+
+ /**
+ * Determine the executable format and record the sections.
+ * @param elfFile
+ *
+ * @throws IOException if file contents cannot be read
+ */
+ private void recordSections(Elf elfFile) throws IOException {
+
+ // start from zero so that we can use it as index to the array list
+ // for quick access.
+ int id = 0;
+ Map<String, Object> props;
+
+ // Use segments instead of sections in the Elf file.
+ PHdr[] segments = elfFile.getPHdrs();
+
+ for (PHdr s : segments) {
+ if (s.p_type == PHdr.PT_LOAD) {
+ props = new HashMap<String, Object>();
+
+ if ((s.p_flags & PHdr.PF_X) != 0)
+ props.put(ISection.PROPERTY_NAME, ISection.NAME_TEXT);
+ else
+ // There is no clear way to tell if a segment is
+ // data or bss segment.
+ props.put(ISection.PROPERTY_NAME, ISection.NAME_DATA);
+
+ Section section = new Section(id++, s.p_memsz, s.p_vaddr, s.p_paddr, props);
+ sections.add(section);
+ }
+ }
+
+ // remember how to map the sections
+ for (Elf.Section section : elfFile.getSections()) {
+ String name = section.toString();
+
+ if (name.length() > 0) {
+ addSection(section, name);
+ }
+ }
+ }
+
+ private void addSection(Elf.Section section, String name) {
+ if (executableSections.containsKey(name))
+ throw new IllegalStateException("duplicate section " + name);
+
+ ISection segment = getSegmentForExecutableSection(section);
+ boolean executable = (section.sh_flags & Elf.Section.SHF_EXECINTR) != 0;
+ boolean writable = (section.sh_flags & Elf.Section.SHF_WRITE) != 0;
+ boolean allocatable = (section.sh_flags & Elf.Section.SHF_ALLOC) != 0;
+
+ // with default load-factor of .75 and the following 4 properties
+ // being the only known keys for now, set the initial capacity to 8.
+ Map<String,Object> properties = new HashMap<String,Object>(8);
+
+ properties.put(IExecutableSection.PROPERTY_CONTAINER, segment);
+ properties.put(IExecutableSection.PROPERTY_EXECUTABLE, executable);
+ properties.put(IExecutableSection.PROPERTY_WRITABLE, writable);
+ properties.put(IExecutableSection.PROPERTY_ALLOCATABLE, allocatable);
+
+ IExecutableSection exeSection
+ = new ExecutableSection(sectionMapper, name,
+ new SectionInfo(section.sh_addr, section.sh_offset, section.sh_size),
+ properties);
+
+ executableSections.put(name, exeSection);
+ executableSectionsList.add(exeSection);
+ }
+
+ protected ISection getSegmentForExecutableSection(Elf.Section section){
+ for (ISection segment : sections){
+ if (segment.getLowAddress().compareTo(section.sh_addr) <= 0
+ && segment.getHighAddress().compareTo(section.sh_addr.add(section.sh_size)) > 0){
+ return segment;
+ }
+ }
+ return null;
+ }
+
+ protected void readSymbols(Elf elfFile) throws IOException {
+ // load the symbol table
+ elfFile.loadSymbols();
+
+ for (Elf.Symbol symbol : elfFile.getSymtabSymbols()) {
+ String name = symbol.toString();
+ if (name.length() > 0) {
+ // Multiple symbol entries for the same address are generated.
+ // Do not add duplicate symbols with 0 size to the list since it confuses
+ // debugger
+ IAddress linkAddress = symbol.st_value;
+ List<ISymbol> symbolsAtAddress = symbols.get(linkAddress);
+ if ((includeRepeatZeroSizeSymbols || symbol.st_size != 0 || symbolsAtAddress == null)
+ // need to get rid of labels with size 0
+ && (symbol.st_size != 0 || !name.startsWith("|"))) {
+
+ ISymbol newSymbol = newSymbol(symbol, linkAddress);
+
+ //Store the symbol
+ // We can't reuse linkAddress here as the symbol may alter the linkAddress to give its actual address
+ storeSymbol(newSymbol, newSymbol.getAddress());
+ }
+ }
+ }
+ }
+
+ /**
+ * instantiates a new Symbol object; protected for override by
+ * ElfExecutableSymbolicsReader extension classes
+ * @param symbol
+ * @param linkAddress
+ * @return the new symbol instance
+ */
+ protected ISymbol newSymbol(Elf.Symbol symbol, IAddress linkAddress) {
+ return new Symbol(symbol.toString(), linkAddress, symbol.st_size,
+ initSymbolProperties(symbol));
+ }
+
+ /**
+ * establishes initial properties for a symbol; protected for override by
+ * ElfExecutableSymbolicsReader extension classes
+ * @param symbol
+ * @return the new attributes
+ */
+ protected Map<String,Object> initSymbolProperties(Elf.Symbol symbol) {
+ int st_type = symbol.st_type();
+ boolean file = st_type == Elf.Symbol.STT_FILE;
+ boolean section = st_type == Elf.Symbol.STT_SECTION;
+ IExecutableSection exeSection = null;
+ if (symbol.st_shndx != Elf.Symbol.SHN_UNDEF){
+ int exeSectionIndex = symbol.st_shndx -1;// as 0 is for undef
+ if (exeSectionIndex >= 0 && exeSectionIndex < executableSectionsList.size()) {
+ exeSection = executableSectionsList.get(exeSectionIndex);
+ }
+ }
+
+ Map<String,Object> properties = new HashMap<String,Object>();
+ properties.put(ISymbol.PROPERTY_CONTAINER, exeSection);
+ properties.put(ISymbol.PROPERTY_EXECUTABLE, st_type == Elf.Symbol.STT_FUNC);
+ properties.put(ISymbol.PROPERTY_DATA, st_type == Elf.Symbol.STT_OBJECT);
+ properties.put(ISymbol.PROPERTY_NOT_EXECUTABLE_OR_DATA, file || section);
+ properties.put(ISymbol.PROPERTY_FILE, file);
+ properties.put(ISymbol.PROPERTY_SECTION, section);
+
+ return properties;
+ }
+
+ /**
+ * Find the executable (text) segment of the elf file, assuming there is
+ * only one that segment.
+ *
+ * @param elf
+ * @return exe segment header or null on error.
+ * @throws IOException
+ */
+ private PHdr getExeSegment(Elf elf) throws IOException {
+ PHdr[] segments = elf.getPHdrs();
+
+ for (PHdr s : segments) {
+ if (s.p_type == PHdr.PT_LOAD && ((s.p_flags & PHdr.PF_X) != 0))
+ return s;
+ }
+
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IExecutableSymbolicsReader#getByteOrder()
+ */
+ public ByteOrder getByteOrder() {
+ return isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ExecutableSection.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ExecutableSection.java
index e626b89..9878abd 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ExecutableSection.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/ExecutableSection.java
@@ -1,81 +1,125 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.io.IOException;
-
-import org.eclipse.cdt.debug.edc.IStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-
-/**
- *
- */
-public class ExecutableSection implements IExecutableSection {
-
- private final String name;
- private final ISectionMapper executableSectionMapper;
- private final SectionInfo section;
- private IStreamBuffer buffer;
- private boolean deadSection;
-
- /**
- * @param section
- * @param name
- * @param elfExecutableSymbolicsReader
- */
- public ExecutableSection(ISectionMapper executableSectionMapper,
- String name,
- SectionInfo section) {
- this.executableSectionMapper = executableSectionMapper;
- this.name = name;
- this.section = section;
- this.deadSection = false;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return name + " @ " + section + (deadSection ? " <<BROKEN>>": ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSection#getName()
- */
- public String getName() {
- return name;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSection#getBuffer()
- */
- public IStreamBuffer getBuffer() {
- if (buffer == null && !deadSection) {
- try {
- buffer = executableSectionMapper.getSectionBuffer(section);
- } catch (IOException e) {
- deadSection = true;
- EDCDebugger.getMessageLogger().logError("Failed to read section " + name, e);
- }
- }
- return buffer;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSection#dispose()
- */
- public void dispose() {
- executableSectionMapper.releaseSectionBuffer(section);
- buffer = null;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - implementation of getProperties() & ctor with properties
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+
+/**
+ *
+ */
+public class ExecutableSection implements IExecutableSection {
+
+ private final String name;
+ private final ISectionMapper executableSectionMapper;
+ private final SectionInfo section;
+ private IStreamBuffer buffer;
+ private boolean deadSection;
+ private HashMap<String, Object> properties;
+
+ /**
+ * @param executableSectionMapper
+ * @param name
+ * @param section
+ */
+ public ExecutableSection(ISectionMapper executableSectionMapper,
+ String name, SectionInfo section) {
+ this(executableSectionMapper, name, section, new HashMap<String,Object>(0));
+ }
+
+ /**
+ * @param executableSectionMapper
+ * @param name
+ * @param section
+ * @param properties
+ */
+ public ExecutableSection(ISectionMapper executableSectionMapper,
+ String name, SectionInfo section, Map<String, Object> properties) {
+ this.executableSectionMapper = executableSectionMapper;
+ this.name = name;
+ this.section = section;
+ this.deadSection = false;
+ this.properties = new HashMap<String, Object>(properties); // make a copy
+ }
+
+ @Override
+ public String toString() {
+ return name + " @ " + section + (deadSection ? " <<BROKEN>>": ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public IStreamBuffer getBuffer() {
+ if (buffer == null && !deadSection && executableSectionMapper != null) {
+ try {
+ buffer = executableSectionMapper.getSectionBuffer(section);
+ } catch (IOException e) {
+ deadSection = true;
+ EDCDebugger.getMessageLogger().logError("Failed to read section " + name, e);
+ }
+ }
+ return buffer;
+ }
+
+ public void dispose() {
+ executableSectionMapper.releaseSectionBuffer(section);
+ buffer = null;
+ }
+
+ public long getSize() {
+ if (buffer == null && !deadSection) {
+ getBuffer();
+ }
+ if (buffer != null) {
+ return buffer.capacity();
+ } else if (section != null) {
+ return section.sectionSize;
+ } else {
+ return 0;
+ }
+ }
+
+ public long getFileOffset() {
+ return section.fileOffset;
+ }
+
+ public IAddress getLinkAddress() {
+ return section.virtualAddress;
+ }
+
+ public boolean hasEmptyRange() {
+ return section.sectionSize == 0 || section.virtualAddress == null;
+ }
+
+ public IAddress getLowAddress() {
+ return getLinkAddress();
+ }
+
+ public IAddress getHighAddress() {
+ IAddress address = getLinkAddress();
+ return (address != null) ? address.add(section.sectionSize) : null;
+ }
+
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/PEFileExecutableSymbolicsReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/PEFileExecutableSymbolicsReader.java
index 55a2a8b..1eaf5b9 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/PEFileExecutableSymbolicsReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/PEFileExecutableSymbolicsReader.java
@@ -1,276 +1,328 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteOrder;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.cdt.debug.edc.internal.symbols.Section;
-import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
-import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
-import org.eclipse.cdt.debug.edc.symbols.ISymbol;
-import org.eclipse.cdt.utils.Addr32;
-import org.eclipse.cdt.utils.Addr64;
-import org.eclipse.cdt.utils.coff.Coff.SectionHeader;
-import org.eclipse.cdt.utils.coff.PE;
-import org.eclipse.cdt.utils.coff.PE.NTOptionalHeader;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * This class handles PE-COFF files for the purpose of supporting symbolics.
- */
-public class PEFileExecutableSymbolicsReader extends BaseExecutableSymbolicsReader {
-
- static public final String CODEVIEW_SECTION_NAME = "CodeView_Data";
- /** .CRT is another initialized data section utilized by the Microsoft C/C++ run-time libraries
- * @since 5.2
- */
- public final static String _CRT = ".CRT"; //$NON-NLS-1$
-
- protected boolean isLE;
- protected Map<Integer, ISection> sectionsByPEID = new HashMap<Integer, ISection>();
-
- public PEFileExecutableSymbolicsReader(IPath binaryFile, PE peFile) throws IOException {
- super(binaryFile);
- isLE = true;
- exeBaseAddress = new Addr32(peFile.getNTOptionalHeader().ImageBase);
- modificationDate = binaryFile.toFile().lastModified();
-
- sectionMapper = new SectionMapper(binaryFile, isLE);
-
- recordSections(peFile);
-
- // TODO: better selection.
- boolean isWin32 = false, isEABI = false;
- for (ISymbol symbol : symbols) {
- String symname = symbol.getName();
- if (symname.startsWith("__Z") && symname.endsWith("v")) {
- isWin32 = true;
- isEABI = true;
- break;
- } else if (symname.startsWith("_Z") && symname.endsWith("v")) {
- isEABI = true;
- break;
- } else if (symname.contains("@") && symname.contains("?")) {
- isWin32 = true;
- break;
- }
- }
- if (isWin32 && isEABI)
- unmangler = new UnmanglerWin32EABI();
- else if (isEABI)
- unmangler = new UnmanglerEABI();
- else
- unmangler = new UnmanglerWin32();
-
-
- }
-
- /**
- * Determine the executable format and record the sections.
- * @param peFile
- *
- * @throws IOException if file reading fails
- */
- private void recordSections(PE peFile) throws IOException {
- // start from zero so that we can use it as index to the array list
- // for quick access.
- int id = 0;
- Map<String, Object> props;
-
- SectionHeader[] secHeaders = peFile.getSectionHeaders();
- long imageBase = peFile.getNTOptionalHeader().ImageBase & 0xffffffffL;
- SectionHeader rDataHeader = null;
- int peSectionID = 0;
-
- for (SectionHeader s : secHeaders) {
- peSectionID++;
- String name = new String(s.s_name).trim();
- if (name.startsWith("/")) //$NON-NLS-1$
- {
- int stringTableOffset = Integer.parseInt(name.substring(1));
- name = peFile.getStringTableEntry(stringTableOffset);
- }
-
- // Remember how to map this section
- if (executableSections.containsKey(name))
- throw new IllegalStateException("duplicate section " + name);
- IExecutableSection exeSection = new ExecutableSection(sectionMapper, name,
- new SectionInfo(s.s_scnptr, s.s_paddr));
- executableSections.put(name, exeSection);
-
- String sectionName = name;
- // Convert the name to our unified name.
- if (sectionName.equals(SectionHeader._TEXT))
- name = ISection.NAME_TEXT;
- else if (sectionName.equals(SectionHeader._DATA) || sectionName.equals(_CRT))
- name = ISection.NAME_DATA;
- else if (sectionName.equals(".rdata")) // add this name in SectionHeader ?
- {
- name = ISection.NAME_RODATA;
- rDataHeader = s;
- }
- else if (sectionName.equals(SectionHeader._BSS))
- name = ISection.NAME_BSS;
- else { // ignore other section.
- continue;
- }
-
- // Well, PE is a _modified_ version of COFF, where
- // section.s_paddr of COFF becomes "VirtualSize"
- // (memory size of the section) in PE, while s_size
- // is raw data size (file size of the section).
- long size = s.s_paddr; // not s_size !
-
- props = new HashMap<String, Object>();
- props.put(ISection.PROPERTY_NAME, name);
-
- // Note the s_vaddr is relative to image base.
- // For Section we need absolute address.
- Section newSection = new Section(id++, size, new Addr64(Long.toString(imageBase + s.s_vaddr)), props);
- sections.add(newSection);
- sectionsByPEID.put(peSectionID, newSection);
- }
-
- // load the symbol table
- //
- /*
- * Note this "rawSymbols" array contains both standard and auxiliary
- * symbol records. It's assumed symbols in the array are in the same
- * order they appear in the symbol table section, no sorting of any kind
- * is done.
- *
- * Actually auxiliary symbols should not be treated the same as standard
- * symbols by Coff and PE in CDT core. But fixing that would break API,
- * which is not allowed for CDT 7.0 at this time......... 04/07/10
- */
- org.eclipse.cdt.utils.coff.Coff.Symbol[] rawSymbols = peFile.getSymbols();
-
- for (int i=0; i < rawSymbols.length; i++) {
- org.eclipse.cdt.utils.coff.Coff.Symbol symbol = rawSymbols[i];
-
- if (!(symbol.n_type == 0)) // Change to Coff.isNoSymbol for CDT 8.0.
- {
- String symName = symbol.getName(peFile.getStringTable());
- symbols.add(new Symbol(symName, new Addr32(symbol.n_value), 1));
- }
-
- // skip auxiliary symbol record(s) if any as otherwise they may
- // give us bogus match in any symbol table lookup.
- if (symbol.n_numaux > 0) {
- i += symbol.n_numaux;
- }
- }
-
- if (rDataHeader != null)
- checkForCodeView(peFile, rDataHeader, imageBase, id);
-
- // now sort it by address for faster lookups
- Collections.sort(symbols);
- }
-
- private void checkForCodeView(PE peFile, SectionHeader rDataHeader, long imageBase, int id) throws IOException { //$NON-NLS-1$
- // figure out the file offset of the debug directory
- // entries
- final int IMAGE_DIRECTORY_ENTRY_DEBUG = 6;
- final int DEBUGDIRSZ = 28;
- NTOptionalHeader ntHeader = peFile.getNTOptionalHeader();
- if (ntHeader == null
- || ntHeader.NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_DEBUG)
- return;
-
- int debugDir = ntHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
- if (debugDir == 0)
- return;
-
- int debugFormats = ntHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size / 28;
- if (debugFormats == 0)
- return;
-
- int offsetInto_rdata = debugDir
- - rDataHeader.s_vaddr;
- int fileOffset = rDataHeader.s_scnptr
- + offsetInto_rdata;
- RandomAccessFile accessFile = new RandomAccessFile(
- binaryFile.toOSString(), "r");
-
- // loop through the debug directories looking for
- // CodeView (type 2)
- for (int j = 0; j < debugFormats; j++) {
- PE.IMAGE_DEBUG_DIRECTORY dir = new PE.IMAGE_DEBUG_DIRECTORY(
- accessFile, fileOffset);
-
- if ((dir.Type == 2) && (dir.SizeOfData > 0)) {
- // CodeView found, seek to actual data
- int debugBase = dir.PointerToRawData;
- accessFile.seek(debugBase);
-
- // sanity check. the first four bytes of the
- // CodeView
- // data should be "NB11"
- String s2 = accessFile.readLine();
- if (s2.startsWith("NB11")) { //$NON-NLS-1$
- // Attribute att = peFile.getAttribute();
- long start = debugBase;
- long size = accessFile.length() - start;
-
- String name = CODEVIEW_SECTION_NAME;
- IExecutableSection exeSection = new ExecutableSection(sectionMapper, name,
- new SectionInfo(start, size));
- executableSections.put(name, exeSection);
- }
- }
- fileOffset += DEBUGDIRSZ;
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IExecutableSymbolicsReader#getByteOrder()
- */
- public ByteOrder getByteOrder() {
- return isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#getSymbolAtAddress()
- */
- @Override
- public ISymbol getSymbolAtAddress(IAddress linkAddress) {
- int insertion = Collections.binarySearch(symbols, linkAddress);
- if (insertion >= 0) {
- return symbols.get(insertion++);
- }
-
- if (insertion == -1) {
- return null;
- }
-
- insertion = -insertion - 1;
-
- if (insertion == symbols.size()) {
- return null;
- }
-
- return symbols.get(insertion - 1);
- }
-
- public ISection getSectionByPEID(int peID)
- {
- return sectionsByPEID.get(peID);
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - implementation of executable section properties
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteOrder;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.cdt.debug.edc.internal.symbols.Section;
+import org.eclipse.cdt.debug.edc.internal.symbols.Symbol;
+import org.eclipse.cdt.debug.edc.symbols.IExecutableSection;
+import org.eclipse.cdt.debug.edc.symbols.ISymbol;
+import org.eclipse.cdt.utils.Addr32;
+import org.eclipse.cdt.utils.Addr64;
+import org.eclipse.cdt.utils.coff.Coff.SectionHeader;
+import org.eclipse.cdt.utils.coff.PE;
+import org.eclipse.cdt.utils.coff.PE.NTOptionalHeader;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This class handles PE-COFF files for the purpose of supporting symbolics.
+ */
+public class PEFileExecutableSymbolicsReader extends BaseExecutableSymbolicsReader {
+
+ static public final String CODEVIEW_SECTION_NAME = "CodeView_Data";
+ /** .CRT is another initialized data section used by the Microsoft C/C++ run-time libraries
+ * @since 5.2
+ */
+ static public final String _CRT = ".CRT"; //$NON-NLS-1$
+
+ /** .SYMBIAN is another initialized data section used by Symbian OS PE-COFF files
+ * @since
+ */
+ static public final String _SYMBIAN = ".SYMBIAN"; //$NON-NLS-1$
+
+ protected boolean isLE;
+ protected Map<Integer, ISection> sectionsByPEID = new HashMap<Integer, ISection>();
+
+ public PEFileExecutableSymbolicsReader(IPath binaryFile, PE peFile) throws IOException {
+ super(binaryFile);
+ isLE = true;
+ exeBaseAddress = new Addr32(peFile.getNTOptionalHeader().ImageBase);
+ modificationDate = binaryFile.toFile().lastModified();
+
+ sectionMapper = new SectionMapper(binaryFile, isLE);
+
+ recordSections(peFile);
+
+ // TODO: better selection.
+ boolean isWin32 = false, isEABI = false;
+ for (ISymbol symbol : getSymbols()) {
+ String symname = symbol.getName();
+ if (symname.startsWith("__Z") && symname.endsWith("v")) {
+ isWin32 = true;
+ isEABI = true;
+ break;
+ } else if (symname.startsWith("_Z") && symname.endsWith("v")) {
+ isEABI = true;
+ break;
+ } else if (symname.contains("@") && symname.contains("?")) {
+ isWin32 = true;
+ break;
+ }
+ }
+ if (isWin32 && isEABI)
+ unmangler = new UnmanglerWin32EABI();
+ else if (isEABI)
+ unmangler = new UnmanglerEABI();
+ else
+ unmangler = new UnmanglerWin32();
+ }
+
+ /**
+ * Determine the executable format and record the sections.
+ * @param peFile
+ *
+ * @throws IOException if file reading fails
+ */
+ private void recordSections(PE peFile) throws IOException {
+ // start from zero so that we can use it as index to the array list
+ // for quick access.
+ int id = 0;
+
+ SectionHeader[] secHeaders = peFile.getSectionHeaders();
+ long imageBase = peFile.getNTOptionalHeader().ImageBase & 0xffffffffL;
+ SectionHeader rDataHeader = null;
+ int peSectionID = 0;
+
+ for (SectionHeader s : secHeaders) {
+ peSectionID++;
+ String name = new String(s.s_name).trim();
+ if (name.startsWith("/")) //$NON-NLS-1$
+ {
+ int stringTableOffset = Integer.parseInt(name.substring(1));
+ name = peFile.getStringTableEntry(stringTableOffset);
+ }
+
+ // PE is a _modified_ version of COFF, where section.s_paddr of COFF
+ // becomes "VirtualSize" (memory size of the section) in PE,
+ // while s_size is raw data size (file size of the section).
+ long size = s.s_paddr; // not s_size !
+
+ Map<String,Object> exeSectionProps = new HashMap<String, Object>();
+
+ String sectionName = name;
+ boolean ignoreSection = false;
+ // Convert the name to our unified name.
+ if (sectionName.equals(SectionHeader._TEXT)) {
+ name = ISection.NAME_TEXT;
+ exeSectionProps.put(IExecutableSection.PROPERTY_EXECUTABLE, true);
+ } else if (sectionName.equals(SectionHeader._DATA)
+ || sectionName.equals(_CRT) || sectionName.equals(_SYMBIAN)) {
+ name = ISection.NAME_DATA;
+ } else if (sectionName.equals(".rdata")) { // add this name in SectionHeader ?
+ name = ISection.NAME_RODATA;
+ rDataHeader = s;
+ } else if (sectionName.equals(SectionHeader._BSS)) {
+ name = ISection.NAME_BSS;
+ } else { // ignore other section.
+ ignoreSection = true;
+ }
+
+ Map<String, Object> sectionProps = new HashMap<String, Object>();
+ sectionProps.put(ISection.PROPERTY_NAME, name);
+
+ // Note the s_vaddr is relative to image base.
+ // For Section we need absolute address.
+ IAddress virtualAddress = new Addr64(Long.toString(imageBase + s.s_vaddr));
+
+ Section newSection = new Section(id++, size, virtualAddress, sectionProps);
+ if (!ignoreSection) {
+ sections.add(newSection);
+ sectionsByPEID.put(peSectionID, newSection);
+ exeSectionProps.put(IExecutableSection.PROPERTY_ALLOCATABLE, true);
+ } else {
+ exeSectionProps.put(IExecutableSection.PROPERTY_ALLOCATABLE, false);
+ }
+ exeSectionProps.put(IExecutableSection.PROPERTY_CONTAINER, newSection);
+
+ // Remember how to map this section
+ if (executableSections.containsKey(sectionName))
+ throw new IllegalStateException("duplicate section " + sectionName);
+
+ IExecutableSection exeSection
+ = new ExecutableSection(sectionMapper, sectionName,
+ new SectionInfo(virtualAddress, s.s_scnptr, size),
+ exeSectionProps);
+ executableSections.put(sectionName, exeSection);
+ executableSectionsList.add(exeSection);
+ }
+
+ // load the symbol table
+ //
+ /*
+ * Note this "rawSymbols" array contains both standard and auxiliary
+ * symbol records. It's assumed symbols in the array are in the same
+ * order they appear in the symbol table section, no sorting of any kind
+ * is done.
+ *
+ * Actually auxiliary symbols should not be treated the same as standard
+ * symbols by Coff and PE in CDT core. But fixing that would break API,
+ * which is not allowed for CDT 7.0 at this time......... 04/07/10
+ */
+ org.eclipse.cdt.utils.coff.Coff.Symbol[] rawSymbols = peFile.getSymbols();
+
+ for (int i=0; i < rawSymbols.length; i++) {
+ org.eclipse.cdt.utils.coff.Coff.Symbol symbol = rawSymbols[i];
+
+ if (!(symbol.n_type == 0)) // Change to Coff.isNoSymbol for CDT 8.0.
+ {
+ String symName = symbol.getName(peFile.getStringTable());
+ IAddress linkAddress = new Addr32(symbol.n_value);
+ Map<String,Object> properties = new HashMap<String,Object>();
+ properties.put(ISymbol.PROPERTY_EXECUTABLE, symbol.isFunction());
+ properties.put(ISymbol.PROPERTY_DATA,
+ symbol.isArray() | symbol.isPointer()
+ | (symbol.n_type & 0xf) != 0);
+
+ // TODO: implement setting size correctly rather than just to 1
+ ISymbol newSymbol = new Symbol(symName, linkAddress, 1, properties);
+
+ // Store the symbol
+ storeSymbol(newSymbol, linkAddress);
+ }
+
+ // skip auxiliary symbol record(s) if any as otherwise they may
+ // give us bogus match in any symbol table lookup.
+ if (symbol.n_numaux > 0) {
+ i += symbol.n_numaux;
+ }
+ }
+
+ if (rDataHeader != null)
+ checkForCodeView(peFile, rDataHeader, imageBase, id);
+ }
+
+ private void checkForCodeView(PE peFile, SectionHeader rDataHeader, long imageBase, int id) throws IOException {
+ // figure out the file offset of the debug directory
+ // entries
+ final int IMAGE_DIRECTORY_ENTRY_DEBUG = 6;
+ final int DEBUGDIRSZ = 28;
+ NTOptionalHeader ntHeader = peFile.getNTOptionalHeader();
+ if (ntHeader == null
+ || ntHeader.NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_DEBUG)
+ return;
+
+ int debugDir = ntHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
+ if (debugDir == 0)
+ return;
+
+ int debugFormats = ntHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size / 28;
+ if (debugFormats == 0)
+ return;
+
+ int offsetInto_rdata = debugDir - rDataHeader.s_vaddr;
+ int fileOffset = rDataHeader.s_scnptr + offsetInto_rdata;
+ RandomAccessFile accessFile
+ = new RandomAccessFile(binaryFile.toOSString(), "r");
+
+ try {
+ // loop through the debug directories looking for
+ // CodeView (type 2)
+ for (int j = 0; j < debugFormats; j++) {
+ PE.IMAGE_DEBUG_DIRECTORY dir = new PE.IMAGE_DEBUG_DIRECTORY(
+ accessFile, fileOffset);
+
+ if ((dir.Type == 2) && (dir.SizeOfData > 0)) {
+ // CodeView found, seek to actual data
+ int debugBase = dir.PointerToRawData;
+ accessFile.seek(debugBase);
+
+ // sanity check. the first four bytes of the
+ // CodeView
+ // data should be "NB11"
+ String s2 = accessFile.readLine();
+ if (s2.startsWith("NB11")) { //$NON-NLS-1$
+ // Attribute att = peFile.getAttribute();
+ long start = debugBase;
+ long size = accessFile.length() - start;
+
+ String name = CODEVIEW_SECTION_NAME;
+ IExecutableSection exeSection = new ExecutableSection(sectionMapper, name,
+ new SectionInfo(start, size));
+ executableSections.put(name, exeSection);
+ executableSectionsList.add(exeSection);
+ }
+ }
+ fileOffset += DEBUGDIRSZ;
+ }
+ } finally {
+ accessFile.close();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IExecutableSymbolicsReader#getByteOrder()
+ */
+ public ByteOrder getByteOrder() {
+ return isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSymbolicsReader#getSymbolAtAddress()
+ * Override to work around symbols being always size 1 as setting size not yet implemented
+ * TODO: once size is correctly (Bug 337821) set then this hack can be removed
+ */
+ @Override
+ public ISymbol getSymbolAtAddress(IAddress linkAddress) {
+ Collection<ISymbol> symbolsAtAddress = getSymbolsAtAddress(linkAddress);
+ for (ISymbol symbol : symbolsAtAddress){
+ return symbol;//return the first one if any
+ }
+ return null;
+ }
+
+ @Override//TODO: remove once Bug 337821 fixed
+ public Collection<ISymbol> getSymbolsAtAddress(IAddress linkAddress) {
+ {// Try for an exact match
+ SortedMap<IAddress, List<ISymbol>> tail = symbols.tailMap(linkAddress);
+ if (!tail.isEmpty()) {
+ IAddress firstKey = tail.firstKey();
+ if (firstKey.equals(linkAddress)) {
+ // We have an exact match
+ return Collections.unmodifiableCollection(tail.get(firstKey));
+ }
+ }
+ }
+ // No exact match
+ {
+ // we need to try entries before linkAddress which might be large
+ // enough
+ SortedMap<IAddress, List<ISymbol>> head = symbols.headMap(linkAddress);
+ if (!head.isEmpty()) {
+ IAddress lastKey = head.lastKey();
+ return head.get(lastKey);
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ public ISection getSectionByPEID(int peID)
+ {
+ return sectionsByPEID.get(peID);
+ }
+
+ @Override
+ public String toString() {
+ return "PEFileExecutableSymbolicsReader [File=" + binaryFile
+ + ", LittleEndian=" + isLE + "]";
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionInfo.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionInfo.java
index 2c59874..76ce3f3 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionInfo.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionInfo.java
@@ -1,66 +1,83 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-/**
- * Information about the range of content for a section. Used as a key in {@link SectionMapper}.
- */
-public class SectionInfo {
-
- public long fileOffset;
- public long sectionSize;
-
- public SectionInfo(long fileOffset, long sectionSize) {
- this.fileOffset = fileOffset;
- this.sectionSize = sectionSize;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "section from " + Long.toHexString(fileOffset) + " - " + Long.toHexString(fileOffset + sectionSize); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + (int) (fileOffset ^ (fileOffset >>> 32));
- result = prime * result + (int) (sectionSize ^ (sectionSize >>> 32));
- return result;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- SectionInfo other = (SectionInfo) obj;
- if (fileOffset != other.fileOffset)
- return false;
- if (sectionSize != other.sectionSize)
- return false;
- return true;
- }
-
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import org.eclipse.cdt.core.IAddress;
+
+/**
+ * Information about the range of content for a section. Used as a key in {@link SectionMapper}.
+ */
+public class SectionInfo {
+
+ /**
+ * May be null
+ */
+ public final IAddress virtualAddress;
+ public final long fileOffset;
+ public final long sectionSize;
+
+ /**
+ * Only use if virtual address not known.
+ * @param fileOffset
+ * @param sectionSize
+ */
+ public SectionInfo(long fileOffset, long sectionSize) {
+ this(null,fileOffset,sectionSize);
+ }
+
+ public SectionInfo(IAddress virtualAddress, long fileOffset, long sectionSize) {
+ this.virtualAddress = virtualAddress;
+ this.fileOffset = fileOffset;
+ this.sectionSize = sectionSize;
+ }
+
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "section from " + Long.toHexString(fileOffset) + " - " + Long.toHexString(fileOffset + sectionSize); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (int) (fileOffset ^ (fileOffset >>> 32));
+ result = prime * result + (int) (sectionSize ^ (sectionSize >>> 32));
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SectionInfo other = (SectionInfo) obj;
+ if (fileOffset != other.fileOffset)
+ return false;
+ if (sectionSize != other.sectionSize)
+ return false;
+ return true;
+ }
+
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionMapper.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionMapper.java
index 9791720..098fd97 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionMapper.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/SectionMapper.java
@@ -1,189 +1,191 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.io.IOException;
-import java.nio.ByteOrder;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.cdt.debug.edc.IStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.FileStreamBuffer;
-import org.eclipse.cdt.debug.edc.internal.MemoryStreamBuffer;
-import org.eclipse.cdt.utils.ERandomAccessFile;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Handle mapping sections into memory and caching this content.
- */
-public class SectionMapper implements ISectionMapper {
-
- private final IPath hostFile;
- private final boolean isLE;
- private ERandomAccessFile efile;
- /** all sections loaded for any reason */
- private Map<SectionInfo, IStreamBuffer> loadedSections;
- /** subset of sections loaded into memory maps */
- private Map<SectionInfo, IStreamBuffer> mappedBuffers;
-
- public SectionMapper(IPath hostFile, boolean isLE) {
- this.hostFile = hostFile;
- this.isLE = isLE;
- this.efile = null;
- this.loadedSections = new HashMap<SectionInfo, IStreamBuffer>();
- this.mappedBuffers = new HashMap<SectionInfo, IStreamBuffer>();
- }
-
- public void dispose() {
- for (Map.Entry<SectionInfo, IStreamBuffer> entry: loadedSections.entrySet()) {
- IStreamBuffer buffer = entry.getValue();
- if (buffer == null)
- continue;
- if (mappedBuffers.containsKey(entry.getKey()))
- FileStatistics.currentMemoryMappedBuffers -= buffer.capacity();
- else
- FileStatistics.currentHeapAllocatedBuffers -= buffer.capacity();
- }
- loadedSections.clear();
- mappedBuffers.clear();
- close();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.ISectionMapper#getMappedFile()
- */
- public IPath getMappedFile() {
- return hostFile;
- }
-
- /**
- *
- */
- private void ensureOpen() throws IOException {
- if (efile == null) {
- FileStatistics.log("Opening " + hostFile.toFile());
- FileStatistics.executablesOpened++;
- FileStatistics.executablesOpen++;
- efile = new ERandomAccessFile(hostFile.toFile(), "r");
- }
- }
-
-
- private void close() {
- if (!mappedBuffers.isEmpty())
- throw new IllegalStateException("cannot close file; mapped buffers open");
- if (efile != null) {
- try {
- FileStatistics.log("Closing " + hostFile.toFile());
- FileStatistics.executablesOpen--;
- efile.close();
- } catch (IOException e) {
- // ignore
- }
- }
- efile = null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSectionMapper#getSectionBuffer(org.eclipse.cdt.debug.edc.internal.symbols.exe.SectionInfo)
- */
- public IStreamBuffer getSectionBuffer(SectionInfo section) throws IOException {
-
- ensureOpen();
-
- IStreamBuffer buffer = loadedSections.get(section);
- if (buffer == null) {
- buffer = loadSection(section);
-
- loadedSections.put(section, buffer);
- // TODO: flush data occasionally, before #dispose()
- }
-
- return buffer;
- }
-
- private IStreamBuffer loadSection(SectionInfo section)
- throws IOException {
- FileStatistics.log("Loading " + section + " from " + hostFile.toFile());
-
- IStreamBuffer buffer = null;
-
- // If the sym file is too large, it's useless reading it
- // into the heap and choking the memory.
- // Just read it on-demand from disk.
- try {
- if (section.sectionSize > 4 * 1024 * 1024) {
- buffer = loadSectionIntoFileStreamBuffer(section);
- } else {
- buffer = loadSectionIntoHeap(section);
- }
- } catch (IOException e) {
- buffer = loadSectionIntoHeap(section);
- }
-
- return buffer;
- }
-
- /**
- * Load section contents into a streaming buffer. This is a little slower but
- * does not allocate any more than a page of memory at a time.
- *
- * @param section
- * @param buffer
- * @return new {@link IStreamBuffer}
- */
- private IStreamBuffer loadSectionIntoFileStreamBuffer(SectionInfo section) throws IOException {
- IStreamBuffer buffer = null;
- try {
- buffer = new FileStreamBuffer(efile, isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN,
- section.fileOffset, section.sectionSize);
- mappedBuffers.put(section, buffer);
- FileStatistics.currentMemoryMappedBuffers += buffer.capacity();
- FileStatistics.totalMemoryMappedBuffers += buffer.capacity();
- } catch (Throwable e2) {
- EDCDebugger.getMessageLogger().logError("Failed to make buffer for section " + section, e2);
- }
- return buffer;
- }
-
- private IStreamBuffer loadSectionIntoHeap(SectionInfo section)
- throws IOException {
- IStreamBuffer buffer;
- // try to load the section into memory because it will
- // be faster
- byte[] data = new byte[(int)section.sectionSize];
- efile.seek(section.fileOffset);
- efile.read(data);
- buffer = new MemoryStreamBuffer(data, isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
- FileStatistics.currentHeapAllocatedBuffers += data.length;
- FileStatistics.totalHeapAllocatedBuffers += data.length;
- return buffer;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.ISectionMapper#releaseBuffer(java.nio.ByteBuffer)
- */
- public void releaseSectionBuffer(SectionInfo section) {
- IStreamBuffer buffer = loadedSections.remove(section);
- if (buffer != null) {
- if (mappedBuffers.remove(section) != null) {
- FileStatistics.currentMemoryMappedBuffers -= buffer.capacity();
- if (mappedBuffers.isEmpty()) {
- close();
- }
- } else {
- FileStatistics.currentHeapAllocatedBuffers -= buffer.capacity();
- }
- }
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - loadSectionIntoHeap() buffer creation optimization
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.debug.edc.IStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.FileStreamBuffer;
+import org.eclipse.cdt.debug.edc.internal.MemoryStreamBuffer;
+import org.eclipse.cdt.utils.ERandomAccessFile;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Handle mapping sections into memory and caching this content.
+ */
+public class SectionMapper implements ISectionMapper {
+
+ private final IPath hostFile;
+ private final boolean isLE;
+ private ERandomAccessFile efile;
+ /** all sections loaded for any reason */
+ private Map<SectionInfo, IStreamBuffer> loadedSections;
+ /** subset of sections loaded into memory maps */
+ private Map<SectionInfo, IStreamBuffer> mappedBuffers;
+
+ public SectionMapper(IPath hostFile, boolean isLE) {
+ this.hostFile = hostFile;
+ this.isLE = isLE;
+ this.efile = null;
+ this.loadedSections = new HashMap<SectionInfo, IStreamBuffer>();
+ this.mappedBuffers = new HashMap<SectionInfo, IStreamBuffer>();
+ }
+
+ public void dispose() {
+ for (Map.Entry<SectionInfo, IStreamBuffer> entry: loadedSections.entrySet()) {
+ IStreamBuffer buffer = entry.getValue();
+ if (buffer == null)
+ continue;
+ if (mappedBuffers.containsKey(entry.getKey()))
+ FileStatistics.currentMemoryMappedBuffers -= buffer.capacity();
+ else
+ FileStatistics.currentHeapAllocatedBuffers -= buffer.capacity();
+ }
+ loadedSections.clear();
+ mappedBuffers.clear();
+ close();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.ISectionMapper#getMappedFile()
+ */
+ public IPath getMappedFile() {
+ return hostFile;
+ }
+
+ /**
+ *
+ */
+ private void ensureOpen() throws IOException {
+ if (efile == null) {
+ FileStatistics.log("Opening " + hostFile.toFile());
+ FileStatistics.executablesOpened++;
+ FileStatistics.executablesOpen++;
+ efile = new ERandomAccessFile(hostFile.toFile(), "r");
+ }
+ }
+
+
+ private void close() {
+ if (!mappedBuffers.isEmpty())
+ throw new IllegalStateException("cannot close file; mapped buffers open");
+ if (efile != null) {
+ try {
+ FileStatistics.log("Closing " + hostFile.toFile());
+ FileStatistics.executablesOpen--;
+ efile.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ efile = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.IExecutableSectionMapper#getSectionBuffer(org.eclipse.cdt.debug.edc.internal.symbols.exe.SectionInfo)
+ */
+ public IStreamBuffer getSectionBuffer(SectionInfo section) throws IOException {
+
+ ensureOpen();
+
+ IStreamBuffer buffer = loadedSections.get(section);
+ if (buffer == null) {
+ buffer = loadSection(section);
+
+ loadedSections.put(section, buffer);
+ // TODO: flush data occasionally, before #dispose()
+ }
+
+ return buffer;
+ }
+
+ private IStreamBuffer loadSection(SectionInfo section)
+ throws IOException {
+ FileStatistics.log("Loading " + section + " from " + hostFile.toFile());
+
+ IStreamBuffer buffer = null;
+
+ // If the sym file is too large, it's useless reading it
+ // into the heap and choking the memory.
+ // Just read it on-demand from disk.
+ try {
+ if (section.sectionSize > 4 * 1024 * 1024) {
+ buffer = loadSectionIntoFileStreamBuffer(section);
+ } else {
+ buffer = loadSectionIntoHeap(section);
+ }
+ } catch (IOException e) {
+ buffer = loadSectionIntoHeap(section);
+ }
+
+ return buffer;
+ }
+
+ /**
+ * Load section contents into a streaming buffer. This is a little slower but
+ * does not allocate any more than a page of memory at a time.
+ *
+ * @param section
+ * @param buffer
+ * @return new {@link IStreamBuffer}
+ */
+ private IStreamBuffer loadSectionIntoFileStreamBuffer(SectionInfo section) throws IOException {
+ IStreamBuffer buffer = null;
+ try {
+ buffer = new FileStreamBuffer(efile, isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN,
+ section.fileOffset, section.sectionSize);
+ mappedBuffers.put(section, buffer);
+ FileStatistics.currentMemoryMappedBuffers += buffer.capacity();
+ FileStatistics.totalMemoryMappedBuffers += buffer.capacity();
+ } catch (Throwable e2) {
+ EDCDebugger.getMessageLogger().logError("Failed to make buffer for section " + section, e2);
+ }
+ return buffer;
+ }
+
+ private IStreamBuffer loadSectionIntoHeap(SectionInfo section)
+ throws IOException {
+ IStreamBuffer buffer;
+ // try to load the section into memory because it will
+ // be faster
+ byte[] data = new byte[(int)section.sectionSize];
+ efile.seek(section.fileOffset);
+ int bytesRead = efile.read(data);
+ buffer = new MemoryStreamBuffer(data, isLE ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN,
+ 0 , (bytesRead != -1) ? bytesRead : 0);
+ FileStatistics.currentHeapAllocatedBuffers += data.length;
+ FileStatistics.totalHeapAllocatedBuffers += data.length;
+ return buffer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.exe.ISectionMapper#releaseBuffer(java.nio.ByteBuffer)
+ */
+ public void releaseSectionBuffer(SectionInfo section) {
+ IStreamBuffer buffer = loadedSections.remove(section);
+ if (buffer != null) {
+ if (mappedBuffers.remove(section) != null) {
+ FileStatistics.currentMemoryMappedBuffers -= buffer.capacity();
+ if (mappedBuffers.isEmpty()) {
+ close();
+ }
+ } else {
+ FileStatistics.currentHeapAllocatedBuffers -= buffer.capacity();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/UnmanglerEABI.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/UnmanglerEABI.java
index aedc1dc..9aebc1e 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/UnmanglerEABI.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/symbols/files/UnmanglerEABI.java
@@ -1,1824 +1,1754 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.internal.symbols.files;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-import java.util.WeakHashMap;
-
-import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
-
-/**
- * Unmangler for the ARM/Itanium/etc. EABI (http://www.codesourcery.com/public/cxx-abi/abi.html)
- * <p>
- * TODO: <expression> <closure-type-name> <lambda-sig>
- */
-public class UnmanglerEABI implements IUnmangler {
-
- private static boolean DEBUG = false;
-
- enum SubstType {
- PREFIX,
- TEMPLATE_PREFIX,
- TYPE,
- QUAL_TYPE,
- TEMPLATE_TEMPLATE_PARAM,
-
- }
- public UnmanglerEABI() {
-
- }
-
- static class UnmangleState {
- private char[] symbol;
- private int index;
- StringBuilder buffer;
- private Stack<Integer> pushes ; // lengths of buffer when pushed
- private List<String> substitutions;
- private Map<Integer, SubstType> substitutionTypes;
- private int lastTypeNameIndex;
-
- private List<String> templateArgs;
- private int templateArgBase;
- private Stack<Integer> templateArgStack; // length of templateArgs when pushed
-
- private Stack<Integer> backtracks ; // grouped entries: index value, lengths of buffer, and substitutions length when pushed
-
- private final boolean nameOnly;
-
- public UnmangleState(String symbol, boolean nameOnly) {
- this.symbol = symbol.toCharArray();
- this.nameOnly = nameOnly;
- index = 0;
- buffer = new StringBuilder();
- pushes = new Stack<Integer>();
- substitutions = new ArrayList<String>();
- substitutionTypes = new HashMap<Integer, UnmanglerEABI.SubstType>();
- templateArgs = new ArrayList<String>();
- templateArgStack = new Stack<Integer>();
- backtracks = new Stack<Integer>();
- lastTypeNameIndex = -1;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- String remaining = getRemaining();
- if (remaining.length() == 0)
- remaining = "<<end>>";
- return "state: at [" + remaining + "], so far: " + current();
- }
-
- /**
- * Push when entering a new decoding context (BNF expression).
- */
- public void push() {
- pushes.push(buffer.length());
- }
-
- /**
- * Pop the current decoded string and restore context to
- * the calling context.
- * @return decoded string
- */
- public String pop() {
- int oldpos = pushes.isEmpty() ? 0 : pushes.pop();
- String str = buffer.substring(oldpos, buffer.length());
- buffer.setLength(oldpos);
- return str;
- }
-
- /**
- * Push template argument state
- */
- public void pushTemplateArgs() {
- templateArgStack.push(templateArgBase);
- templateArgStack.push(templateArgs.size());
- }
-
- /**
- * Pop template argument state
- * @throws UnmanglingException
- */
- public void popTemplateArgs() throws UnmanglingException {
- try {
- templateArgs.subList(templateArgStack.pop(), templateArgs.size()).clear();
- templateArgBase = templateArgStack.pop();
- } catch (Exception e) {
- throw new UnmanglingException("template stack empty", buffer.toString());
- }
- }
- /**
- * Push all state, when entering a possible backtrack scenario.
- * Use #safePop() if an operation succeeds, or #safeBacktrack()
- * if it failed and you want to retry.
- */
- public void safePush() {
- backtracks.push(index);
- backtracks.push(lastTypeNameIndex);
- backtracks.push(buffer.length());
- backtracks.push(substitutions.size());
- backtracks.push(pushes.size());
- }
-
- /**
- * Call when a #safePush() branch has succeeded to discard backtrack state.
- */
- public void safePop() {
- backtracks.pop();
- backtracks.pop();
- backtracks.pop();
- backtracks.pop();
- backtracks.pop();
- }
-
- /**
- * Call when a #safePush() branch has failed to reset backtrack state.
- * (To perform another backtrack, call #safePush() again)
- */
- public void safeBacktrack() {
- int oldSize = backtracks.pop();
- pushes.subList(oldSize, pushes.size()).clear();
- oldSize = backtracks.pop();
- substitutions.subList(oldSize, substitutions.size()).clear();
- while (substitutionTypes.size() > oldSize)
- substitutionTypes.remove(substitutionTypes.size() - 1);
- buffer.setLength(backtracks.pop());
- lastTypeNameIndex = backtracks.pop();
- index = backtracks.pop();
- }
-
- /**
- * Tell if there is any current string (length > 0)
- * @return
- */
- public boolean hasCurrent() {
- int oldpos = pushes.isEmpty() ? 0 : pushes.peek();
- int end = buffer.length();
- return end > oldpos;
- }
-
- /**
- * Get the current constructed string (since the last #push())
- * @return
- */
- public String current() {
- int oldpos = pushes.isEmpty() ? 0 : pushes.peek();
- String str = buffer.substring(oldpos, buffer.length());
- return str;
- }
-
- /**
- * Remember the current constructed string as a substitution.
- * @param substType
- */
- public void remember(SubstType substType) {
- remember(current(), substType);
- }
-
- public boolean lastSubstitutionIsPrefix(SubstType substType) {
- if (substitutions.size() == 0)
- return false;
- String current = current();
- if (substitutions.get(substitutions.size() - 1).length() >= current.length())
- return false;
- return lastSubstitution() == substType;
- }
- /**
- * Remember the given string as a substitution.
- * @param name
- * @param substType
- */
- public void remember(String name, SubstType substType) {
- if (name.length() == 0)
- return;
- int num = substitutions.size();
- if (num > 0 && substitutions.get(num - 1).equals(name))
- return;
- substitutions.add(name);
- substitutionTypes.put(num, substType);
- lastTypeNameIndex = num;
- if (DEBUG) System.out.println(num+" := " + name + " --> " + substType);
- }
-
- /**
- * Replace the last substitution.
- * @param name
- * @param substType
- */
- public void rememberInstead(String name, SubstType substType) {
- int num = substitutions.size() - 1;
- substitutions.set(num, name);
- substitutionTypes.put(num, substType);
- if (DEBUG) System.out.println(num+" ::= " + name + " -- > " + substType);
- }
-
- /**
- * Pop the current decoded string as in {@link #pop()}
- * and remember the string as a substitution.
- * @return String
- */
- public String popAndRemember(SubstType substType) {
- String name = pop();
- remember(name, substType);
- return name;
- }
-
- public char peek() {
- return index < symbol.length ? symbol[index] : 0;
- }
-
- public char peek(int offset) {
- return index + offset < symbol.length ? symbol[index + offset] : 0;
- }
-
- public void consume(char ch) throws UnmanglingException {
- if (ch != get())
- throw unexpected();
- }
- public char get() {
- return index < symbol.length ? symbol[index++] : 0;
- }
-
- public void unget() {
- if (index > 0) index--;
- }
- public void skip() {
- if (index < symbol.length)
- index++;
- }
-
- public void skip2() {
- index = Math.min(index + 2, symbol.length);
- }
-
- public boolean done() {
- return index >= symbol.length;
- }
-
- public UnmanglingException unexpected() {
- return new UnmanglingException("Unexpected text at " + getRemaining(), buffer.toString());
- }
- public UnmanglingException unexpected(String what) {
- return new UnmanglingException("Wanted " + what + " but got unexpected text at " + getRemaining(), buffer.toString());
- }
- public UnmanglingException notImplemented() {
- return new UnmanglingException("Unimplemented at " + getRemaining(),
- buffer.toString());
- }
-
- /**
- * @return
- */
- private String getRemaining() {
- if (index >= symbol.length)
- return "";
- return new String(symbol, index, symbol.length - index);
- }
-
- /**
- * @throws UnmanglingException
- *
- */
- public void throwIfDone() throws UnmanglingException {
- if (done())
- throw new UnmanglingException("Unexpected end of symbol",
- buffer.toString());
- }
-
- public void updateSubstitution(SubstType substType) {
- int num = substitutions.size() - 1;
- substitutionTypes.put(num, substType);
- if (DEBUG) System.out.println(num + " ::= " + substType);
- }
-
- /**
- * @return
- */
- public SubstType lastSubstitution() {
- return substitutionTypes.get(substitutions.size() - 1);
- }
-
- /**
- * @param arg
- */
- public void rememberTemplateArg(String arg) {
- templateArgs.add(arg);
- }
-
- /**
- * @param num
- * @return
- * @throws UnmanglingException
- */
- public String getTemplateArg(int num) throws UnmanglingException {
- num -= templateArgBase;
- if (num < 0 || num >= templateArgs.size())
- throw unexpected("template argument in range 0-" + (templateArgs.size() - templateArgBase)+"; got " + num);
- return templateArgs.get(num);
- }
-
- public String lastSubstitutedName() {
- if (lastTypeNameIndex < 0)
- return "";
- return substitutions.get(lastTypeNameIndex);
- }
- }
-
- private static WeakHashMap<String, String> unmangledMap = new WeakHashMap<String, String>();
- private static WeakHashMap<String, String> withoutArgsMap = new WeakHashMap<String, String>();
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IUnmangler#undecorate(java.lang.String)
- */
- public String undecorate(String symbol) {
- // symbols may have @@GLIBC... type suffixes
- int atat = symbol.indexOf("@@");
- if (atat > 0)
- symbol = symbol.substring(0, atat);
- return symbol;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IUnmangler#isMangled(java.lang.String)
- */
- public boolean isMangled(String symbol) {
- if (symbol == null)
- return false;
- if (symbol.startsWith("_Z"))
- return true;
- // this is used for enum constants
- if (symbol.startsWith("__N"))
- return true;
- return false;
- }
-
- public String unmangleWithoutArgs(String symbol) throws UnmanglingException {
- return unmangle(symbol, true);
- }
-
- public String unmangle(String symbol) throws UnmanglingException {
- return unmangle(symbol, false);
- }
-
- public String unmangleType(String symbol) throws UnmanglingException {
- if (symbol == null)
- return null;
-
- if (unmangledMap.containsKey(symbol))
- return unmangledMap.get(symbol);
-
- if (symbol.startsWith("_Z")) {
- UnmangleState state = new UnmangleState(symbol, false);
- state.skip2();
- String unmangled = "";
- if (state.peek() == 'S') {
- unmangled += unmangleSubstitution(state);
- }
- while (!state.done()) {
- if (state.peek() == 'I') {
- // unscoped-template-name
- state.remember(unmangled, SubstType.TEMPLATE_PREFIX);
- String args = unmangleTemplateArgs(state, false);
- state.buffer.append(args);
- unmangled += args;
- } else {
- if (unmangled.equals("::std"))
- unmangled += "::";
- unmangled += unmangleType(state);
- }
- state.remember(unmangled, SubstType.TYPE);
- }
- unmangledMap.put(symbol, unmangled);
- return unmangled;
- }
- return symbol;
- }
-
- public String unmangle(String symbol, boolean skipArgs) throws UnmanglingException {
- if (symbol == null)
- return null;
-
- String unmangled;
-
- if (skipArgs) {
- if (withoutArgsMap.containsKey(symbol))
- unmangled = withoutArgsMap.get(symbol);
- else {
- unmangled = doUnmangle(symbol, true);
- withoutArgsMap.put(symbol, unmangled);
- }
- } else if (unmangledMap.containsKey(symbol)) {
- unmangled = unmangledMap.get(symbol);
- } else {
- unmangled = doUnmangle(symbol, skipArgs);
- unmangledMap.put(symbol, unmangled);
-
- do {// for break below if conditionals succeed
- int paren = unmangled.indexOf('(');
- if (0 < paren) {
- String unmangledWithoutArgs = unmangled.substring(0, paren-1);
- if (unmangledWithoutArgs != null && unmangledWithoutArgs.length() != 0) {
- withoutArgsMap.put(symbol, unmangledWithoutArgs);
- break;
- } }
- withoutArgsMap.put(symbol, unmangled);
- } while (false);// allows break above to skip default case
- }
-
- return unmangled;
- }
-
- /**
- * @param symbol
- * @return
- * @throws UnmanglingException
- */
- private String doUnmangle(String symbol, boolean nameOnly) throws UnmanglingException {
- /*
- Entities with C linkage and global namespace variables are not mangled. Mangled names have the general structure:
-
-
- <mangled-name> ::= _Z <encoding>
- <encoding> ::= <function name> <bare-function-type>
- ::= <data name>
- ::= <special-name>
- */
- if (symbol.startsWith("_Z")) {
- String suffix = "";
- int idx = symbol.indexOf('@');
- if (idx >= 0) {
- suffix = symbol.substring(idx);
- symbol = symbol.substring(0, idx);
- }
-
- UnmangleState state = new UnmangleState(symbol, nameOnly);
- state.skip2();
-
- String unmangled = unmangleEncoding(state);
- unmangled += suffix;
- return unmangled;
- } else if (symbol.startsWith("__N")) {
- UnmangleState state = new UnmangleState(symbol, true);
- state.skip2();
-
- String unmangled = unmangleName(state);
- return unmangled;
- } else {
- return symbol;
- }
- }
-
- /*
- <encoding> ::= <function name> <bare-function-type>
- ::= <data name>
- ::= <special-name>
- */
- private String unmangleEncoding(UnmangleState state) throws UnmanglingException {
- state.push();
-
- String name;
-
- // ferret out <special-name>
- char ch = state.peek();
- if (ch == 'T' || ch == 'G') {
- name = unmangleSpecialName(state);
- } else {
- name = unmangleName(state);
- }
-
- if (!state.done() && !state.nameOnly) {
- boolean isTemplate = name.endsWith(">"); // HACK
- if (isTemplate) {
- state.buffer.append(unmangleType(state));
- state.buffer.append(' ');
- }
- state.buffer.append(name);
- state.buffer.append(unmangleBareFunctionType(state, false));
- } else {
- state.buffer.append(name);
- }
-
- return state.pop();
- }
-
- private void unmangleSpecialNameCallOffset(UnmangleState state, char ch)
- throws UnmanglingException {
-
- switch (ch) {
- case 'h': {
- // h <nv-offset> _
- int offset = doUnmangleNumber(state);
- state.consume('_');
- state.buffer.append("<non-virtual base override at offset ");
- appendHexNumber(state.buffer, offset);
- break;
- }
- case 'v': {
- // v <offset number> _ <virtual offset number> _
- int offset = doUnmangleNumber(state);
- state.consume('_');
- int voffset = doUnmangleNumber(state);
- state.consume('_');
- state.buffer.append("<virtual base override at offset ");
- appendHexNumber(state.buffer, offset);
- state.buffer.append(", vcall offset ");
- appendHexNumber(state.buffer, voffset);
- break;
- }
- default:
- throw state.unexpected("special name call-offset");
- }
- }
-
- /*
- <special-name> ::= TV <type> # virtual table
- ::= TT <type> # VTT structure (construction vtable index)
- ::= TI <type> # typeinfo structure
- ::= TS <type> # typeinfo name (null-terminated byte string)
- <special-name> ::= GV <object name> # Guard variable for one-time initialization
- # No <type>
- <special-name> ::= T <call-offset> <base encoding>
- # base is the nominal target function of thunk
- <call-offset> ::= h <nv-offset> _
- ::= v <v-offset> _
- <nv-offset> ::= <offset number>
- # non-virtual base override
- <v-offset> ::= <offset number> _ <virtual offset number>
- # virtual base override, with vcall offset
-
- <special-name> ::= Tc <call-offset> <call-offset> <base encoding>
- # base is the nominal target function of thunk
- # first call-offset is 'this' adjustment
- # second call-offset is result adjustment
-
- */
- private String unmangleSpecialName(UnmangleState state) throws UnmanglingException {
- state.push();
-
- char ch = state.get();
- if (ch == 'T') {
- String type = null;
- ch = state.get();
- switch (ch) {
- case 'V':
- type = unmangleType(state);
- state.buffer.append("<virtual table for ");
- state.buffer.append(type);
- state.buffer.append('>');
- break;
- case 'T':
- type = unmangleType(state);
- state.buffer.append("<VTT structure for ");
- state.buffer.append(type);
- state.buffer.append('>');
- break;
- case 'I':
- type = unmangleType(state);
- state.buffer.append("<typeinfo structure for ");
- state.buffer.append(type);
- state.buffer.append('>');
- break;
- case 'S':
- type = unmangleType(state);
- state.buffer.append("<typeinfo name for ");
- state.buffer.append(type);
- state.buffer.append('>');
- break;
- case 'h':
- case 'v':
- unmangleSpecialNameCallOffset(state, ch);
- state.buffer.append(" for ");
- state.buffer.append(unmangleEncoding(state));
- state.buffer.append('>');
- break;
- case 'c': {
- // c <call-offset> <call-offset> <base encoding>
- state.buffer.append("<covariant : 'this' adjustment ");
- unmangleSpecialNameCallOffset(state, state.get());
- state.buffer.append("> result adjustment ");
- unmangleSpecialNameCallOffset(state, state.get());
- state.buffer.append("> for ");
- state.buffer.append(unmangleEncoding(state));
- state.buffer.append('>');
- break;
- }
- default:
- throw state.unexpected("special name");
- }
- } else if (ch == 'G') {
- switch (state.get()) {
- case 'V':
- state.buffer.append("<one-time-init guard for ");
- state.buffer.append(unmangleName(state));
- state.buffer.append('>');
- break;
- default:
- throw state.unexpected("special name");
- }
- }
-
- return state.pop();
- }
-
- private void appendHexNumber(StringBuilder builder, int offset) {
- if (offset < 0) {
- builder.append("-0x");
- builder.append(Integer.toHexString(-offset));
- } else {
- builder.append("0x");
- builder.append(Integer.toHexString(offset));
- }
- }
-
- /**
- * @param state
- * @param name
- * @return
- * @throws UnmanglingException
- */
- private String doUnmangleFunctionWithName(UnmangleState state, boolean expectReturn, String name) throws UnmanglingException {
- state.push();
-
- state.consume('F');
-
- if (expectReturn) {
- state.buffer.append(unmangleType(state));
- state.buffer.append(' ');
- }
-
- if (name != null)
- state.buffer.append(name);
-
- state.buffer.append(unmangleBareFunctionType(state, false));
-
- state.consume('E');
-
- return state.pop();
- }
-
- /**
- * @param state
- * @param expectReturn true if a return type precedes argument list
- * @throws UnmanglingException
- */
- private String unmangleBareFunctionType(UnmangleState state, boolean expectReturn) throws UnmanglingException {
- state.push();
- if (expectReturn) {
- state.buffer.append(unmangleType(state));
- state.buffer.append(' ');
- }
- state.buffer.append('(');
- if (state.peek() == 'v') {
- state.skip();
- } else {
- boolean first = true;
- while (!state.done() && state.peek() != 'E') {
- if (first) {
- first = false;
- } else {
- state.buffer.append(',');
- }
- state.buffer.append(unmangleType(state));
- }
- }
- state.buffer.append(')');
- return state.pop();
- }
-
- /*
- <name> ::= <nested-name> = N ...
- ::= <unscoped-name> = number or St ...
- ::= <unscoped-template-name> <template-args> = unscoped | S ... | I ...
- ::= <local-name> # See Scope Encoding below = Z ...
-
- */
- private String unmangleName(UnmangleState state) throws UnmanglingException {
- state.push();
- char ch = state.peek();
- if (ch == 'N') {
- state.buffer.append(unmangleNestedName(state, true));
- } else if (ch == 'Z') {
- state.buffer.append(unmangleLocalName(state));
- } else if (ch == 0) {
- state.throwIfDone();
- } else {
- // must be unscoped-name or unscoped-template-name
-
- if (ch == 'S' && state.peek(1) == 't') {
- state.skip2();
- state.buffer.append("::std::");
- }
- String name = unmangleUnqualifiedName(state);
- state.buffer.append(name);
- if (state.peek() == 'I') {
- // unscoped-template-name
- state.remember(name, SubstType.TEMPLATE_PREFIX);
- String args = unmangleTemplateArgs(state, false);
- state.buffer.append(args);
- state.remember(name + args, SubstType.TYPE);
- }
- }
- return state.pop();
- }
-
- /*
- <local-name> := Z <function encoding> E <entity name> [<discriminator>]
- := Z <function encoding> E s [<discriminator>]
-
- <discriminator> := _ <non-negative number> # when number < 10
- := __ <non-negative number> _ # when number >= 10
-
- */
- private String unmangleLocalName(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('Z');
- state.buffer.append(unmangleEncoding(state));
- state.consume('E');
-
- boolean isStringLiteral = false;
- if (state.peek() == 's') {
- isStringLiteral = true;
- state.skip();
- if (state.peek() == '_')
- state.buffer.append("::");
- } else {
- addNameWithColons(state, unmangleName(state));
- }
- if (state.peek() == '_') {
- state.skip();
- int num;
- if (state.peek() == '_') {
- // >= 10
- num = doUnmangleNonNegativeNumber(state);
- state.consume('_');
- } else {
- char ch = state.get();
- if (ch >= '0' && ch <= '9') {
- num = ch - '0';
- } else {
- throw state.unexpected("number");
- }
- }
- if (isStringLiteral)
- state.buffer.append("string literal");
- state.buffer.append("#" + num);
- }
- return state.pop();
- }
-
- /*
- <source-name> ::= <positive length number> <identifier>
- <number> ::= [n] <non-negative decimal integer>
- <identifier> ::= <unqualified source code identifier>
- */
- private String unmangleSourceName(UnmangleState state) throws UnmanglingException {
- state.push();
- char ch = state.peek();
- if (ch >= '0' && ch <= '9') {
- int length = doUnmangleNumber(state);
- while (length-- > 0) {
- state.throwIfDone();
- state.buffer.append(state.get());
- }
- return state.pop();
- } else {
- throw state.unexpected();
- }
- }
-
- /*
- * [0-9]+
- */
- private int doUnmangleNonNegativeNumber(UnmangleState state) {
- int number = 0;
- char ch;
- while ((ch = state.get()) != 0 && ch >= '0' && ch <= '9') {
- number = number * 10 + (ch - '0');
- }
- state.unget();
- return number;
- }
-
- /*
- * [n] <non-negative decimal number>
- */
- private int doUnmangleNumber(UnmangleState state) {
- boolean neg = false;
- if (state.peek() == 'n') {
- state.skip();
- neg = true;
- }
- int number = doUnmangleNonNegativeNumber(state);
- return neg ? -number : number;
- }
-
- /*
- <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
- ::= N [<CV-qualifiers>] <template-prefix> <template-args> E (args = I...)
-
- */
- private String unmangleNestedName(UnmangleState state, boolean allowCV)
- throws UnmanglingException {
-
- state.push();
-
- state.consume('N');
-
- String cvquals = allowCV ? unmangleCVQualifiers(state) : null;
-
- state.buffer.append(unmanglePrefix(state, SubstType.PREFIX));
-
- state.consume('E');
-
- if (allowCV && (cvquals != null && cvquals.length() > 0)) {
- state.buffer.append(' ');
- state.buffer.append(cvquals);
- }
- return state.pop();
- }
-
-
- /*
- <template-args> ::= I <template-arg>+ E
-
- */
- private String unmangleTemplateArgs(UnmangleState state, boolean substArg) throws UnmanglingException {
- state.push();
-
- int origTypeIndex = state.lastTypeNameIndex;
-
- String typeName = state.lastSubstitutedName();
-
- if (!substArg || state.peek() == 'I') {
- state.consume('I');
- substArg = false;
- }
- state.buffer.append('<');
- boolean lastArgWasSubst = false;
- if (state.peek() != 'E') {
- boolean first = true;
- do {
- if (first)
- first = false;
- else
- state.buffer.append(',');
- boolean unfinishedTemplateSubst = false;
- if (state.peek() == 'S') {
- char ch2 = state.peek(1);
- if (ch2 == 't') {
- state.buffer.append("::std::");
- state.skip2();
- first = true;
- continue; // more of this arg to come
- }
- lastArgWasSubst = true;
- if (ch2 == 'a' || ch2 == 'b') {
- unfinishedTemplateSubst = true;
- }
- }
- String arg = unmangleTemplateArg(state);
- if (unfinishedTemplateSubst)
- arg += unmangleTemplateArgs(state, false);
- state.buffer.append(arg);
- if (lastArgWasSubst && state.done())
- break;
- lastArgWasSubst = false;
- } while (state.peek() != 'E');
- }
-
- if (!substArg && !lastArgWasSubst)
- state.consume('E');
-
- if (state.buffer.lastIndexOf(">") == state.buffer.length() - 1)
- state.buffer.append(' ');
- state.buffer.append('>');
-
- if (state.lastSubstitution() == SubstType.TEMPLATE_TEMPLATE_PARAM)
- state.rememberInstead(typeName + state.current(), SubstType.TEMPLATE_TEMPLATE_PARAM);
- else if (state.lastTypeNameIndex > origTypeIndex)
- state.remember(typeName + state.current(), SubstType.TYPE);
- state.lastTypeNameIndex = origTypeIndex;
-
- return state.pop();
- }
-
- /*
- <template-arg> ::= <type> # type or template
- ::= X <expression> E # expression
- ::= <expr-primary> # simple expressions ('L')
- ::= I <template-arg>* E # argument pack
- ::= sp <expression> # pack expansion of (C++0x)
-
- */
- private String unmangleTemplateArg(UnmangleState state) throws UnmanglingException {
- state.push();
-
- String arg = null;
- char ch = state.peek();
- if (ch == 'X') {
- throw state.notImplemented();
- } else if (ch == 'I') {
- arg = unmangleTemplateArgs(state, false);
- } else if (ch == 's' && state.peek(1) == 'p') {
- throw state.notImplemented();
- } else if (ch == 'L') {
- arg = unmangleExprPrimary(state);
- } else {
- arg = unmangleType(state);
- }
- state.rememberTemplateArg(arg);
- state.buffer.append(arg);
-
- return state.pop();
- }
-
-
- /**
-<expr-primary> ::= L <type> <value number> E # integer literal
- ::= L <type> <value float> E # floating literal
- ::= L <string type> E # string literal
- ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
- ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
- ::= L <mangled-name> E # external name
-
- * @param state
- * @return
- */
- private String unmangleExprPrimary(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('L');
-
- try {
- state.safePush();
-
- String type = null;
- String suffix = null;
- switch (state.peek()) {
- case 'i': // int
- suffix = "";
- break;
- case 'j': // unsigned int
- suffix = "U";
- break;
- case 'l': // long
- suffix = "L";
- break;
- case 'm': // unsigned long
- suffix = "UL";
- break;
- case 'x': // long long
- suffix = "LL";
- break;
- case 'y': // unsigned long long
- suffix = "ULL";
- break;
- }
- if (suffix != null) {
- state.skip();
- state.buffer.append(doUnmangleNumber(state));
- state.buffer.append(suffix);
- } else {
- // show other types
- type = unmangleType(state);
- state.buffer.append('(');
- state.buffer.append(type);
- state.buffer.append(')');
- state.buffer.append(doUnmangleNumber(state));
- }
- state.safePop();
- } catch (UnmanglingException e) {
- state.safeBacktrack();
-
- // must be mangled-name or something else
- state.buffer.append(unmangleName(state));
- }
- state.consume('E');
-
- return state.popAndRemember(SubstType.TEMPLATE_TEMPLATE_PARAM);
-
- }
- /*
- <template-param> ::= T_ # first template parameter
- ::= T <parameter-2 non-negative number> _
-
- */
- private String unmangleTemplateParam(UnmangleState state) throws UnmanglingException {
- state.push();
-
- state.consume('T');
- int num = doUnmangleBase10(state);
- state.buffer.append(state.getTemplateArg(num));
-
- return state.popAndRemember(SubstType.TEMPLATE_TEMPLATE_PARAM);
- }
-
- /**
- * Base-10, where _ = 0 and 1..x = 0..x-1
- * @param state
- * @return
- * @throws UnmanglingException
- */
- private int doUnmangleBase10(UnmangleState state) throws UnmanglingException {
- char ch;
- if (state.peek() == '_') {
- state.skip();
- return 0;
- }
- int num = 0;
- while ((ch = state.get()) != '_') {
- state.throwIfDone();
- num = (num * 10) + (ch - '0');
- }
- return num + 1;
- }
-
- /*
- <substitution> ::= S <seq-id> _
- ::= S_
-
- <substitution> ::= St # ::std::
- <substitution> ::= Sa # ::std::allocator
- <substitution> ::= Sb # ::std::basic_string
- <substitution> ::= Ss # ::std::basic_string < char,
- ::std::char_traits<char>,
- ::std::allocator<char> >
- <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
- <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
- <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
-
- */
- private String unmangleSubstitution(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('S');
-
- char ch = state.peek();
- if (ch == '_' || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')) {
- int num = doUnmangleBase36(state);
- if (num < 0 || num >= state.substitutions.size())
- throw state.unexpected("substitution id in the range 0-"+ state.substitutions.size() + " but got " + num);
- String val = state.substitutions.get(num);
-
- SubstType type = state.substitutionTypes.get(num);
- switch (type) {
- case PREFIX:
- //...?
- state.buffer.append(val);
- break;
- case TEMPLATE_PREFIX:
- state.buffer.append(val);
- state.buffer.append(unmangleTemplateArgs(state, true));
- break;
- case TEMPLATE_TEMPLATE_PARAM:
- state.buffer.append(val);
- break;
- case QUAL_TYPE:
- case TYPE:
- // ...?
- state.buffer.append(val);
- break;
- }
- } else {
- switch (ch) {
- case 't':
- state.buffer.append("::std"); break;
- case 'a':
- state.buffer.append("::std::allocator"); break;
- case 'b':
- state.buffer.append("::std::basic_string"); break;
- case 's':
- state.buffer.append("::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >"); break;
- case 'i':
- state.buffer.append("::std::basic_istream<char,::std::char_traits<char> >"); break;
- case 'o':
- state.buffer.append("::std::basic_ostream<char,::std::char_traits<char> >"); break;
- case 'd':
- state.buffer.append("::std::basic_iostream<char,::std::char_traits<char> >"); break;
- default:
- throw state.unexpected("std:: substitution");
- }
- state.skip();
- }
-
- return state.pop();
- }
-
- /**
- * As a special case, the first substitutable entity is encoded as "S_",
- * i.e. with no number, so the numbered entities are the second one as
- * "S0_", the third as "S1_", the twelfth as "SA_", the thirty-eighth as
- * "S10_", etc.
- * @throws UnmanglingException
- */
- private int doUnmangleBase36(UnmangleState state) throws UnmanglingException {
- int num = 0;
- char ch = state.peek();
- if (ch == '_') {
- state.skip();
- return 0;
- }
- while ((ch = state.get()) != '_') {
- state.throwIfDone();
- num = (num * 10);
- if (ch >= '0' && ch <= '9')
- num += (ch - '0');
- else if (ch >= 'A' && ch <= 'Z')
- num += (ch - 'A') + 10;
- else
- throw state.unexpected("BASE-36 number");
- }
- return num + 1;
- }
-
- /*
- <prefix> ::= <prefix> <unqualified-name> # ... 0-9
- ::= <template-prefix> <template-args> --> template=T... args=I...
- ::= <template-param> --> T...
- ::= # empty
- ::= <substitution> --> S...
- ::= <prefix> <data-member-prefix> --> name M
-
- left-recursion elimination:
- <prefix> ::= <template-prefix> <template-args> <prefix'>
- ::= <template-param> <prefix'>
- ::= <substitution> <prefix'>
- ::= # empty
- <prefix'> ::= <unqualified-name> <prefix'>
- ::= <data-member-prefix> M <prefix'>
- ::= #empty
- */
- private String unmanglePrefix(UnmangleState state, SubstType substType) throws UnmanglingException {
- state.push();
-
- boolean any = false;
- boolean lastSubst = false;
-
- while (true) {
- char ch = state.peek();
-
- if (ch == 'E') {
- break;
- }
-
- String part = null;
-
- if (ch == 'T') {
- part = unmangleTemplateParam(state);
- state.remember(substType);
- }
- else if (ch == 'S') {
- part = unmangleSubstitution(state);
- lastSubst = true;
- }
- else if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z')
- || (ch == 'C' || ch == 'D' || ch == 'L')) {
- part = unmangleUnqualifiedName(state);
- }
- else if (ch == 'I') {
- if (!any)
- throw state.unexpected();
-
- if (state.hasCurrent()) {
- state.updateSubstitution(SubstType.TEMPLATE_PREFIX);
- part = state.current();
- }
- String args = unmangleTemplateArgs(state, false);
- state.buffer.append(args);
- continue;
- }
- else {
- throw state.unexpected();
- }
-
- lastSubst = false;
- any = true;
-
- if (lastSubst)
- any = true;
- if (state.hasCurrent()) {
- addNameWithColons(state, part);
- } else {
- state.buffer.append(part);
- }
-
- if (ch != 'S' && state.peek() != 'E') {
- state.remember(substType);
- }
- }
-
-
- return state.pop();
- }
-
- /**
- * @param state
- * @param name
- */
- private void addNameWithColons(UnmangleState state, String name) {
- if (state.hasCurrent() && !name.startsWith("::"))
- state.buffer.append("::");
- state.buffer.append(name);
- }
-
- /*
- <template-prefix> ::= <prefix> <template unqualified-name> ... 0-9
- ::= <template-param> # T*
- ::= <substitution> # S*
- --> followed by <template-args> (I)
-
- left-recursion elimination:
- <template-prefix> ::= <template-param> <template-prefix'> # T*
- ::= <substitution> <template-prefix'> # S*
- <template-prefix'> ::= <template unqualified-name> <template-prefix'> ... 0-9
- ::= #empty
- --> followed by <template-args> (I)
- */
- String unmangleTemplatePrefix(UnmangleState state) throws UnmanglingException {
- state.push();
-
- char ch = state.peek();
- if (ch == 'S') {
- state.buffer.append(unmangleSubstitution(state));
- state.buffer.append(unmangleTemplatePrefixPrime(state));
- return state.pop();
- }
-
- if (ch == 'T') {
- state.buffer.append(unmangleTemplateParam(state));
- state.buffer.append(unmangleTemplatePrefixPrime(state));
- }
-
- return state.popAndRemember(SubstType.TEMPLATE_PREFIX);
- }
-
- private String unmangleTemplatePrefixPrime(UnmangleState state) throws UnmanglingException {
- state.push();
- while (true) {
- try {
- state.buffer.append(unmangleUnqualifiedName(state));
- if (state.peek() == 'I') {
- // unscoped-template-name
- state.buffer.append(unmangleTemplateArgs(state, false));
- }
- } catch (UnmanglingException e) {
- break;
- }
- }
-
- return state.pop();
- }
-
- /*
-<type> ::= <builtin-type> = rVKPROCGU ...
- ::= <function-type> =
- ::= <class-enum-type>
- ::= <array-type>
- ::= <pointer-to-member-type> = M...
- ::= <template-param>
- ::= <template-template-param> <template-args>
- ::= <substitution> # See Compression below
-
- <type> ::= <CV-qualifiers> <type>
- ::= P <type> # pointer-to
- ::= R <type> # reference-to
- ::= O <type> # rvalue reference-to (C++0x)
- ::= C <type> # complex pair (C 2000)
- ::= G <type> # imaginary (C 2000)
- ::= U <source-name> <type> # vendor extended type qualifier
-
- <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
- */
- private String unmangleType(UnmangleState state) throws UnmanglingException {
- state.push();
- char ch = state.get();
- switch (ch) {
- //
- // qualified types
- //
- case 'r':
- case 'V':
- case 'K':
- state.unget();
- String cvquals = unmangleCVQualifiers(state);
- state.buffer.append(unmangleType(state));
- if (cvquals.length() > 0) {
- state.buffer.append(' ');
- state.buffer.append(cvquals);
- }
- if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
- state.remember(SubstType.QUAL_TYPE);
- return state.popAndRemember(SubstType.QUAL_TYPE);
- case 'P':
- state.buffer.append(unmangleType(state));
- if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
- state.remember(SubstType.QUAL_TYPE);
- ptrOrRefize(state.buffer, "*");
- return state.popAndRemember(SubstType.QUAL_TYPE);
- case 'R':
- state.buffer.append(unmangleType(state));
- if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
- state.remember(SubstType.QUAL_TYPE);
- ptrOrRefize(state.buffer, "&");
- return state.popAndRemember(SubstType.QUAL_TYPE);
- case 'O': // rvalue reference-to
- case 'C': // complex pair
- case 'G': // imaginary
- throw state.notImplemented();
- case 'U': // vendor extension
- {
- // TODO: assuming the extension precedes the type,
- // e.g. int __declspec(dllimport) foo();
- state.buffer.append(unmangleSourceName(state));
- state.buffer.append(' ');
- state.buffer.append(unmangleType(state));
- return state.popAndRemember(SubstType.TYPE);
- }
-
- //
- // built-in types
- //
- case 'v':
- state.buffer.append("void"); break;
- case 'w':
- state.buffer.append("wchar_t"); break;
- case 'b':
- state.buffer.append("bool"); break;
- case 'c':
- state.buffer.append("char"); break;
- case 'a':
- state.buffer.append("signed char"); break;
- case 'h':
- state.buffer.append("unsigned char"); break;
- case 's':
- state.buffer.append("short"); break;
- case 't':
- state.buffer.append("unsigned short"); break;
- case 'i':
- state.buffer.append("int"); break;
- case 'j':
- state.buffer.append("unsigned int"); break;
- case 'l':
- state.buffer.append("long"); break;
- case 'm':
- state.buffer.append("unsigned long"); break;
- case 'x':
- state.buffer.append("long long"); break;
- case 'y':
- state.buffer.append("unsigned long long"); break;
- case 'n':
- state.buffer.append("__int128"); break;
- case 'o':
- state.buffer.append("unsigned __int128"); break;
- case 'f':
- state.buffer.append("float"); break;
- case 'd':
- state.buffer.append("double"); break;
- case 'e':
- state.buffer.append("long double"); break;
- case 'g':
- state.buffer.append("__float128"); break;
- case 'z':
- state.buffer.append("..."); break;
- case 'D': {
- ch = state.get();
- switch (ch) {
- case 'd':
- state.buffer.append("::std::decimal::decimal64"); break;
- case 'e':
- state.buffer.append("::std::decimal::decimal128"); break;
- case 'f':
- state.buffer.append("::std::decimal::decimal32"); break;
- case 'h':
- state.buffer.append("::std::decimal::binary16"); break; // TODO: a guess; what's the actual C++ name for the half-float?
- case 'i':
- state.buffer.append("char32_t"); break;
- case 's':
- state.buffer.append("char16_t"); break;
- default:
- // Dp, Dt, DT
- state.unget(); throw state.notImplemented();
- }
- }
- case 'u':
- state.buffer.append(unmangleName(state));
- return state.popAndRemember(SubstType.TYPE);
-
- //
- // <class-enum-type> ::= <unqualified-name> | <nested-name>
- //
- case 'N':
- state.unget();
- state.buffer.append(unmangleNestedName(state, false));
- state.remember(SubstType.TYPE);
- break;
-
- case 'F':
- // <function-type> ::= F [Y] <bare-function-type> E
- if (state.peek() == 'Y') {
- state.skip();
- state.buffer.append("extern \"C\" ");
- }
- state.buffer.append(unmangleBareFunctionType(state, true));
- state.consume('E');
- state.remember(SubstType.TYPE);
- break;
-
- case 'M': {
- state.unget();
- String name = unmanglePtm(state);
- state.buffer.append(name);
- state.remember(name, SubstType.TYPE);
- break;
- }
-
- case 'S':
- state.unget();
- state.buffer.append(unmangleSubstitution(state));
- break;
-
- case 'T':
- // either <template-param> or <template-template-param> <template-args>
- state.unget();
- state.buffer.append(unmangleTemplateParam(state));
- if (state.peek() == 'I') {
- state.buffer.append(unmangleTemplateArgs(state, false));
- }
- break;
-
- case 'A':
- state.unget();
- state.buffer.append(unmangleArrayType(state));
- break;
-
- default:
- state.unget();
- String unqual = unmangleUnqualifiedName(state);
- state.buffer.append(unqual);
- if (state.peek() == 'I') {
- // unscoped-template-name
- state.remember(unqual, SubstType.TEMPLATE_PREFIX);
- state.buffer.append(unmangleTemplateArgs(state, false));
- }
- state.remember(SubstType.TYPE);
- break;
- }
- return state.pop();
- }
-
-
- /**
- * Insert a "*" or "&" into a string. If this is a function type,
- * insert in front of the argument list, not after.
- * @param buffer
- * @param string
- */
- private void ptrOrRefize(StringBuilder buffer, String string) {
- char last = buffer.length() > 0 ? buffer.charAt(buffer.length() - 1) : 0;
- if (last == ')' || last == ']') {
- char match = last == ')' ? '(' : '[';
- int stack = 0;
- int idx = buffer.length() - 1;
- while (idx > 0) {
- char ch = buffer.charAt(idx);
- if (ch == last)
- stack++;
- else if (ch == match) {
- stack--;
- if (stack == 0)
- break;
- }
- idx--;
- }
- buffer.insert(idx, '(' + string + ')');
- } else {
- buffer.append(string);
- }
- }
-
- /*
- <array-type> ::= A <positive dimension number> _ <element type>
- ::= A [<dimension expression>] _ <element type>
-
- */
- private String unmangleArrayType(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('A');
-
- String count;
-
- char ch = state.peek();
- if (ch >= '0' && ch <= '9') {
- int num = doUnmangleNonNegativeNumber(state);
- count = "" + num;
- } else {
- throw state.notImplemented();
- }
- state.consume('_');
-
- state.buffer.append(unmangleType(state));
-
- state.buffer.append('[');
- state.buffer.append(count);
- state.buffer.append(']');
-
- return state.pop();
- }
-
- /*
- <pointer-to-member-type> ::= M <class type> <member type>
- */
- private String unmanglePtm(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('M');
- String klass = unmangleType(state);
- String ptrquals = unmangleCVQualifiers(state);
- try {
- state.safePush();
- state.buffer.append(doUnmangleFunctionWithName(state, true, '(' + klass + "::*)"));
- state.safePop();
- } catch (UnmanglingException e) {
- // may be pointer to member (field)
- state.safeBacktrack();
- state.buffer.append(unmangleType(state));
- state.buffer.append(' ');
- state.buffer.append(klass);
- state.buffer.append("::*");
- }
- if (ptrquals.length() > 0) {
- state.buffer.append(' ');
- state.buffer.append(ptrquals);
- }
- return state.pop();
- }
-
- /**
- * Unmangle any sequence of CV quals
- * @param state state
- * @return String
- */
- private String unmangleCVQualifiers(UnmangleState state) {
- state.push();
- while (true) {
- boolean matched = true;
- switch (state.peek()) {
- case 'r':
- state.skip();
- if (state.hasCurrent()) state.buffer.append(' ');
- state.buffer.append("restrict");
- break;
- case 'V':
- state.skip();
- if (state.hasCurrent()) state.buffer.append(' ');
- state.buffer.append("volatile");
- break;
- case 'K':
- state.skip();
- if (state.hasCurrent()) state.buffer.append(' ');
- state.buffer.append("const");
- break;
- default:
- matched = false;
- break;
- }
- if (!matched)
- break;
- }
- return state.pop();
- }
-
- static class Operator {
- String name;
- /** for unary or binary ops; other questionable ones are 0 */
- int numops;
-
- public Operator(String name, int numops) {
- this.name = name;
- this.numops = numops;
- }
- }
-
- static Map<String, Operator> operators = new HashMap<String, Operator>();
-
- private static void registerOperator(String code, String name, int opcnt) {
- if (operators.containsKey(code))
- throw new IllegalStateException();
- operators.put(code, new Operator(name, opcnt));
- }
-
- static {
- registerOperator("nw", "new", 0);
- registerOperator("na", "new[]", 0);
- registerOperator("dl", "delete", 0);
- registerOperator("da", "delete[]", 0);
- registerOperator("ps", "+", 1);
- registerOperator("ng", "-", 1);
- registerOperator("ad", "&", 1);
- registerOperator("de", "*", 1);
- registerOperator("co", "~", 1);
- registerOperator("pl", "+", 2);
- registerOperator("mi", "-", 2);
- registerOperator("ml", "*", 2);
- registerOperator("dv", "/", 2);
- registerOperator("rm", "%", 2);
- registerOperator("an", "&", 2);
- registerOperator("or", "|", 2);
- registerOperator("eo", "^", 2);
- registerOperator("aS", "=", 2);
- registerOperator("pL", "+=", 2);
- registerOperator("mI", "-=", 2);
- registerOperator("mL", "*=", 2);
- registerOperator("dV", "/=", 2);
- registerOperator("rM", "%=", 2);
- registerOperator("aN", "&=", 2);
- registerOperator("oR", "|=", 2);
- registerOperator("eO", "^=", 2);
- registerOperator("ls", "<<", 2);
- registerOperator("rs", ">>", 2);
- registerOperator("lS", "<<=", 2);
- registerOperator("rS", ">>=", 2);
- registerOperator("eq", "==", 2);
- registerOperator("ne", "!=", 2);
- registerOperator("lt", "<", 2);
- registerOperator("gt", ">", 2);
- registerOperator("le", "<=", 2);
- registerOperator("ge", ">=", 2);
- registerOperator("nt", "!", 1);
- registerOperator("aa", "&&", 2);
- registerOperator("oo", "||", 2);
- registerOperator("pp", "++", 1);
- registerOperator("mm", "--", 1);
- registerOperator("cm", ",", 2);
- registerOperator("pm", "->*", 2);
- registerOperator("pt", "->", 2);
- registerOperator("cl", "()", 1);
- registerOperator("ix", "[]", 2);
- registerOperator("qu", "?", 3);
- registerOperator("st", "sizeof ", 0); // type
- registerOperator("sz", "sizeof", 1); // expression
- registerOperator("at", "alignof ", 0); // type
- registerOperator("az", "alignof", 1); // expression
- registerOperator("cv", "()", 1);
- }
-
- /*
- <unqualified-name> ::= <operator-name> = lowercase
- ::= <ctor-dtor-name> = C1-3 D0-2 ...
- ::= <source-name> = <number> ...
- ::= <unnamed-type-name> = Ut ...
-
- */
- private String unmangleUnqualifiedName(UnmangleState state) throws UnmanglingException {
- char ch = state.peek();
- if (ch >= '0' && ch <= '9') {
- return unmangleSourceName(state);
- }
- else if (ch >= 'a' && ch <= 'z') {
- return unmangleOperatorName(state);
- }
- else if (ch == 'U') {
- return unmangleUnnamedTypeName(state);
- }
- else if (ch == 'C') {
- state.push();
- String last = simpleName(state.lastSubstitutedName());
- state.get();
- switch (state.get()) {
- case '1':
- case '2':
- case '3':
- state.buffer.append(last);
- return state.pop();
- default:
- state.unget();
- throw state.unexpected("constructor name");
- }
- }
- else if (ch == 'D') {
- state.push();
- String last = simpleName(state.lastSubstitutedName());
- state.get();
- state.buffer.append('~');
- state.buffer.append(last);
- switch (state.get()) {
- case '0':
- return state.pop();
- case '1':
- return state.pop();
- case '2':
- return state.pop();
- default:
- state.unget();
- throw state.unexpected("destructor name");
- }
- }
- throw state.unexpected();
- }
-
- /**
- * @param name
- * @return
- */
- private String simpleName(String name) {
- int idx = name.lastIndexOf("::");
- if (idx >= 0)
- return name.substring(idx + 2);
- return name;
- }
-
- /*
- <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
- <unnamed-type-name> ::= <closure-type-name>
-
- <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
-
- */
- private String unmangleUnnamedTypeName(UnmangleState state) throws UnmanglingException {
- state.push();
- state.consume('U');
- switch (state.get()) {
- case 't':
- state.buffer.append("<unnamed #");
- if (state.peek() != '_') {
- state.buffer.append("" + (doUnmangleNonNegativeNumber(state) + 2));
- } else {
- state.buffer.append("1");
- }
- state.buffer.append('>');
- state.consume('_');
- break;
- case 'l':
- throw state.notImplemented();
- default:
- throw state.unexpected();
- }
- return state.pop();
- }
-
- /*
- */
- private String unmangleOperatorName(UnmangleState state) throws UnmanglingException {
- state.push();
- char ch = state.get();
- String op = "" + ch;
- if (ch == 'v') {
- // vendor type <digit> <source-name>
- ch = state.get();
- if (ch >= '0' && ch <= '9') {
- int opcount = ch - '0';
- op = unmangleSourceName(state);
- boolean first = true;
-
- // pretend it's a function, to differentiate
- state.buffer.append('(');
- while (opcount-- > 0) {
- if (first)
- first = false;
- else
- state.buffer.append(',');
- }
- state.buffer.append(')');
- } else {
- throw state.unexpected();
- }
- return state.pop();
- }
-
- ch = state.get();
- if (!Character.isLetter(ch)) {
- throw state.unexpected();
- }
-
- op += ch;
-
- Operator oper = operators.get(op);
- if (oper == null) {
- throw state.unexpected();
- }
-
- state.buffer.append("operator ");
-
- // special cases
- if (op.equals("cv")) {
- state.buffer.append(unmangleType(state));
- // fall through
- }
-
- state.buffer.append(oper.name);
- return state.pop();
-
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.internal.symbols.files;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+import java.util.WeakHashMap;
+
+import org.eclipse.cdt.debug.edc.symbols.IUnmangler;
+
+/**
+ * Unmangler for the ARM/Itanium/etc. EABI (http://www.codesourcery.com/public/cxx-abi/abi.html)
+ * <p>
+ * TODO: <expression> <closure-type-name> <lambda-sig>
+ */
+public class UnmanglerEABI implements IUnmangler {
+
+ private static boolean DEBUG = false;
+
+ enum SubstType {
+ PREFIX,
+ TEMPLATE_PREFIX,
+ TYPE,
+ QUAL_TYPE,
+ TEMPLATE_TEMPLATE_PARAM,
+
+ }
+ public UnmanglerEABI() {
+
+ }
+
+ static class UnmangleState {
+ private char[] symbol;
+ private int index;
+ StringBuilder buffer;
+ private Stack<Integer> pushes ; // lengths of buffer when pushed
+ private List<String> substitutions;
+ private Map<Integer, SubstType> substitutionTypes;
+ private int lastTypeNameIndex;
+
+ private List<String> templateArgs;
+ private int templateArgBase;
+
+ private Stack<Integer> backtracks ; // grouped entries: index value, lengths of buffer, and substitutions length when pushed
+
+ private final boolean nameOnly;
+
+ public UnmangleState(String symbol, boolean nameOnly) {
+ this.symbol = symbol.toCharArray();
+ this.nameOnly = nameOnly;
+ index = 0;
+ buffer = new StringBuilder();
+ pushes = new Stack<Integer>();
+ substitutions = new ArrayList<String>();
+ substitutionTypes = new HashMap<Integer, UnmanglerEABI.SubstType>();
+ templateArgs = new ArrayList<String>();
+ backtracks = new Stack<Integer>();
+ lastTypeNameIndex = -1;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ String remaining = getRemaining();
+ if (remaining.length() == 0)
+ remaining = "<<end>>";
+ return "state: at [" + remaining + "], so far: " + current();
+ }
+
+ /**
+ * Push when entering a new decoding context (BNF expression).
+ */
+ public void push() {
+ pushes.push(buffer.length());
+ }
+
+ /**
+ * Pop the current decoded string and restore context to
+ * the calling context.
+ * @return decoded string
+ */
+ public String pop() {
+ int oldpos = pushes.isEmpty() ? 0 : pushes.pop();
+ String str = buffer.substring(oldpos, buffer.length());
+ buffer.setLength(oldpos);
+ return str;
+ }
+
+ /**
+ * Push all state, when entering a possible backtrack scenario.
+ * Use #safePop() if an operation succeeds, or #safeBacktrack()
+ * if it failed and you want to retry.
+ */
+ public void safePush() {
+ backtracks.push(index);
+ backtracks.push(lastTypeNameIndex);
+ backtracks.push(buffer.length());
+ backtracks.push(substitutions.size());
+ backtracks.push(pushes.size());
+ }
+
+ /**
+ * Call when a #safePush() branch has succeeded to discard backtrack state.
+ */
+ public void safePop() {
+ backtracks.pop();
+ backtracks.pop();
+ backtracks.pop();
+ backtracks.pop();
+ backtracks.pop();
+ }
+
+ /**
+ * Call when a #safePush() branch has failed to reset backtrack state.
+ * (To perform another backtrack, call #safePush() again)
+ */
+ public void safeBacktrack() {
+ int oldSize = backtracks.pop();
+ pushes.subList(oldSize, pushes.size()).clear();
+ oldSize = backtracks.pop();
+ substitutions.subList(oldSize, substitutions.size()).clear();
+ while (substitutionTypes.size() > oldSize)
+ substitutionTypes.remove(substitutionTypes.size() - 1);
+ buffer.setLength(backtracks.pop());
+ lastTypeNameIndex = backtracks.pop();
+ index = backtracks.pop();
+ }
+
+ /**
+ * Tell if there is any current string (length > 0)
+ * @return
+ */
+ public boolean hasCurrent() {
+ int oldpos = pushes.isEmpty() ? 0 : pushes.peek();
+ int end = buffer.length();
+ return end > oldpos;
+ }
+
+ /**
+ * Get the current constructed string (since the last #push())
+ * @return
+ */
+ public String current() {
+ int oldpos = pushes.isEmpty() ? 0 : pushes.peek();
+ String str = buffer.substring(oldpos, buffer.length());
+ return str;
+ }
+
+ /**
+ * Remember the current constructed string as a substitution.
+ * @param substType
+ */
+ public void remember(SubstType substType) {
+ remember(current(), substType);
+ }
+
+ public boolean lastSubstitutionIsPrefix(SubstType substType) {
+ if (substitutions.size() == 0)
+ return false;
+ String current = current();
+ if (substitutions.get(substitutions.size() - 1).length() >= current.length())
+ return false;
+ return lastSubstitution() == substType;
+ }
+ /**
+ * Remember the given string as a substitution.
+ * @param name
+ * @param substType
+ */
+ public void remember(String name, SubstType substType) {
+ if (name.length() == 0)
+ return;
+ int num = substitutions.size();
+ if (num > 0 && substitutions.get(num - 1).equals(name))
+ return;
+ substitutions.add(name);
+ substitutionTypes.put(num, substType);
+ lastTypeNameIndex = num;
+ if (DEBUG) System.out.println(num+" := " + name + " --> " + substType);
+ }
+
+ /**
+ * Replace the last substitution.
+ * @param name
+ * @param substType
+ */
+ public void rememberInstead(String name, SubstType substType) {
+ int num = substitutions.size() - 1;
+ substitutions.set(num, name);
+ substitutionTypes.put(num, substType);
+ if (DEBUG) System.out.println(num+" ::= " + name + " -- > " + substType);
+ }
+
+ /**
+ * Pop the current decoded string as in {@link #pop()}
+ * and remember the string as a substitution.
+ * @return String
+ */
+ public String popAndRemember(SubstType substType) {
+ String name = pop();
+ remember(name, substType);
+ return name;
+ }
+
+ public char peek() {
+ return index < symbol.length ? symbol[index] : 0;
+ }
+
+ public char peek(int offset) {
+ return index + offset < symbol.length ? symbol[index + offset] : 0;
+ }
+
+ public void consume(char ch) throws UnmanglingException {
+ if (ch != get())
+ throw unexpected();
+ }
+ public char get() {
+ return index < symbol.length ? symbol[index++] : 0;
+ }
+
+ public void unget() {
+ if (index > 0) index--;
+ }
+ public void skip() {
+ if (index < symbol.length)
+ index++;
+ }
+
+ public void skip2() {
+ index = Math.min(index + 2, symbol.length);
+ }
+
+ public boolean done() {
+ return index >= symbol.length;
+ }
+
+ public UnmanglingException unexpected() {
+ return new UnmanglingException("Unexpected text at " + getRemaining(), buffer.toString());
+ }
+ public UnmanglingException unexpected(String what) {
+ return new UnmanglingException("Wanted " + what + " but got unexpected text at " + getRemaining(), buffer.toString());
+ }
+ public UnmanglingException notImplemented() {
+ return new UnmanglingException("Unimplemented at " + getRemaining(),
+ buffer.toString());
+ }
+
+ /**
+ * @return
+ */
+ private String getRemaining() {
+ if (index >= symbol.length)
+ return "";
+ return new String(symbol, index, symbol.length - index);
+ }
+
+ /**
+ * @throws UnmanglingException
+ *
+ */
+ public void throwIfDone() throws UnmanglingException {
+ if (done())
+ throw new UnmanglingException("Unexpected end of symbol",
+ buffer.toString());
+ }
+
+ public void updateSubstitution(SubstType substType) {
+ int num = substitutions.size() - 1;
+ substitutionTypes.put(num, substType);
+ if (DEBUG) System.out.println(num + " ::= " + substType);
+ }
+
+ /**
+ * @return
+ */
+ public SubstType lastSubstitution() {
+ return substitutionTypes.get(substitutions.size() - 1);
+ }
+
+ /**
+ * @param arg
+ */
+ public void rememberTemplateArg(String arg) {
+ templateArgs.add(arg);
+ }
+
+ /**
+ * @param num
+ * @return
+ * @throws UnmanglingException
+ */
+ public String getTemplateArg(int num) throws UnmanglingException {
+ num -= templateArgBase;
+ if (num < 0 || num >= templateArgs.size())
+ throw unexpected("template argument in range 0-" + (templateArgs.size() - templateArgBase)+"; got " + num);
+ return templateArgs.get(num);
+ }
+
+ public String lastSubstitutedName() {
+ if (lastTypeNameIndex < 0)
+ return "";
+ return substitutions.get(lastTypeNameIndex);
+ }
+ }
+
+ private static WeakHashMap<String, String> unmangledMap = new WeakHashMap<String, String>();
+ private static WeakHashMap<String, String> withoutArgsMap = new WeakHashMap<String, String>();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IUnmangler#undecorate(java.lang.String)
+ */
+ public String undecorate(String symbol) {
+ // symbols may have @@GLIBC... type suffixes
+ int atat = symbol.indexOf("@@");
+ if (atat > 0)
+ symbol = symbol.substring(0, atat);
+ return symbol;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.edc.internal.symbols.files.IUnmangler#isMangled(java.lang.String)
+ */
+ public boolean isMangled(String symbol) {
+ if (symbol == null)
+ return false;
+ if (symbol.startsWith("_Z"))
+ return true;
+ // this is used for enum constants
+ if (symbol.startsWith("__N"))
+ return true;
+ return false;
+ }
+
+ public String unmangleWithoutArgs(String symbol) throws UnmanglingException {
+ return unmangle(symbol, true);
+ }
+
+ public String unmangle(String symbol) throws UnmanglingException {
+ return unmangle(symbol, false);
+ }
+
+ public String unmangleType(String symbol) throws UnmanglingException {
+ if (symbol == null)
+ return null;
+
+ if (unmangledMap.containsKey(symbol))
+ return unmangledMap.get(symbol);
+
+ if (symbol.startsWith("_Z")) {
+ UnmangleState state = new UnmangleState(symbol, false);
+ state.skip2();
+ String unmangled = "";
+ if (state.peek() == 'S') {
+ unmangled += unmangleSubstitution(state);
+ }
+ while (!state.done()) {
+ if (state.peek() == 'I') {
+ // unscoped-template-name
+ state.remember(unmangled, SubstType.TEMPLATE_PREFIX);
+ String args = unmangleTemplateArgs(state, false);
+ state.buffer.append(args);
+ unmangled += args;
+ } else {
+ if (unmangled.equals("::std"))
+ unmangled += "::";
+ unmangled += unmangleType(state);
+ }
+ state.remember(unmangled, SubstType.TYPE);
+ }
+ unmangledMap.put(symbol, unmangled);
+ return unmangled;
+ }
+ return symbol;
+ }
+
+ public String unmangle(String symbol, boolean skipArgs) throws UnmanglingException {
+ if (symbol == null)
+ return null;
+
+ String unmangled;
+
+ if (skipArgs) {
+ if (withoutArgsMap.containsKey(symbol))
+ unmangled = withoutArgsMap.get(symbol);
+ else {
+ unmangled = doUnmangle(symbol, true);
+ withoutArgsMap.put(symbol, unmangled);
+ }
+ } else if (unmangledMap.containsKey(symbol)) {
+ unmangled = unmangledMap.get(symbol);
+ } else {
+ unmangled = doUnmangle(symbol, skipArgs);
+ unmangledMap.put(symbol, unmangled);
+
+ do {// for break below if conditionals succeed
+ int paren = unmangled.indexOf('(');
+ if (0 < paren) {
+ String unmangledWithoutArgs = unmangled.substring(0, paren-1);
+ if (unmangledWithoutArgs != null && unmangledWithoutArgs.length() != 0) {
+ withoutArgsMap.put(symbol, unmangledWithoutArgs);
+ break;
+ } }
+ withoutArgsMap.put(symbol, unmangled);
+ } while (false);// allows break above to skip default case
+ }
+
+ return unmangled;
+ }
+
+ /**
+ * @param symbol
+ * @return
+ * @throws UnmanglingException
+ */
+ private String doUnmangle(String symbol, boolean nameOnly) throws UnmanglingException {
+ /*
+ Entities with C linkage and global namespace variables are not mangled. Mangled names have the general structure:
+
+
+ <mangled-name> ::= _Z <encoding>
+ <encoding> ::= <function name> <bare-function-type>
+ ::= <data name>
+ ::= <special-name>
+ */
+ if (symbol.startsWith("_Z")) {
+ String suffix = "";
+ int idx = symbol.indexOf('@');
+ if (idx >= 0) {
+ suffix = symbol.substring(idx);
+ symbol = symbol.substring(0, idx);
+ }
+
+ UnmangleState state = new UnmangleState(symbol, nameOnly);
+ state.skip2();
+
+ String unmangled = unmangleEncoding(state);
+ unmangled += suffix;
+ return unmangled;
+ } else if (symbol.startsWith("__N")) {
+ UnmangleState state = new UnmangleState(symbol, true);
+ state.skip2();
+
+ String unmangled = unmangleName(state);
+ return unmangled;
+ } else {
+ return symbol;
+ }
+ }
+
+ /*
+ <encoding> ::= <function name> <bare-function-type>
+ ::= <data name>
+ ::= <special-name>
+ */
+ private String unmangleEncoding(UnmangleState state) throws UnmanglingException {
+ state.push();
+
+ String name;
+
+ // ferret out <special-name>
+ char ch = state.peek();
+ if (ch == 'T' || ch == 'G') {
+ name = unmangleSpecialName(state);
+ } else {
+ name = unmangleName(state);
+ }
+
+ if (!state.done() && !state.nameOnly) {
+ boolean isTemplate = name.endsWith(">"); // HACK
+ if (isTemplate) {
+ state.buffer.append(unmangleType(state));
+ state.buffer.append(' ');
+ }
+ state.buffer.append(name);
+ state.buffer.append(unmangleBareFunctionType(state, false));
+ } else {
+ state.buffer.append(name);
+ }
+
+ return state.pop();
+ }
+
+ private void unmangleSpecialNameCallOffset(UnmangleState state, char ch)
+ throws UnmanglingException {
+
+ switch (ch) {
+ case 'h': {
+ // h <nv-offset> _
+ int offset = doUnmangleNumber(state);
+ state.consume('_');
+ state.buffer.append("<non-virtual base override at offset ");
+ appendHexNumber(state.buffer, offset);
+ break;
+ }
+ case 'v': {
+ // v <offset number> _ <virtual offset number> _
+ int offset = doUnmangleNumber(state);
+ state.consume('_');
+ int voffset = doUnmangleNumber(state);
+ state.consume('_');
+ state.buffer.append("<virtual base override at offset ");
+ appendHexNumber(state.buffer, offset);
+ state.buffer.append(", vcall offset ");
+ appendHexNumber(state.buffer, voffset);
+ break;
+ }
+ default:
+ throw state.unexpected("special name call-offset");
+ }
+ }
+
+ /*
+ <special-name> ::= TV <type> # virtual table
+ ::= TT <type> # VTT structure (construction vtable index)
+ ::= TI <type> # typeinfo structure
+ ::= TS <type> # typeinfo name (null-terminated byte string)
+ <special-name> ::= GV <object name> # Guard variable for one-time initialization
+ # No <type>
+ <special-name> ::= T <call-offset> <base encoding>
+ # base is the nominal target function of thunk
+ <call-offset> ::= h <nv-offset> _
+ ::= v <v-offset> _
+ <nv-offset> ::= <offset number>
+ # non-virtual base override
+ <v-offset> ::= <offset number> _ <virtual offset number>
+ # virtual base override, with vcall offset
+
+ <special-name> ::= Tc <call-offset> <call-offset> <base encoding>
+ # base is the nominal target function of thunk
+ # first call-offset is 'this' adjustment
+ # second call-offset is result adjustment
+
+ */
+ private String unmangleSpecialName(UnmangleState state) throws UnmanglingException {
+ state.push();
+
+ char ch = state.get();
+ if (ch == 'T') {
+ String type = null;
+ ch = state.get();
+ switch (ch) {
+ case 'V':
+ type = unmangleType(state);
+ state.buffer.append("<virtual table for ");
+ state.buffer.append(type);
+ state.buffer.append('>');
+ break;
+ case 'T':
+ type = unmangleType(state);
+ state.buffer.append("<VTT structure for ");
+ state.buffer.append(type);
+ state.buffer.append('>');
+ break;
+ case 'I':
+ type = unmangleType(state);
+ state.buffer.append("<typeinfo structure for ");
+ state.buffer.append(type);
+ state.buffer.append('>');
+ break;
+ case 'S':
+ type = unmangleType(state);
+ state.buffer.append("<typeinfo name for ");
+ state.buffer.append(type);
+ state.buffer.append('>');
+ break;
+ case 'h':
+ case 'v':
+ unmangleSpecialNameCallOffset(state, ch);
+ state.buffer.append(" for ");
+ state.buffer.append(unmangleEncoding(state));
+ state.buffer.append('>');
+ break;
+ case 'c': {
+ // c <call-offset> <call-offset> <base encoding>
+ state.buffer.append("<covariant : 'this' adjustment ");
+ unmangleSpecialNameCallOffset(state, state.get());
+ state.buffer.append("> result adjustment ");
+ unmangleSpecialNameCallOffset(state, state.get());
+ state.buffer.append("> for ");
+ state.buffer.append(unmangleEncoding(state));
+ state.buffer.append('>');
+ break;
+ }
+ default:
+ throw state.unexpected("special name");
+ }
+ } else if (ch == 'G') {
+ switch (state.get()) {
+ case 'V':
+ state.buffer.append("<one-time-init guard for ");
+ state.buffer.append(unmangleName(state));
+ state.buffer.append('>');
+ break;
+ default:
+ throw state.unexpected("special name");
+ }
+ }
+
+ return state.pop();
+ }
+
+ private void appendHexNumber(StringBuilder builder, int offset) {
+ if (offset < 0) {
+ builder.append("-0x");
+ builder.append(Integer.toHexString(-offset));
+ } else {
+ builder.append("0x");
+ builder.append(Integer.toHexString(offset));
+ }
+ }
+
+ /**
+ * @param state
+ * @param name
+ * @return
+ * @throws UnmanglingException
+ */
+ private String doUnmangleFunctionWithName(UnmangleState state, boolean expectReturn, String name) throws UnmanglingException {
+ state.push();
+
+ state.consume('F');
+
+ if (expectReturn) {
+ state.buffer.append(unmangleType(state));
+ state.buffer.append(' ');
+ }
+
+ if (name != null)
+ state.buffer.append(name);
+
+ state.buffer.append(unmangleBareFunctionType(state, false));
+
+ state.consume('E');
+
+ return state.pop();
+ }
+
+ /**
+ * @param state
+ * @param expectReturn true if a return type precedes argument list
+ * @throws UnmanglingException
+ */
+ private String unmangleBareFunctionType(UnmangleState state, boolean expectReturn) throws UnmanglingException {
+ state.push();
+ if (expectReturn) {
+ state.buffer.append(unmangleType(state));
+ state.buffer.append(' ');
+ }
+ state.buffer.append('(');
+ if (state.peek() == 'v') {
+ state.skip();
+ } else {
+ boolean first = true;
+ while (!state.done() && state.peek() != 'E') {
+ if (first) {
+ first = false;
+ } else {
+ state.buffer.append(',');
+ }
+ state.buffer.append(unmangleType(state));
+ }
+ }
+ state.buffer.append(')');
+ return state.pop();
+ }
+
+ /*
+ <name> ::= <nested-name> = N ...
+ ::= <unscoped-name> = number or St ...
+ ::= <unscoped-template-name> <template-args> = unscoped | S ... | I ...
+ ::= <local-name> # See Scope Encoding below = Z ...
+
+ */
+ private String unmangleName(UnmangleState state) throws UnmanglingException {
+ state.push();
+ char ch = state.peek();
+ if (ch == 'N') {
+ state.buffer.append(unmangleNestedName(state, true));
+ } else if (ch == 'Z') {
+ state.buffer.append(unmangleLocalName(state));
+ } else if (ch == 0) {
+ state.throwIfDone();
+ } else {
+ // must be unscoped-name or unscoped-template-name
+
+ if (ch == 'S' && state.peek(1) == 't') {
+ state.skip2();
+ state.buffer.append("::std::");
+ }
+ String name = unmangleUnqualifiedName(state);
+ state.buffer.append(name);
+ if (state.peek() == 'I') {
+ // unscoped-template-name
+ state.remember(name, SubstType.TEMPLATE_PREFIX);
+ String args = unmangleTemplateArgs(state, false);
+ state.buffer.append(args);
+ state.remember(name + args, SubstType.TYPE);
+ }
+ }
+ return state.pop();
+ }
+
+ /*
+ <local-name> := Z <function encoding> E <entity name> [<discriminator>]
+ := Z <function encoding> E s [<discriminator>]
+
+ <discriminator> := _ <non-negative number> # when number < 10
+ := __ <non-negative number> _ # when number >= 10
+
+ */
+ private String unmangleLocalName(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('Z');
+ state.buffer.append(unmangleEncoding(state));
+ state.consume('E');
+
+ boolean isStringLiteral = false;
+ if (state.peek() == 's') {
+ isStringLiteral = true;
+ state.skip();
+ if (state.peek() == '_')
+ state.buffer.append("::");
+ } else {
+ addNameWithColons(state, unmangleName(state));
+ }
+ if (state.peek() == '_') {
+ state.skip();
+ int num;
+ if (state.peek() == '_') {
+ // >= 10
+ num = doUnmangleNonNegativeNumber(state);
+ state.consume('_');
+ } else {
+ char ch = state.get();
+ if (ch >= '0' && ch <= '9') {
+ num = ch - '0';
+ } else {
+ throw state.unexpected("number");
+ }
+ }
+ if (isStringLiteral)
+ state.buffer.append("string literal");
+ state.buffer.append("#" + num);
+ }
+ return state.pop();
+ }
+
+ /*
+ <source-name> ::= <positive length number> <identifier>
+ <number> ::= [n] <non-negative decimal integer>
+ <identifier> ::= <unqualified source code identifier>
+ */
+ private String unmangleSourceName(UnmangleState state) throws UnmanglingException {
+ state.push();
+ char ch = state.peek();
+ if (ch >= '0' && ch <= '9') {
+ int length = doUnmangleNumber(state);
+ while (length-- > 0) {
+ state.throwIfDone();
+ state.buffer.append(state.get());
+ }
+ return state.pop();
+ } else {
+ throw state.unexpected();
+ }
+ }
+
+ /*
+ * [0-9]+
+ */
+ private int doUnmangleNonNegativeNumber(UnmangleState state) {
+ int number = 0;
+ char ch;
+ while ((ch = state.get()) != 0 && ch >= '0' && ch <= '9') {
+ number = number * 10 + (ch - '0');
+ }
+ state.unget();
+ return number;
+ }
+
+ /*
+ * [n] <non-negative decimal number>
+ */
+ private int doUnmangleNumber(UnmangleState state) {
+ boolean neg = false;
+ if (state.peek() == 'n') {
+ state.skip();
+ neg = true;
+ }
+ int number = doUnmangleNonNegativeNumber(state);
+ return neg ? -number : number;
+ }
+
+ /*
+ <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
+ ::= N [<CV-qualifiers>] <template-prefix> <template-args> E (args = I...)
+
+ */
+ private String unmangleNestedName(UnmangleState state, boolean allowCV)
+ throws UnmanglingException {
+
+ state.push();
+
+ state.consume('N');
+
+ String cvquals = allowCV ? unmangleCVQualifiers(state) : null;
+
+ state.buffer.append(unmanglePrefix(state, SubstType.PREFIX));
+
+ state.consume('E');
+
+ if (allowCV && (cvquals != null && cvquals.length() > 0)) {
+ state.buffer.append(' ');
+ state.buffer.append(cvquals);
+ }
+ return state.pop();
+ }
+
+
+ /*
+ <template-args> ::= I <template-arg>+ E
+
+ */
+ private String unmangleTemplateArgs(UnmangleState state, boolean substArg) throws UnmanglingException {
+ state.push();
+
+ int origTypeIndex = state.lastTypeNameIndex;
+
+ String typeName = state.lastSubstitutedName();
+
+ if (!substArg || state.peek() == 'I') {
+ state.consume('I');
+ substArg = false;
+ }
+ state.buffer.append('<');
+ boolean lastArgWasSubst = false;
+ if (state.peek() != 'E') {
+ boolean first = true;
+ do {
+ if (first)
+ first = false;
+ else
+ state.buffer.append(',');
+ boolean unfinishedTemplateSubst = false;
+ if (state.peek() == 'S') {
+ char ch2 = state.peek(1);
+ if (ch2 == 't') {
+ state.buffer.append("::std::");
+ state.skip2();
+ first = true;
+ continue; // more of this arg to come
+ }
+ lastArgWasSubst = true;
+ if (ch2 == 'a' || ch2 == 'b') {
+ unfinishedTemplateSubst = true;
+ }
+ }
+ String arg = unmangleTemplateArg(state);
+ if (unfinishedTemplateSubst)
+ arg += unmangleTemplateArgs(state, false);
+ state.buffer.append(arg);
+ if (lastArgWasSubst && state.done())
+ break;
+ lastArgWasSubst = false;
+ } while (state.peek() != 'E');
+ }
+
+ if (!substArg && !lastArgWasSubst)
+ state.consume('E');
+
+ if (state.buffer.lastIndexOf(">") == state.buffer.length() - 1)
+ state.buffer.append(' ');
+ state.buffer.append('>');
+
+ if (state.lastSubstitution() == SubstType.TEMPLATE_TEMPLATE_PARAM)
+ state.rememberInstead(typeName + state.current(), SubstType.TEMPLATE_TEMPLATE_PARAM);
+ else if (state.lastTypeNameIndex > origTypeIndex)
+ state.remember(typeName + state.current(), SubstType.TYPE);
+ state.lastTypeNameIndex = origTypeIndex;
+
+ return state.pop();
+ }
+
+ /*
+ <template-arg> ::= <type> # type or template
+ ::= X <expression> E # expression
+ ::= <expr-primary> # simple expressions ('L')
+ ::= I <template-arg>* E # argument pack
+ ::= sp <expression> # pack expansion of (C++0x)
+
+ */
+ private String unmangleTemplateArg(UnmangleState state) throws UnmanglingException {
+ state.push();
+
+ String arg = null;
+ char ch = state.peek();
+ if (ch == 'X') {
+ throw state.notImplemented();
+ } else if (ch == 'I') {
+ arg = unmangleTemplateArgs(state, false);
+ } else if (ch == 's' && state.peek(1) == 'p') {
+ throw state.notImplemented();
+ } else if (ch == 'L') {
+ arg = unmangleExprPrimary(state);
+ } else {
+ arg = unmangleType(state);
+ }
+ state.rememberTemplateArg(arg);
+ state.buffer.append(arg);
+
+ return state.pop();
+ }
+
+
+ /**
+<expr-primary> ::= L <type> <value number> E # integer literal
+ ::= L <type> <value float> E # floating literal
+ ::= L <string type> E # string literal
+ ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
+ ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
+ ::= L <mangled-name> E # external name
+
+ * @param state
+ * @return
+ */
+ private String unmangleExprPrimary(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('L');
+
+ try {
+ state.safePush();
+
+ String type = null;
+ String suffix = null;
+ switch (state.peek()) {
+ case 'i': // int
+ suffix = "";
+ break;
+ case 'j': // unsigned int
+ suffix = "U";
+ break;
+ case 'l': // long
+ suffix = "L";
+ break;
+ case 'm': // unsigned long
+ suffix = "UL";
+ break;
+ case 'x': // long long
+ suffix = "LL";
+ break;
+ case 'y': // unsigned long long
+ suffix = "ULL";
+ break;
+ }
+ if (suffix != null) {
+ state.skip();
+ state.buffer.append(doUnmangleNumber(state));
+ state.buffer.append(suffix);
+ } else {
+ // show other types
+ type = unmangleType(state);
+ state.buffer.append('(');
+ state.buffer.append(type);
+ state.buffer.append(')');
+ state.buffer.append(doUnmangleNumber(state));
+ }
+ state.safePop();
+ } catch (UnmanglingException e) {
+ state.safeBacktrack();
+
+ // must be mangled-name or something else
+ state.buffer.append(unmangleName(state));
+ }
+ state.consume('E');
+
+ return state.popAndRemember(SubstType.TEMPLATE_TEMPLATE_PARAM);
+
+ }
+ /*
+ <template-param> ::= T_ # first template parameter
+ ::= T <parameter-2 non-negative number> _
+
+ */
+ private String unmangleTemplateParam(UnmangleState state) throws UnmanglingException {
+ state.push();
+
+ state.consume('T');
+ int num = doUnmangleBase10(state);
+ state.buffer.append(state.getTemplateArg(num));
+
+ return state.popAndRemember(SubstType.TEMPLATE_TEMPLATE_PARAM);
+ }
+
+ /**
+ * Base-10, where _ = 0 and 1..x = 0..x-1
+ * @param state
+ * @return
+ * @throws UnmanglingException
+ */
+ private int doUnmangleBase10(UnmangleState state) throws UnmanglingException {
+ char ch;
+ if (state.peek() == '_') {
+ state.skip();
+ return 0;
+ }
+ int num = 0;
+ while ((ch = state.get()) != '_') {
+ state.throwIfDone();
+ num = (num * 10) + (ch - '0');
+ }
+ return num + 1;
+ }
+
+ /*
+ <substitution> ::= S <seq-id> _
+ ::= S_
+
+ <substitution> ::= St # ::std::
+ <substitution> ::= Sa # ::std::allocator
+ <substitution> ::= Sb # ::std::basic_string
+ <substitution> ::= Ss # ::std::basic_string < char,
+ ::std::char_traits<char>,
+ ::std::allocator<char> >
+ <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
+ <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
+ <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
+
+ */
+ private String unmangleSubstitution(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('S');
+
+ char ch = state.peek();
+ if (ch == '_' || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')) {
+ int num = doUnmangleBase36(state);
+ if (num < 0 || num >= state.substitutions.size())
+ throw state.unexpected("substitution id in the range 0-"+ state.substitutions.size() + " but got " + num);
+ String val = state.substitutions.get(num);
+
+ SubstType type = state.substitutionTypes.get(num);
+ switch (type) {
+ case PREFIX:
+ //...?
+ state.buffer.append(val);
+ break;
+ case TEMPLATE_PREFIX:
+ state.buffer.append(val);
+ state.buffer.append(unmangleTemplateArgs(state, true));
+ break;
+ case TEMPLATE_TEMPLATE_PARAM:
+ state.buffer.append(val);
+ break;
+ case QUAL_TYPE:
+ case TYPE:
+ // ...?
+ state.buffer.append(val);
+ break;
+ }
+ } else {
+ switch (ch) {
+ case 't':
+ state.buffer.append("::std"); break;
+ case 'a':
+ state.buffer.append("::std::allocator"); break;
+ case 'b':
+ state.buffer.append("::std::basic_string"); break;
+ case 's':
+ state.buffer.append("::std::basic_string<char,::std::char_traits<char>,::std::allocator<char> >"); break;
+ case 'i':
+ state.buffer.append("::std::basic_istream<char,::std::char_traits<char> >"); break;
+ case 'o':
+ state.buffer.append("::std::basic_ostream<char,::std::char_traits<char> >"); break;
+ case 'd':
+ state.buffer.append("::std::basic_iostream<char,::std::char_traits<char> >"); break;
+ default:
+ throw state.unexpected("std:: substitution");
+ }
+ state.skip();
+ }
+
+ return state.pop();
+ }
+
+ /**
+ * As a special case, the first substitutable entity is encoded as "S_",
+ * i.e. with no number, so the numbered entities are the second one as
+ * "S0_", the third as "S1_", the twelfth as "SA_", the thirty-eighth as
+ * "S10_", etc.
+ * @throws UnmanglingException
+ */
+ private int doUnmangleBase36(UnmangleState state) throws UnmanglingException {
+ int num = 0;
+ char ch = state.peek();
+ if (ch == '_') {
+ state.skip();
+ return 0;
+ }
+ while ((ch = state.get()) != '_') {
+ state.throwIfDone();
+ num = (num * 10);
+ if (ch >= '0' && ch <= '9')
+ num += (ch - '0');
+ else if (ch >= 'A' && ch <= 'Z')
+ num += (ch - 'A') + 10;
+ else
+ throw state.unexpected("BASE-36 number");
+ }
+ return num + 1;
+ }
+
+ /*
+ <prefix> ::= <prefix> <unqualified-name> # ... 0-9
+ ::= <template-prefix> <template-args> --> template=T... args=I...
+ ::= <template-param> --> T...
+ ::= # empty
+ ::= <substitution> --> S...
+ ::= <prefix> <data-member-prefix> --> name M
+
+ left-recursion elimination:
+ <prefix> ::= <template-prefix> <template-args> <prefix'>
+ ::= <template-param> <prefix'>
+ ::= <substitution> <prefix'>
+ ::= # empty
+ <prefix'> ::= <unqualified-name> <prefix'>
+ ::= <data-member-prefix> M <prefix'>
+ ::= #empty
+ */
+ private String unmanglePrefix(UnmangleState state, SubstType substType) throws UnmanglingException {
+ state.push();
+
+ boolean any = false;
+ boolean lastSubst = false;
+
+ while (true) {
+ char ch = state.peek();
+
+ if (ch == 'E') {
+ break;
+ }
+
+ String part = null;
+
+ if (ch == 'T') {
+ part = unmangleTemplateParam(state);
+ state.remember(substType);
+ }
+ else if (ch == 'S') {
+ part = unmangleSubstitution(state);
+ lastSubst = true;
+ }
+ else if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z')
+ || (ch == 'C' || ch == 'D' || ch == 'L')) {
+ part = unmangleUnqualifiedName(state);
+ }
+ else if (ch == 'I') {
+ if (!any)
+ throw state.unexpected();
+
+ if (state.hasCurrent()) {
+ state.updateSubstitution(SubstType.TEMPLATE_PREFIX);
+ part = state.current();
+ }
+ String args = unmangleTemplateArgs(state, false);
+ state.buffer.append(args);
+ continue;
+ }
+ else {
+ throw state.unexpected();
+ }
+
+ lastSubst = false;
+ any = true;
+
+ if (lastSubst)
+ any = true;
+ if (state.hasCurrent()) {
+ addNameWithColons(state, part);
+ } else {
+ state.buffer.append(part);
+ }
+
+ if (ch != 'S' && state.peek() != 'E') {
+ state.remember(substType);
+ }
+ }
+
+
+ return state.pop();
+ }
+
+ /**
+ * @param state
+ * @param name
+ */
+ private void addNameWithColons(UnmangleState state, String name) {
+ if (state.hasCurrent() && !name.startsWith("::"))
+ state.buffer.append("::");
+ state.buffer.append(name);
+ }
+
+ /*
+<type> ::= <builtin-type> = rVKPROCGU ...
+ ::= <function-type> =
+ ::= <class-enum-type>
+ ::= <array-type>
+ ::= <pointer-to-member-type> = M...
+ ::= <template-param>
+ ::= <template-template-param> <template-args>
+ ::= <substitution> # See Compression below
+
+ <type> ::= <CV-qualifiers> <type>
+ ::= P <type> # pointer-to
+ ::= R <type> # reference-to
+ ::= O <type> # rvalue reference-to (C++0x)
+ ::= C <type> # complex pair (C 2000)
+ ::= G <type> # imaginary (C 2000)
+ ::= U <source-name> <type> # vendor extended type qualifier
+
+ <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
+ */
+ private String unmangleType(UnmangleState state) throws UnmanglingException {
+ state.push();
+ char ch = state.get();
+ switch (ch) {
+ //
+ // qualified types
+ //
+ case 'r':
+ case 'V':
+ case 'K':
+ state.unget();
+ String cvquals = unmangleCVQualifiers(state);
+ state.buffer.append(unmangleType(state));
+ if (cvquals.length() > 0) {
+ state.buffer.append(' ');
+ state.buffer.append(cvquals);
+ }
+ if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
+ state.remember(SubstType.QUAL_TYPE);
+ return state.popAndRemember(SubstType.QUAL_TYPE);
+ case 'P':
+ state.buffer.append(unmangleType(state));
+ if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
+ state.remember(SubstType.QUAL_TYPE);
+ ptrOrRefize(state.buffer, "*");
+ return state.popAndRemember(SubstType.QUAL_TYPE);
+ case 'R':
+ state.buffer.append(unmangleType(state));
+ if (state.lastSubstitutionIsPrefix(SubstType.QUAL_TYPE))
+ state.remember(SubstType.QUAL_TYPE);
+ ptrOrRefize(state.buffer, "&");
+ return state.popAndRemember(SubstType.QUAL_TYPE);
+ case 'O': // rvalue reference-to
+ case 'C': // complex pair
+ case 'G': // imaginary
+ throw state.notImplemented();
+ case 'U': // vendor extension
+ {
+ // TODO: assuming the extension precedes the type,
+ // e.g. int __declspec(dllimport) foo();
+ state.buffer.append(unmangleSourceName(state));
+ state.buffer.append(' ');
+ state.buffer.append(unmangleType(state));
+ return state.popAndRemember(SubstType.TYPE);
+ }
+
+ //
+ // built-in types
+ //
+ case 'v':
+ state.buffer.append("void"); break;
+ case 'w':
+ state.buffer.append("wchar_t"); break;
+ case 'b':
+ state.buffer.append("bool"); break;
+ case 'c':
+ state.buffer.append("char"); break;
+ case 'a':
+ state.buffer.append("signed char"); break;
+ case 'h':
+ state.buffer.append("unsigned char"); break;
+ case 's':
+ state.buffer.append("short"); break;
+ case 't':
+ state.buffer.append("unsigned short"); break;
+ case 'i':
+ state.buffer.append("int"); break;
+ case 'j':
+ state.buffer.append("unsigned int"); break;
+ case 'l':
+ state.buffer.append("long"); break;
+ case 'm':
+ state.buffer.append("unsigned long"); break;
+ case 'x':
+ state.buffer.append("long long"); break;
+ case 'y':
+ state.buffer.append("unsigned long long"); break;
+ case 'n':
+ state.buffer.append("__int128"); break;
+ case 'o':
+ state.buffer.append("unsigned __int128"); break;
+ case 'f':
+ state.buffer.append("float"); break;
+ case 'd':
+ state.buffer.append("double"); break;
+ case 'e':
+ state.buffer.append("long double"); break;
+ case 'g':
+ state.buffer.append("__float128"); break;
+ case 'z':
+ state.buffer.append("..."); break;
+ case 'D': {
+ ch = state.get();
+ switch (ch) {
+ case 'd':
+ state.buffer.append("::std::decimal::decimal64"); break;
+ case 'e':
+ state.buffer.append("::std::decimal::decimal128"); break;
+ case 'f':
+ state.buffer.append("::std::decimal::decimal32"); break;
+ case 'h':
+ state.buffer.append("::std::decimal::binary16"); break; // TODO: a guess; what's the actual C++ name for the half-float?
+ case 'i':
+ state.buffer.append("char32_t"); break;
+ case 's':
+ state.buffer.append("char16_t"); break;
+ default:
+ // Dp, Dt, DT
+ state.unget(); throw state.notImplemented();
+ }
+ }
+ case 'u':
+ state.buffer.append(unmangleName(state));
+ return state.popAndRemember(SubstType.TYPE);
+
+ //
+ // <class-enum-type> ::= <unqualified-name> | <nested-name>
+ //
+ case 'N':
+ state.unget();
+ state.buffer.append(unmangleNestedName(state, false));
+ state.remember(SubstType.TYPE);
+ break;
+
+ case 'F':
+ // <function-type> ::= F [Y] <bare-function-type> E
+ if (state.peek() == 'Y') {
+ state.skip();
+ state.buffer.append("extern \"C\" ");
+ }
+ state.buffer.append(unmangleBareFunctionType(state, true));
+ state.consume('E');
+ state.remember(SubstType.TYPE);
+ break;
+
+ case 'M': {
+ state.unget();
+ String name = unmanglePtm(state);
+ state.buffer.append(name);
+ state.remember(name, SubstType.TYPE);
+ break;
+ }
+
+ case 'S':
+ state.unget();
+ state.buffer.append(unmangleSubstitution(state));
+ break;
+
+ case 'T':
+ // either <template-param> or <template-template-param> <template-args>
+ state.unget();
+ state.buffer.append(unmangleTemplateParam(state));
+ if (state.peek() == 'I') {
+ state.buffer.append(unmangleTemplateArgs(state, false));
+ }
+ break;
+
+ case 'A':
+ state.unget();
+ state.buffer.append(unmangleArrayType(state));
+ break;
+
+ default:
+ state.unget();
+ String unqual = unmangleUnqualifiedName(state);
+ state.buffer.append(unqual);
+ if (state.peek() == 'I') {
+ // unscoped-template-name
+ state.remember(unqual, SubstType.TEMPLATE_PREFIX);
+ state.buffer.append(unmangleTemplateArgs(state, false));
+ }
+ state.remember(SubstType.TYPE);
+ break;
+ }
+ return state.pop();
+ }
+
+
+ /**
+ * Insert a "*" or "&" into a string. If this is a function type,
+ * insert in front of the argument list, not after.
+ * @param buffer
+ * @param string
+ */
+ private void ptrOrRefize(StringBuilder buffer, String string) {
+ char last = buffer.length() > 0 ? buffer.charAt(buffer.length() - 1) : 0;
+ if (last == ')' || last == ']') {
+ char match = last == ')' ? '(' : '[';
+ int stack = 0;
+ int idx = buffer.length() - 1;
+ while (idx > 0) {
+ char ch = buffer.charAt(idx);
+ if (ch == last)
+ stack++;
+ else if (ch == match) {
+ stack--;
+ if (stack == 0)
+ break;
+ }
+ idx--;
+ }
+ buffer.insert(idx, '(' + string + ')');
+ } else {
+ buffer.append(string);
+ }
+ }
+
+ /*
+ <array-type> ::= A <positive dimension number> _ <element type>
+ ::= A [<dimension expression>] _ <element type>
+
+ */
+ private String unmangleArrayType(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('A');
+
+ String count;
+
+ char ch = state.peek();
+ if (ch >= '0' && ch <= '9') {
+ int num = doUnmangleNonNegativeNumber(state);
+ count = "" + num;
+ } else {
+ throw state.notImplemented();
+ }
+ state.consume('_');
+
+ state.buffer.append(unmangleType(state));
+
+ state.buffer.append('[');
+ state.buffer.append(count);
+ state.buffer.append(']');
+
+ return state.pop();
+ }
+
+ /*
+ <pointer-to-member-type> ::= M <class type> <member type>
+ */
+ private String unmanglePtm(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('M');
+ String klass = unmangleType(state);
+ String ptrquals = unmangleCVQualifiers(state);
+ try {
+ state.safePush();
+ state.buffer.append(doUnmangleFunctionWithName(state, true, '(' + klass + "::*)"));
+ state.safePop();
+ } catch (UnmanglingException e) {
+ // may be pointer to member (field)
+ state.safeBacktrack();
+ state.buffer.append(unmangleType(state));
+ state.buffer.append(' ');
+ state.buffer.append(klass);
+ state.buffer.append("::*");
+ }
+ if (ptrquals.length() > 0) {
+ state.buffer.append(' ');
+ state.buffer.append(ptrquals);
+ }
+ return state.pop();
+ }
+
+ /**
+ * Unmangle any sequence of CV quals
+ * @param state state
+ * @return String
+ */
+ private String unmangleCVQualifiers(UnmangleState state) {
+ state.push();
+ while (true) {
+ boolean matched = true;
+ switch (state.peek()) {
+ case 'r':
+ state.skip();
+ if (state.hasCurrent()) state.buffer.append(' ');
+ state.buffer.append("restrict");
+ break;
+ case 'V':
+ state.skip();
+ if (state.hasCurrent()) state.buffer.append(' ');
+ state.buffer.append("volatile");
+ break;
+ case 'K':
+ state.skip();
+ if (state.hasCurrent()) state.buffer.append(' ');
+ state.buffer.append("const");
+ break;
+ default:
+ matched = false;
+ break;
+ }
+ if (!matched)
+ break;
+ }
+ return state.pop();
+ }
+
+ static class Operator {
+ String name;
+ /** for unary or binary ops; other questionable ones are 0 */
+ int numops;
+
+ public Operator(String name, int numops) {
+ this.name = name;
+ this.numops = numops;
+ }
+ }
+
+ static Map<String, Operator> operators = new HashMap<String, Operator>();
+
+ private static void registerOperator(String code, String name, int opcnt) {
+ if (operators.containsKey(code))
+ throw new IllegalStateException();
+ operators.put(code, new Operator(name, opcnt));
+ }
+
+ static {
+ registerOperator("nw", "new", 0);
+ registerOperator("na", "new[]", 0);
+ registerOperator("dl", "delete", 0);
+ registerOperator("da", "delete[]", 0);
+ registerOperator("ps", "+", 1);
+ registerOperator("ng", "-", 1);
+ registerOperator("ad", "&", 1);
+ registerOperator("de", "*", 1);
+ registerOperator("co", "~", 1);
+ registerOperator("pl", "+", 2);
+ registerOperator("mi", "-", 2);
+ registerOperator("ml", "*", 2);
+ registerOperator("dv", "/", 2);
+ registerOperator("rm", "%", 2);
+ registerOperator("an", "&", 2);
+ registerOperator("or", "|", 2);
+ registerOperator("eo", "^", 2);
+ registerOperator("aS", "=", 2);
+ registerOperator("pL", "+=", 2);
+ registerOperator("mI", "-=", 2);
+ registerOperator("mL", "*=", 2);
+ registerOperator("dV", "/=", 2);
+ registerOperator("rM", "%=", 2);
+ registerOperator("aN", "&=", 2);
+ registerOperator("oR", "|=", 2);
+ registerOperator("eO", "^=", 2);
+ registerOperator("ls", "<<", 2);
+ registerOperator("rs", ">>", 2);
+ registerOperator("lS", "<<=", 2);
+ registerOperator("rS", ">>=", 2);
+ registerOperator("eq", "==", 2);
+ registerOperator("ne", "!=", 2);
+ registerOperator("lt", "<", 2);
+ registerOperator("gt", ">", 2);
+ registerOperator("le", "<=", 2);
+ registerOperator("ge", ">=", 2);
+ registerOperator("nt", "!", 1);
+ registerOperator("aa", "&&", 2);
+ registerOperator("oo", "||", 2);
+ registerOperator("pp", "++", 1);
+ registerOperator("mm", "--", 1);
+ registerOperator("cm", ",", 2);
+ registerOperator("pm", "->*", 2);
+ registerOperator("pt", "->", 2);
+ registerOperator("cl", "()", 1);
+ registerOperator("ix", "[]", 2);
+ registerOperator("qu", "?", 3);
+ registerOperator("st", "sizeof ", 0); // type
+ registerOperator("sz", "sizeof", 1); // expression
+ registerOperator("at", "alignof ", 0); // type
+ registerOperator("az", "alignof", 1); // expression
+ registerOperator("cv", "()", 1);
+ }
+
+ /*
+ <unqualified-name> ::= <operator-name> = lowercase
+ ::= <ctor-dtor-name> = C1-3 D0-2 ...
+ ::= <source-name> = <number> ...
+ ::= <unnamed-type-name> = Ut ...
+
+ */
+ private String unmangleUnqualifiedName(UnmangleState state) throws UnmanglingException {
+ char ch = state.peek();
+ if (ch >= '0' && ch <= '9') {
+ return unmangleSourceName(state);
+ }
+ else if (ch >= 'a' && ch <= 'z') {
+ return unmangleOperatorName(state);
+ }
+ else if (ch == 'U') {
+ return unmangleUnnamedTypeName(state);
+ }
+ else if (ch == 'C') {
+ state.push();
+ String last = simpleName(state.lastSubstitutedName());
+ state.get();
+ switch (state.get()) {
+ case '1':
+ case '2':
+ case '3':
+ state.buffer.append(last);
+ return state.pop();
+ default:
+ state.unget();
+ throw state.unexpected("constructor name");
+ }
+ }
+ else if (ch == 'D') {
+ state.push();
+ String last = simpleName(state.lastSubstitutedName());
+ state.get();
+ state.buffer.append('~');
+ state.buffer.append(last);
+ switch (state.get()) {
+ case '0':
+ return state.pop();
+ case '1':
+ return state.pop();
+ case '2':
+ return state.pop();
+ default:
+ state.unget();
+ throw state.unexpected("destructor name");
+ }
+ }
+ throw state.unexpected();
+ }
+
+ /**
+ * @param name
+ * @return
+ */
+ private String simpleName(String name) {
+ int idx = name.lastIndexOf("::");
+ if (idx >= 0)
+ return name.substring(idx + 2);
+ return name;
+ }
+
+ /*
+ <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
+ <unnamed-type-name> ::= <closure-type-name>
+
+ <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
+
+ */
+ private String unmangleUnnamedTypeName(UnmangleState state) throws UnmanglingException {
+ state.push();
+ state.consume('U');
+ switch (state.get()) {
+ case 't':
+ state.buffer.append("<unnamed #");
+ if (state.peek() != '_') {
+ state.buffer.append("" + (doUnmangleNonNegativeNumber(state) + 2));
+ } else {
+ state.buffer.append("1");
+ }
+ state.buffer.append('>');
+ state.consume('_');
+ break;
+ case 'l':
+ throw state.notImplemented();
+ default:
+ throw state.unexpected();
+ }
+ return state.pop();
+ }
+
+ /*
+ */
+ private String unmangleOperatorName(UnmangleState state) throws UnmanglingException {
+ state.push();
+ char ch = state.get();
+ String op = "" + ch;
+ if (ch == 'v') {
+ // vendor type <digit> <source-name>
+ ch = state.get();
+ if (ch >= '0' && ch <= '9') {
+ int opcount = ch - '0';
+ op = unmangleSourceName(state);
+ boolean first = true;
+
+ // pretend it's a function, to differentiate
+ state.buffer.append('(');
+ while (opcount-- > 0) {
+ if (first)
+ first = false;
+ else
+ state.buffer.append(',');
+ }
+ state.buffer.append(')');
+ } else {
+ throw state.unexpected();
+ }
+ return state.pop();
+ }
+
+ ch = state.get();
+ if (!Character.isLetter(ch)) {
+ throw state.unexpected();
+ }
+
+ op += ch;
+
+ Operator oper = operators.get(op);
+ if (oper == null) {
+ throw state.unexpected();
+ }
+
+ state.buffer.append("operator ");
+
+ // special cases
+ if (op.equals("cv")) {
+ state.buffer.append(unmangleType(state));
+ // fall through
+ }
+
+ state.buffer.append(oper.name);
+ return state.pop();
+
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunch.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunch.java
index dba5e24..3e26459 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunch.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunch.java
@@ -83,7 +83,7 @@
@ThreadSafe
abstract public class EDCLaunch extends DsfLaunch {
private DefaultDsfExecutor executor;
- private final DsfSession session;
+ private DsfSession session;
private DsfServicesTracker tracker;
private boolean initialized;
private boolean shutDown;
@@ -119,18 +119,26 @@
super(launchConfiguration, mode, locator);
debugModelID = ownerID;
+ }
+ private void startSession()
+ {
// Create the dispatch queue to be used by debugger control and services
// that belong to this launch
- final DefaultDsfExecutor dsfExecutor = new DefaultDsfExecutor("DSF executor - " + ownerID); //$NON-NLS-1$
+ final DefaultDsfExecutor dsfExecutor = new DefaultDsfExecutor("DSF executor - " + debugModelID); //$NON-NLS-1$
dsfExecutor.prestartCoreThread();
executor = dsfExecutor;
- session = DsfSession.startSession(executor, ownerID);
+ session = DsfSession.startSession(executor, debugModelID);
launchSessions.put(session.getId(), this);
threadPools.put(session.getId(), newThreadPool());
- }
+ try {
+ setSourceLocator(createSourceLocator());
+ } catch (CoreException e) {
+ EDCDebugger.getMessageLogger().logException(e);
+ }
+ }
/**
* Obtains a new thread pool
*/
@@ -249,6 +257,8 @@
}
public DsfSession getSession() {
+ if (session == null)
+ startSession();
return session;
}
@@ -424,6 +434,8 @@
// session-ended event, finish step only after the dispatch.
executor.shutdown();
executor = null;
+
+ shutDown = true; // note this controls whether the launch canTerminate().
fireTerminate();
try {
@@ -432,8 +444,6 @@
EDCDebugger.getMessageLogger().logError(null, e);
}
- shutDown = true;
-
rm.setStatus(getStatus());
rm.done();
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunchDelegate.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunchDelegate.java
index 4b09e17..14664e9 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunchDelegate.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/launch/EDCLaunchDelegate.java
@@ -91,6 +91,9 @@
try {
final EDCLaunch edcLaunch = (EDCLaunch) launch;
+
+ edcLaunch.initialize();
+
boolean forDebug = mode.equals(ILaunchManager.DEBUG_MODE);
monitor.worked(1);
@@ -245,8 +248,6 @@
if (launch == null)
{
launch = createLaunch(configuration, mode);
- launch.initialize();
- launch.setSourceLocator(launch.createSourceLocator());
}
else
{
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/AbstractTargetEnvironment.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/AbstractTargetEnvironment.java
index 850b66e..a25916d 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/AbstractTargetEnvironment.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/AbstractTargetEnvironment.java
@@ -11,7 +11,10 @@
package org.eclipse.cdt.debug.edc.services;
+import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunch;
@@ -77,4 +80,15 @@
// any loaded module until it succeeds.
return true;
}
+
+ /**
+ * @since 3.0
+ */
+ public void stepPastGlueCode(IExecutionDMContext dmc, IAddress pc,
+ RequestMonitor rm) {
+ // Assume no glue code by default.
+ rm.done();
+ }
+
+
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Disassembly.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Disassembly.java
index af0a435..4339d95 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Disassembly.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Disassembly.java
@@ -132,15 +132,18 @@
* @return a code buffer either full of readable bytes
* or empty representing the unreadable region
*/
+ @SuppressWarnings("null") // memByte can't be null if memByteReadable is true
private ByteBuffer translateMemoryBytes(List<MemoryByte> memBytes) {
- byte[] bytes = new byte[memBytes.size()];
- boolean firstIsReadable = memBytes.get(0).isReadable();
int count = 0;
+ byte[] bytes = new byte[memBytes.size()];
+ MemoryByte firstByte = memBytes.get(0);
+ boolean firstIsReadable = firstByte != null && firstByte.isReadable();
for (MemoryByte memByte : memBytes) {
+ boolean memByteReadable = memByte != null && memByte.isReadable();
// check each byte
- if (memByte.isReadable() != firstIsReadable)
+ if (memByteReadable != firstIsReadable)
break;
- bytes[count++] = firstIsReadable ? memByte.getValue() : 0;
+ bytes[count++] = memByteReadable ? memByte.getValue() : 0;
}
return ByteBuffer.wrap(bytes, 0, count);
@@ -439,7 +442,8 @@
ByteBuffer codeBuf = translateMemoryBytes(memBytes.subList(offset, last));
int codeBufSize = codeBuf.limit();
IAddress block = start.add(offset);
- if (memBytes.get(offset).isReadable()) {
+ MemoryByte firstByte = memBytes.get(offset);
+ if (firstByte != null && firstByte.isReadable()) {
try {
List<IDisassembledInstruction> insts
= disassembler.disassembleInstructions(block, block.add(codeBufSize),
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/ITargetEnvironment.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/ITargetEnvironment.java
index 8a23112..fa6ab38 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/ITargetEnvironment.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/ITargetEnvironment.java
@@ -17,7 +17,9 @@
import org.eclipse.cdt.debug.edc.IAddressExpressionEvaluator;
import org.eclipse.cdt.debug.edc.disassembler.IDisassembler;
import org.eclipse.cdt.debug.edc.tcf.extension.services.ISimpleRegisters;
+import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.service.IDsfService;
import org.eclipse.tm.tcf.services.IRegisters;
@@ -198,4 +200,20 @@
* @return
*/
public String getProperty(String propertyKey);
+
+ /**
+ * Check if instruction(s) at PC are glue code (e.g. jump table for call to
+ * DLL functions on Windows), if yes, step past them. Otherwise just do
+ * nothing.<br>
+ * This is only called when we perform stepping.
+ *
+ * @param dmc
+ * the execution context, usually a thread.
+ * @param pc
+ * program counter.
+ * @param rm
+ * @since 3.0
+ */
+ public void stepPastGlueCode(IExecutionDMContext dmc, IAddress pc,
+ RequestMonitor rm);
}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Stack.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Stack.java
index 1e04ebc..e5e9d8c 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Stack.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/services/Stack.java
@@ -28,12 +28,12 @@
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.EDCTrace;
import org.eclipse.cdt.debug.edc.internal.launch.CSourceLookup;
+import org.eclipse.cdt.debug.edc.internal.services.dsf.EDCSymbolReader;
import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl;
import org.eclipse.cdt.debug.edc.internal.services.dsf.RunControl.ExecutionDMC;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
import org.eclipse.cdt.debug.edc.internal.snapshot.SnapshotUtils;
import org.eclipse.cdt.debug.edc.internal.symbols.MemoryVariableLocation;
-import org.eclipse.cdt.debug.edc.internal.symbols.dwarf.EDCSymbolReader;
import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglerEABI;
import org.eclipse.cdt.debug.edc.internal.symbols.files.UnmanglingException;
import org.eclipse.cdt.debug.edc.snapshot.IAlbum;
@@ -137,18 +137,26 @@
return module;
}
+ private boolean equals(final IAddress right, final IAddress left) {
+ return right == left || right != null && right.equals(left);
+ }
+
+ private boolean equals(final String right, final String left) {
+ return right == left || right != null && right.equals(left);
+ }
+
@Override
public boolean equals(Object other) {
return
this == other
|| (other != null && other instanceof StackFrameData
- && getAddress().equals(((StackFrameData)other).getAddress())
- && getFunction().equals(((StackFrameData)other).getFunction())
+ && equals(getAddress(), ((StackFrameData)other).getAddress())
+ && equals(getFunction(), ((StackFrameData)other).getFunction())
&& getLevel() == ((StackFrameData)other).getLevel()
- && getFile().equals(((StackFrameData)other).getFile())
+ && equals(getFile(), ((StackFrameData)other).getFile())
&& getLine() == ((StackFrameData)other).getLine()
&& getColumn() == ((StackFrameData)other).getColumn()
- && getModule().equals(((StackFrameData)other).getModule()));
+ && equals(getModule(), ((StackFrameData)other).getModule()));
}
}
@@ -1003,7 +1011,7 @@
// file, even for big symbol files.
if (variableScope instanceof IModuleScope) {
Collection<IVariable> variables = ((IModuleScope)variableScope).getVariablesByName(qualifiedName != null ? qualifiedName : name, true);
- if (variables.size() > 0) {
+ if (variables != null && variables.size() > 0) {
// list may contain non-global variables, so return the first global
for (Object varObject : variables) {
if (varObject instanceof IVariable) {
@@ -1214,8 +1222,15 @@
return name;
}
+ /**
+ * was initially implemented as "0".
+ * currently returns null to guarantee anything calling this
+ * knows it's getting a useless bit of data.
+ * @see org.eclipse.cdt.dsf.debug.service.IStack.IVariableDMData#getValue()
+ */
public String getValue() {
- return "0";
+ // TODO not implemented
+ return null;
}
}
@@ -1501,7 +1516,7 @@
if (frames == null) {
// nothing in the cache so need to update
needsUpdate = true;
- } else if (allFramesCached.get(context.getID())) {
+ } else if (allFramesCached.containsKey(context.getID()) && allFramesCached.get(context.getID())) {
// all frames are cached
needsUpdate = false;
} else if (endIndex == ALL_FRAMES) {
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/AbstractAddressInterval.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/AbstractAddressInterval.java
new file mode 100644
index 0000000..c9fdf1b
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/AbstractAddressInterval.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import org.eclipse.cdt.core.IAddress;
+
+/**
+ * @since 3.0
+ */
+abstract public class AbstractAddressInterval implements IAddressInterval, ISymbol{
+
+ public boolean hasEmptyRange() {
+ return getSize() == 0;
+ }
+
+ public IAddress getLowAddress() {
+ return getAddress();
+ }
+
+ public IAddress getHighAddress() {
+ return getLowAddress().add(getSize());
+ }
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IAddressInterval.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IAddressInterval.java
new file mode 100644
index 0000000..5173490
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IAddressInterval.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import org.eclipse.cdt.core.IAddress;
+
+/**
+ * @since 3.0
+ */
+public interface IAddressInterval {
+ /**
+ * Get the name of the interval
+ *
+ * @return the name
+ */
+ String getName();
+ /**
+ * Tell whether the interval has an empty address range (either unset or unspecified)
+ */
+ boolean hasEmptyRange();
+
+ /**
+ * Get the low address of this interval (absolute or synthesized from a range list)
+ *
+ * @return low address, or null if unknown
+ */
+ IAddress getLowAddress();
+
+ /**
+ * Get the high address of this interval (absolute or synthesized from a range list)
+ *
+ * @return high address, or null if unknown
+ */
+ IAddress getHighAddress();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java
index ff87372..0fc5887 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IEDCSymbolReader.java
@@ -1,46 +1,53 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import org.eclipse.cdt.core.ISymbolReader;
-
-/**
- * Top-level interface for getting symbolics information. The executable
- * symbolics reader and IDebugInfoProvider (behind the scenes) work together
- * to provide the full information. The symbolics
- * information includes debug information (e.g. DWARF, CODEVIEW) and symbol
- * table data. A binary file may only have symbol table without debug
- * information.
- */
-public interface IEDCSymbolReader extends IExecutableSymbolicsReader, ISymbolReader {
- /**
- * Call when the reader is no longer needed and should free up any resources.
- */
- void shutDown();
-
- /**
- * Check whether the symbol file has debug information recognized by this
- * reader. The debug information here means data in the binary file that's
- * specially for debugger, such as DWARF and CODEVIEW. The symbol table
- * section data in many types of binary files is not considered debug
- * information here.
- *
- * @return true if the symbol reader has dedicated debug information
- */
- boolean hasRecognizedDebugInformation();
-
- /**
- * Get the module-level scope for the primary symbol file
- * @return scope, never <code>null</code>
- * @see #getSymbolFile()
- */
- IModuleScope getModuleScope();
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import org.eclipse.cdt.core.ISymbolReader;
+
+/**
+ * Top-level interface for getting symbolics information. The executable
+ * symbolics reader and IDebugInfoProvider (behind the scenes) work together
+ * to provide the full information. The symbolics
+ * information includes debug information (e.g. DWARF, CODEVIEW) and symbol
+ * table data. A binary file may only have symbol table without debug
+ * information.
+ */
+public interface IEDCSymbolReader extends IExecutableSymbolicsReader, ISymbolReader {
+ /**
+ * Call when the reader is no longer needed and should free up any resources.
+ */
+ void shutDown();
+
+ /**
+ * Check whether the symbol file has debug information recognized by this
+ * reader. The debug information here means data in the binary file that's
+ * specially for debugger, such as DWARF and CODEVIEW. The symbol table
+ * section data in many types of binary files is not considered debug
+ * information here.
+ *
+ * @return true if the symbol reader has dedicated debug information
+ */
+ boolean hasRecognizedDebugInformation();
+
+ /**
+ * Get the module-level scope for the primary symbol file
+ * @return scope, never <code>null</code>
+ * @see #getSymbolFile()
+ */
+ IModuleScope getModuleScope();
+
+ /**
+ * Get symbolics reader for the primary symbol file
+ * @return symbol reader
+ * @since 3.0
+ */
+ IExecutableSymbolicsReader getSymbolicsReader();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSection.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSection.java
index 2eef95f..fb74133 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSection.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSection.java
@@ -1,35 +1,69 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import org.eclipse.cdt.debug.edc.IStreamBuffer;
-
-/**
- * This abstracts access to a particular section in an executable
- */
-public interface IExecutableSection {
- /**
- * Get the name of the section.
- */
- String getName();
-
- /**
- * Get the buffer for the section. This may be thrown away and reloaded on demand.
- * The buffer has the correct endianness already set.
- * @return buffer, or <code>null</code> if failed to load
- */
- IStreamBuffer getBuffer();
-
- /**
- * Free the buffer allocated for this section.
- */
- void dispose();
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - addition of properties API
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.IStreamBuffer;
+
+/**
+ * This abstracts access to a particular section in an executable
+ */
+public interface IExecutableSection extends IAddressInterval, IHasSize {
+
+ /** @since 3.0*/
+ static final String PROPERTY_CONTAINER = "container"; //$NON-NLS-1$
+
+ /** @since 3.0*/
+ static final String PROPERTY_WRITABLE = "writable"; //$NON-NLS-1$
+ /** @since 3.0*/
+ static final String PROPERTY_EXECUTABLE = "executable"; //$NON-NLS-1$
+ /** @since 3.0*/
+ static final String PROPERTY_ALLOCATABLE = "allocatable"; //$NON-NLS-1$
+
+ /**
+ * Get the base link address of the section
+ *
+ * @return the base link address
+ * @since 3.0
+ */
+ IAddress getLinkAddress();
+
+ /**
+ * Get the file offset of the section
+ *
+ * @return the file offset
+ * @since 3.0
+ */
+ long getFileOffset();
+
+ /**
+ * Get the buffer for the section. This may be thrown away and reloaded on demand.
+ * The buffer has the correct endianness already set.
+ * @return buffer, or <code>null</code> if failed to load
+ */
+ IStreamBuffer getBuffer();
+
+ /**
+ * Free the buffer allocated for this section.
+ */
+ void dispose();
+
+ /**
+ * Get the properties of the section
+ *
+ * @return the section properties
+ * @since 3.0
+ */
+ Map<String, Object> getProperties();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSymbolicsReader.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSymbolicsReader.java
index c4ba5b5..2dd06aa 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSymbolicsReader.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IExecutableSymbolicsReader.java
@@ -1,115 +1,127 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import java.nio.ByteOrder;
-import java.util.Collection;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Interface for handling different kinds of executables. This manages
- * the mid-level access to different executable formats (ELF, PE-COFF, etc.).
- */
-public interface IExecutableSymbolicsReader {
- /**
- * Dispose the reader and any files or memory it is holding
- */
- void dispose();
-
- /**
- * Get the file represented by this reader
- */
- IPath getSymbolFile();
-
- /**
- * Get the executable sections from the symbol file (names and buffers)
- * @return unmodifiable list of sections
- */
- Collection<IExecutableSection> getExecutableSections();
-
- /**
- * Get a section with the given name
- * @param sectionName
- * @return {@link IExecutableSection} or <code>null</code>
- */
- IExecutableSection findExecutableSection(String sectionName);
-
- /**
- * Get the (low level) sections from the symbol file
- *
- * @return unmodifiable list of sections
- */
- Collection<ISection> getSections();
-
- /**
- * Get the base image address generated by the linker
- *
- * @return the base address, or null if unknown
- */
- IAddress getBaseLinkAddress();
-
- /**
- * Get the modification date of the symbol file when it was parsed. This is
- * used for caching purposes.
- *
- * @return the modification date (e.g. file.lastModified())
- */
- long getModificationDate();
-
- /**
- * Find symbol(s) with the given name. If no exact
- * matches are found, also search for a symbol whose
- * undecorated variant matches the name (e.g. in Win32, "_main" -> "main",
- * "__imp_foo@8" -> "foo").
- * @param name name of the symbol
- * @return collection of matching symbols, may be empty
- */
- Collection<ISymbol> findSymbols(String name);
-
- /**
- * Find symbol(s) with the given unmangled name.
- * The name will be interpreted as if spaces are irrelevant.
- * The name will be matched as if a fully qualified name (e.g.
- * leading "::" may be missing).
- * If a symbol is a function and the name does not include
- * arguments, any function with the same qualified name matches
- * (e.g. "foo(int)" for name="foo").
- * @param name name of unmangled string (e.g. "Foo::Bar", "main", "::std::myfunc(int)")
- * @return collection of matching symbols, may be empty
- */
- Collection<ISymbol> findUnmangledSymbols(String name);
-
- /**
- * Get the symbols from the symbol table
- *
- * @return unmodifiable list of symbols
- */
- Collection<ISymbol> getSymbols();
-
-
- /**
- * Get the symbol that contains the given link address
- *
- * @param linkAddress
- * the link address
- * @return the symbol containing this address, or null if none found
- */
- ISymbol getSymbolAtAddress(IAddress linkAddress);
-
- /**
- * Get the byte order of data in the executable
- * @return {@link ByteOrder}
- */
- ByteOrder getByteOrder();
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.nio.ByteOrder;
+import java.util.Collection;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISection;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Interface for handling different kinds of executables. This manages
+ * the mid-level access to different executable formats (ELF, PE-COFF, etc.).
+ */
+public interface IExecutableSymbolicsReader {
+ /**
+ * Dispose the reader and any files or memory it is holding
+ */
+ void dispose();
+
+ /**
+ * Get the file represented by this reader
+ */
+ IPath getSymbolFile();
+
+ /**
+ * Get the executable sections from the symbol file (names and buffers)
+ * @return unmodifiable list of sections
+ */
+ Collection<IExecutableSection> getExecutableSections();
+
+ /**
+ * Get a section with the given name
+ * @param sectionName
+ * @return {@link IExecutableSection} or <code>null</code>
+ */
+ IExecutableSection findExecutableSection(String sectionName);
+
+ /**
+ * Get the (low level) sections from the symbol file
+ *
+ * @return unmodifiable list of sections
+ */
+ Collection<ISection> getSections();
+
+ /**
+ * Get the base image address generated by the linker
+ *
+ * @return the base address, or null if unknown
+ */
+ IAddress getBaseLinkAddress();
+
+ /**
+ * Get the modification date of the symbol file when it was parsed. This is
+ * used for caching purposes.
+ *
+ * @return the modification date (e.g. file.lastModified())
+ */
+ long getModificationDate();
+
+ /**
+ * Find symbol(s) with the given name. If no exact
+ * matches are found, also search for a symbol whose
+ * undecorated variant matches the name (e.g. in Win32, "_main" -> "main",
+ * "__imp_foo@8" -> "foo").
+ * @param name name of the symbol
+ * @return collection of matching symbols, may be empty
+ */
+ Collection<ISymbol> findSymbols(String name);
+
+ /**
+ * Find symbol(s) with the given unmangled name.
+ * The name will be interpreted as if spaces are irrelevant.
+ * The name will be matched as if a fully qualified name (e.g.
+ * leading "::" may be missing).
+ * If a symbol is a function and the name does not include
+ * arguments, any function with the same qualified name matches
+ * (e.g. "foo(int)" for name="foo").
+ * @param name name of unmangled string (e.g. "Foo::Bar", "main", "::std::myfunc(int)")
+ * @return collection of matching symbols, may be empty
+ */
+ Collection<ISymbol> findUnmangledSymbols(String name);
+
+ /**
+ * Get the symbols from the symbol table
+ *
+ * @return unmodifiable list of symbols
+ */
+ Collection<ISymbol> getSymbols();
+
+
+ /**
+ * Get the symbol that contains the given link address
+ *
+ * @param linkAddress
+ * the link address
+ * @return the symbol containing this address, or null if none found
+ * @see #getSymbolsAtAddress(IAddress) in many cases there may be more than
+ * one such symbol and this will only return the first one
+ */
+ ISymbol getSymbolAtAddress(IAddress linkAddress);
+
+ /**
+ * Get the symbols that contains the given link address
+ *
+ * @param linkAddress
+ * the link address
+ * @return the symbols containing this address, or the empty collection if none found
+ * @since 3.0
+ */
+ Collection<ISymbol> getSymbolsAtAddress(IAddress linkAddress);
+
+ /**
+ * Get the byte order of data in the executable
+ * @return {@link ByteOrder}
+ */
+ ByteOrder getByteOrder();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IHasSize.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IHasSize.java
new file mode 100644
index 0000000..c9b9cab
--- /dev/null
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IHasSize.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Broadcom 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+/**
+ * @since 3.0
+ */
+public interface IHasSize {
+ /**
+ * Get the size
+ *
+ * @return the size
+ */
+ long getSize();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IModuleScope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IModuleScope.java
index 3495a82..d3b1a2f 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IModuleScope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IModuleScope.java
@@ -1,94 +1,103 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Interface representing a module scope. A module is a symbol file which
- * contains compile units.
- */
-public interface IModuleScope extends IScope {
-
- /**
- * Get the module described
- */
- IPath getSymbolFile();
-
- /**
- * Get the compile unit at the given link address
- *
- * @param address
- * the link address
- * @return the compile unit at the address, or null if none
- */
- ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress);
-
- /**
- * Get the compile unit(s) for the given file
- *
- * @param filePath
- * the file path as defined in the symbolics
- * @return the compile unit for this file, possibly empty
- */
- List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath);
-
- /**
- * Get all functions with the given name in any scope in the module
- *
- * @param name
- * the function name, or <code>null</code> for all functions
- * @return unmodifiable list of functions, which may be empty
- */
- Collection<IFunctionScope> getFunctionsByName(String name);
-
- /**
- * Get all variables with the given name in any scope in the module
- *
- * @param name
- * the variable name, or <code>null</code> to get all variables
- * @param globalsOnly
- * whether to assume local variables in scope have been recorded
- * and only globally-visible variables remain to be found
- * @return unmodifiable list of variables, which may be empty
- */
- Collection<IVariable> getVariablesByName(String name, boolean globalsOnly);
-
-
- /**
- * Get all the types declared in the module.
- * <p>
- * This does not load types on demand; each IType instance may be a proxy for a
- * type loaded once methods are called on it. Thus, do not use "instanceof" to
- * check the type.
- * @return unmodifiable list of types, which may be empty.
- */
- Collection<IType> getTypes();
-
- /**
- * Get the line entry provider for the module. This aggregates the
- * information for any source or header file referenced in the module.
- * @return {@link IModuleLineEntryProvider}, never <code>null</code>
- */
- IModuleLineEntryProvider getModuleLineEntryProvider();
-
- /**
- * Get a provider that allows access to registers stored in other stack frames.
- * @return {@link IFrameRegisterProvider} or <code>null</code>
- */
- IFrameRegisterProvider getFrameRegisterProvider();
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.edc.services.IFrameRegisterProvider;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Interface representing a module scope. A module is a symbol file which
+ * contains compile units.
+ */
+public interface IModuleScope extends IScope {
+
+ /**
+ * Get the module described
+ */
+ IPath getSymbolFile();
+
+ /**
+ * Get the compile unit at the given link address
+ *
+ * @param address
+ * the link address
+ * @return the compile unit at the address, or null if none
+ */
+ ICompileUnitScope getCompileUnitForAddress(IAddress linkAddress);
+
+ /**
+ * Get the compile unit(s) for the given file
+ *
+ * @param filePath
+ * the file path as defined in the symbolics
+ * @return the compile unit for this file, possibly empty
+ */
+ List<ICompileUnitScope> getCompileUnitsForFile(IPath filePath);
+
+ /**
+ * Get all functions with the given name in any scope in the module
+ *
+ * @param name
+ * the function name, or <code>null</code> for all functions
+ * @return unmodifiable list of functions, which may be empty
+ */
+ Collection<IFunctionScope> getFunctionsByName(String name);
+
+ /**
+ * Get the first function with the given name in any scope in the module
+ *
+ * @param name
+ * the function name, cannot be <code>null</code>.
+ * @return a function scope if found, null otherwise.
+ * @since 3.0
+ */
+ IFunctionScope getFunctionByName(String name);
+
+ /**
+ * Get all variables with the given name in any scope in the module
+ *
+ * @param name
+ * the variable name, or <code>null</code> to get all variables
+ * @param globalsOnly
+ * whether to assume local variables in scope have been recorded
+ * and only globally-visible variables remain to be found
+ * @return unmodifiable list of variables, which may be empty
+ */
+ Collection<IVariable> getVariablesByName(String name, boolean globalsOnly);
+
+ /**
+ * Get all the types declared in the module.
+ * <p>
+ * This does not load types on demand; each IType instance may be a proxy for a
+ * type loaded once methods are called on it. Thus, do not use "instanceof" to
+ * check the type.
+ * @return unmodifiable list of types, which may be empty.
+ */
+ Collection<IType> getTypes();
+
+ /**
+ * Get the line entry provider for the module. This aggregates the
+ * information for any source or header file referenced in the module.
+ * @return {@link IModuleLineEntryProvider}, never <code>null</code>
+ */
+ IModuleLineEntryProvider getModuleLineEntryProvider();
+
+ /**
+ * Get a provider that allows access to registers stored in other stack frames.
+ * @return {@link IFrameRegisterProvider} or <code>null</code>
+ */
+ IFrameRegisterProvider getFrameRegisterProvider();
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IScope.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IScope.java
index 210e2ed..aa65df3 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IScope.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/IScope.java
@@ -1,97 +1,71 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import java.util.Collection;
-
-import org.eclipse.cdt.core.IAddress;
-
-/**
- * Generic symbolic scope interface.
- */
-public interface IScope extends Comparable<Object> {
-
- /**
- * Get the name of the scope
- *
- * @return the name
- */
- String getName();
-
- /**
- * Tell whether the scope has an empty address range (either unset or unspecified)
- */
- boolean hasEmptyRange();
-
- /**
- * Get the low link address of this scope (absolute or synthesized from a range list)
- *
- * @return low address, or null if unknown
- */
- IAddress getLowAddress();
-
- /**
- * Get the high link address of this scope (absolute or synthesized from a range list)
- *
- * @return high address, or null if unknown
- */
- IAddress getHighAddress();
-
- /**
- * Get the list of non-consecutive ranges for the scope.
- * @return list or <code>null</code> if the low and high addresses specify a contiguous range
- */
- IRangeList getRangeList();
-
- /**
- * Get the parent of this scope
- *
- * @return the parent scope, or null if the highest level scope
- */
- IScope getParent();
-
- /**
- * Gets the list of child scopes (if any)
- *
- * @return unmodifiable list of child scopes which may be empty
- */
- Collection<IScope> getChildren();
-
- /**
- * Gets the list of variables in this scope only
- *
- * @return unmodifiable list of variables which may be empty
- */
- Collection<IVariable> getVariables();
-
- /**
- * Gets the list of enumerators in this scope (if any)
- *
- * @return unmodifiable list of enumerators which may be empty
- */
- Collection<IEnumerator> getEnumerators();
-
- /**
- * Find the smallest scope at the given link address
- *
- * @param address
- * the link address
- * @return the smallest scope containing the given address, or null if none
- * found
- */
- IScope getScopeAtAddress(IAddress linkAddress);
-
- /**
- *
- */
- void dispose();
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.util.Collection;
+
+import org.eclipse.cdt.core.IAddress;
+
+/**
+ * Generic symbolic scope interface.
+ */
+public interface IScope extends Comparable<Object>, IAddressInterval {
+
+ /**
+ * Get the list of non-consecutive ranges for the scope.
+ * @return list or <code>null</code> if the low and high addresses specify a contiguous range
+ */
+ IRangeList getRangeList();
+
+ /**
+ * Get the parent of this scope
+ *
+ * @return the parent scope, or null if the highest level scope
+ */
+ IScope getParent();
+
+ /**
+ * Gets the list of child scopes (if any)
+ *
+ * @return unmodifiable list of child scopes which may be empty
+ */
+ Collection<IScope> getChildren();
+
+ /**
+ * Gets the list of variables in this scope only
+ *
+ * @return unmodifiable list of variables which may be empty
+ */
+ Collection<IVariable> getVariables();
+
+ /**
+ * Gets the list of enumerators in this scope (if any)
+ *
+ * @return unmodifiable list of enumerators which may be empty
+ */
+ Collection<IEnumerator> getEnumerators();
+
+ /**
+ * Find the smallest scope at the given link address
+ *
+ * @param address
+ * the link address
+ * @return the smallest scope containing the given address, or null if none
+ * found
+ */
+ IScope getScopeAtAddress(IAddress linkAddress);
+
+ /**
+ *
+ */
+ void dispose();
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/ISymbol.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/ISymbol.java
index 5a148e9..4f3d4c2 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/ISymbol.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/ISymbol.java
@@ -1,41 +1,81 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import org.eclipse.cdt.core.IAddress;
-
-/**
- * Interface representing a symbol from the symbol table
- */
-public interface ISymbol extends Comparable<Object> {
-
- /**
- * Get the symbol name
- *
- * @return the symbol name
- */
- String getName();
-
- /**
- * Get the address of the symbol
- *
- * @return the symbol address
- */
- IAddress getAddress();
-
- /**
- * Get the size of the symbol
- *
- * @return the symbol size
- */
- long getSize();
-
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - addition of properties
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+
+/**
+ * Interface representing a symbol from the symbol table
+ * @since 2.0
+ */
+public interface ISymbol extends Comparable<Object>, IAddressInterval, IHasSize {
+
+ /**
+ * the executable section containing this symbol
+ * @since 3.0
+ */
+ static final String PROPERTY_CONTAINER = IExecutableSection.PROPERTY_CONTAINER;
+
+ /**
+ * Symbol has a type indicating executable code such as a function
+ * @since 3.0
+ */
+ static final String PROPERTY_EXECUTABLE = IExecutableSection.PROPERTY_EXECUTABLE;
+
+ /**
+ * Symbol has type indicating that it is for a data object
+ * @since 3.0
+ */
+ static final String PROPERTY_DATA = "data"; //$NON-NLS-1$
+
+ /**
+ * Symbol is neither executable code nor data but something else such as a file or section
+ * @since 3.0
+ */
+ static final String PROPERTY_NOT_EXECUTABLE_OR_DATA = "notExecutableOrData"; //$NON-NLS-1$
+
+ /**
+ * Symbol represents a file
+ * @since 3.0
+ */
+ static final String PROPERTY_FILE = "file"; //$NON-NLS-1$
+
+ /**
+ * Symbol is for a section
+ * @since 3.0
+ */
+ static final String PROPERTY_SECTION = "section"; //$NON-NLS-1$
+
+ /**
+ * Get the address of the symbol
+ *
+ * @return the symbol address
+ */
+ IAddress getAddress();
+
+ /**
+ * Get the size of the symbol
+ *
+ * @return the symbol size
+ */
+ long getSize();
+
+ /**
+ * Get the properties of the section
+ *
+ * @return the section properties
+ * @since 3.0
+ */
+ Map<String, Object> getProperties();
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeEngine.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeEngine.java
index aa4e545..df05a86 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeEngine.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeEngine.java
@@ -1,557 +1,556 @@
-/*******************************************************************************
- * Copyright (c) 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.debug.edc.symbols;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
-import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
-import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
-import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
-import org.eclipse.cdt.core.dom.ast.IASTExpression;
-import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
-import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
-import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
-import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId;
-import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
-import org.eclipse.cdt.core.dom.ast.IASTTypeId;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator;
-import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
-import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.PushLongOrBigInteger;
-import org.eclipse.cdt.debug.edc.internal.symbols.ArrayBoundType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.CPPBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
-import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
-import org.eclipse.cdt.debug.edc.services.ITargetEnvironment;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * This class manages the {@link IType} instances relevant to a given target.
- * @noextend This class is not intended to be subclassed by clients.
- */
-@SuppressWarnings("deprecation")
-public class TypeEngine {
- private Map<Integer, Integer> typeSizeMap;
- private Map<Object, IType> typeMap = new HashMap<Object, IType>();
- private int addressSize;
- private Map<IType, String> typeNameMap = new HashMap<IType, String>();
- private final IDebugInfoProvider debugInfoProvider;
- /** map of type signature to IType or CoreException */
- private Map<String, Object> typeIdToTypeMap = new HashMap<String, Object>();
- private Map<String, IArrayType> typeToArrayTypeMap = new HashMap<String, IArrayType>();
- private boolean charIsSigned;
-
- /**
- * @since 2.0
- */
- public TypeEngine(ITargetEnvironment targetEnvironment, IDebugInfoProvider debugInfoProvider) {
- this.debugInfoProvider = debugInfoProvider;
- if (targetEnvironment != null) {
- typeSizeMap = targetEnvironment.getBasicTypeSizes();
- addressSize = targetEnvironment.getPointerSize();
- charIsSigned = targetEnvironment.isCharSigned();
- } else {
- typeSizeMap = Collections.emptyMap();
- addressSize = 4;
- charIsSigned = true;
- }
- }
-
- /**
- * Get the target's basic type for an integer of the given size
- * @param size
- * @param isSigned
- * @return type or <code>null</code> if no match
- */
- public IType getIntegerTypeOfSize(int size, boolean isSigned) {
- int basicType;
- int flags;
-
- if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
- basicType = ICPPBasicType.t_char;
- flags = ICPPBasicType.IS_SIGNED;
- } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
- basicType = ICPPBasicType.t_char;
- flags = ICPPBasicType.IS_UNSIGNED;
- } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_SHORT) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_SHORT + ICPPBasicType.IS_SIGNED;
- } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_SHORT) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_SHORT + ICPPBasicType.IS_UNSIGNED;
- } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_INT) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_SIGNED;
- } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_INT) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_UNSIGNED;
- } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_LONG + ICPPBasicType.IS_SIGNED;
- } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_LONG + ICPPBasicType.IS_UNSIGNED;
- } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_LONG) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_LONG_LONG + ICPPBasicType.IS_SIGNED;
- } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_LONG) == size) {
- basicType = ICPPBasicType.t_int;
- flags = ICPPBasicType.IS_LONG_LONG + ICPPBasicType.IS_UNSIGNED;
- } else {
- return null;
- }
-
- return getBasicType(basicType, flags, size);
- }
-
- /**
- * Get the target's basic type for an integer of the given kind
- * @param typeUtilsType from TypeUtils#BASIC_TYPE
- * @param isSigned
- * @return type or <code>null</code> if no match
- */
- public IType getIntegerTypeFor(int typeUtilsBasicType, boolean isSigned) {
- return getIntegerTypeOfSize(typeSizeMap.get(typeUtilsBasicType), isSigned);
- }
-
- /**
- * Get a cached ICPPBasicType instance
- * @param basicType
- * @param flags
- * @param size
- * @return IType
- */
- public IType getBasicType(int basicType, int flags, int size) {
- return getBasicType(null, basicType, flags, size);
- }
-
- /**
- * Get a cached ICPPBasicType instance, using a custom name.
- * @param name
- * @param basicType
- * @param flags
- * @param size
- * @return IType
- */
- public IType getBasicType(String name, int basicType, int flags, int size) {
- Object typeCode = (flags << 16) + (basicType << 8) + size;
- if (name != null)
- typeCode = name + ":" + typeCode; //$NON-NLS-1$
- IType type = typeMap.get(typeCode);
- if (type == null) {
- if (name == null)
- name = getBasicTypeName(basicType, flags);
- type = new CPPBasicType(name, basicType, flags, size);
- typeMap.put(typeCode, type);
- }
- return type;
- }
-
- /**
- * @param basicType
- * @param flags
- * @return
- */
- private String getBasicTypeName(int basicType, int flags) {
- String name;
- switch (basicType) {
- case ICPPBasicType.t_bool:
- name = "bool"; break; //$NON-NLS-1$
- case ICPPBasicType.t_wchar_t:
- name = "wchar_t"; break; //$NON-NLS-1$
- case ICPPBasicType.t_char:
- name = "char"; break; //$NON-NLS-1$
- case ICPPBasicType.t_int:
- if ((flags & ICPPBasicType.IS_SHORT) != 0)
- name = "short"; //$NON-NLS-1$
- else if ((flags & ICPPBasicType.IS_LONG) != 0)
- name = "long"; //$NON-NLS-1$
- else if ((flags & ICPPBasicType.IS_LONG_LONG) != 0)
- name = "long long"; //$NON-NLS-1$
- else
- name = "int"; //$NON-NLS-1$
- break;
- case ICPPBasicType.t_float:
- name = "float"; break; //$NON-NLS-1$
- case ICPPBasicType.t_double:
- if ((flags & ICPPBasicType.IS_LONG) != 0)
- name = "long double"; //$NON-NLS-1$
- else
- name = "double"; //$NON-NLS-1$
- break;
- case ICPPBasicType.t_unspecified:
- name = "<<unknown>>"; //$NON-NLS-1$
- break;
- case ICPPBasicType.t_void:
- name = "void"; //$NON-NLS-1$
- break;
- default:
- assert(false);
- name = ""; //$NON-NLS-1$
- break;
- }
-
- if ((flags & ICPPBasicType.IS_SIGNED) != 0)
- name = "signed " + name; //$NON-NLS-1$
- else if ((flags & ICPPBasicType.IS_UNSIGNED) != 0)
- name = "unsigned " + name; //$NON-NLS-1$
- if ((flags & ICPPBasicType.IS_COMPLEX) != 0)
- name = "complex " + name; //$NON-NLS-1$
- if ((flags & ICPPBasicType.IS_IMAGINARY) != 0)
- name = "imaginary " + name; //$NON-NLS-1$
- return name;
- }
-
- /**
- * Get the target's basic type for a float of the given size
- * @param size
- * @param isSigned
- * @return type or <code>null</code> if no match
- */
- public IType getFloatTypeOfSize(int size) {
- if (typeSizeMap.get(TypeUtils.BASIC_TYPE_FLOAT) == size) {
- return getBasicType(ICPPBasicType.t_float, 0, size);
- }
- if (typeSizeMap.get(TypeUtils.BASIC_TYPE_DOUBLE) == size) {
- return getBasicType(ICPPBasicType.t_double, 0, size);
- }
- if (typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_DOUBLE) == size) {
- return getBasicType(ICPPBasicType.t_double, ICPPBasicType.IS_LONG, size);
- }
- return null;
- }
-
- /**
- * Get the basic type for a character of a given size.
- * @param size
- * @return IType
- */
- public IType getCharacterType(int size) {
- if (typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
- return getBasicType(ICPPBasicType.t_char, 0, size);
- }
- return getBasicType(ICPPBasicType.t_wchar_t, 0, size);
- }
-
- /**
- * Get the basic type for a character of a given size.
- * @param size
- * @return IType
- */
- public IType getWideCharacterType(int size) {
- return getBasicType(ICPPBasicType.t_wchar_t, 0, size);
- }
-
- public IType getBooleanType(int size) {
- return getBasicType(ICPPBasicType.t_bool, 0, size);
- }
-
- public IType getCharArrayType(IType charType, int length) {
- IArrayBoundType bounds = new ArrayBoundType(null, length);
- IArrayType array = new ArrayType(charType.getName() + "[" + length + "]", null, length, null); //$NON-NLS-1$ //$NON-NLS-2$
- array.addBound(bounds);
- array.setType(charType);
- return array;
- }
-
- /**
- * Get the integral type the same size as a pointer.
- * @return IType or <code>null</code>
- */
- public IType getPointerSizeType() {
- int size = getPointerSize();
- return getBasicType("ptrsize_t", ICPPBasicType.t_int, 0, size); //$NON-NLS-1$
- }
-
- private int getPointerSize() {
- return addressSize;
- }
-
- /**
- * Get the byte size of a type
- * @param basicType (TypeUtils#BASIC_TYPE_xxx)
- * @return type, or 0 if unknown
- */
- public int getTypeSize(int basicType) {
- Integer size = typeSizeMap.get(basicType);
- return size != null ? size.intValue() : 0;
- }
-
- /**
- * @param valueType
- * @return
- */
- public String getTypeName(IType valueType) {
- if (valueType == null)
- return ""; //$NON-NLS-1$
-
- String typeName = null;
- synchronized (typeNameMap) {
- typeName = typeNameMap.get(valueType);
- if (typeName == null) {
- typeName = TypeUtils.getFullTypeName(valueType);
- typeNameMap.put(valueType, typeName);
- }
- }
- return typeName;
- }
-
- /**
- * Convert an AST type ID into an EDC IType.
- * @param typeId
- * @return IType
- * @throws CoreException if the IType cannot be created
- */
- public IType getTypeForTypeId(IASTTypeId typeId) throws CoreException {
- if (typeId == null)
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_NoTypeToCast);
-
- if (typeId instanceof IASTProblemTypeId)
- throw EDCDebugger.newCoreException(((IASTProblemTypeId) typeId).getProblem().getMessage());
-
- String typeSignature = ASTSignatureUtil.getSignature(typeId);
-
- Object obj = typeIdToTypeMap.get(typeSignature);
- if (obj instanceof CoreException)
- throw (CoreException) obj;
-
- obj = null; //HACK
- IType type = null;
- if (!(obj instanceof IType)) {
- try {
- type = createTypeForTypeId(typeId, typeSignature, type);
- typeIdToTypeMap.put(typeSignature, type);
- } catch (CoreException e) {
- typeIdToTypeMap.put(typeSignature, e);
- throw e;
- }
- } else {
- type = (IType) obj;
- }
-
- return type;
- }
-
- /**
- * Create an IType mapping to IASTTypeId
- * @param typeId
- * @param typeSignature
- * @param type
- * @return new IType
- * @throws CoreException
- */
- @SuppressWarnings("unused")
- private IType createTypeForTypeId(IASTTypeId typeId, String typeSignature, IType type) throws CoreException {
- IASTDeclSpecifier declSpec = typeId.getDeclSpecifier();
- if (declSpec instanceof IASTSimpleDeclSpecifier) {
- type = getTypeForDeclSpecifier((IASTSimpleDeclSpecifier) declSpec);
- } else if (declSpec instanceof IASTNamedTypeSpecifier || declSpec instanceof IASTElaboratedTypeSpecifier) {
- String typeName;
-
- int elaboration = -1;
-
- if (declSpec instanceof IASTNamedTypeSpecifier) {
- typeName = ((IASTNamedTypeSpecifier) declSpec).getName().toString();
- } else /*if (declSpec instanceof IASTElaboratedTypeSpecifier)*/ {
- // note: ignore the elaboration (class/struct/etc) since compilers are
- // inconsistent with how they do this, and furthermore, only one name
- // should be visible at a time, usually, anyway
- elaboration = ((IASTElaboratedTypeSpecifier) declSpec).getKind();
- typeName = ((IASTElaboratedTypeSpecifier) declSpec).getName().toString();
- }
-
- if (debugInfoProvider != null) {
- Collection<IType> types;
- IType aMatch = null;
- types = debugInfoProvider.getTypesByName(typeName);
-
- // try to find one matching struct/class/etc
- for (IType aType : types) {
- aMatch = aType;
- if (elaboration < 0 ||
- (type instanceof ICompositeType && ((ICompositeType) type).getKey() == elaboration)) {
- type = aType;
- break;
- }
- }
-
- // if no match, just take a matching name
- if (type == null && aMatch != null) {
- type = aMatch;
- }
-
- // fall through to check type != null
- }
- }
-
- if (type == null) {
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_CannotResolveType + typeSignature);
- }
-
- if (typeId.getAbstractDeclarator() instanceof ICPPASTDeclarator) {
- ICPPASTDeclarator declarator = (ICPPASTDeclarator) typeId.getAbstractDeclarator();
- for (IASTPointerOperator pointer : declarator.getPointerOperators()) {
- IType ptr = new PointerType(type.getName()+"*", type.getScope(), getPointerSize(), null); //$NON-NLS-1$
- ptr.setType(type);
- type = ptr;
- }
-
- if (declarator instanceof ICPPASTArrayDeclarator) {
- ICPPASTArrayDeclarator arrayDeclarator = (ICPPASTArrayDeclarator) declarator;
- IArrayType arrayType = new ArrayType(type.getName()+"[]", type.getScope(), 0, null); //$NON-NLS-1$
- for (IASTArrayModifier arrayMod : arrayDeclarator.getArrayModifiers()) {
- long elementCount = 1;
- if (arrayMod.getConstantExpression() != null) {
- elementCount = getConstantValue(arrayMod.getConstantExpression());
- }
- IArrayBoundType bound = new ArrayBoundType(arrayType.getScope(), elementCount);
- arrayType.addBound(bound);
- }
- arrayType.setType(type);
- type = arrayType;
- }
- }
- return type;
- }
-
- private long getConstantValue(IASTExpression constantExpression) throws CoreException {
- if (constantExpression instanceof IASTLiteralExpression) {
- if (((IASTLiteralExpression) constantExpression).getKind() == IASTLiteralExpression.lk_integer_constant) {
- // HACK, use more generic utilities
- PushLongOrBigInteger pusher = new PushLongOrBigInteger(constantExpression.toString());
- return pusher.getLong();
- }
- }
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_ExpectedIntegerConstant +
- ASTSignatureUtil.getExpressionString(constantExpression));
- }
-
- private IType getTypeForDeclSpecifier(IASTSimpleDeclSpecifier simpleDeclSpec) throws CoreException {
- int baseType = 0;
- int basicType = 0;
- switch (simpleDeclSpec.getType()) {
- case IASTSimpleDeclSpecifier.t_bool:
- baseType = ICPPBasicType.t_bool;
- basicType = TypeUtils.BASIC_TYPE_BOOL;
- break;
- case IASTSimpleDeclSpecifier.t_char:
- baseType = ICPPBasicType.t_char;
- basicType = TypeUtils.BASIC_TYPE_CHAR;
- break;
- case IASTSimpleDeclSpecifier.t_wchar_t:
- baseType = ICPPBasicType.t_wchar_t;
- basicType = TypeUtils.BASIC_TYPE_WCHAR_T;
- break;
- case IASTSimpleDeclSpecifier.t_double:
- baseType = ICPPBasicType.t_double;
- basicType = TypeUtils.BASIC_TYPE_DOUBLE;
- break;
- case IASTSimpleDeclSpecifier.t_float:
- baseType = ICPPBasicType.t_float;
- basicType = TypeUtils.BASIC_TYPE_FLOAT;
- break;
- case IASTSimpleDeclSpecifier.t_int:
- baseType = ICPPBasicType.t_int;
- basicType = TypeUtils.BASIC_TYPE_INT;
- break;
- case IASTSimpleDeclSpecifier.t_void:
- baseType = ICPPBasicType.t_void;
- break;
- case IASTSimpleDeclSpecifier.t_typeof:
- // we'd need to parse the subexpression then get its type
- case IASTSimpleDeclSpecifier.t_decltype:
- // not sure about this one
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_NoDecltypeSupport);
- case IASTSimpleDeclSpecifier.t_unspecified:
- baseType = ICPPBasicType.t_int;
- break;
- default:
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_UnhandledType + simpleDeclSpec);
- }
-
- int flags = 0;
- if (simpleDeclSpec.isComplex()) flags |= ICPPBasicType.IS_COMPLEX;
- if (simpleDeclSpec.isImaginary()) flags |= ICPPBasicType.IS_IMAGINARY;
- if (simpleDeclSpec.isLong()) {
- flags |= ICPPBasicType.IS_LONG;
- if (basicType == 0)
- basicType = TypeUtils.BASIC_TYPE_LONG;
- }
- if (simpleDeclSpec.isLongLong()) {
- flags |= ICPPBasicType.IS_LONG_LONG;
- if (basicType == 0)
- basicType = TypeUtils.BASIC_TYPE_LONG_LONG;
- }
- if (simpleDeclSpec.isShort()) {
- flags |= ICPPBasicType.IS_SHORT;
- if (basicType == 0)
- basicType = TypeUtils.BASIC_TYPE_SHORT;
- }
- if (simpleDeclSpec.isUnsigned()) flags |= ICPPBasicType.IS_UNSIGNED;
- if (simpleDeclSpec.isSigned()) flags |= ICPPBasicType.IS_SIGNED;
-
- if (!simpleDeclSpec.isUnsigned() && !simpleDeclSpec.isSigned()) {
- if (baseType == ICPPBasicType.t_char)
- flags |= charIsSigned ? ICPPBasicType.IS_SIGNED : ICPPBasicType.IS_UNSIGNED;
- else if (baseType == ICPPBasicType.t_int)
- flags |= ICPPBasicType.IS_SIGNED;
- }
-
- int size = getTypeSize(basicType);
- return getBasicType(baseType, flags, size);
- }
-
- /**
- * Convert a given type to an array type
- * @param exprType
- * @return array type
- * @throws CoreException if not a sensible conversion
- */
- public IType convertToArrayType(IType type, int count) throws CoreException {
- String typeSig = getTypeName(type);
-
- IArrayType arrayType = typeToArrayTypeMap.get(typeSig);
- if (arrayType == null) {
- type = TypeUtils.getStrippedType(type);
-
- IType baseType = type;
-
- if (type instanceof IPointerType || type instanceof IArrayType) {
- baseType = type.getType();
- }
-
- if (baseType == null)
- throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_CannotResolveBaseType + typeSig);
-
- arrayType = new ArrayType(baseType.getName()+"[]", baseType.getScope(), //$NON-NLS-1$
- baseType.getByteSize() * count, null);
- IArrayBoundType bound = new ArrayBoundType(arrayType.getScope(), count);
- arrayType.addBound(bound);
- arrayType.setType(baseType);
-
- typeToArrayTypeMap.put(typeSig, arrayType);
- }
-
- return arrayType;
- }
-
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
+import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTExpression;
+import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
+import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
+import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId;
+import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTTypeId;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator;
+import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.PushLongOrBigInteger;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.CPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICPPBasicType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
+import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
+import org.eclipse.cdt.debug.edc.services.ITargetEnvironment;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * This class manages the {@link IType} instances relevant to a given target.
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+@SuppressWarnings("deprecation")
+public class TypeEngine {
+ private Map<Integer, Integer> typeSizeMap;
+ private Map<Object, IType> typeMap = new HashMap<Object, IType>();
+ private int addressSize;
+ private Map<IType, String> typeNameMap = new HashMap<IType, String>();
+ private final IDebugInfoProvider debugInfoProvider;
+ /** map of type signature to IType or CoreException */
+ private Map<String, Object> typeIdToTypeMap = new HashMap<String, Object>();
+ private Map<String, IArrayType> typeToArrayTypeMap = new HashMap<String, IArrayType>();
+ private boolean charIsSigned;
+
+ /**
+ * @since 2.0
+ */
+ public TypeEngine(ITargetEnvironment targetEnvironment, IDebugInfoProvider debugInfoProvider) {
+ this.debugInfoProvider = debugInfoProvider;
+ if (targetEnvironment != null) {
+ typeSizeMap = targetEnvironment.getBasicTypeSizes();
+ addressSize = targetEnvironment.getPointerSize();
+ charIsSigned = targetEnvironment.isCharSigned();
+ } else {
+ typeSizeMap = Collections.emptyMap();
+ addressSize = 4;
+ charIsSigned = true;
+ }
+ }
+
+ /**
+ * Get the target's basic type for an integer of the given size
+ * @param size
+ * @param isSigned
+ * @return type or <code>null</code> if no match
+ */
+ public IType getIntegerTypeOfSize(int size, boolean isSigned) {
+ int basicType;
+ int flags;
+
+ if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
+ basicType = ICPPBasicType.t_char;
+ flags = ICPPBasicType.IS_SIGNED;
+ } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
+ basicType = ICPPBasicType.t_char;
+ flags = ICPPBasicType.IS_UNSIGNED;
+ } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_SHORT) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_SHORT + ICPPBasicType.IS_SIGNED;
+ } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_SHORT) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_SHORT + ICPPBasicType.IS_UNSIGNED;
+ } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_INT) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_SIGNED;
+ } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_INT) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_UNSIGNED;
+ } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_LONG + ICPPBasicType.IS_SIGNED;
+ } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_LONG + ICPPBasicType.IS_UNSIGNED;
+ } else if (isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_LONG) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_LONG_LONG + ICPPBasicType.IS_SIGNED;
+ } else if (!isSigned && typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_LONG) == size) {
+ basicType = ICPPBasicType.t_int;
+ flags = ICPPBasicType.IS_LONG_LONG + ICPPBasicType.IS_UNSIGNED;
+ } else {
+ return null;
+ }
+
+ return getBasicType(basicType, flags, size);
+ }
+
+ /**
+ * Get the target's basic type for an integer of the given kind
+ * @param typeUtilsType from TypeUtils#BASIC_TYPE
+ * @param isSigned
+ * @return type or <code>null</code> if no match
+ */
+ public IType getIntegerTypeFor(int typeUtilsBasicType, boolean isSigned) {
+ return getIntegerTypeOfSize(typeSizeMap.get(typeUtilsBasicType), isSigned);
+ }
+
+ /**
+ * Get a cached ICPPBasicType instance
+ * @param basicType
+ * @param flags
+ * @param size
+ * @return IType
+ */
+ public IType getBasicType(int basicType, int flags, int size) {
+ return getBasicType(null, basicType, flags, size);
+ }
+
+ /**
+ * Get a cached ICPPBasicType instance, using a custom name.
+ * @param name
+ * @param basicType
+ * @param flags
+ * @param size
+ * @return IType
+ */
+ public IType getBasicType(String name, int basicType, int flags, int size) {
+ Object typeCode = (flags << 16) + (basicType << 8) + size;
+ if (name != null)
+ typeCode = name + ":" + typeCode; //$NON-NLS-1$
+ IType type = typeMap.get(typeCode);
+ if (type == null) {
+ if (name == null)
+ name = getBasicTypeName(basicType, flags);
+ type = new CPPBasicType(name, basicType, flags, size);
+ typeMap.put(typeCode, type);
+ }
+ return type;
+ }
+
+ /**
+ * @param basicType
+ * @param flags
+ * @return
+ */
+ private String getBasicTypeName(int basicType, int flags) {
+ String name;
+ switch (basicType) {
+ case ICPPBasicType.t_bool:
+ name = "bool"; break; //$NON-NLS-1$
+ case ICPPBasicType.t_wchar_t:
+ name = "wchar_t"; break; //$NON-NLS-1$
+ case ICPPBasicType.t_char:
+ name = "char"; break; //$NON-NLS-1$
+ case ICPPBasicType.t_int:
+ if ((flags & ICPPBasicType.IS_SHORT) != 0)
+ name = "short"; //$NON-NLS-1$
+ else if ((flags & ICPPBasicType.IS_LONG) != 0)
+ name = "long"; //$NON-NLS-1$
+ else if ((flags & ICPPBasicType.IS_LONG_LONG) != 0)
+ name = "long long"; //$NON-NLS-1$
+ else
+ name = "int"; //$NON-NLS-1$
+ break;
+ case ICPPBasicType.t_float:
+ name = "float"; break; //$NON-NLS-1$
+ case ICPPBasicType.t_double:
+ if ((flags & ICPPBasicType.IS_LONG) != 0)
+ name = "long double"; //$NON-NLS-1$
+ else
+ name = "double"; //$NON-NLS-1$
+ break;
+ case ICPPBasicType.t_unspecified:
+ name = "<<unknown>>"; //$NON-NLS-1$
+ break;
+ case ICPPBasicType.t_void:
+ name = "void"; //$NON-NLS-1$
+ break;
+ default:
+ assert(false);
+ name = ""; //$NON-NLS-1$
+ break;
+ }
+
+ if ((flags & ICPPBasicType.IS_SIGNED) != 0)
+ name = "signed " + name; //$NON-NLS-1$
+ else if ((flags & ICPPBasicType.IS_UNSIGNED) != 0)
+ name = "unsigned " + name; //$NON-NLS-1$
+ if ((flags & ICPPBasicType.IS_COMPLEX) != 0)
+ name = "complex " + name; //$NON-NLS-1$
+ if ((flags & ICPPBasicType.IS_IMAGINARY) != 0)
+ name = "imaginary " + name; //$NON-NLS-1$
+ return name;
+ }
+
+ /**
+ * Get the target's basic type for a float of the given size
+ * @param size
+ * @param isSigned
+ * @return type or <code>null</code> if no match
+ */
+ public IType getFloatTypeOfSize(int size) {
+ if (typeSizeMap.get(TypeUtils.BASIC_TYPE_FLOAT) == size) {
+ return getBasicType(ICPPBasicType.t_float, 0, size);
+ }
+ if (typeSizeMap.get(TypeUtils.BASIC_TYPE_DOUBLE) == size) {
+ return getBasicType(ICPPBasicType.t_double, 0, size);
+ }
+ if (typeSizeMap.get(TypeUtils.BASIC_TYPE_LONG_DOUBLE) == size) {
+ return getBasicType(ICPPBasicType.t_double, ICPPBasicType.IS_LONG, size);
+ }
+ return null;
+ }
+
+ /**
+ * Get the basic type for a character of a given size.
+ * @param size
+ * @return IType
+ */
+ public IType getCharacterType(int size) {
+ if (typeSizeMap.get(TypeUtils.BASIC_TYPE_CHAR) == size) {
+ return getBasicType(ICPPBasicType.t_char, 0, size);
+ }
+ return getBasicType(ICPPBasicType.t_wchar_t, 0, size);
+ }
+
+ /**
+ * Get the basic type for a character of a given size.
+ * @param size
+ * @return IType
+ */
+ public IType getWideCharacterType(int size) {
+ return getBasicType(ICPPBasicType.t_wchar_t, 0, size);
+ }
+
+ public IType getBooleanType(int size) {
+ return getBasicType(ICPPBasicType.t_bool, 0, size);
+ }
+
+ public IType getCharArrayType(IType charType, int length) {
+ IArrayBoundType bounds = new ArrayBoundType(null, length);
+ IArrayType array = new ArrayType(charType.getName(), null, length, null); //$NON-NLS-1$ //$NON-NLS-2$
+ array.addBound(bounds);
+ array.setType(charType);
+ return array;
+ }
+
+ /**
+ * Get the integral type the same size as a pointer.
+ * @return IType or <code>null</code>
+ */
+ public IType getPointerSizeType() {
+ int size = getPointerSize();
+ return getBasicType("ptrsize_t", ICPPBasicType.t_int, 0, size); //$NON-NLS-1$
+ }
+
+ private int getPointerSize() {
+ return addressSize;
+ }
+
+ /**
+ * Get the byte size of a type
+ * @param basicType (TypeUtils#BASIC_TYPE_xxx)
+ * @return type, or 0 if unknown
+ */
+ public int getTypeSize(int basicType) {
+ Integer size = typeSizeMap.get(basicType);
+ return size != null ? size.intValue() : 0;
+ }
+
+ /**
+ * @param valueType
+ * @return
+ */
+ public String getTypeName(IType valueType) {
+ if (valueType == null)
+ return ""; //$NON-NLS-1$
+
+ String typeName = null;
+ synchronized (typeNameMap) {
+ typeName = typeNameMap.get(valueType);
+ if (typeName == null) {
+ typeName = TypeUtils.getFullTypeName(valueType);
+ typeNameMap.put(valueType, typeName);
+ }
+ }
+ return typeName;
+ }
+
+ /**
+ * Convert an AST type ID into an EDC IType.
+ * @param typeId
+ * @return IType
+ * @throws CoreException if the IType cannot be created
+ */
+ public IType getTypeForTypeId(IASTTypeId typeId) throws CoreException {
+ if (typeId == null)
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_NoTypeToCast);
+
+ if (typeId instanceof IASTProblemTypeId)
+ throw EDCDebugger.newCoreException(((IASTProblemTypeId) typeId).getProblem().getMessage());
+
+ String typeSignature = ASTSignatureUtil.getSignature(typeId);
+
+ Object obj = typeIdToTypeMap.get(typeSignature);
+ if (obj instanceof CoreException)
+ throw (CoreException) obj;
+
+ obj = null; //HACK
+ IType type = null;
+ if (!(obj instanceof IType)) {
+ try {
+ type = createTypeForTypeId(typeId, typeSignature, type);
+ typeIdToTypeMap.put(typeSignature, type);
+ } catch (CoreException e) {
+ typeIdToTypeMap.put(typeSignature, e);
+ throw e;
+ }
+ } else {
+ type = (IType) obj;
+ }
+
+ return type;
+ }
+
+ /**
+ * Create an IType mapping to IASTTypeId
+ * @param typeId
+ * @param typeSignature
+ * @param type
+ * @return new IType
+ * @throws CoreException
+ */
+ private IType createTypeForTypeId(IASTTypeId typeId, String typeSignature, IType type) throws CoreException {
+ IASTDeclSpecifier declSpec = typeId.getDeclSpecifier();
+ if (declSpec instanceof IASTSimpleDeclSpecifier) {
+ type = getTypeForDeclSpecifier((IASTSimpleDeclSpecifier) declSpec);
+ } else if (declSpec instanceof IASTNamedTypeSpecifier || declSpec instanceof IASTElaboratedTypeSpecifier) {
+ String typeName;
+
+ int elaboration = -1;
+
+ if (declSpec instanceof IASTNamedTypeSpecifier) {
+ typeName = ((IASTNamedTypeSpecifier) declSpec).getName().toString();
+ } else /*if (declSpec instanceof IASTElaboratedTypeSpecifier)*/ {
+ // note: ignore the elaboration (class/struct/etc) since compilers are
+ // inconsistent with how they do this, and furthermore, only one name
+ // should be visible at a time, usually, anyway
+ elaboration = ((IASTElaboratedTypeSpecifier) declSpec).getKind();
+ typeName = ((IASTElaboratedTypeSpecifier) declSpec).getName().toString();
+ }
+
+ if (debugInfoProvider != null) {
+ Collection<IType> types;
+ IType aMatch = null;
+ types = debugInfoProvider.getTypesByName(typeName);
+
+ // try to find one matching struct/class/etc
+ for (IType aType : types) {
+ aMatch = aType;
+ if (elaboration < 0 ||
+ (type instanceof ICompositeType && ((ICompositeType) type).getKey() == elaboration)) {
+ type = aType;
+ break;
+ }
+ }
+
+ // if no match, just take a matching name
+ if (type == null && aMatch != null) {
+ type = aMatch;
+ }
+
+ // fall through to check type != null
+ }
+ }
+
+ if (type == null) {
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_CannotResolveType + typeSignature);
+ }
+
+ if (typeId.getAbstractDeclarator() instanceof ICPPASTDeclarator) {
+ ICPPASTDeclarator declarator = (ICPPASTDeclarator) typeId.getAbstractDeclarator();
+ for (@SuppressWarnings("unused") IASTPointerOperator pointer : declarator.getPointerOperators()) {
+ IType ptr = new PointerType(type.getName()+"*", type.getScope(), getPointerSize(), null); //$NON-NLS-1$
+ ptr.setType(type);
+ type = ptr;
+ }
+
+ if (declarator instanceof ICPPASTArrayDeclarator) {
+ ICPPASTArrayDeclarator arrayDeclarator = (ICPPASTArrayDeclarator) declarator;
+ IArrayType arrayType = new ArrayType(type.getName(), type.getScope(), 0, null); //$NON-NLS-1$
+ for (IASTArrayModifier arrayMod : arrayDeclarator.getArrayModifiers()) {
+ long elementCount = 1;
+ if (arrayMod.getConstantExpression() != null) {
+ elementCount = getConstantValue(arrayMod.getConstantExpression());
+ }
+ IArrayBoundType bound = new ArrayBoundType(arrayType.getScope(), elementCount);
+ arrayType.addBound(bound);
+ }
+ arrayType.setType(type);
+ type = arrayType;
+ }
+ }
+ return type;
+ }
+
+ private long getConstantValue(IASTExpression constantExpression) throws CoreException {
+ if (constantExpression instanceof IASTLiteralExpression) {
+ if (((IASTLiteralExpression) constantExpression).getKind() == IASTLiteralExpression.lk_integer_constant) {
+ // HACK, use more generic utilities
+ PushLongOrBigInteger pusher = new PushLongOrBigInteger(constantExpression.toString());
+ return pusher.getLong();
+ }
+ }
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_ExpectedIntegerConstant +
+ ASTSignatureUtil.getExpressionString(constantExpression));
+ }
+
+ private IType getTypeForDeclSpecifier(IASTSimpleDeclSpecifier simpleDeclSpec) throws CoreException {
+ int baseType = 0;
+ int basicType = 0;
+ switch (simpleDeclSpec.getType()) {
+ case IASTSimpleDeclSpecifier.t_bool:
+ baseType = ICPPBasicType.t_bool;
+ basicType = TypeUtils.BASIC_TYPE_BOOL;
+ break;
+ case IASTSimpleDeclSpecifier.t_char:
+ baseType = ICPPBasicType.t_char;
+ basicType = TypeUtils.BASIC_TYPE_CHAR;
+ break;
+ case IASTSimpleDeclSpecifier.t_wchar_t:
+ baseType = ICPPBasicType.t_wchar_t;
+ basicType = TypeUtils.BASIC_TYPE_WCHAR_T;
+ break;
+ case IASTSimpleDeclSpecifier.t_double:
+ baseType = ICPPBasicType.t_double;
+ basicType = TypeUtils.BASIC_TYPE_DOUBLE;
+ break;
+ case IASTSimpleDeclSpecifier.t_float:
+ baseType = ICPPBasicType.t_float;
+ basicType = TypeUtils.BASIC_TYPE_FLOAT;
+ break;
+ case IASTSimpleDeclSpecifier.t_int:
+ baseType = ICPPBasicType.t_int;
+ basicType = TypeUtils.BASIC_TYPE_INT;
+ break;
+ case IASTSimpleDeclSpecifier.t_void:
+ baseType = ICPPBasicType.t_void;
+ break;
+ case IASTSimpleDeclSpecifier.t_typeof:
+ // we'd need to parse the subexpression then get its type
+ case IASTSimpleDeclSpecifier.t_decltype:
+ // not sure about this one
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_NoDecltypeSupport);
+ case IASTSimpleDeclSpecifier.t_unspecified:
+ baseType = ICPPBasicType.t_int;
+ break;
+ default:
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_UnhandledType + simpleDeclSpec);
+ }
+
+ int flags = 0;
+ if (simpleDeclSpec.isComplex()) flags |= ICPPBasicType.IS_COMPLEX;
+ if (simpleDeclSpec.isImaginary()) flags |= ICPPBasicType.IS_IMAGINARY;
+ if (simpleDeclSpec.isLong()) {
+ flags |= ICPPBasicType.IS_LONG;
+ if (basicType == 0)
+ basicType = TypeUtils.BASIC_TYPE_LONG;
+ }
+ if (simpleDeclSpec.isLongLong()) {
+ flags |= ICPPBasicType.IS_LONG_LONG;
+ if (basicType == 0)
+ basicType = TypeUtils.BASIC_TYPE_LONG_LONG;
+ }
+ if (simpleDeclSpec.isShort()) {
+ flags |= ICPPBasicType.IS_SHORT;
+ if (basicType == 0)
+ basicType = TypeUtils.BASIC_TYPE_SHORT;
+ }
+ if (simpleDeclSpec.isUnsigned()) flags |= ICPPBasicType.IS_UNSIGNED;
+ if (simpleDeclSpec.isSigned()) flags |= ICPPBasicType.IS_SIGNED;
+
+ if (!simpleDeclSpec.isUnsigned() && !simpleDeclSpec.isSigned()) {
+ if (baseType == ICPPBasicType.t_char)
+ flags |= charIsSigned ? ICPPBasicType.IS_SIGNED : ICPPBasicType.IS_UNSIGNED;
+ else if (baseType == ICPPBasicType.t_int)
+ flags |= ICPPBasicType.IS_SIGNED;
+ }
+
+ int size = getTypeSize(basicType);
+ return getBasicType(baseType, flags, size);
+ }
+
+ /**
+ * Convert a given type to an array type
+ * @param exprType
+ * @return array type
+ * @throws CoreException if not a sensible conversion
+ */
+ public IType convertToArrayType(IType type, int count) throws CoreException {
+ String typeSig = getTypeName(type);
+
+ IArrayType arrayType = typeToArrayTypeMap.get(typeSig);
+ if (arrayType == null) {
+ type = TypeUtils.getStrippedType(type);
+
+ IType baseType = type;
+
+ if (type instanceof IPointerType || type instanceof IArrayType) {
+ baseType = type.getType();
+ }
+
+ if (baseType == null)
+ throw EDCDebugger.newCoreException(SymbolsMessages.TypeEngine_CannotResolveBaseType + typeSig);
+
+ arrayType = new ArrayType(baseType.getName(), baseType.getScope(), //$NON-NLS-1$
+ baseType.getByteSize() * count, null);
+ IArrayBoundType bound = new ArrayBoundType(arrayType.getScope(), count);
+ arrayType.addBound(bound);
+ arrayType.setType(baseType);
+
+ typeToArrayTypeMap.put(typeSig, arrayType);
+ }
+
+ return arrayType;
+ }
+
+
+}
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeUtils.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeUtils.java
index 362ea5b..f37f522 100644
--- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeUtils.java
+++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/symbols/TypeUtils.java
@@ -1,317 +1,320 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Nokia 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nokia - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.debug.edc.symbols;
-
-import java.math.BigInteger;
-
-import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.IArrayDimensionType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IAggregate;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IConstType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
-import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IQualifierType;
-import org.eclipse.cdt.debug.edc.internal.symbols.IReferenceType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ISubroutineType;
-import org.eclipse.cdt.debug.edc.internal.symbols.ITypedef;
-
-
-/*
- * Various utility routines for Type objects
- */
-public class TypeUtils {
-
- // type IDs for basic C and C++ types
- static public final int BASIC_TYPE_CHAR = 1;
- static public final int BASIC_TYPE_CHAR_UNSIGNED = 2;
- static public final int BASIC_TYPE_CHAR_SIGNED = 3;
- static public final int BASIC_TYPE_SHORT = 4;
- static public final int BASIC_TYPE_SHORT_UNSIGNED = 5;
- static public final int BASIC_TYPE_INT = 6;
- static public final int BASIC_TYPE_INT_UNSIGNED = 7;
- static public final int BASIC_TYPE_LONG = 8;
- static public final int BASIC_TYPE_LONG_UNSIGNED = 9;
- static public final int BASIC_TYPE_LONG_LONG = 10;
- static public final int BASIC_TYPE_LONG_LONG_UNSIGNED = 11;
- static public final int BASIC_TYPE_FLOAT = 12;
- static public final int BASIC_TYPE_FLOAT_COMPLEX = 13;
- static public final int BASIC_TYPE_DOUBLE = 14;
- static public final int BASIC_TYPE_DOUBLE_COMPLEX = 15;
- static public final int BASIC_TYPE_LONG_DOUBLE = 16;
- static public final int BASIC_TYPE_LONG_DOUBLE_COMPLEX = 17;
- static public final int BASIC_TYPE_BOOL = 18;
- static public final int BASIC_TYPE_BOOL_C9X = 19;
- static public final int BASIC_TYPE_WCHAR_T = 20;
- static public final int BASIC_TYPE_POINTER = 21; // not technically a basic type
-
- // is a type a pointer "*" type?
- public static boolean isPointerType(IType type) {
- return getStrippedType(type) instanceof IPointerType;
- }
-
- // is a type a reference "&" type?
- public static boolean isReferenceType(IType type) {
- return getStrippedType(type) instanceof IReferenceType;
- }
-
- // is a type an aggregate (composite or array) type?
- public static boolean isAggregateType(IType type) {
- return getStrippedType(type) instanceof IAggregate;
- }
-
- // is a type a composite (class, struct, or union) type?
- public static boolean isCompositeType(IType type) {
- return getStrippedType(type) instanceof ICompositeType;
- }
-
- /**
- * is a type a constant type?
- * @since 2.0
- */
- public static boolean isConstType(IType type) {
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
-
- while ( type instanceof ITypedef || type instanceof IQualifierType || type instanceof IReferenceType
- || type instanceof IArrayType) {
- if (type instanceof IConstType)
- return true;
-
- type = type.getType();
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
- }
-
- return false;
- }
-
- // return the type with no typedefs, consts, or volatiles
- public static IType getStrippedType(IType type) {
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
-
- while (type instanceof ITypedef || type instanceof IQualifierType) {
- type = type.getType();
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
- }
-
- return type;
- }
-
- /**
- * Return the type with no typedefs, consts, volatiles, or references
- * @since 2.0
- */
- public static IType getUnRefStrippedType(IType type) {
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
-
- while (type instanceof ITypedef || type instanceof IQualifierType || type instanceof IReferenceType) {
- type = type.getType();
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
- }
-
- return type;
- }
-
- // return base type with no typedefs, consts, volatiles, or pointer types
- // removing array types messes up formatters because they are assumed to act on the array
- // but code creating expressions ignores the array syntax
- // unlike with pointer types where -> is used instead of .
- public static IType getBaseType(Object type) {
- if (!(type instanceof IType))
- return null;
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
-
- while (type instanceof ITypedef || type instanceof IQualifierType
- || type instanceof IPointerType) {
- type = ((IType) type).getType();
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
- }
-
- return (IType) type;
- }
-
- // return base type with no consts, volatiles, pointer types, or array types - but preserving typedefs
- public static IType getBaseTypePreservingTypedef(IType type) {
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
-
- while (type instanceof IQualifierType
- || type instanceof IPointerType || type instanceof IArrayType) {
- type = type.getType();
-
- if (type instanceof IForwardTypeReference)
- type = ((IForwardTypeReference) type).getReferencedType();
- }
-
- return type;
- }
-
- // shift, mask, and extend an extracted bit-field
- // NOTE: this may need to be endianness aware
- public static Number extractBitField(Number value, int byteSize, int bitSize, int bitOffset, boolean isSignedInt) {
- if (bitSize <= 0 || value == null
- || (!(value instanceof Long) && !(value instanceof Integer) && !(value instanceof BigInteger))) {
- return value;
- }
-
- // TODO: Need to get default type sizes from the ITargetEnvironment
- // This assumes long and long long are 64 bits, and int is 32 bits
- if (value instanceof Long) {
- long longValue = (Long) value;
-
- longValue >>= (byteSize * 8) - (bitOffset + bitSize);
- longValue &= (-1) >>> (64 - bitSize);
-
- if (isSignedInt) {
- if ((longValue & (1 << (bitSize - 1))) != 0) {
- longValue |= ((-1) >>> bitSize) << bitSize;
- }
- }
- return new Long(longValue);
- }
-
- if (value instanceof Integer) {
- int intValue = (Integer) value;
-
- intValue >>= (byteSize * 8) - (bitOffset + bitSize);
- intValue &= ((-1) >>> (32 - bitSize));
-
- if (isSignedInt) {
- if ((intValue & (1 << (bitSize - 1))) != 0) {
- intValue |= ((-1) >>> bitSize) << bitSize;
- }
- }
- return new Integer(intValue);
- }
-
- if (value instanceof BigInteger) {
- BigInteger bigValue = (BigInteger) value;
- bigValue = bigValue.shiftRight((byteSize * 8) - (bitOffset + bitSize));
- byte[] bytes = new byte[8];
- int mask;
- BigInteger bigMask;
-
- mask = ((-1) >>> (32 - bitSize));
- for (int i = 0; i < 8; i++) {
- bytes[i] = (byte) ((mask >>> ((7 - i) * 8)) & 0xff);
- }
-
- bigMask = new BigInteger(bytes);
- bigValue = bigValue.and(bigMask);
-
- if (isSignedInt) {
- // NOTE: for variable values, we use BigInteger ONLY for
- // unsigned numbers
- if (bigValue.testBit(bitSize - 1)) {
- mask = (((-1) >>> bitSize) << bitSize);
- for (int i = 0; i < 8; i++) {
- bytes[i] = (byte) ((mask >>> ((7 - i) * 8)) & 0xff);
- }
-
- bigMask = new BigInteger(bytes);
- bigValue = bigValue.or(bigMask);
- }
- }
-
- return bigValue;
- }
-
- return value;
- }
-
- /**
- * Get the full name of a type.
- *
- * {@link TypeEngine#getTypeName(IType)} caches the full name returned by this routine and associates it
- * with the type passed in.
- *
- * @param type type whose full name is desired
- * @return full name of the type, with all qualifiers, array bounds, etc.
- *
- * @since 2.0
- */
- public static String getFullTypeName(IType type) {
- if (type == null)
- return ""; //$NON-NLS-1$
- if (type instanceof IReferenceType)
- return getFullTypeName(((IReferenceType) type).getType()) + " &"; //$NON-NLS-1$
- if (type instanceof IPointerType) {
- IType pointedTo = ((IPointerType) type).getType();
- if (pointedTo instanceof ISubroutineType)
- // TODO: get parameters instead of saying "..."
- return "(*)(...)"; //$NON-NLS-1$
- else
- return getFullTypeName(pointedTo) + " *"; //$NON-NLS-1$
- }
- if (type instanceof IArrayType) {
- IArrayType arrayType = (IArrayType) type;
-
- IType subtype = null;
- String dimensions = "";
- do {
- for (IArrayBoundType bound : arrayType.getBounds())
- dimensions += "[" + bound.getBoundCount() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
- subtype = TypeUtils.getStrippedType(arrayType.getType());
- if (subtype instanceof IArrayType)
- arrayType = (IArrayType)subtype;
- } while (subtype instanceof IArrayType);
-
- return getFullTypeName(arrayType.getType()) + dimensions;
- }
- if (type instanceof IArrayDimensionType) {
- IArrayDimensionType arrayDimensionType = (IArrayDimensionType) type;
- IArrayType arrayType = arrayDimensionType.getArrayType();
- String returnType = getFullTypeName(arrayType.getType());
-
- IArrayBoundType[] bounds = arrayType.getBounds();
- for (int i = arrayDimensionType.getDimensionCount(); i < arrayType.getBoundsCount(); i++) {
- returnType += "[" + bounds[i].getBoundCount() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
- }
- return returnType;
- }
- if (type instanceof ITypedef)
- return ((ITypedef) type).getName();
- if (type instanceof ICompositeType)
- return ((ICompositeType) type).getName();
- if (type instanceof IQualifierType)
- return ((IQualifierType) type).getName()
- + " " + getFullTypeName(((IQualifierType) type).getType()); //$NON-NLS-1$
- if (type instanceof ISubroutineType) {
- // TODO: real stuff once we parse parameters
- return getFullTypeName(((ISubroutineType) type).getType());
- }
- return type.getName() + getFullTypeName(type.getType());
- }
-
- /**
- * Check if a type is an opaque type.
- *
- * @param type
- * @return true if the type is an opaque composite type; false otherwise.
- * @since 3.0
- */
- public static boolean isOpaqueType(IType type) {
- return (type != null && type instanceof ICompositeType && ((ICompositeType)type).isOpaque());
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2009, 2010, 2011 Nokia 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nokia - Initial API and implementation
+ * Broadcom - additional JavaDoc
+ *******************************************************************************/
+package org.eclipse.cdt.debug.edc.symbols;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.debug.edc.internal.eval.ast.engine.instructions.IArrayDimensionType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IAggregate;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IConstType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IForwardTypeReference;
+import org.eclipse.cdt.debug.edc.internal.symbols.IPointerType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IQualifierType;
+import org.eclipse.cdt.debug.edc.internal.symbols.IReferenceType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ISubroutineType;
+import org.eclipse.cdt.debug.edc.internal.symbols.ITypedef;
+
+
+/*
+ * Various utility routines for Type objects
+ */
+public class TypeUtils {
+
+ // type IDs for basic C and C++ types
+ static public final int BASIC_TYPE_CHAR = 1;
+ static public final int BASIC_TYPE_CHAR_UNSIGNED = 2;
+ static public final int BASIC_TYPE_CHAR_SIGNED = 3;
+ static public final int BASIC_TYPE_SHORT = 4;
+ static public final int BASIC_TYPE_SHORT_UNSIGNED = 5;
+ static public final int BASIC_TYPE_INT = 6;
+ static public final int BASIC_TYPE_INT_UNSIGNED = 7;
+ static public final int BASIC_TYPE_LONG = 8;
+ static public final int BASIC_TYPE_LONG_UNSIGNED = 9;
+ static public final int BASIC_TYPE_LONG_LONG = 10;
+ static public final int BASIC_TYPE_LONG_LONG_UNSIGNED = 11;
+ static public final int BASIC_TYPE_FLOAT = 12;
+ static public final int BASIC_TYPE_FLOAT_COMPLEX = 13;
+ static public final int BASIC_TYPE_DOUBLE = 14;
+ static public final int BASIC_TYPE_DOUBLE_COMPLEX = 15;
+ static public final int BASIC_TYPE_LONG_DOUBLE = 16;
+ static public final int BASIC_TYPE_LONG_DOUBLE_COMPLEX = 17;
+ static public final int BASIC_TYPE_BOOL = 18;
+ static public final int BASIC_TYPE_BOOL_C9X = 19;
+ static public final int BASIC_TYPE_WCHAR_T = 20;
+ static public final int BASIC_TYPE_POINTER = 21; // not technically a basic type
+
+ /** is a type a pointer "*" type? */
+ public static boolean isPointerType(IType type) {
+ return getStrippedType(type) instanceof IPointerType;
+ }
+
+ /** is a type a reference "&" type? */
+ public static boolean isReferenceType(IType type) {
+ return getStrippedType(type) instanceof IReferenceType;
+ }
+
+ /** is a type an aggregate (composite or array) type? */
+ public static boolean isAggregateType(IType type) {
+ return getStrippedType(type) instanceof IAggregate;
+ }
+
+ /** is a type a composite (class, struct, or union) type? */
+ public static boolean isCompositeType(IType type) {
+ return getStrippedType(type) instanceof ICompositeType;
+ }
+
+ /**
+ * is a type a constant type?
+ * @since 2.0
+ */
+ public static boolean isConstType(IType type) {
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+
+ while ( type instanceof ITypedef || type instanceof IQualifierType || type instanceof IReferenceType
+ || type instanceof IArrayType) {
+ if (type instanceof IConstType)
+ return true;
+
+ type = type.getType();
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+ }
+
+ return false;
+ }
+
+ /** return the type with no typedefs, consts, or volatiles*/
+ public static IType getStrippedType(IType type) {
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+
+ while (type instanceof ITypedef || type instanceof IQualifierType) {
+ type = type.getType();
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+ }
+
+ return type;
+ }
+
+ /**
+ * Return the type with no typedefs, consts, volatiles, or references
+ * @since 2.0
+ */
+ public static IType getUnRefStrippedType(IType type) {
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+
+ while (type instanceof ITypedef || type instanceof IQualifierType || type instanceof IReferenceType) {
+ type = type.getType();
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+ }
+
+ return type;
+ }
+
+ /**
+ * return base type with no typedefs, consts, volatiles, or pointer types
+ * removing array types messes up formatters because they are assumed to act on the array
+ * but code creating expressions ignores the array syntax
+ * unlike with pointer types where -> is used instead of .
+ * */
+ public static IType getBaseType(Object type) {
+ if (!(type instanceof IType))
+ return null;
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+
+ while (type instanceof ITypedef || type instanceof IQualifierType
+ || type instanceof IPointerType) {
+ type = ((IType) type).getType();
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+ }
+
+ return (IType) type;
+ }
+
+ /** return base type with no consts, volatiles, pointer types, or array types - but preserving typedefs */
+ public static IType getBaseTypePreservingTypedef(IType type) {
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+
+ while (type instanceof IQualifierType
+ || type instanceof IPointerType || type instanceof IArrayType) {
+ type = type.getType();
+
+ if (type instanceof IForwardTypeReference)
+ type = ((IForwardTypeReference) type).getReferencedType();
+ }
+
+ return type;
+ }
+
+ // shift, mask, and extend an extracted bit-field
+ // NOTE: this may need to be endianness aware
+ public static Number extractBitField(Number value, int byteSize, int bitSize, int bitOffset, boolean isSignedInt) {
+ if (bitSize <= 0 || value == null
+ || (!(value instanceof Long) && !(value instanceof Integer) && !(value instanceof BigInteger))) {
+ return value;
+ }
+
+ // TODO: Need to get default type sizes from the ITargetEnvironment
+ // This assumes long and long long are 64 bits, and int is 32 bits
+ if (value instanceof Long) {
+ long longValue = (Long) value;
+
+ longValue >>= (byteSize * 8) - (bitOffset + bitSize);
+ longValue &= (-1) >>> (64 - bitSize);
+
+ if (isSignedInt) {
+ if ((longValue & (1 << (bitSize - 1))) != 0) {
+ longValue |= ((-1) >>> bitSize) << bitSize;
+ }
+ }
+ return new Long(longValue);
+ }
+
+ if (value instanceof Integer) {
+ int intValue = (Integer) value;
+
+ intValue >>= (byteSize * 8) - (bitOffset + bitSize);
+ intValue &= ((-1) >>> (32 - bitSize));
+
+ if (isSignedInt) {
+ if ((intValue & (1 << (bitSize - 1))) != 0) {
+ intValue |= ((-1) >>> bitSize) << bitSize;
+ }
+ }
+ return new Integer(intValue);
+ }
+
+ if (value instanceof BigInteger) {
+ BigInteger bigValue = (BigInteger) value;
+ bigValue = bigValue.shiftRight((byteSize * 8) - (bitOffset + bitSize));
+ byte[] bytes = new byte[8];
+ int mask;
+ BigInteger bigMask;
+
+ mask = ((-1) >>> (32 - bitSize));
+ for (int i = 0; i < 8; i++) {
+ bytes[i] = (byte) ((mask >>> ((7 - i) * 8)) & 0xff);
+ }
+
+ bigMask = new BigInteger(bytes);
+ bigValue = bigValue.and(bigMask);
+
+ if (isSignedInt) {
+ // NOTE: for variable values, we use BigInteger ONLY for
+ // unsigned numbers
+ if (bigValue.testBit(bitSize - 1)) {
+ mask = (((-1) >>> bitSize) << bitSize);
+ for (int i = 0; i < 8; i++) {
+ bytes[i] = (byte) ((mask >>> ((7 - i) * 8)) & 0xff);
+ }
+
+ bigMask = new BigInteger(bytes);
+ bigValue = bigValue.or(bigMask);
+ }
+ }
+
+ return bigValue;
+ }
+
+ return value;
+ }
+
+ /**
+ * Get the full name of a type.
+ *
+ * {@link TypeEngine#getTypeName(IType)} caches the full name returned by this routine and associates it
+ * with the type passed in.
+ *
+ * @param type type whose full name is desired
+ * @return full name of the type, with all qualifiers, array bounds, etc.
+ *
+ * @since 2.0
+ */
+ public static String getFullTypeName(IType type) {
+ if (type == null)
+ return ""; //$NON-NLS-1$
+ if (type instanceof IReferenceType)
+ return getFullTypeName(((IReferenceType) type).getType()) + " &"; //$NON-NLS-1$
+ if (type instanceof IPointerType) {
+ IType pointedTo = ((IPointerType) type).getType();
+ if (pointedTo instanceof ISubroutineType)
+ // TODO: get parameters instead of saying "..."
+ return "(*)(...)"; //$NON-NLS-1$
+ else
+ return getFullTypeName(pointedTo) + " *"; //$NON-NLS-1$
+ }
+ if (type instanceof IArrayType) {
+ IArrayType arrayType = (IArrayType) type;
+
+ IType subtype = null;
+ String dimensions = "";
+ do {
+ for (IArrayBoundType bound : arrayType.getBounds())
+ dimensions += "[" + bound.getBoundCount() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ subtype = TypeUtils.getStrippedType(arrayType.getType());
+ if (subtype instanceof IArrayType)
+ arrayType = (IArrayType)subtype;
+ } while (subtype instanceof IArrayType);
+
+ return getFullTypeName(arrayType.getType()) + dimensions;
+ }
+ if (type instanceof IArrayDimensionType) {
+ IArrayDimensionType arrayDimensionType = (IArrayDimensionType) type;
+ IArrayType arrayType = arrayDimensionType.getArrayType();
+ String returnType = getFullTypeName(arrayType.getType());
+
+ IArrayBoundType[] bounds = arrayType.getBounds();
+ for (int i = arrayDimensionType.getDimensionCount(); i < arrayType.getBoundsCount(); i++) {
+ returnType += "[" + bounds[i].getBoundCount() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return returnType;
+ }
+ if (type instanceof ITypedef)
+ return ((ITypedef) type).getName();
+ if (type instanceof ICompositeType)
+ return ((ICompositeType) type).getName();
+ if (type instanceof IQualifierType)
+ return ((IQualifierType) type).getName()
+ + " " + getFullTypeName(((IQualifierType) type).getType()); //$NON-NLS-1$
+ if (type instanceof ISubroutineType) {
+ // TODO: real stuff once we parse parameters
+ return getFullTypeName(((ISubroutineType) type).getType());
+ }
+ return type.getName() + getFullTypeName(type.getType());
+ }
+
+ /**
+ * Check if a type is an opaque type.
+ *
+ * @param type
+ * @return true if the type is an opaque composite type; false otherwise.
+ * @since 3.0
+ */
+ public static boolean isOpaqueType(IType type) {
+ return (type != null && type instanceof ICompositeType && ((ICompositeType)type).isOpaque());
+ }
+}
diff --git a/org.eclipse.cdt.scripting/META-INF/MANIFEST.MF b/org.eclipse.cdt.scripting/META-INF/MANIFEST.MF
index f99a946..af46e83 100644
--- a/org.eclipse.cdt.scripting/META-INF/MANIFEST.MF
+++ b/org.eclipse.cdt.scripting/META-INF/MANIFEST.MF
@@ -13,6 +13,7 @@
Import-Package: org.eclipse.equinox.http.jetty,
org.eclipse.jface.preference,
org.eclipse.swt.widgets,
+ org.eclipse.ui,
org.eclipse.ui.preferences
Export-Package: org.eclipse.cdt.internal.scripting;
uses:="org.eclipse.core.runtime,