@@ -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
107
+ withBufferAsSymbolicFile (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,62 @@ 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
+ if (Obj == nullptr ) {
124
+ return false ;
125
+ }
126
+ return Callback (*Obj);
127
+ }
123
128
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
+ });
125
133
}
126
134
127
135
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);
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
+ }
142
155
143
- if (Obj == nullptr ) {
144
156
return false ;
145
- }
157
+ });
158
+ }
146
159
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
+ }
165
178
166
- return false ;
179
+ return false ;
180
+ });
167
181
}
0 commit comments