From 6ab16c43acae59f15b298af5f70d492554adb00d Mon Sep 17 00:00:00 2001 From: triton Date: Wed, 8 May 2013 23:25:04 +0100 Subject: [PATCH] Added support for a lot more driver options, including ignoring built-in and standard includes, target triple and ABIs, and system include directories. --- src/Generator/Driver.cs | 10 ++++++ src/Generator/Parser.cs | 7 +++- src/Parser/Parser.cpp | 71 ++++++++++++++++++++++++++++++----------- src/Parser/Parser.h | 11 +++++++ 4 files changed, 80 insertions(+), 19 deletions(-) diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index df6e2fec..a93911eb 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -205,13 +205,18 @@ namespace CppSharp { Defines = new List(); IncludeDirs = new List(); + SystemIncludeDirs = new List(); Headers = new List(); Assembly = string.Empty; + NoStandardIncludes = false; + NoBuiltinIncludes = false; GeneratorKind = LanguageGeneratorKind.CSharp; GenerateLibraryNamespace = true; GenerateFunctionTemplates = false; WriteOnlyWhenChanged = false; GeneratePartialClasses = true; + MicrosoftMode = (Environment.OSVersion.Platform != PlatformID.MacOSX) + && (Environment.OSVersion.Platform != PlatformID.Unix); // Library options LibraryDirs = new List(); @@ -232,12 +237,17 @@ namespace CppSharp public bool GenerateLibraryNamespace; public bool GenerateFunctionTemplates; public bool GeneratePartialClasses; + public bool NoStandardIncludes; + public bool NoBuiltinIncludes; + public bool MicrosoftMode; + public string TargetTriple; public string OutputNamespace; public string OutputDir; public string LibraryName; public CppAbi Abi; public List Defines; public List IncludeDirs; + public List SystemIncludeDirs; public List Headers; public string Template; public string Assembly; diff --git a/src/Generator/Parser.cs b/src/Generator/Parser.cs index 452fc1c3..375970d9 100644 --- a/src/Generator/Parser.cs +++ b/src/Generator/Parser.cs @@ -45,8 +45,13 @@ namespace CppSharp FileName = file, Verbose = false, IncludeDirs = options.IncludeDirs, + SystemIncludeDirs = options.SystemIncludeDirs, Defines = options.Defines, - ToolSetToUse = options.ToolsetToUse + NoStandardIncludes = options.NoStandardIncludes, + NoBuiltinIncludes = options.NoBuiltinIncludes, + MicrosoftMode = options.MicrosoftMode, + ToolSetToUse = options.ToolsetToUse, + TargetTriple = options.TargetTriple }; var result = ClangParser.ParseHeader(parserOptions); diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 00b8e35f..56adf708 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -73,34 +73,60 @@ void Parser::SetupHeader() using namespace clang; using namespace clix; - const char* args[] = + std::vector args; + args.push_back("-cc1"); + + // Enable C++ language mode + args.push_back("-xc++"); + args.push_back("-std=gnu++11"); + //args.push_back("-Wno-undefined-inline"); + args.push_back("-fno-rtti"); + + // Enable the Microsoft parsing extensions + if (Opts->MicrosoftMode) { - // Enable C++ language mode - "-xc++", "-std=c++11", "-fno-rtti", - // Enable the Microsoft parsing extensions - "-fms-extensions", "-fms-compatibility", "-fdelayed-template-parsing", - // Enable the Microsoft ABI - //"-Xclang", "-cxx-abi", "-Xclang", "microsoft" - }; + args.push_back("-fms-extensions"); + args.push_back("-fms-compatibility"); + args.push_back("-fdelayed-template-parsing"); + } C.reset(new CompilerInstance()); C->createDiagnostics(); CompilerInvocation* Inv = new CompilerInvocation(); - CompilerInvocation::CreateFromArgs(*Inv, args, args + ARRAY_SIZE(args), + CompilerInvocation::CreateFromArgs(*Inv, args.data(), args.data() + args.size(), C->getDiagnostics()); C->setInvocation(Inv); TargetOptions& TO = Inv->getTargetOpts(); - TO.Triple = llvm::sys::getDefaultTargetTriple(); + if (!System::String::IsNullOrWhiteSpace(Opts->TargetTriple)) + TO.Triple = marshalString(Opts->TargetTriple); + else + TO.Triple = llvm::sys::getDefaultTargetTriple(); + + TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft + : TargetCXXABI::GenericItanium; TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO); - TI->setCXXABI(TargetCXXABI::Microsoft); + TI->setCXXABI(TargetABI); C->setTarget(TI); C->createFileManager(); C->createSourceManager(C->getFileManager()); + 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; @@ -110,6 +136,12 @@ void Parser::SetupHeader() C->getHeaderSearchOpts().AddPath(s, frontend::Angled, false, false); } + for each(System::String^% include in Opts->SystemIncludeDirs) + { + String s = marshalString(include); + C->getHeaderSearchOpts().AddPath(s, frontend::System, false, false); + } + for each(System::String^% def in Opts->Defines) { String s = marshalString(def); @@ -123,12 +155,15 @@ void Parser::SetupHeader() clang::frontend::System, false, false); #ifdef _MSC_VER - std::vector SystemDirs = GetWindowsSystemIncludeDirs(); - clang::HeaderSearchOptions& HSOpts = C->getHeaderSearchOpts(); + if (!Opts->NoBuiltinIncludes) + { + std::vector 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(size_t i = 0; i < SystemDirs.size(); ++i) + { + HSOpts.AddPath(SystemDirs[i], frontend::System, false, false); + } } #endif @@ -1165,7 +1200,7 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, CppSharp::Function^ F, } F->ReturnType = WalkType(FD->getResultType(), &RTL); - String Mangled = GetDeclMangledName(FD, TargetCXXABI::Microsoft, IsDependent); + String Mangled = GetDeclMangledName(FD, TargetABI, IsDependent); F->Mangled = marshalString(Mangled); for(auto it = FD->param_begin(); it != FD->param_end(); ++it) @@ -1374,7 +1409,7 @@ CppSharp::Variable^ Parser::WalkVariable(clang::VarDecl *VD) auto TL = VD->getTypeSourceInfo()->getTypeLoc(); Var->QualifiedType = GetQualifiedType(VD->getType(), WalkType(VD->getType(), &TL)); - auto Mangled = GetDeclMangledName(VD, TargetCXXABI::Microsoft, /*IsDependent=*/false); + auto Mangled = GetDeclMangledName(VD, TargetABI, /*IsDependent=*/false); Var->Mangled = marshalString(Mangled); return Var; diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index faf5a28c..2114be9f 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -38,12 +38,17 @@ public ref struct ParserOptions ParserOptions() { IncludeDirs = gcnew List(); + SystemIncludeDirs = gcnew List(); Defines = gcnew List(); LibraryDirs = gcnew List(); + MicrosoftMode = false; + NoStandardIncludes = false; + NoBuiltinIncludes = false; } // Include directories List^ IncludeDirs; + List^ SystemIncludeDirs; List^ Defines; List^ LibraryDirs; @@ -54,6 +59,11 @@ public ref struct ParserOptions // Toolset version - 2005 - 8, 2008 - 9, 2010 - 10, 0 - autoprobe for any. int ToolSetToUse; + System::String^ TargetTriple; + + bool NoStandardIncludes; + bool NoBuiltinIncludes; + bool MicrosoftMode; bool Verbose; }; @@ -146,6 +156,7 @@ protected: gcroot Opts; llvm::OwningPtr C; clang::ASTContext* AST; + clang::TargetCXXABI::Kind TargetABI; }; //-----------------------------------//