Browse Source

Added support for a lot more driver options, including ignoring built-in and standard includes, target triple and ABIs, and system include directories.

pull/1/head
triton 12 years ago
parent
commit
6ab16c43ac
  1. 10
      src/Generator/Driver.cs
  2. 7
      src/Generator/Parser.cs
  3. 57
      src/Parser/Parser.cpp
  4. 11
      src/Parser/Parser.h

10
src/Generator/Driver.cs

@ -205,13 +205,18 @@ namespace CppSharp
{ {
Defines = new List<string>(); Defines = new List<string>();
IncludeDirs = new List<string>(); IncludeDirs = new List<string>();
SystemIncludeDirs = new List<string>();
Headers = new List<string>(); Headers = new List<string>();
Assembly = string.Empty; Assembly = string.Empty;
NoStandardIncludes = false;
NoBuiltinIncludes = false;
GeneratorKind = LanguageGeneratorKind.CSharp; GeneratorKind = LanguageGeneratorKind.CSharp;
GenerateLibraryNamespace = true; GenerateLibraryNamespace = true;
GenerateFunctionTemplates = false; GenerateFunctionTemplates = false;
WriteOnlyWhenChanged = false; WriteOnlyWhenChanged = false;
GeneratePartialClasses = true; GeneratePartialClasses = true;
MicrosoftMode = (Environment.OSVersion.Platform != PlatformID.MacOSX)
&& (Environment.OSVersion.Platform != PlatformID.Unix);
// Library options // Library options
LibraryDirs = new List<string>(); LibraryDirs = new List<string>();
@ -232,12 +237,17 @@ namespace CppSharp
public bool GenerateLibraryNamespace; public bool GenerateLibraryNamespace;
public bool GenerateFunctionTemplates; public bool GenerateFunctionTemplates;
public bool GeneratePartialClasses; public bool GeneratePartialClasses;
public bool NoStandardIncludes;
public bool NoBuiltinIncludes;
public bool MicrosoftMode;
public string TargetTriple;
public string OutputNamespace; public string OutputNamespace;
public string OutputDir; public string OutputDir;
public string LibraryName; public string LibraryName;
public CppAbi Abi; public CppAbi Abi;
public List<string> Defines; public List<string> Defines;
public List<string> IncludeDirs; public List<string> IncludeDirs;
public List<string> SystemIncludeDirs;
public List<string> Headers; public List<string> Headers;
public string Template; public string Template;
public string Assembly; public string Assembly;

7
src/Generator/Parser.cs

@ -45,8 +45,13 @@ namespace CppSharp
FileName = file, FileName = file,
Verbose = false, Verbose = false,
IncludeDirs = options.IncludeDirs, IncludeDirs = options.IncludeDirs,
SystemIncludeDirs = options.SystemIncludeDirs,
Defines = options.Defines, 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); var result = ClangParser.ParseHeader(parserOptions);

57
src/Parser/Parser.cpp

@ -73,34 +73,60 @@ void Parser::SetupHeader()
using namespace clang; using namespace clang;
using namespace clix; using namespace clix;
const char* args[] = std::vector<const char*> args;
{ args.push_back("-cc1");
// Enable C++ language mode // Enable C++ language mode
"-xc++", "-std=c++11", "-fno-rtti", 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 // Enable the Microsoft parsing extensions
"-fms-extensions", "-fms-compatibility", "-fdelayed-template-parsing", if (Opts->MicrosoftMode)
// 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.reset(new CompilerInstance());
C->createDiagnostics(); C->createDiagnostics();
CompilerInvocation* Inv = new CompilerInvocation(); CompilerInvocation* Inv = new CompilerInvocation();
CompilerInvocation::CreateFromArgs(*Inv, args, args + ARRAY_SIZE(args), CompilerInvocation::CreateFromArgs(*Inv, args.data(), args.data() + args.size(),
C->getDiagnostics()); C->getDiagnostics());
C->setInvocation(Inv); C->setInvocation(Inv);
TargetOptions& TO = Inv->getTargetOpts(); TargetOptions& TO = Inv->getTargetOpts();
if (!System::String::IsNullOrWhiteSpace(Opts->TargetTriple))
TO.Triple = marshalString<E_UTF8>(Opts->TargetTriple);
else
TO.Triple = llvm::sys::getDefaultTargetTriple(); TO.Triple = llvm::sys::getDefaultTargetTriple();
TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft
: TargetCXXABI::GenericItanium;
TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO); TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO);
TI->setCXXABI(TargetCXXABI::Microsoft); TI->setCXXABI(TargetABI);
C->setTarget(TI); C->setTarget(TI);
C->createFileManager(); C->createFileManager();
C->createSourceManager(C->getFileManager()); 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) if (Opts->Verbose)
C->getHeaderSearchOpts().Verbose = true; C->getHeaderSearchOpts().Verbose = true;
@ -110,6 +136,12 @@ void Parser::SetupHeader()
C->getHeaderSearchOpts().AddPath(s, frontend::Angled, false, false); C->getHeaderSearchOpts().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);
}
for each(System::String^% def in Opts->Defines) for each(System::String^% def in Opts->Defines)
{ {
String s = marshalString<E_UTF8>(def); String s = marshalString<E_UTF8>(def);
@ -123,6 +155,8 @@ void Parser::SetupHeader()
clang::frontend::System, false, false); clang::frontend::System, false, false);
#ifdef _MSC_VER #ifdef _MSC_VER
if (!Opts->NoBuiltinIncludes)
{
std::vector<std::string> SystemDirs = GetWindowsSystemIncludeDirs(); std::vector<std::string> SystemDirs = GetWindowsSystemIncludeDirs();
clang::HeaderSearchOptions& HSOpts = C->getHeaderSearchOpts(); clang::HeaderSearchOptions& HSOpts = C->getHeaderSearchOpts();
@ -130,6 +164,7 @@ void Parser::SetupHeader()
{ {
HSOpts.AddPath(SystemDirs[i], frontend::System, false, false); HSOpts.AddPath(SystemDirs[i], frontend::System, false, false);
} }
}
#endif #endif
C->createPreprocessor(); C->createPreprocessor();
@ -1165,7 +1200,7 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, CppSharp::Function^ F,
} }
F->ReturnType = WalkType(FD->getResultType(), &RTL); F->ReturnType = WalkType(FD->getResultType(), &RTL);
String Mangled = GetDeclMangledName(FD, TargetCXXABI::Microsoft, IsDependent); String Mangled = GetDeclMangledName(FD, TargetABI, IsDependent);
F->Mangled = marshalString<E_UTF8>(Mangled); F->Mangled = marshalString<E_UTF8>(Mangled);
for(auto it = FD->param_begin(); it != FD->param_end(); ++it) 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(); auto TL = VD->getTypeSourceInfo()->getTypeLoc();
Var->QualifiedType = GetQualifiedType(VD->getType(), WalkType(VD->getType(), &TL)); 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<E_UTF8>(Mangled); Var->Mangled = marshalString<E_UTF8>(Mangled);
return Var; return Var;

11
src/Parser/Parser.h

@ -38,12 +38,17 @@ public ref struct ParserOptions
ParserOptions() ParserOptions()
{ {
IncludeDirs = gcnew List<System::String^>(); IncludeDirs = gcnew List<System::String^>();
SystemIncludeDirs = gcnew List<System::String^>();
Defines = gcnew List<System::String^>(); Defines = gcnew List<System::String^>();
LibraryDirs = gcnew List<System::String^>(); LibraryDirs = gcnew List<System::String^>();
MicrosoftMode = false;
NoStandardIncludes = false;
NoBuiltinIncludes = false;
} }
// Include directories // Include directories
List<System::String^>^ IncludeDirs; List<System::String^>^ IncludeDirs;
List<System::String^>^ SystemIncludeDirs;
List<System::String^>^ Defines; List<System::String^>^ Defines;
List<System::String^>^ LibraryDirs; List<System::String^>^ LibraryDirs;
@ -54,6 +59,11 @@ public ref struct ParserOptions
// Toolset version - 2005 - 8, 2008 - 9, 2010 - 10, 0 - autoprobe for any. // Toolset version - 2005 - 8, 2008 - 9, 2010 - 10, 0 - autoprobe for any.
int ToolSetToUse; int ToolSetToUse;
System::String^ TargetTriple;
bool NoStandardIncludes;
bool NoBuiltinIncludes;
bool MicrosoftMode;
bool Verbose; bool Verbose;
}; };
@ -146,6 +156,7 @@ protected:
gcroot<ParserOptions^> Opts; gcroot<ParserOptions^> Opts;
llvm::OwningPtr<clang::CompilerInstance> C; llvm::OwningPtr<clang::CompilerInstance> C;
clang::ASTContext* AST; clang::ASTContext* AST;
clang::TargetCXXABI::Kind TargetABI;
}; };
//-----------------------------------// //-----------------------------------//

Loading…
Cancel
Save