GP-4968 - PDB U source lines

This commit is contained in:
ghizard 2024-07-01 17:40:28 +00:00
parent 141e71600d
commit a19571e718
2 changed files with 63 additions and 36 deletions

View file

@ -43,11 +43,11 @@ public class PdbApplicatorOptions {
// Apply Source Line Numbers. // Apply Source Line Numbers.
private static final String OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS = private static final String OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS =
"Apply Source Line Numbers"; // DWARF says "Output Source Line Info", but we use "Apply" "Import Source Line Info";
private static final String OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS = private static final String OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS =
"Create source map entries containing the source code filename, line number, address, and" + "Create source map entries containing the source code filename, line number, address, and" +
" length at each location provided in the PDB data."; " length at each location provided in the PDB data.";
private static final boolean DEFAULT_APPLY_SOURCE_LINE_NUMBERS = false; private static final boolean DEFAULT_APPLY_SOURCE_LINE_NUMBERS = true;
private boolean applySourceLineNumbers; private boolean applySourceLineNumbers;
// Apply Code Block Comments. // Apply Code Block Comments.
@ -190,10 +190,9 @@ public class PdbApplicatorOptions {
private void registerOptions(Options options, boolean enableControl) { private void registerOptions(Options options, boolean enableControl) {
HelpLocation help = null; HelpLocation help = null;
//TODO: Uncomment the following for GP-3883 options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS,
// options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers, help,
// applySourceLineNumbers, help, OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
// OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
if (DEVELOPER_MODE || enableControl) { if (DEVELOPER_MODE || enableControl) {
options.registerOption(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL, help, options.registerOption(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL, help,
@ -203,11 +202,6 @@ public class PdbApplicatorOptions {
// PdbApplicatorOptions // PdbApplicatorOptions
if (DEVELOPER_MODE) { if (DEVELOPER_MODE) {
//TODO: Remove the following line for GP-3883
options.registerOption(OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS,
applySourceLineNumbers, help,
OPTION_DESCRIPTION_APPLY_SOURCE_LINE_NUMBERS);
options.registerOption(OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS, options.registerOption(OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS,
applyCodeScopeBlockComments, help, applyCodeScopeBlockComments, help,
OPTION_DESCRIPTION_APPLY_CODE_SCOPE_BLOCK_COMMENTS); OPTION_DESCRIPTION_APPLY_CODE_SCOPE_BLOCK_COMMENTS);
@ -251,9 +245,8 @@ public class PdbApplicatorOptions {
private void loadOptions(Options options, boolean enableControl) { private void loadOptions(Options options, boolean enableControl) {
//TODO: Uncomment the following for GP-3883 applySourceLineNumbers = options.getBoolean(
// applySourceLineNumbers = options.getBoolean( OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
// OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
if (DEVELOPER_MODE || enableControl) { if (DEVELOPER_MODE || enableControl) {
control = options.getEnum(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL); control = options.getEnum(OPTION_NAME_PROCESSING_CONTROL, PdbApplicatorControl.ALL);
@ -262,10 +255,6 @@ public class PdbApplicatorOptions {
// PdbApplicatorOptions // PdbApplicatorOptions
if (DEVELOPER_MODE) { if (DEVELOPER_MODE) {
//TODO: Remove the following line for GP-3883
applySourceLineNumbers = options.getBoolean(
OPTION_NAME_APPLY_SOURCE_LINE_NUMBERS, applySourceLineNumbers);
applyCodeScopeBlockComments = options.getBoolean( applyCodeScopeBlockComments = options.getBoolean(
OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS, applyCodeScopeBlockComments); OPTION_NAME_APPLY_CODE_SCOPE_BLOCK_COMMENTS, applyCodeScopeBlockComments);

View file

@ -21,9 +21,16 @@ import ghidra.app.util.bin.format.pdb2.pdbreader.*;
import ghidra.app.util.bin.format.pdb2.pdbreader.Module; import ghidra.app.util.bin.format.pdb2.pdbreader.Module;
import ghidra.app.util.bin.format.pdb2.pdbreader.type.*; import ghidra.app.util.bin.format.pdb2.pdbreader.type.*;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.framework.store.LockException;
import ghidra.program.database.sourcemap.SourceFile;
import ghidra.program.database.sourcemap.SourceFileIdType;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressOverflowException;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
import ghidra.program.model.sourcemap.SourceFileManager;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.SourceFileUtils;
import ghidra.util.exception.AssertException;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
/** /**
@ -38,7 +45,7 @@ public class PdbSourceLinesApplicator {
private Map<Address, Integer> functionLengthByAddress; private Map<Address, Integer> functionLengthByAddress;
// private SourceFileManager manager; private SourceFileManager manager;
//============================================================================================== //==============================================================================================
/** /**
@ -56,7 +63,7 @@ public class PdbSourceLinesApplicator {
functionLengthByAddress = new HashMap<>(); functionLengthByAddress = new HashMap<>();
//manager = program.getSourceFileManager(); manager = program.getSourceFileManager();
} }
//============================================================================================== //==============================================================================================
@ -338,13 +345,39 @@ public class PdbSourceLinesApplicator {
} }
//============================================================================================== //==============================================================================================
// Temporary mock class // Processing in the section is geared toward C13 records processing. Have not evaluated its
private static class SourceFile { // usefulness for C11 records
// Empty /**
} * Finds or creates a SourceFile for our checksum and file ID for C13 processing
* @param fileChecksums the set of FileChecksumC13Sections for this module
* @param fileId the file ID found in the source line records
* @return the source file
*/
private SourceFile getSourceFile(FileChecksumsC13Section fileChecksums, int fileId) { private SourceFile getSourceFile(FileChecksumsC13Section fileChecksums, int fileId) {
return new SourceFile();
// Note: fileId is an offset into the checksum table, so we have them stored in a map.
C13FileChecksum checksumInfo = fileChecksums.getFileChecksumByOffset(fileId);
Long offsetFilename = checksumInfo.getOffsetFilename();
String filename = pdb.getNameStringFromOffset(offsetFilename.intValue());
SourceFileIdType idType = switch (checksumInfo.getChecksumTypeValue()) {
case 0 -> SourceFileIdType.NONE;
case 1 -> SourceFileIdType.MD5;
case 2 -> SourceFileIdType.SHA1;
case 3 -> SourceFileIdType.SHA256;
default -> SourceFileIdType.UNKNOWN;
};
byte[] identifier = checksumInfo.getChecksumBytes();
SourceFile sourceFile =
SourceFileUtils.getSourceFileFromPathString(filename, idType, identifier);
try {
manager.addSourceFile(sourceFile);
}
catch (LockException e) {
throw new AssertionError("LockException after exclusive access verified!");
}
return sourceFile;
} }
//============================================================================================== //==============================================================================================
@ -363,16 +396,21 @@ public class PdbSourceLinesApplicator {
return; return;
} }
// try { try {
// manager.addSourceMapEntry(sourceFile, start, address, length); manager.addSourceMapEntry(sourceFile, start, address, length);
// } }
// catch (LockException e) { catch (LockException e) {
// throw new AssertException("LockException after exclusive access verified!"); throw new AssertException("LockException after exclusive access verified!");
// } }
// catch (AddressOverflowException e) { catch (AddressOverflowException e) {
// log.appendMsg("PDB", "AddressOverflow for source map info: %s, %d, %s, %d" log.appendMsg("PDB", "AddressOverflow for source map info: %s, %d, %s, %d"
// .formatted(sourceFile.getPath(), start, address.toString(), length)); .formatted(sourceFile.getPath(), start, address.toString(), length));
// } }
catch (IllegalArgumentException e) {
// thrown by SourceFileManager.addSourceMapEntry if the new entry conflicts
// with an existing entry or if sourceFile is not associated with manager
log.appendMsg("PDB", e.getMessage());
}
} }
} }