/*******************************************************************************
* Copyright (c) 2016 Movidius 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
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.symbols;
import java.io.File;
import java.util.Collections;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.core.callstack.FunctionNameMapper;
import org.eclipse.tracecompass.tmf.core.event.lookup.ITmfCallsite;
import org.eclipse.tracecompass.tmf.core.event.lookup.TmfCallsite;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider;
import org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProviderPreferencePage;
/**
* The {@link BasicSymbolProvider} can use either an executable or a simple
* symbol mapping file to resolve symbols.
*
* @author Robert Kiss
*
*/
public class BasicSymbolProvider implements ISymbolProvider {
private final @NonNull ITmfTrace fTrace;
private @NonNull Map<String, String> fMapping = Collections.emptyMap();
private String fSource;
private @NonNull SourceKind fKind = SourceKind.BINARY;
private boolean fConfigured;
/**
* The kind of source this provider is configured with
*
*/
public static enum SourceKind {
/**
* Literal for binary configuration
*/
BINARY,
/**
* Literal for mapping configuration
*/
MAPPING;
}
/**
* Create a new {@link BasicSymbolProvider} for the given trace
*
* @param trace
* A non-null trace
*/
public BasicSymbolProvider(@NonNull ITmfTrace trace) {
fTrace = trace;
}
/**
*
* @return the configured source
*/
public String getConfiguredSource() {
return fSource;
}
/**
* @return the configured source kind
*/
public @NonNull SourceKind getConfiguredSourceKind() {
return fKind;
}
/**
* Set the configuration to the given source and kind.
*
* @param fileSource
* File path to either a binary file or a mapping file.
* @param kind
* the type of the referenced file
*/
public void setConfiguredSource(String fileSource, @NonNull SourceKind kind) {
fSource = fileSource;
fKind = kind;
fConfigured = false;
}
@Override
public @NonNull ITmfTrace getTrace() {
return fTrace;
}
@Override
public void loadConfiguration(IProgressMonitor monitor) {
if (!fConfigured) {
synchronized (this) {
if (!fConfigured) {
try {
fMapping = Collections.emptyMap();
if (fSource != null) {
File file = new File(fSource);
if (file.isFile()) {
Map<String, String> result;
if (fKind == SourceKind.BINARY) {
result = FunctionNameMapper.mapFromBinaryFile(file);
} else {
result = FunctionNameMapper.mapFromNmTextFile(file);
}
if (result != null) {
fMapping = result;
}
}
}
} finally {
fConfigured = true;
}
}
}
}
}
@Override
public @Nullable String getSymbolText(long address) {
loadConfiguration(null);
return fMapping.get(Long.toHexString(address));
}
@Deprecated
@Override
public @Nullable ITmfCallsite getSymbolInfo(long address) {
loadConfiguration(null);
String symbolText = getSymbolText(address);
if (symbolText != null) {
return new TmfCallsite(null, symbolText, -1);
}
return null;
}
@Override
public ISymbolProviderPreferencePage createPreferencePage() {
return new BasicSymbolProviderPreferencePage(this);
}
}