@@ -1163,20 +1163,21 @@ enum Symbol : uint32_t {
1163
1163
// / Scan the symbols from a BitcodeFile \p Buffer and record if we need to
1164
1164
// / extract any symbols from it.
1165
1165
Expected<bool > getSymbolsFromBitcode (MemoryBufferRef Buffer, OffloadKind Kind,
1166
- StringSaver &Saver,
1166
+ bool IsArchive, StringSaver &Saver,
1167
1167
DenseMap<StringRef, Symbol> &Syms) {
1168
1168
Expected<IRSymtabFile> IRSymtabOrErr = readIRSymtab (Buffer);
1169
1169
if (!IRSymtabOrErr)
1170
1170
return IRSymtabOrErr.takeError ();
1171
1171
1172
- bool ShouldExtract = false ;
1172
+ bool ShouldExtract = !IsArchive;
1173
+ DenseMap<StringRef, Symbol> TmpSyms;
1173
1174
for (unsigned I = 0 ; I != IRSymtabOrErr->Mods .size (); ++I) {
1174
1175
for (const auto &Sym : IRSymtabOrErr->TheReader .module_symbols (I)) {
1175
1176
if (Sym.isFormatSpecific () || !Sym.isGlobal ())
1176
1177
continue ;
1177
1178
1178
1179
bool NewSymbol = Syms.count (Sym.getName ()) == 0 ;
1179
- auto & OldSym = Syms[Saver. save ( Sym.getName () )];
1180
+ auto OldSym = NewSymbol ? Sym_None : Syms[Sym.getName ()];
1180
1181
1181
1182
// We will extract if it defines a currenlty undefined non-weak symbol.
1182
1183
bool ResolvesStrongReference =
@@ -1192,23 +1193,31 @@ Expected<bool> getSymbolsFromBitcode(MemoryBufferRef Buffer, OffloadKind Kind,
1192
1193
1193
1194
// Update this symbol in the "table" with the new information.
1194
1195
if (OldSym & Sym_Undefined && !Sym.isUndefined ())
1195
- OldSym = static_cast <Symbol>(OldSym & ~Sym_Undefined);
1196
+ TmpSyms[Saver.save (Sym.getName ())] =
1197
+ static_cast <Symbol>(OldSym & ~Sym_Undefined);
1196
1198
if (Sym.isUndefined () && NewSymbol)
1197
- OldSym = static_cast <Symbol>(OldSym | Sym_Undefined);
1199
+ TmpSyms[Saver.save (Sym.getName ())] =
1200
+ static_cast <Symbol>(OldSym | Sym_Undefined);
1198
1201
if (Sym.isWeak ())
1199
- OldSym = static_cast <Symbol>(OldSym | Sym_Weak);
1202
+ TmpSyms[Saver.save (Sym.getName ())] =
1203
+ static_cast <Symbol>(OldSym | Sym_Weak);
1200
1204
}
1201
1205
}
1202
1206
1207
+ // If the file gets extracted we update the table with the new symbols.
1208
+ if (ShouldExtract)
1209
+ Syms.insert (std::begin (TmpSyms), std::end (TmpSyms));
1210
+
1203
1211
return ShouldExtract;
1204
1212
}
1205
1213
1206
1214
// / Scan the symbols from an ObjectFile \p Obj and record if we need to extract
1207
1215
// / any symbols from it.
1208
1216
Expected<bool > getSymbolsFromObject (const ObjectFile &Obj, OffloadKind Kind,
1209
- StringSaver &Saver,
1217
+ bool IsArchive, StringSaver &Saver,
1210
1218
DenseMap<StringRef, Symbol> &Syms) {
1211
- bool ShouldExtract = false ;
1219
+ bool ShouldExtract = !IsArchive;
1220
+ DenseMap<StringRef, Symbol> TmpSyms;
1212
1221
for (SymbolRef Sym : Obj.symbols ()) {
1213
1222
auto FlagsOrErr = Sym.getFlags ();
1214
1223
if (!FlagsOrErr)
@@ -1223,7 +1232,7 @@ Expected<bool> getSymbolsFromObject(const ObjectFile &Obj, OffloadKind Kind,
1223
1232
return NameOrErr.takeError ();
1224
1233
1225
1234
bool NewSymbol = Syms.count (*NameOrErr) == 0 ;
1226
- auto & OldSym = Syms[Saver. save ( *NameOrErr) ];
1235
+ auto OldSym = NewSymbol ? Sym_None : Syms[*NameOrErr];
1227
1236
1228
1237
// We will extract if it defines a currenlty undefined non-weak symbol.
1229
1238
bool ResolvesStrongReference = (OldSym & Sym_Undefined) &&
@@ -1240,12 +1249,19 @@ Expected<bool> getSymbolsFromObject(const ObjectFile &Obj, OffloadKind Kind,
1240
1249
1241
1250
// Update this symbol in the "table" with the new information.
1242
1251
if (OldSym & Sym_Undefined && !(*FlagsOrErr & SymbolRef::SF_Undefined))
1243
- OldSym = static_cast <Symbol>(OldSym & ~Sym_Undefined);
1252
+ TmpSyms[Saver.save (*NameOrErr)] =
1253
+ static_cast <Symbol>(OldSym & ~Sym_Undefined);
1244
1254
if (*FlagsOrErr & SymbolRef::SF_Undefined && NewSymbol)
1245
- OldSym = static_cast <Symbol>(OldSym | Sym_Undefined);
1255
+ TmpSyms[Saver.save (*NameOrErr)] =
1256
+ static_cast <Symbol>(OldSym | Sym_Undefined);
1246
1257
if (*FlagsOrErr & SymbolRef::SF_Weak)
1247
- OldSym = static_cast <Symbol>(OldSym | Sym_Weak);
1258
+ TmpSyms[Saver. save (*NameOrErr)] = static_cast <Symbol>(OldSym | Sym_Weak);
1248
1259
}
1260
+
1261
+ // If the file gets extracted we update the table with the new symbols.
1262
+ if (ShouldExtract)
1263
+ Syms.insert (std::begin (TmpSyms), std::end (TmpSyms));
1264
+
1249
1265
return ShouldExtract;
1250
1266
}
1251
1267
@@ -1255,18 +1271,19 @@ Expected<bool> getSymbolsFromObject(const ObjectFile &Obj, OffloadKind Kind,
1255
1271
// / 1) It defines an undefined symbol in a regular object filie.
1256
1272
// / 2) It defines a global symbol without hidden visibility that has not
1257
1273
// / yet been defined.
1258
- Expected<bool > getSymbols (StringRef Image, OffloadKind Kind, StringSaver &Saver,
1274
+ Expected<bool > getSymbols (StringRef Image, OffloadKind Kind, bool IsArchive,
1275
+ StringSaver &Saver,
1259
1276
DenseMap<StringRef, Symbol> &Syms) {
1260
1277
MemoryBufferRef Buffer = MemoryBufferRef (Image, " " );
1261
1278
switch (identify_magic (Image)) {
1262
1279
case file_magic::bitcode:
1263
- return getSymbolsFromBitcode (Buffer, Kind, Saver, Syms);
1280
+ return getSymbolsFromBitcode (Buffer, Kind, IsArchive, Saver, Syms);
1264
1281
case file_magic::elf_relocatable: {
1265
1282
Expected<std::unique_ptr<ObjectFile>> ObjFile =
1266
1283
ObjectFile::createObjectFile (Buffer);
1267
1284
if (!ObjFile)
1268
1285
return ObjFile.takeError ();
1269
- return getSymbolsFromObject (**ObjFile, Kind, Saver, Syms);
1286
+ return getSymbolsFromObject (**ObjFile, Kind, IsArchive, Saver, Syms);
1270
1287
}
1271
1288
default :
1272
1289
return false ;
@@ -1341,13 +1358,14 @@ Expected<SmallVector<OffloadFile>> getDeviceInput(const ArgList &Args) {
1341
1358
if (IsArchive && !WholeArchive && !Syms.count (Binary))
1342
1359
continue ;
1343
1360
1344
- Expected<bool > ExtractOrErr = getSymbols (
1345
- Binary.getBinary ()->getImage (),
1346
- Binary.getBinary ()->getOffloadKind (), Saver, Syms[Binary]);
1361
+ Expected<bool > ExtractOrErr =
1362
+ getSymbols (Binary.getBinary ()->getImage (),
1363
+ Binary.getBinary ()->getOffloadKind (), IsArchive, Saver,
1364
+ Syms[Binary]);
1347
1365
if (!ExtractOrErr)
1348
1366
return ExtractOrErr.takeError ();
1349
1367
1350
- Extracted = IsArchive && !WholeArchive && *ExtractOrErr;
1368
+ Extracted = !WholeArchive && *ExtractOrErr;
1351
1369
1352
1370
if (!IsArchive || WholeArchive || Extracted)
1353
1371
InputFiles.emplace_back (std::move (Binary));
0 commit comments