LLVM  8.0.0svn
PDBSymbolCompiland.cpp
Go to the documentation of this file.
1 //===- PDBSymbolCompiland.cpp - compiland details ---------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
12 
17 
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/Support/Path.h"
20 #include <utility>
21 
22 using namespace llvm;
23 using namespace llvm::pdb;
24 
26  Dumper.dump(*this);
27 }
28 
31 }
32 
34  std::string SourceFileFullPath;
35 
36  // RecordedResult could be the basename, relative path or full path of the
37  // source file. Usually it is retrieved and recorded from the command that
38  // compiles this compiland.
39  //
40  // cmd FileName -> RecordedResult = .\\FileName
41  // cmd (Path)\\FileName -> RecordedResult = (Path)\\FileName
42  //
43  std::string RecordedResult = RawSymbol->getSourceFileName();
44 
45  if (RecordedResult.empty()) {
46  if (auto Envs = findAllChildren<PDBSymbolCompilandEnv>()) {
47  std::string EnvWorkingDir, EnvSrc;
48 
49  while (auto Env = Envs->getNext()) {
50  std::string Var = Env->getName();
51  if (Var == "cwd") {
52  EnvWorkingDir = Env->getValue();
53  continue;
54  }
55  if (Var == "src") {
56  EnvSrc = Env->getValue();
57  if (sys::path::is_absolute(EnvSrc))
58  return EnvSrc;
59  RecordedResult = EnvSrc;
60  continue;
61  }
62  }
63  if (!EnvWorkingDir.empty() && !EnvSrc.empty()) {
64  auto Len = EnvWorkingDir.length();
65  if (EnvWorkingDir[Len - 1] != '/' && EnvWorkingDir[Len - 1] != '\\') {
66  std::string Path = EnvWorkingDir + "\\" + EnvSrc;
67  std::replace(Path.begin(), Path.end(), '/', '\\');
68  // We will return it as full path if we can't find a better one.
69  if (sys::path::is_absolute(Path))
70  SourceFileFullPath = Path;
71  }
72  }
73  }
74  }
75 
76  if (!RecordedResult.empty()) {
77  if (sys::path::is_absolute(RecordedResult))
78  return RecordedResult;
79 
80  // This searches name that has same basename as the one in RecordedResult.
81  auto OneSrcFile = Session.findOneSourceFile(
82  this, RecordedResult, PDB_NameSearchFlags::NS_CaseInsensitive);
83  if (OneSrcFile)
84  return OneSrcFile->getFileName();
85  }
86 
87  // At this point, we have to walk through all source files of this compiland,
88  // and determine the right source file if any that is used to generate this
89  // compiland based on language indicated in compilanddetails language field.
90  auto Details = findOneChild<PDBSymbolCompilandDetails>();
91  PDB_Lang Lang = Details ? Details->getLanguage() : PDB_Lang::Cpp;
92  auto SrcFiles = Session.getSourceFilesForCompiland(*this);
93  if (SrcFiles) {
94  bool LangC = (Lang == PDB_Lang::Cpp || Lang == PDB_Lang::C);
95  while (auto File = SrcFiles->getNext()) {
96  std::string FileName = File->getFileName();
97  auto file_extension = sys::path::extension(FileName);
98  if (StringSwitch<bool>(file_extension.lower())
99  .Case(".cpp", LangC)
100  .Case(".c", LangC)
101  .Case(".cc", LangC)
102  .Case(".cxx", LangC)
103  .Case(".asm", Lang == PDB_Lang::Masm)
104  .Default(false))
105  return File->getFileName();
106  }
107  }
108 
109  return SourceFileFullPath;
110 }
uint64_t CallInst * C
LLVM_NODISCARD std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:228
IPDBRawSymbol * RawSymbol
Definition: PDBSymbol.h:166
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
std::string getSourceFileFullPath() const
void dump(PDBSymDumper &Dumper) const override
Dumps the contents of a symbol a raw_ostream.
virtual std::string getSourceFileName() const =0
bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
Definition: Path.cpp:688
virtual std::unique_ptr< IPDBEnumSourceFiles > getSourceFilesForCompiland(const PDBSymbolCompiland &Compiland) const =0
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE R Default(T Value)
Definition: StringSwitch.h:203
A switch()-like statement whose cases are string literals.
Definition: StringSwitch.h:43
static void replace(Module &M, GlobalVariable *Old, GlobalVariable *New)
SourceLanguage
These values correspond to the CV_CFL_LANG enumeration, and are documented here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx.
Definition: CodeView.h:144
virtual std::unique_ptr< IPDBSourceFile > findOneSourceFile(const PDBSymbolCompiland *Compiland, llvm::StringRef Pattern, PDB_NameSearchFlags Flags) const =0
LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & Case(StringLiteral S, T Value)
Definition: StringSwitch.h:70
std::string getSourceFileName() const
StringRef filename(StringRef path, Style style=Style::native)
Get filename.
Definition: Path.cpp:590
virtual void dump(const PDBSymbolAnnotation &Symbol)
const IPDBSession & Session
Definition: PDBSymbol.h:164
StringRef extension(StringRef path, Style style=Style::native)
Get extension.
Definition: Path.cpp:605