@@ -609,6 +609,9 @@ void *jl_create_native_impl(jl_array_t *methods, LLVMOrcThreadSafeModuleRef llvm
609
609
else if (func == " jl_fptr_sparam" ) {
610
610
func_id = -2 ;
611
611
}
612
+ else if (decls.functionObject != " jl_f_opaque_closure_call" ) {
613
+ func_id = -3 ;
614
+ }
612
615
else {
613
616
// Safe b/c context is locked by params
614
617
data->jl_sysimg_fvars .push_back (cast<Function>(clone.getModuleUnlocked ()->getNamedValue (func)));
@@ -904,11 +907,13 @@ static bool canPartition(const GlobalValue &G) {
904
907
return true ;
905
908
}
906
909
907
- static inline bool verify_partitioning (const SmallVectorImpl<Partition> &partitions, const Module &M, size_t fvars_size, size_t gvars_size) {
910
+ static inline bool verify_partitioning (const SmallVectorImpl<Partition> &partitions, const Module &M, DenseMap<GlobalValue *, unsigned > &fvars, DenseMap<GlobalValue *, unsigned > &gvars) {
911
+ size_t fvars_size = fvars.size ();
912
+ size_t gvars_size = gvars.size ();
908
913
bool bad = false ;
909
914
#ifndef JL_NDEBUG
910
- SmallVector<uint32_t , 0 > fvars (fvars_size);
911
- SmallVector<uint32_t , 0 > gvars (gvars_size);
915
+ SmallVector<uint32_t , 0 > fvars_partition (fvars_size);
916
+ SmallVector<uint32_t , 0 > gvars_partition (gvars_size);
912
917
StringMap<uint32_t > GVNames;
913
918
for (uint32_t i = 0 ; i < partitions.size (); i++) {
914
919
for (auto &name : partitions[i].globals ) {
@@ -919,18 +924,18 @@ static inline bool verify_partitioning(const SmallVectorImpl<Partition> &partiti
919
924
GVNames[name.getKey ()] = i;
920
925
}
921
926
for (auto &fvar : partitions[i].fvars ) {
922
- if (fvars [fvar.second ] != 0 ) {
927
+ if (fvars_partition [fvar.second ] != 0 ) {
923
928
bad = true ;
924
- dbgs () << " Duplicate fvar " << fvar.first () << " in partitions " << i << " and " << fvars [fvar.second ] - 1 << " \n " ;
929
+ dbgs () << " Duplicate fvar " << fvar.first () << " in partitions " << i << " and " << fvars_partition [fvar.second ] - 1 << " \n " ;
925
930
}
926
- fvars [fvar.second ] = i+1 ;
931
+ fvars_partition [fvar.second ] = i+1 ;
927
932
}
928
933
for (auto &gvar : partitions[i].gvars ) {
929
- if (gvars [gvar.second ] != 0 ) {
934
+ if (gvars_partition [gvar.second ] != 0 ) {
930
935
bad = true ;
931
- dbgs () << " Duplicate gvar " << gvar.first () << " in partitions " << i << " and " << gvars [gvar.second ] - 1 << " \n " ;
936
+ dbgs () << " Duplicate gvar " << gvar.first () << " in partitions " << i << " and " << gvars_partition [gvar.second ] - 1 << " \n " ;
932
937
}
933
- gvars [gvar.second ] = i+1 ;
938
+ gvars_partition [gvar.second ] = i+1 ;
934
939
}
935
940
}
936
941
for (auto &GV : M.global_values ()) {
@@ -967,13 +972,14 @@ static inline bool verify_partitioning(const SmallVectorImpl<Partition> &partiti
967
972
}
968
973
}
969
974
for (uint32_t i = 0 ; i < fvars_size; i++) {
970
- if (fvars[i] == 0 ) {
975
+ if (fvars_partition[i] == 0 ) {
976
+ auto gv = find_if (fvars.begin (), fvars.end (), [i](auto var) { return var.second == i; });
971
977
bad = true ;
972
- dbgs () << " fvar " << i << " not in any partition\n " ;
978
+ dbgs () << " fvar " << gv-> first -> getName () << " at " << i << " not in any partition\n " ;
973
979
}
974
980
}
975
981
for (uint32_t i = 0 ; i < gvars_size; i++) {
976
- if (gvars [i] == 0 ) {
982
+ if (gvars_partition [i] == 0 ) {
977
983
bad = true ;
978
984
dbgs () << " gvar " << i << " not in any partition\n " ;
979
985
}
@@ -1117,7 +1123,7 @@ static SmallVector<Partition, 32> partitionModule(Module &M, unsigned threads) {
1117
1123
}
1118
1124
}
1119
1125
1120
- bool verified = verify_partitioning (partitions, M, fvars. size () , gvars. size () );
1126
+ bool verified = verify_partitioning (partitions, M, fvars, gvars);
1121
1127
assert (verified && " Partitioning failed to partition globals correctly" );
1122
1128
(void ) verified;
1123
1129
0 commit comments