@@ -48,7 +48,7 @@ using namespace llvm;
48
48
using namespace llvm ::object;
49
49
50
50
struct SymMap {
51
- bool UseECMap;
51
+ bool UseECMap = false ;
52
52
std::map<std::string, uint16_t > Map;
53
53
std::map<std::string, uint16_t > ECMap;
54
54
};
@@ -678,6 +678,25 @@ static bool isECObject(object::SymbolicFile &Obj) {
678
678
return false ;
679
679
}
680
680
681
+ static bool useECMap (object::SymbolicFile &Obj) {
682
+ if (Obj.isCOFF ())
683
+ return COFF::isAnyArm64 (cast<COFFObjectFile>(&Obj)->getMachine ());
684
+
685
+ if (Obj.isCOFFImportFile ())
686
+ return COFF::isAnyArm64 (cast<COFFImportFile>(&Obj)->getMachine ());
687
+
688
+ if (Obj.isIR ()) {
689
+ Expected<std::string> TripleStr =
690
+ getBitcodeTargetTriple (Obj.getMemoryBufferRef ());
691
+ if (!TripleStr)
692
+ return false ;
693
+ Triple T (*TripleStr);
694
+ return T.getArch () == Triple::aarch64;
695
+ }
696
+
697
+ return false ;
698
+ }
699
+
681
700
bool isImportDescriptor (StringRef Name) {
682
701
return Name.starts_with (ImportDescriptorPrefix) ||
683
702
Name == StringRef{NullImportDescriptorSymbolName} ||
@@ -803,6 +822,11 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames,
803
822
getSymbolicFile (M.Buf ->getMemBufferRef (), Context);
804
823
if (!SymFileOrErr)
805
824
return createFileError (M.MemberName , SymFileOrErr.takeError ());
825
+
826
+ // Use EC map if any member is ARM64 COFF file.
827
+ if (Kind == Archive::K_COFF && !SymMap->UseECMap && *SymFileOrErr)
828
+ SymMap->UseECMap = useECMap (**SymFileOrErr);
829
+
806
830
SymFiles.push_back (std::move (*SymFileOrErr));
807
831
}
808
832
}
@@ -957,7 +981,7 @@ static Error writeArchiveToStream(raw_ostream &Out,
957
981
ArrayRef<NewArchiveMember> NewMembers,
958
982
SymtabWritingMode WriteSymtab,
959
983
object::Archive::Kind Kind,
960
- bool Deterministic, bool Thin, bool IsEC ) {
984
+ bool Deterministic, bool Thin) {
961
985
assert ((!Thin || !isBSDLike (Kind)) && " Only the gnu format has a thin mode" );
962
986
963
987
SmallString<0 > SymNamesBuf;
@@ -977,7 +1001,6 @@ static Error writeArchiveToStream(raw_ostream &Out,
977
1001
// reference to it, thus SymbolicFile should be destroyed first.
978
1002
LLVMContext Context;
979
1003
980
- SymMap.UseECMap = IsEC;
981
1004
Expected<std::vector<MemberData>> DataOrErr = computeMemberData (
982
1005
StringTable, SymNames, Kind, Thin, Deterministic, WriteSymtab,
983
1006
isCOFFArchive (Kind) ? &SymMap : nullptr , Context, NewMembers);
@@ -1226,15 +1249,15 @@ static Error writeArchiveToStream(raw_ostream &Out,
1226
1249
Error writeArchive (StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
1227
1250
SymtabWritingMode WriteSymtab, object::Archive::Kind Kind,
1228
1251
bool Deterministic, bool Thin,
1229
- std::unique_ptr<MemoryBuffer> OldArchiveBuf, bool IsEC ) {
1252
+ std::unique_ptr<MemoryBuffer> OldArchiveBuf) {
1230
1253
Expected<sys::fs::TempFile> Temp =
1231
1254
sys::fs::TempFile::create (ArcName + " .temp-archive-%%%%%%%.a" );
1232
1255
if (!Temp)
1233
1256
return Temp.takeError ();
1234
1257
raw_fd_ostream Out (Temp->FD , false );
1235
1258
1236
1259
if (Error E = writeArchiveToStream (Out, NewMembers, WriteSymtab, Kind,
1237
- Deterministic, Thin, IsEC )) {
1260
+ Deterministic, Thin)) {
1238
1261
if (Error DiscardError = Temp->discard ())
1239
1262
return joinErrors (std::move (E), std::move (DiscardError));
1240
1263
return E;
@@ -1263,7 +1286,7 @@ writeArchiveToBuffer(ArrayRef<NewArchiveMember> NewMembers,
1263
1286
raw_svector_ostream ArchiveStream (ArchiveBufferVector);
1264
1287
1265
1288
if (Error E = writeArchiveToStream (ArchiveStream, NewMembers, WriteSymtab,
1266
- Kind, Deterministic, Thin, false ))
1289
+ Kind, Deterministic, Thin))
1267
1290
return std::move (E);
1268
1291
1269
1292
return std::make_unique<SmallVectorMemoryBuffer>(
0 commit comments