Path: Recognize Windows compiled resource file.

Some background: One can pass compiled resource files (.res files) directly
to the linker on Windows. If a resource file is given, the linker will run
"cvtres" command in background to convert the resource file to a COFF file
to link it.

What I'm trying to do with this patch is to make the linker to recognize
the resource file by file magic, so that it can run cvtres command.

Differential Revision: http://llvm-reviews.chandlerc.com/D1943

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192742 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rui Ueyama
2013-10-15 22:45:38 +00:00
parent 72be32c633
commit b32b0376d4
5 changed files with 14 additions and 2 deletions

View File

@@ -238,7 +238,8 @@ struct file_magic {
macho_dsym_companion, ///< Mach-O dSYM companion file macho_dsym_companion, ///< Mach-O dSYM companion file
macho_universal_binary, ///< Mach-O universal binary macho_universal_binary, ///< Mach-O universal binary
coff_object, ///< COFF object file coff_object, ///< COFF object file
pecoff_executable ///< PECOFF executable file pecoff_executable, ///< PECOFF executable file
windows_resource, ///< Windows compiled resource file (.rc)
}; };
bool is_object() const { bool is_object() const {

View File

@@ -553,6 +553,7 @@ ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) {
case sys::fs::file_magic::coff_object: case sys::fs::file_magic::coff_object:
case sys::fs::file_magic::pecoff_executable: case sys::fs::file_magic::pecoff_executable:
case sys::fs::file_magic::macho_universal_binary: case sys::fs::file_magic::macho_universal_binary:
case sys::fs::file_magic::windows_resource:
report_fatal_error("Incompatible object format!"); report_fatal_error("Incompatible object format!");
} }
} else { } else {

View File

@@ -100,7 +100,8 @@ error_code object::createBinary(MemoryBuffer *Source,
return object_error::success; return object_error::success;
} }
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::windows_resource: {
// Unrecognized object file format. // Unrecognized object file format.
return object_error::invalid_file_type; return object_error::invalid_file_type;
} }

View File

@@ -49,6 +49,7 @@ ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
case sys::fs::file_magic::bitcode: case sys::fs::file_magic::bitcode:
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:
delete Object; delete Object;
return 0; return 0;
case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_relocatable:

View File

@@ -847,6 +847,14 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result) {
if (Magic.size() < 4) if (Magic.size() < 4)
return file_magic::unknown; return file_magic::unknown;
switch ((unsigned char)Magic[0]) { switch ((unsigned char)Magic[0]) {
case 0x00: {
// Windows resource file
const char Expected[] = "\0\0\0\0\x20\0\0\0\xff";
if (Magic.size() >= sizeof(Expected) &&
memcmp(Magic.data(), Expected, sizeof(Expected)) == 0)
return file_magic::windows_resource;
break;
}
case 0xDE: // 0x0B17C0DE = BC wraper case 0xDE: // 0x0B17C0DE = BC wraper
if (Magic[1] == (char)0xC0 && Magic[2] == (char)0x17 && if (Magic[1] == (char)0xC0 && Magic[2] == (char)0x17 &&
Magic[3] == (char)0x0B) Magic[3] == (char)0x0B)