From: Rui Ueyama Date: Tue, 15 Oct 2013 22:45:38 +0000 (+0000) Subject: Path: Recognize Windows compiled resource file. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=b32b0376d4ac04fc2401e70aa0bdd2f6ce5a8968;p=oota-llvm.git 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 --- diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 9d72a665125..24bb8ea63e0 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -238,7 +238,8 @@ struct file_magic { macho_dsym_companion, ///< Mach-O dSYM companion file macho_universal_binary, ///< Mach-O universal binary 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 { diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index f04f8c29f66..bda32d4154c 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -553,6 +553,7 @@ ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { case sys::fs::file_magic::coff_object: case sys::fs::file_magic::pecoff_executable: case sys::fs::file_magic::macho_universal_binary: + case sys::fs::file_magic::windows_resource: report_fatal_error("Incompatible object format!"); } } else { diff --git a/lib/Object/Binary.cpp b/lib/Object/Binary.cpp index fd9d3b4bd75..d0a70091444 100644 --- a/lib/Object/Binary.cpp +++ b/lib/Object/Binary.cpp @@ -100,7 +100,8 @@ error_code object::createBinary(MemoryBuffer *Source, return object_error::success; } 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. return object_error::invalid_file_type; } diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 1d1dafdc8f4..59395c640ff 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -49,6 +49,7 @@ ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { case sys::fs::file_magic::bitcode: case sys::fs::file_magic::archive: case sys::fs::file_magic::macho_universal_binary: + case sys::fs::file_magic::windows_resource: delete Object; return 0; case sys::fs::file_magic::elf_relocatable: diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index 8d707aedded..390614b9a5b 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -847,6 +847,14 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result) { if (Magic.size() < 4) return file_magic::unknown; 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 if (Magic[1] == (char)0xC0 && Magic[2] == (char)0x17 && Magic[3] == (char)0x0B)