@@ -1120,6 +1120,102 @@ extern "C" void LLVMRustPrintPasses() {
1120
1120
PB.printPassNames (outs ());
1121
1121
}
1122
1122
1123
+ // from https://github.com/llvm/llvm-project/blob/7021182d6b43de9488ab70de626192ce70b3a4a6/llvm/lib/Object/IRSymtab.cpp#L48-L57
1124
+ static const char *PreservedLibcallSymbols[] = {
1125
+ #define HANDLE_LIBCALL (code, name ) name,
1126
+ #include " llvm/IR/RuntimeLibcalls.def"
1127
+ #undef HANDLE_LIBCALL
1128
+ // RuntimeLibcalls.def missing symbols.
1129
+ " __ctzsi2" ,
1130
+ " __ctzdi2" ,
1131
+ " __ctzti2" ,
1132
+ " __ffssi2" ,
1133
+ " __ffsdi2" ,
1134
+ " __ffsti2" ,
1135
+ " __paritysi2" ,
1136
+ " __paritydi2" ,
1137
+ " __parityti2" ,
1138
+ " __popcountsi2" ,
1139
+ " __popcountdi2" ,
1140
+ " __popcountti2" ,
1141
+ " __bswapsi2" ,
1142
+ " __bswapdi2" ,
1143
+ " __negti2" ,
1144
+ " __udivmoddi4" ,
1145
+ " __udivmodti4" ,
1146
+ " __udivmodsi4" ,
1147
+ " __divmodsi4" ,
1148
+ " __divmoddi4" ,
1149
+ " __divmodti4" ,
1150
+ " __absvsi2" ,
1151
+ " __absvdi2" ,
1152
+ " __absvti2" ,
1153
+ " __negvsi2" ,
1154
+ " __negvdi2" ,
1155
+ " __negvti2" ,
1156
+ " __addvsi3" ,
1157
+ " __addvdi3" ,
1158
+ " __addvti3" ,
1159
+ " __subvsi3" ,
1160
+ " __subvdi3" ,
1161
+ " __subvti3" ,
1162
+ " __mulvsi3" ,
1163
+ " __mulvdi3" ,
1164
+ " __mulvti3" ,
1165
+ " __cmpdi2" ,
1166
+ " __cmpti2" ,
1167
+ " __ucmpdi2" ,
1168
+ " __ucmpti2" ,
1169
+ " __mulsc3" ,
1170
+ " __muldc3" ,
1171
+ " __mulxc3" ,
1172
+ " __multc3" ,
1173
+ " __divsc3" ,
1174
+ " __divdc3" ,
1175
+ " __divxc3" ,
1176
+ " __divtc3" ,
1177
+ " __clear_cache" ,
1178
+ " __enable_execute_stack" ,
1179
+ " __gcc_personality_v0" ,
1180
+ " __eprintf" ,
1181
+ " __emutls_get_address" ,
1182
+ " __trampoline_setup" ,
1183
+ " __addsf3vfp" ,
1184
+ " __adddf3vfp" ,
1185
+ " __divsf3vfp" ,
1186
+ " __divdf3vfp" ,
1187
+ " __eqsf2vfp" ,
1188
+ " __eqdf2vfp" ,
1189
+ " __extendsfdf2vfp" ,
1190
+ " __fixdfsivfp" ,
1191
+ " __fixsfsivfp" ,
1192
+ " __fixunssfsivfp" ,
1193
+ " __fixunsdfsivfp" ,
1194
+ " __floatsidfvfp" ,
1195
+ " __floatsisfvfp" ,
1196
+ " __floatunssidfvfp" ,
1197
+ " __floatunssisfvfp" ,
1198
+ " __gedf2vfp" ,
1199
+ " __gesf2vfp" ,
1200
+ " __gtdf2vfp" ,
1201
+ " __gtsf2vfp" ,
1202
+ " __ledf2vfp" ,
1203
+ " __lesf2vfp" ,
1204
+ " __ltdf2vfp" ,
1205
+ " __ltsf2vfp" ,
1206
+ " __muldf3vfp" ,
1207
+ " __mulsf3vfp" ,
1208
+ " __nedf2vfp" ,
1209
+ " __negdf2vfp" ,
1210
+ " __negsf2vfp" ,
1211
+ " __negsf2vfp" ,
1212
+ " __subdf3vfp" ,
1213
+ " __subsf3vfp" ,
1214
+ " __truncdfsf2vfp" ,
1215
+ " __unorddf2vfp" ,
1216
+ " __unordsf2vfp" ,
1217
+ };
1218
+
1123
1219
extern " C" void LLVMRustRunRestrictionPass (LLVMModuleRef M, char **Symbols,
1124
1220
size_t Len) {
1125
1221
auto PreserveFunctions = [=](const GlobalValue &GV) {
@@ -1135,7 +1231,7 @@ extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
1135
1231
return true ;
1136
1232
}
1137
1233
}
1138
- return false ;
1234
+ return llvm::is_contained (PreservedLibcallSymbols, GV. getName ()) ;
1139
1235
};
1140
1236
1141
1237
internalizeModule (*unwrap (M), PreserveFunctions);
@@ -1293,6 +1389,12 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
1293
1389
auto GUID = GlobalValue::getGUID (preserved_symbols[i]);
1294
1390
Ret->GUIDPreservedSymbols .insert (GUID);
1295
1391
}
1392
+ for (int i = 0 ; i < sizeof (PreservedLibcallSymbols) / sizeof (PreservedLibcallSymbols[0 ]); i++) {
1393
+ if (auto *PreservedLibcallSymbol = PreservedLibcallSymbols[i]) {
1394
+ auto GUID = GlobalValue::getGUID (PreservedLibcallSymbol);
1395
+ Ret->GUIDPreservedSymbols .insert (GUID);
1396
+ }
1397
+ }
1296
1398
1297
1399
// Collect the import/export lists for all modules from the call-graph in the
1298
1400
// combined index
0 commit comments