@@ -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