mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-15 06:30:19 +00:00
Add a file magic for CL.exe's object file created with /GL.
This patch makes it possible to identify object files created by CL.exe with /GL option. Such file contains Microsoft proprietary intermediate code instead of target machine code to do LTO. I need this to print out user-friendly error message from LLD. Differential Revision: https://reviews.llvm.org/D26645 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286919 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2c34688a06
commit
baf920c9bc
@ -41,6 +41,11 @@ namespace COFF {
|
|||||||
'\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
|
'\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char ClGlObjMagic[] = {
|
||||||
|
'\x38', '\xfe', '\xb3', '\x0c', '\xa5', '\xd9', '\xab', '\x4d',
|
||||||
|
'\xac', '\x9b', '\xd6', '\xb6', '\x22', '\x26', '\x53', '\xc2',
|
||||||
|
};
|
||||||
|
|
||||||
// Sizes in bytes of various things in the COFF format.
|
// Sizes in bytes of various things in the COFF format.
|
||||||
enum {
|
enum {
|
||||||
Header16Size = 20,
|
Header16Size = 20,
|
||||||
|
@ -258,6 +258,7 @@ struct file_magic {
|
|||||||
macho_dsym_companion, ///< Mach-O dSYM companion file
|
macho_dsym_companion, ///< Mach-O dSYM companion file
|
||||||
macho_kext_bundle, ///< Mach-O kext bundle file
|
macho_kext_bundle, ///< Mach-O kext bundle file
|
||||||
macho_universal_binary, ///< Mach-O universal binary
|
macho_universal_binary, ///< Mach-O universal binary
|
||||||
|
coff_cl_gl_object, ///< Microsoft cl.exe's intermediate code file
|
||||||
coff_object, ///< COFF object file
|
coff_object, ///< COFF object file
|
||||||
coff_import_library, ///< COFF import library
|
coff_import_library, ///< COFF import library
|
||||||
pecoff_executable, ///< PECOFF executable file
|
pecoff_executable, ///< PECOFF executable file
|
||||||
|
@ -78,6 +78,7 @@ ObjectFile::createObjectFile(MemoryBufferRef Object, sys::fs::file_magic Type) {
|
|||||||
switch (Type) {
|
switch (Type) {
|
||||||
case sys::fs::file_magic::unknown:
|
case sys::fs::file_magic::unknown:
|
||||||
case sys::fs::file_magic::bitcode:
|
case sys::fs::file_magic::bitcode:
|
||||||
|
case sys::fs::file_magic::coff_cl_gl_object:
|
||||||
case sys::fs::file_magic::archive:
|
case sys::fs::file_magic::archive:
|
||||||
case sys::fs::file_magic::macho_universal_binary:
|
case sys::fs::file_magic::macho_universal_binary:
|
||||||
case sys::fs::file_magic::windows_resource:
|
case sys::fs::file_magic::windows_resource:
|
||||||
|
@ -986,22 +986,18 @@ file_magic identify_magic(StringRef Magic) {
|
|||||||
return file_magic::unknown;
|
return file_magic::unknown;
|
||||||
switch ((unsigned char)Magic[0]) {
|
switch ((unsigned char)Magic[0]) {
|
||||||
case 0x00: {
|
case 0x00: {
|
||||||
// COFF bigobj or short import library file
|
// COFF bigobj, CL.exe's LTO object file, or short import library file
|
||||||
if (Magic[1] == (char)0x00 && Magic[2] == (char)0xff &&
|
if (memcmp(Magic.data() + 1, "\0\xFF\xFF", 3) == 0) {
|
||||||
Magic[3] == (char)0xff) {
|
|
||||||
size_t MinSize = offsetof(COFF::BigObjHeader, UUID) + sizeof(COFF::BigObjMagic);
|
size_t MinSize = offsetof(COFF::BigObjHeader, UUID) + sizeof(COFF::BigObjMagic);
|
||||||
if (Magic.size() < MinSize)
|
if (Magic.size() < MinSize)
|
||||||
return file_magic::coff_import_library;
|
return file_magic::coff_import_library;
|
||||||
|
|
||||||
int BigObjVersion = read16le(
|
|
||||||
Magic.data() + offsetof(COFF::BigObjHeader, Version));
|
|
||||||
if (BigObjVersion < COFF::BigObjHeader::MinBigObjectVersion)
|
|
||||||
return file_magic::coff_import_library;
|
|
||||||
|
|
||||||
const char *Start = Magic.data() + offsetof(COFF::BigObjHeader, UUID);
|
const char *Start = Magic.data() + offsetof(COFF::BigObjHeader, UUID);
|
||||||
if (memcmp(Start, COFF::BigObjMagic, sizeof(COFF::BigObjMagic)) != 0)
|
if (memcmp(Start, COFF::BigObjMagic, sizeof(COFF::BigObjMagic)) == 0)
|
||||||
return file_magic::coff_import_library;
|
return file_magic::coff_object;
|
||||||
return file_magic::coff_object;
|
if (memcmp(Start, COFF::ClGlObjMagic, sizeof(COFF::BigObjMagic)) == 0)
|
||||||
|
return file_magic::coff_cl_gl_object;
|
||||||
|
return file_magic::coff_import_library;
|
||||||
}
|
}
|
||||||
// Windows resource file
|
// Windows resource file
|
||||||
const char Expected[] = { 0, 0, 0, 0, '\x20', 0, 0, 0, '\xff' };
|
const char Expected[] = { 0, 0, 0, 0, '\x20', 0, 0, 0, '\xff' };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user