diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index 9a4311993acd2..c97018d3231d5 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -34,6 +34,8 @@ namespace object { const char ArchiveMagic[] = "!\n"; const char ThinArchiveMagic[] = "!\n"; const char BigArchiveMagic[] = "\n"; +const char ZOSArchiveMagic[] = + "\x5A\x4C\x81\x99\x83\x88\x6E\x15"; // "!\n" in EBCDIC class Archive; diff --git a/llvm/lib/BinaryFormat/Magic.cpp b/llvm/lib/BinaryFormat/Magic.cpp index bd378337ed333..bb42c80529984 100644 --- a/llvm/lib/BinaryFormat/Magic.cpp +++ b/llvm/lib/BinaryFormat/Magic.cpp @@ -101,6 +101,11 @@ file_magic llvm::identify_magic(StringRef Magic) { if (startswith(Magic, "CPCH")) return file_magic::clang_ast; break; + case 0x5A: + if (startswith(Magic, + "\x5A\x4C\x81\x99\x83\x88\x6E\x15")) // "!\n" in EBCDIC + return file_magic::archive; + break; case '!': if (startswith(Magic, "!\n") || startswith(Magic, "!\n")) return file_magic::archive; diff --git a/llvm/unittests/BinaryFormat/TestFileMagic.cpp b/llvm/unittests/BinaryFormat/TestFileMagic.cpp index 766f8bfae72b0..3f11eece4f0c5 100644 --- a/llvm/unittests/BinaryFormat/TestFileMagic.cpp +++ b/llvm/unittests/BinaryFormat/TestFileMagic.cpp @@ -47,6 +47,7 @@ class MagicTest : public testing::Test { const char archive[] = "!\x0A"; const char big_archive[] = "\x0A"; +const char zos_archive[] = "\x5A\x4C\x81\x99\x83\x88\x6E\x15"; const char bitcode[] = "\xde\xc0\x17\x0b"; const char coff_object[] = "\x00\x00......"; const char coff_bigobj[] = @@ -100,6 +101,7 @@ TEST_F(MagicTest, Magic) { #define DEFINE(magic) {#magic, magic, sizeof(magic), file_magic::magic} DEFINE(archive), {"big_archive", big_archive, sizeof(big_archive), file_magic::archive}, + {"zos_archive", zos_archive, sizeof(zos_archive), file_magic::archive}, DEFINE(bitcode), DEFINE(coff_object), {"coff_bigobj", coff_bigobj, sizeof(coff_bigobj),