Browse Source

Report errors when linking of generated C++ fails

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1641/head
Dimitar Dobrev 4 years ago
parent
commit
25e983606e
  1. 32
      src/CppParser/Link.cpp
  2. 21
      src/CppParser/Parser.cpp
  3. 8
      src/CppParser/Parser.h

32
src/CppParser/Link.cpp

@ -13,7 +13,7 @@ @@ -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<const char*> args;
llvm::StringRef Dir(llvm::sys::path::parent_path(File));
@ -27,12 +27,10 @@ void Parser::Link(const std::string& File, const CppLinkerOptions* LinkerOptions @@ -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 @@ -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<const char*>& args,
const llvm::StringRef& Dir, llvm::StringRef& Stem, bool MinGW)
{
@ -104,11 +100,13 @@ void Parser::LinkWindows(const CppLinkerOptions* LinkerOptions, @@ -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<const char*>& args,
llvm::StringRef& Dir, llvm::StringRef& Stem)
{
@ -143,11 +141,13 @@ void Parser::LinkELF(const CppLinkerOptions* LinkerOptions, @@ -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<const char*>& args,
llvm::StringRef& Dir, llvm::StringRef& Stem)
{
@ -182,6 +182,8 @@ void Parser::LinkMachO(const CppLinkerOptions* LinkerOptions, @@ -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
}

21
src/CppParser/Parser.cpp

@ -4693,13 +4693,20 @@ ParserResult* Parser::Build(const CppLinkerOptions* LinkerOptions, const std::st @@ -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, @@ -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)

8
src/CppParser/Parser.h

@ -58,7 +58,7 @@ public: @@ -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: @@ -172,11 +172,11 @@ private:
llvm::object::ObjectFile* ObjectFile, std::vector<CppSharp::CppParser::NativeLibrary*>& NativeLibs);
ParserTargetInfo* GetTargetInfo();
void LinkWindows(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
bool LinkWindows(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
const llvm::StringRef& Dir, llvm::StringRef& Stem, bool MinGW = false);
void LinkELF(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
bool LinkELF(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
llvm::StringRef& Dir, llvm::StringRef& Stem);
void LinkMachO(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
bool LinkMachO(const CppLinkerOptions* LinkerOptions, std::vector<const char*>& args,
llvm::StringRef& Dir, llvm::StringRef& Stem);
int index;

Loading…
Cancel
Save