diff --git a/src/CppParser/Link.cpp b/src/CppParser/Link.cpp index 6e5990c9..3514256d 100644 --- a/src/CppParser/Link.cpp +++ b/src/CppParser/Link.cpp @@ -13,7 +13,7 @@ using namespace CppSharp::CppParser; -void Parser::Link(const std::string& File, const CppLinkerOptions* LinkerOptions) +bool Parser::Link(const std::string& File, const CppLinkerOptions* LinkerOptions) { std::vector args; llvm::StringRef Dir(llvm::sys::path::parent_path(File)); @@ -27,12 +27,10 @@ void Parser::Link(const std::string& File, const CppLinkerOptions* LinkerOptions switch (Triple.getEnvironment()) { case llvm::Triple::EnvironmentType::MSVC: - LinkWindows(LinkerOptions, args, Dir, Stem); - break; + return LinkWindows(LinkerOptions, args, Dir, Stem); case llvm::Triple::EnvironmentType::GNU: - LinkWindows(LinkerOptions, args, Dir, Stem, true); - break; + return LinkWindows(LinkerOptions, args, Dir, Stem, true); default: throw std::invalid_argument("Target triple environment"); @@ -40,20 +38,18 @@ void Parser::Link(const std::string& File, const CppLinkerOptions* LinkerOptions break; case llvm::Triple::OSType::Linux: - LinkELF(LinkerOptions, args, Dir, Stem); - break; + return LinkELF(LinkerOptions, args, Dir, Stem); case llvm::Triple::OSType::Darwin: case llvm::Triple::OSType::MacOSX: - LinkMachO(LinkerOptions, args, Dir, Stem); - break; + return LinkMachO(LinkerOptions, args, Dir, Stem); default: throw std::invalid_argument("Target triple operating system"); } } -void Parser::LinkWindows(const CppLinkerOptions* LinkerOptions, +bool Parser::LinkWindows(const CppLinkerOptions* LinkerOptions, std::vector& args, const llvm::StringRef& Dir, llvm::StringRef& Stem, bool MinGW) { @@ -104,11 +100,13 @@ void Parser::LinkWindows(const CppLinkerOptions* LinkerOptions, std::string Out("-out:" + std::string(Output)); args.push_back(Out.data()); - lld::coff::link(args, false, outs(), errs()); + return lld::coff::link(args, false, outs(), errs()); +#else + return false; #endif } -void Parser::LinkELF(const CppLinkerOptions* LinkerOptions, +bool Parser::LinkELF(const CppLinkerOptions* LinkerOptions, std::vector& args, llvm::StringRef& Dir, llvm::StringRef& Stem) { @@ -143,11 +141,13 @@ void Parser::LinkELF(const CppLinkerOptions* LinkerOptions, std::string Out(Output); args.push_back(Out.data()); - lld::elf::link(args, false, outs(), errs()); + return lld::elf::link(args, false, outs(), errs()); +#else + return false; #endif } -void Parser::LinkMachO(const CppLinkerOptions* LinkerOptions, +bool Parser::LinkMachO(const CppLinkerOptions* LinkerOptions, std::vector& args, llvm::StringRef& Dir, llvm::StringRef& Stem) { @@ -182,6 +182,8 @@ void Parser::LinkMachO(const CppLinkerOptions* LinkerOptions, std::string Out(Output); args.push_back(Out.data()); - lld::macho::link(args, false, outs(), errs()); + return lld::macho::link(args, false, outs(), errs()); +#else + return false; #endif } \ No newline at end of file diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index f95b9c54..bf81ecb8 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -4693,13 +4693,20 @@ ParserResult* Parser::Build(const CppLinkerOptions* LinkerOptions, const std::st if (error) return error; - Link(File, LinkerOptions); + bool LinkingError = !Link(File, LinkerOptions); if (Last) llvm::llvm_shutdown(); auto res = new ParserResult(); HandleDiagnostics(res); + if (LinkingError) + { + ParserDiagnostic PD; + PD.level = ParserDiagnosticLevel::Error; + PD.lineNumber = PD.columnNumber = -1; + res->addDiagnostics(PD); + } return res; } @@ -4769,10 +4776,20 @@ ParserResult* ClangParser::Link(CppParserOptions* Opts, return 0; Parser Parser(Opts); - Parser.Link(File, LinkerOptions); + bool LinkingError = !Parser.Link(File, LinkerOptions); if (Last) llvm::llvm_shutdown(); + + auto res = new ParserResult(); + if (LinkingError) + { + ParserDiagnostic PD; + PD.level = ParserDiagnosticLevel::Error; + PD.lineNumber = PD.columnNumber = -1; + res->addDiagnostics(PD); + } + return res; } ParserResult* Parser::Compile(const std::string& File) diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index aae5deb4..896ccddc 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -58,7 +58,7 @@ public: static ParserResult* ParseLibrary(const CppLinkerOptions* Opts); ParserResult* Build(const CppLinkerOptions* LinkerOptions, const std::string& File, bool Last); ParserResult* Compile(const std::string& File); - void Link(const std::string& File, const CppLinkerOptions* LinkerOptions); + bool Link(const std::string& File, const CppLinkerOptions* LinkerOptions); void WalkAST(clang::TranslationUnitDecl* TU); void HandleDeclaration(const clang::Decl* D, Declaration* Decl); CppParserOptions* opts; @@ -172,11 +172,11 @@ private: llvm::object::ObjectFile* ObjectFile, std::vector& NativeLibs); ParserTargetInfo* GetTargetInfo(); - void LinkWindows(const CppLinkerOptions* LinkerOptions, std::vector& args, + bool LinkWindows(const CppLinkerOptions* LinkerOptions, std::vector& args, const llvm::StringRef& Dir, llvm::StringRef& Stem, bool MinGW = false); - void LinkELF(const CppLinkerOptions* LinkerOptions, std::vector& args, + bool LinkELF(const CppLinkerOptions* LinkerOptions, std::vector& args, llvm::StringRef& Dir, llvm::StringRef& Stem); - void LinkMachO(const CppLinkerOptions* LinkerOptions, std::vector& args, + bool LinkMachO(const CppLinkerOptions* LinkerOptions, std::vector& args, llvm::StringRef& Dir, llvm::StringRef& Stem); int index;