@@ -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
107+ withBufferAsSymbolicFile (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,62 @@ extern "C" bool LLVMRustIs64BitSymbolicFile(char *BufPtr, size_t BufLen) {
120120 return false ;
121121 }
122122 std::unique_ptr<object::SymbolicFile> Obj = std::move (*ObjOrErr);
123+ if (Obj == nullptr ) {
124+ return false ;
125+ }
126+ return Callback (*Obj);
127+ }
123128
124- return Obj != nullptr ? Obj->is64Bit () : false ;
129+ extern " C" bool LLVMRustIs64BitSymbolicFile (char *BufPtr, size_t BufLen) {
130+ return withBufferAsSymbolicFile (BufPtr, BufLen, [](object::SymbolicFile &Obj) {
131+ return Obj.is64Bit ();
132+ });
125133}
126134
127135extern " 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);
136+ return withBufferAsSymbolicFile (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+ }
142155
143- if (Obj == nullptr ) {
144156 return false ;
145- }
157+ });
158+ }
146159
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- }
160+ extern " C " bool LLVMRustIsAnyArm64Coff ( char *BufPtr, size_t BufLen) {
161+ return withBufferAsSymbolicFile (BufPtr, BufLen, [](object::SymbolicFile &Obj) {
162+ // Code starting from this line is copied from isAnyArm64COFF in
163+ // ArchiveWriter.cpp.
164+ if (Obj. isCOFF ())
165+ return COFF::isAnyArm64 (cast<COFFObjectFile>(&Obj)-> getMachine ());
166+
167+ if ( Obj. isCOFFImportFile ())
168+ return COFF::isAnyArm64 (cast<COFFImportFile>(&Obj)-> getMachine ()) ;
169+
170+ if (Obj. isIR ()) {
171+ Expected<std::string> TripleStr =
172+ getBitcodeTargetTriple (Obj. getMemoryBufferRef ());
173+ if (!TripleStr)
174+ return false ;
175+ Triple T (*TripleStr);
176+ return T.isOSWindows () && T.getArch () == Triple::aarch64 ;
177+ }
165178
166- return false ;
179+ return false ;
180+ });
167181}
0 commit comments