/******************************************************************************* * Copyright (c) 2009, 2016 STMicroelectronics and others. * All rights reserved. This program and 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: * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation * Ingenico - Vincent Guignot <vincent.guignot@ingenico.com> - Add binutils strings *******************************************************************************/ package org.eclipse.linuxtools.binutils.utils; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.utils.Addr2line; import org.eclipse.cdt.utils.CPPFilt; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.linuxtools.internal.Activator; /** * This class is on charge of managing "org.eclipse.linuxtools.binutils.crossCompilerBinutils" extension point. * */ public class STBinutilsFactoryManager { /** * Map of CPU/ISTBinutilsFactory */ private static final Map<String, ISTBinutilsFactory> map = new HashMap<>(); /** * Default factory */ private static DefaultBinutilsFactory defaultFactory; /** * Private constructor: this class is implemented as a Singleton */ private STBinutilsFactoryManager() { } /** * Try to find an extension point matching the given cpu; Then test availability of the tools. If no match, return * default binutils factory * @param cpu The cpu identifier. * @return The factory. */ private static ISTBinutilsFactory getBinutilsFactoryImpl(String cpu) { try { IExtensionRegistry reg = Platform.getExtensionRegistry(); IExtensionPoint ep = reg.getExtensionPoint("org.eclipse.linuxtools.binutils.crossCompilerBinutils"); //$NON-NLS-1$ IExtension[] exts = ep.getExtensions(); for (IExtension extension : exts) { IConfigurationElement[] elems = extension.getConfigurationElements(); for (IConfigurationElement configurationElement : elems) { String s = configurationElement.getAttribute("CPU"); //$NON-NLS-1$ if (cpu.equals(s)) { ISTBinutilsFactory factory = (ISTBinutilsFactory) configurationElement .createExecutableExtension("binutilsFactory"); //$NON-NLS-1$ if (factory.testAvailability()) return factory; } } } } catch (CoreException e) { Activator.getDefault().getLog().log(e.getStatus()); } if (defaultFactory == null) { defaultFactory = new DefaultBinutilsFactory(); } return defaultFactory; } /** * Get a ISTBinutilsFactory matching the given cpu id Returns the default one if no match. * @param cpu The cpu identifier. * @return THe factory */ public static ISTBinutilsFactory getBinutilsFactory(String cpu) { ISTBinutilsFactory factory = map.get(cpu); if (factory == null) { factory = getBinutilsFactoryImpl(cpu); map.put(cpu, factory); } return factory; } /** * @param cpuType * @param programPath * @param project * The project to get the path to run addr2line * @return an instance of addr2line for the given program * @throws IOException * @since 5.0 */ public static Addr2line getAddr2line(String cpuType, String programPath, IProject project) throws IOException { ISTBinutilsFactory factory = getBinutilsFactory(cpuType); return factory.getAddr2line(programPath, project); } /** * * @param cpuType * @param project * @return an instance of strings for the given program * @throws IOException * @since 6.0 */ public static STStrings getStrings(String cpuType, IProject project) throws IOException { ISTBinutilsFactory factory = getBinutilsFactory(cpuType); return factory.getSTRINGS(project); } /** * @param cpuType * @param project * The project to get the path to run cppfilt * @return an instance of cppfile for the given cpu type * @throws IOException * @since 5.0 */ public static CPPFilt getCPPFilt(String cpuType, IProject project) throws IOException { ISTBinutilsFactory factory = getBinutilsFactory(cpuType); return factory.getCPPFilt(project); } /** * @param cpuType * @param programPath * @param handler * @param project * The project to get the path to be used to run nm * @return an instance of nm for the given program * @throws IOException * @since 5.0 */ public static STNM getNM(String cpuType, String programPath, STNMSymbolsHandler handler, IProject project) throws IOException { ISTBinutilsFactory factory = STBinutilsFactoryManager.getBinutilsFactory(cpuType); return factory.getNM(programPath, handler, project); } }