Browse Source

Fixed Clang parser initialization to be a bit more robust with invalid triples.

pull/22/merge
triton 12 years ago
parent
commit
8c1372f80a
  1. 85
      src/Parser/Parser.cpp
  2. 1
      src/Parser/Parser.h

85
src/Parser/Parser.cpp

@ -66,6 +66,19 @@ static std::string GetClangBuiltinIncludeDir() @@ -66,6 +66,19 @@ static std::string GetClangBuiltinIncludeDir()
//-----------------------------------//
static std::string GetCXXABIString(clang::TargetCXXABI::Kind Kind)
{
switch(Kind)
{
case clang::TargetCXXABI::GenericItanium:
return "itanium";
case clang::TargetCXXABI::Microsoft:
return "microsoft";
}
llvm_unreachable("Unknown C++ ABI kind");
}
#ifdef _MSC_VER
std::vector<std::string> GetWindowsSystemIncludeDirs();
#endif
@ -101,84 +114,88 @@ void Parser::SetupHeader() @@ -101,84 +114,88 @@ void Parser::SetupHeader()
C->setInvocation(Inv);
TargetOptions& TO = Inv->getTargetOpts();
TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft
: TargetCXXABI::GenericItanium;
TO.CXXABI = GetCXXABIString(TargetABI);
TO.Triple = llvm::sys::getDefaultTargetTriple();
if (!System::String::IsNullOrWhiteSpace(Opts->TargetTriple))
TO.Triple = marshalString<E_UTF8>(Opts->TargetTriple);
else
TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO);
if (!TI)
{
// We might have no target info due to an invalid user-provided triple.
// Try again with the default triple.
TO.Triple = llvm::sys::getDefaultTargetTriple();
TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO);
}
TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft
: TargetCXXABI::GenericItanium;
assert(TI && "Expected valid target info");
TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO);
TI->setCXXABI(TargetABI);
C->setTarget(TI);
C->createFileManager();
C->createSourceManager(C->getFileManager());
auto& HSOpts = C->getHeaderSearchOpts();
auto& PPOpts = C->getPreprocessorOpts();
auto& LangOpts = C->getLangOpts();
if (Opts->NoStandardIncludes)
{
auto HSOpts = C->getHeaderSearchOpts();
HSOpts.UseStandardSystemIncludes = false;
HSOpts.UseStandardCXXIncludes = false;
}
if (Opts->NoBuiltinIncludes)
{
auto HSOpts = C->getHeaderSearchOpts();
HSOpts.UseBuiltinIncludes = false;
}
if (Opts->Verbose)
C->getHeaderSearchOpts().Verbose = true;
HSOpts.Verbose = true;
for each(System::String^% include in Opts->IncludeDirs)
{
String s = marshalString<E_UTF8>(include);
C->getHeaderSearchOpts().AddPath(s, frontend::Angled, false, false);
HSOpts.AddPath(s, frontend::Angled, false, false);
}
for each(System::String^% include in Opts->SystemIncludeDirs)
{
String s = marshalString<E_UTF8>(include);
C->getHeaderSearchOpts().AddPath(s, frontend::System, false, false);
HSOpts.AddPath(s, frontend::System, false, false);
}
for each(System::String^% def in Opts->Defines)
{
String s = marshalString<E_UTF8>(def);
C->getPreprocessorOpts().addMacroDef(s);
}
for each(System::String^% define in Opts->Defines)
PPOpts.addMacroDef(marshalString<E_UTF8>(define));
// Initialize the default platform headers.
std::string ResourceDir = GetClangResourceDir(".");
C->getHeaderSearchOpts().ResourceDir = ResourceDir;
C->getHeaderSearchOpts().AddPath(GetClangBuiltinIncludeDir(),
clang::frontend::System, false, false);
HSOpts.ResourceDir = GetClangResourceDir(".");
HSOpts.AddPath(GetClangBuiltinIncludeDir(), clang::frontend::System,
/*IsFramework=*/false, /*IgnoreSysRoot=*/false);
#ifdef _MSC_VER
if (!Opts->NoBuiltinIncludes)
{
std::vector<std::string> SystemDirs = GetWindowsSystemIncludeDirs();
clang::HeaderSearchOptions& HSOpts = C->getHeaderSearchOpts();
for(size_t i = 0; i < SystemDirs.size(); ++i)
{
HSOpts.AddPath(SystemDirs[i], frontend::System, false, false);
}
for(auto Path : SystemDirs)
HSOpts.AddPath(Path, frontend::System, /*IsFramework=*/false,
/*IgnoreSysRoot=*/false);
}
#endif
// Enable preprocessing record.
PPOpts.DetailedRecord = true;
C->createPreprocessor();
C->createASTContext();
if (C->hasPreprocessor())
{
Preprocessor& P = C->getPreprocessor();
P.createPreprocessingRecord();
P.getBuiltinInfo().InitializeBuiltins(P.getIdentifierTable(),
P.getLangOpts());
}
Preprocessor& PP = C->getPreprocessor();
PP.getBuiltinInfo().InitializeBuiltins(PP.getIdentifierTable(),
PP.getLangOpts());
C->createASTContext();
}
//-----------------------------------//

1
src/Parser/Parser.h

@ -60,7 +60,6 @@ public ref struct ParserOptions @@ -60,7 +60,6 @@ public ref struct ParserOptions
CppSharp::AST::Library^ Library;
// Toolset version - 2005 - 8, 2008 - 9, 2010 - 10, 0 - autoprobe for any.
int ToolSetToUse;
System::String^ TargetTriple;

Loading…
Cancel
Save