@@ -103,14 +103,14 @@ LLVMRustGetSymbols(char *BufPtr, size_t BufLen, void *State,
103103#define TRUE_PTR (void *)1
104104#define FALSE_PTR (void *)0
105105
106- extern " C" bool LLVMRustIs64BitSymbolicFile (char *BufPtr, size_t BufLen) {
106+ bool withBufferAsSymbolicFile (
107+ char *BufPtr, size_t BufLen,
108+ std::function<bool (object::SymbolicFile &)> Callback) {
107109 std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer (
108110 StringRef (BufPtr, BufLen), StringRef (" LLVMRustGetSymbolsObject" ), false );
109111 SmallString<0 > SymNameBuf;
110112 auto SymName = raw_svector_ostream (SymNameBuf);
111113
112- // Code starting from this line is copied from s64BitSymbolicFile in
113- // ArchiveWriter.cpp.
114114 // In the scenario when LLVMContext is populated SymbolicFile will contain a
115115 // reference to it, thus SymbolicFile should be destroyed first.
116116 LLVMContext Context;
@@ -120,48 +120,63 @@ extern "C" bool LLVMRustIs64BitSymbolicFile(char *BufPtr, size_t BufLen) {
120120 return false ;
121121 }
122122 std::unique_ptr<object::SymbolicFile> Obj = std::move (*ObjOrErr);
123-
124- return Obj != nullptr ? Obj->is64Bit () : false ;
125- }
126-
127- extern " C" bool LLVMRustIsECObject (char *BufPtr, size_t BufLen) {
128- std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer (
129- StringRef (BufPtr, BufLen), StringRef (" LLVMRustGetSymbolsObject" ), false );
130- SmallString<0 > SymNameBuf;
131- auto SymName = raw_svector_ostream (SymNameBuf);
132-
133- // In the scenario when LLVMContext is populated SymbolicFile will contain a
134- // reference to it, thus SymbolicFile should be destroyed first.
135- LLVMContext Context;
136- Expected<std::unique_ptr<object::SymbolicFile>> ObjOrErr =
137- getSymbolicFile (Buf->getMemBufferRef (), Context);
138- if (!ObjOrErr) {
139- return false ;
140- }
141- std::unique_ptr<object::SymbolicFile> Obj = std::move (*ObjOrErr);
142-
143123 if (Obj == nullptr ) {
144124 return false ;
145125 }
126+ return Callback (*Obj);
127+ }
146128
147- // Code starting from this line is copied from isECObject in
148- // ArchiveWriter.cpp with an extra #if to work with LLVM 17.
149- if (Obj->isCOFF ())
150- return cast<llvm::object::COFFObjectFile>(&*Obj)->getMachine () !=
151- COFF::IMAGE_FILE_MACHINE_ARM64;
152-
153- if (Obj->isCOFFImportFile ())
154- return cast<llvm::object::COFFImportFile>(&*Obj)->getMachine () !=
155- COFF::IMAGE_FILE_MACHINE_ARM64;
156-
157- if (Obj->isIR ()) {
158- Expected<std::string> TripleStr =
159- getBitcodeTargetTriple (Obj->getMemoryBufferRef ());
160- if (!TripleStr)
161- return false ;
162- Triple T (*TripleStr);
163- return T.isWindowsArm64EC () || T.getArch () == Triple::x86_64;
164- }
129+ extern " C" bool LLVMRustIs64BitSymbolicFile (char *BufPtr, size_t BufLen) {
130+ return withBufferAsSymbolicFile (
131+ BufPtr, BufLen, [](object::SymbolicFile &Obj) { return Obj.is64Bit (); });
132+ }
133+
134+ extern " C" bool LLVMRustIsECObject (char *BufPtr, size_t BufLen) {
135+ return withBufferAsSymbolicFile (
136+ BufPtr, BufLen, [](object::SymbolicFile &Obj) {
137+ // Code starting from this line is copied from isECObject in
138+ // ArchiveWriter.cpp with an extra #if to work with LLVM 17.
139+ if (Obj.isCOFF ())
140+ return cast<llvm::object::COFFObjectFile>(&Obj)->getMachine () !=
141+ COFF::IMAGE_FILE_MACHINE_ARM64;
142+
143+ if (Obj.isCOFFImportFile ())
144+ return cast<llvm::object::COFFImportFile>(&Obj)->getMachine () !=
145+ COFF::IMAGE_FILE_MACHINE_ARM64;
146+
147+ if (Obj.isIR ()) {
148+ Expected<std::string> TripleStr =
149+ getBitcodeTargetTriple (Obj.getMemoryBufferRef ());
150+ if (!TripleStr)
151+ return false ;
152+ Triple T (*TripleStr);
153+ return T.isWindowsArm64EC () || T.getArch () == Triple::x86_64;
154+ }
155+
156+ return false ;
157+ });
158+ }
165159
166- return false ;
160+ extern " C" bool LLVMRustIsAnyArm64Coff (char *BufPtr, size_t BufLen) {
161+ return withBufferAsSymbolicFile (
162+ BufPtr, BufLen, [](object::SymbolicFile &Obj) {
163+ // Code starting from this line is copied from isAnyArm64COFF in
164+ // ArchiveWriter.cpp.
165+ if (Obj.isCOFF ())
166+ return COFF::isAnyArm64 (cast<COFFObjectFile>(&Obj)->getMachine ());
167+
168+ if (Obj.isCOFFImportFile ())
169+ return COFF::isAnyArm64 (cast<COFFImportFile>(&Obj)->getMachine ());
170+
171+ if (Obj.isIR ()) {
172+ Expected<std::string> TripleStr =
173+ getBitcodeTargetTriple (Obj.getMemoryBufferRef ());
174+ if (!TripleStr)
175+ return false ;
176+ Triple T (*TripleStr);
177+ return T.isOSWindows () && T.getArch () == Triple::aarch64;
178+ }
179+
180+ return false ;
181+ });
167182}
0 commit comments