From b32b0376d4ac04fc2401e70aa0bdd2f6ce5a8968 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 15 Oct 2013 22:45:38 +0000 Subject: 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 --- include/llvm/Support/FileSystem.h | 3 ++- lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 1 + lib/Object/Binary.cpp | 3 ++- lib/Object/ObjectFile.cpp | 1 + lib/Support/Path.cpp | 8 ++++++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 9d72a66512..24bb8ea63e 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 f04f8c29f6..bda32d4154 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 fd9d3b4bd7..d0a7009144 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 1d1dafdc8f..59395c640f 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 8d707aedde..390614b9a5 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) -- cgit v1.2.3