blob: 0bc185abc2acf2a7c64947a865e87bb7ccec2f43 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.symbols;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.core.callstack.FunctionNameMapper;
import org.eclipse.tracecompass.internal.tmf.core.callstack.MappingFile;
import org.eclipse.tracecompass.internal.tmf.core.callstack.SizedMappingFile;
/**
* Interface that mapping file classes must implement. This interface also
* provides factory method to create the mappings from binary or text files.
*
* @author Geneviève Bastien
* @since 3.2
*/
public interface IMappingFile {
/**
* Create a mapping file from a path.
*
* If the file name before the extension finishes by -[0-9]+, then the number is
* taken as the ID of the process this mapping applies to.
*
* @param fullPath
* The full path of the file to load.
* @param isBinaryFile
* <code>true</code> if the file is a binary file
* @return The MappingFile object, or <code>null</code> if the file is invalid
*/
static @Nullable IMappingFile create(String fullPath, boolean isBinaryFile) {
Path path = Paths.get(fullPath);
// Look for a process ID at the end of the filename.
String filename = path.getFileName().toString();
final Pattern pattern = Pattern.compile("(.+)-([0-9]+)\\.(.+)"); //$NON-NLS-1$
Matcher matcher = pattern.matcher(filename);
int pid = -1;
if (matcher.find()) {
try {
pid = Integer.parseInt(matcher.group(2));
} catch (NumberFormatException e) {
// The number did not match to a proper integer, maybe it's a
// long, ignore it then
}
}
return create(fullPath, isBinaryFile, pid);
}
/**
* Create a mapping file from a path and associate it with the PID this mapping
* applies to.
*
* @param fullPath
* The full path of the file to load.
* @param isBinaryFile
* <code>true</code> if the file is a binary file
* @param pid
* The ID of the process that this mapping describes
* @return The MappingFile object, or <code>null</code> if the file is invalid
*/
static @Nullable IMappingFile create(String fullPath, boolean isBinaryFile, int pid) {
Path path = Paths.get(fullPath);
Map<Long, TmfResolvedSymbol> results = null;
if (isBinaryFile) {
results = FunctionNameMapper.mapFromBinaryFile(path.toFile());
return new MappingFile(fullPath, isBinaryFile, results, pid);
}
switch(FunctionNameMapper.guessMappingType(path.toFile())) {
case MAP_WITH_SIZE:
results = FunctionNameMapper.mapFromSizedTextFile(path.toFile());
return results == null ? null : new SizedMappingFile(fullPath, isBinaryFile, results, pid);
case NM:
results = FunctionNameMapper.mapFromNmTextFile(path.toFile());
return results == null ? null : new MappingFile(fullPath, isBinaryFile, results, pid);
case UNKNOWN: // Fall-through
default:
return null;
}
}
/**
* @return path leading to mapping file
*/
String getFullPath();
/**
* @return type of the mapping file
*/
boolean isBinaryFile();
/**
* Get the entry that may correspond to the symbol
*
* @param address
* The address of the symbol to look for
* @return The entry with its address/symbol if it's within this mapping's space
*/
@Nullable TmfResolvedSymbol getSymbolEntry(long address);
/**
* Get the ID of the process this mapping is for.
*
* @return the process ID that this mapping applies to. A negative value means
* it applies to no specific process.
*/
int getPid();
}