mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 22:46:07 +00:00

Summary: Redefine PDBSymbolCompiland::getSourceFileName() to return the filename (w/o directory) of the source file that is used to compile the compiland. This is because the result returned previously is ambiguous. It could be the filename, relative path or full path of the source file. Move the implementation of SymbolFilePDB::GetSourceFileNameForPDBCompiland() into a new method PDBSymbolCompiland::getSourceFileFullPath(). Reviewers: zturner, rnk, llvm-commits Reviewed By: zturner Differential Revision: https://reviews.llvm.org/D44458 llvm-svn: 327910
118 lines
4.1 KiB
C++
118 lines
4.1 KiB
C++
//===- PDBSymbolCompiland.cpp - compiland details --------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/PDB/IPDBSession.h"
|
|
#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
|
|
|
|
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
|
|
#include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h"
|
|
#include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h"
|
|
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
|
|
|
|
#include "llvm/ADT/StringSwitch.h"
|
|
#include "llvm/Support/Path.h"
|
|
#include <utility>
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::pdb;
|
|
|
|
PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession,
|
|
std::unique_ptr<IPDBRawSymbol> Symbol)
|
|
: PDBSymbol(PDBSession, std::move(Symbol)) {
|
|
assert(RawSymbol->getSymTag() == PDB_SymType::Compiland);
|
|
}
|
|
|
|
void PDBSymbolCompiland::dump(PDBSymDumper &Dumper) const {
|
|
Dumper.dump(*this);
|
|
}
|
|
|
|
std::string PDBSymbolCompiland::getSourceFileName() const {
|
|
return llvm::sys::path::filename(getSourceFileFullPath()).str();
|
|
}
|
|
|
|
std::string PDBSymbolCompiland::getSourceFileFullPath() const {
|
|
std::string SourceFileFullPath;
|
|
|
|
// RecordedResult could be the basename, relative path or full path of the
|
|
// source file. Usually it is retrieved and recorded from the command that
|
|
// compiles this compiland.
|
|
//
|
|
// cmd FileName -> RecordedResult = .\\FileName
|
|
// cmd (Path)\\FileName -> RecordedResult = (Path)\\FileName
|
|
//
|
|
std::string RecordedResult = RawSymbol->getSourceFileName();
|
|
|
|
if (RecordedResult.empty()) {
|
|
if (auto Envs = findAllChildren<PDBSymbolCompilandEnv>()) {
|
|
std::string EnvWorkingDir, EnvSrc;
|
|
|
|
while (auto Env = Envs->getNext()) {
|
|
std::string Var = Env->getName();
|
|
if (Var == "cwd") {
|
|
EnvWorkingDir = Env->getValue();
|
|
continue;
|
|
}
|
|
if (Var == "src") {
|
|
EnvSrc = Env->getValue();
|
|
if (llvm::sys::path::is_absolute(EnvSrc))
|
|
return EnvSrc;
|
|
RecordedResult = EnvSrc;
|
|
continue;
|
|
}
|
|
}
|
|
if (!EnvWorkingDir.empty() && !EnvSrc.empty()) {
|
|
auto Len = EnvWorkingDir.length();
|
|
if (EnvWorkingDir[Len - 1] != '/' && EnvWorkingDir[Len - 1] != '\\') {
|
|
std::string Path = EnvWorkingDir + "\\" + EnvSrc;
|
|
std::replace(Path.begin(), Path.end(), '/', '\\');
|
|
// We will return it as full path if we can't find a better one.
|
|
if (llvm::sys::path::is_absolute(Path))
|
|
SourceFileFullPath = Path;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!RecordedResult.empty()) {
|
|
if (llvm::sys::path::is_absolute(RecordedResult))
|
|
return RecordedResult;
|
|
|
|
// This searches name that has same basename as the one in RecordedResult.
|
|
auto OneSrcFile =
|
|
Session.findOneSourceFile(this, RecordedResult,
|
|
PDB_NameSearchFlags::NS_CaseInsensitive);
|
|
if (OneSrcFile)
|
|
return OneSrcFile->getFileName();
|
|
}
|
|
|
|
// At this point, we have to walk through all source files of this compiland,
|
|
// and determine the right source file if any that is used to generate this
|
|
// compiland based on language indicated in compilanddetails language field.
|
|
auto Details = findOneChild<PDBSymbolCompilandDetails>();
|
|
PDB_Lang Lang = Details ? Details->getLanguage() : PDB_Lang::Cpp;
|
|
auto SrcFiles = Session.getSourceFilesForCompiland(*this);
|
|
if (SrcFiles) {
|
|
bool LangC = (Lang == PDB_Lang::Cpp || Lang == PDB_Lang::C);
|
|
while (auto File = SrcFiles->getNext()) {
|
|
std::string FileName = File->getFileName();
|
|
auto file_extension = llvm::sys::path::extension(FileName);
|
|
if (StringSwitch<bool>(file_extension.lower())
|
|
.Case(".cpp", LangC)
|
|
.Case(".c", LangC)
|
|
.Case(".cc", LangC)
|
|
.Case(".cxx", LangC)
|
|
.Case(".asm", Lang == PDB_Lang::Masm)
|
|
.Default(false))
|
|
return File->getFileName();
|
|
}
|
|
}
|
|
|
|
return SourceFileFullPath;
|
|
}
|