Skip to content

Commit 816df51

Browse files
authored
Make llvmcall errors dynamic. (#35767)
1 parent 097f0b0 commit 816df51

File tree

1 file changed

+36
-20
lines changed

1 file changed

+36
-20
lines changed

src/ccall.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -989,15 +989,21 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
989989
// Do not enable update debug info since it runs the verifier on the whole module
990990
// and will error on the function we are currently emitting.
991991
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);
994996
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();
9991006
}
1000-
f = jl_Module->getFunction(ir_name);
10011007
}
10021008
else {
10031009
assert(isPtr);
@@ -1015,11 +1021,11 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
10151021
f = mover.CloneFunction(f);
10161022
}
10171023

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();
10231029
}
10241030
}
10251031

@@ -1046,7 +1052,12 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar
10461052
JL_GC_POP();
10471053

10481054
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();
10501061
}
10511062

10521063
return mark_julia_type(ctx, inst, retboxed, rtt);
@@ -1864,13 +1875,16 @@ jl_cgval_t function_sig_t::emit_a_ccall(
18641875
Value *llvmf;
18651876
if (llvmcall) {
18661877
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();
18681880
}
18691881
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();
18711884
}
18721885
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();
18741888
}
18751889
else {
18761890
assert(symarg.f_name != NULL);
@@ -1884,10 +1898,12 @@ jl_cgval_t function_sig_t::emit_a_ccall(
18841898
#else
18851899
;
18861900
#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+
}
18911907
}
18921908
}
18931909
else if (symarg.jl_ptr != NULL) {

0 commit comments

Comments
 (0)