@@ -989,15 +989,21 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
989
989
// Do not enable update debug info since it runs the verifier on the whole module
990
990
// and will error on the function we are currently emitting.
991
991
ModuleSummaryIndex index = ModuleSummaryIndex (true );
992
- bool failed = parseAssemblyInto (llvm::MemoryBufferRef (ir_string, " llvmcall" ),
993
- jl_Module, &index, Err, nullptr , /* UpdateDebugInfo */ false );
992
+ bool failed = parseAssemblyInto (MemoryBufferRef (ir_string, " llvmcall" ),
993
+ jl_Module, &index, Err, nullptr ,
994
+ /* UpdateDebugInfo */ false );
995
+ f = jl_Module->getFunction (ir_name);
994
996
if (failed) {
995
- std::string message = " Failed to parse LLVM Assembly: \n " ;
996
- llvm::raw_string_ostream stream (message);
997
- Err.print (" julia" ,stream,true );
998
- jl_error (stream.str ().c_str ());
997
+ // try to get the module in a workable state again
998
+ if (f)
999
+ f->eraseFromParent ();
1000
+
1001
+ std::string message = " Failed to parse LLVM assembly: \n " ;
1002
+ raw_string_ostream stream (message);
1003
+ Err.print (" " , stream, true );
1004
+ emit_error (ctx, stream.str ());
1005
+ return jl_cgval_t ();
999
1006
}
1000
- f = jl_Module->getFunction (ir_name);
1001
1007
}
1002
1008
else {
1003
1009
assert (isPtr);
@@ -1015,11 +1021,11 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
1015
1021
f = mover.CloneFunction (f);
1016
1022
}
1017
1023
1018
- // f->dump() ;
1019
- llvm::raw_fd_ostream out ( 1 , false );
1020
- if (verifyFunction (*f,&out )) {
1021
- llvm_dump (f );
1022
- jl_error ( " Malformed LLVM Function " );
1024
+ std::string message = " Malformed LLVM function: \n " ;
1025
+ raw_string_ostream stream (message );
1026
+ if (verifyFunction (*f, &stream )) {
1027
+ emit_error (ctx, stream. str () );
1028
+ return jl_cgval_t ( );
1023
1029
}
1024
1030
}
1025
1031
@@ -1046,7 +1052,12 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
1046
1052
JL_GC_POP ();
1047
1053
1048
1054
if (inst->getType () != rettype) {
1049
- jl_error (" Return type of llvmcall'ed function does not match declared return type" );
1055
+ std::string message;
1056
+ raw_string_ostream stream (message);
1057
+ stream << " llvmcall return type " << *inst->getType ()
1058
+ << " does not match declared return type" << *rettype;
1059
+ emit_error (ctx, stream.str ());
1060
+ return jl_cgval_t ();
1050
1061
}
1051
1062
1052
1063
return mark_julia_type (ctx, inst, retboxed, rtt);
@@ -1864,13 +1875,16 @@ jl_cgval_t function_sig_t::emit_a_ccall(
1864
1875
Value *llvmf;
1865
1876
if (llvmcall) {
1866
1877
if (symarg.jl_ptr != NULL ) {
1867
- jl_error (" llvmcall doesn't support dynamic pointers" );
1878
+ emit_error (ctx, " llvmcall doesn't support dynamic pointers" );
1879
+ return jl_cgval_t ();
1868
1880
}
1869
1881
else if (symarg.fptr != NULL ) {
1870
- jl_error (" llvmcall doesn't support static pointers" );
1882
+ emit_error (ctx, " llvmcall doesn't support static pointers" );
1883
+ return jl_cgval_t ();
1871
1884
}
1872
1885
else if (symarg.f_lib != NULL ) {
1873
- jl_error (" llvmcall doesn't support dynamic libraries" );
1886
+ emit_error (ctx, " llvmcall doesn't support dynamic libraries" );
1887
+ return jl_cgval_t ();
1874
1888
}
1875
1889
else {
1876
1890
assert (symarg.f_name != NULL );
@@ -1884,10 +1898,12 @@ jl_cgval_t function_sig_t::emit_a_ccall(
1884
1898
#else
1885
1899
;
1886
1900
#endif
1887
- if (!f_extern &&
1888
- (!isa<Function>(llvmf) ||
1889
- cast<Function>(llvmf)->getIntrinsicID () == Intrinsic::not_intrinsic))
1890
- jl_error (" llvmcall only supports intrinsic calls" );
1901
+ if (!f_extern && (!isa<Function>(llvmf) ||
1902
+ cast<Function>(llvmf)->getIntrinsicID () ==
1903
+ Intrinsic::not_intrinsic)) {
1904
+ emit_error (ctx, " llvmcall only supports intrinsic calls" );
1905
+ return jl_cgval_t ();
1906
+ }
1891
1907
}
1892
1908
}
1893
1909
else if (symarg.jl_ptr != NULL ) {
0 commit comments