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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-								</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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>
-								</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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+								</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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+								</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="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/win_agent}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/framework}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/services}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/main}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/machine/i686}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/tcf_agent/system/Windows}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.cdt.debug.edc.windows.agent/src/common_agent}&quot;"/>

+								</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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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 &quot;${plugin_state_location}/${specs_file}&quot;'" 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 &quot;${plugin_state_location}/specs.cpp&quot;'" 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 &quot;${plugin_state_location}/specs.c&quot;'" 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&ltICompileUnitScope> 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}&lt;{@link FileLineEntryProvider}&gt;
 	 */
-	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}&lt;{@link IPath},{@link FileLineEntryProvider}&gt;
 	 */
-	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,