@@ -103,14 +103,14 @@ LLVMRustGetSymbols(char *BufPtr, size_t BufLen, void *State,
103
103
#define TRUE_PTR (void *)1
104
104
#define FALSE_PTR (void *)0
105
105
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) {
107
109
std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer (
108
110
StringRef (BufPtr, BufLen), StringRef (" LLVMRustGetSymbolsObject" ), false );
109
111
SmallString<0 > SymNameBuf;
110
112
auto SymName = raw_svector_ostream (SymNameBuf);
111
113
112
- // Code starting from this line is copied from s64BitSymbolicFile in
113
- // ArchiveWriter.cpp.
114
114
// In the scenario when LLVMContext is populated SymbolicFile will contain a
115
115
// reference to it, thus SymbolicFile should be destroyed first.
116
116
LLVMContext Context;
@@ -120,48 +120,63 @@ extern "C" bool LLVMRustIs64BitSymbolicFile(char *BufPtr, size_t BufLen) {
120
120
return false ;
121
121
}
122
122
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
-
143
123
if (Obj == nullptr ) {
144
124
return false ;
145
125
}
126
+ return Callback (*Obj);
127
+ }
146
128
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
+ }
165
159
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
+ });
167
182
}
0 commit comments