1 //===-- IRForTarget.cpp ---------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "IRForTarget.h"
10
11 #include "ClangExpressionDeclMap.h"
12 #include "ClangUtil.h"
13
14 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
15 #include "llvm/IR/Constants.h"
16 #include "llvm/IR/DataLayout.h"
17 #include "llvm/IR/InstrTypes.h"
18 #include "llvm/IR/Instructions.h"
19 #include "llvm/IR/Intrinsics.h"
20 #include "llvm/IR/LegacyPassManager.h"
21 #include "llvm/IR/Metadata.h"
22 #include "llvm/IR/Module.h"
23 #include "llvm/IR/ValueSymbolTable.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include "llvm/Transforms/IPO.h"
26
27 #include "clang/AST/ASTContext.h"
28
29 #include "lldb/Core/dwarf.h"
30 #include "lldb/Expression/IRExecutionUnit.h"
31 #include "lldb/Expression/IRInterpreter.h"
32 #include "lldb/Symbol/CompilerType.h"
33 #include "lldb/Utility/ConstString.h"
34 #include "lldb/Utility/DataBufferHeap.h"
35 #include "lldb/Utility/Endian.h"
36 #include "lldb/Utility/Log.h"
37 #include "lldb/Utility/Scalar.h"
38 #include "lldb/Utility/StreamString.h"
39
40 #include <map>
41
42 using namespace llvm;
43
44 static char ID;
45
46 typedef SmallVector<Instruction *, 2> InstrList;
47
FunctionValueCache(Maker const & maker)48 IRForTarget::FunctionValueCache::FunctionValueCache(Maker const &maker)
49 : m_maker(maker), m_values() {}
50
~FunctionValueCache()51 IRForTarget::FunctionValueCache::~FunctionValueCache() {}
52
53 llvm::Value *
GetValue(llvm::Function * function)54 IRForTarget::FunctionValueCache::GetValue(llvm::Function *function) {
55 if (!m_values.count(function)) {
56 llvm::Value *ret = m_maker(function);
57 m_values[function] = ret;
58 return ret;
59 }
60 return m_values[function];
61 }
62
FindEntryInstruction(llvm::Function * function)63 static llvm::Value *FindEntryInstruction(llvm::Function *function) {
64 if (function->empty())
65 return nullptr;
66
67 return function->getEntryBlock().getFirstNonPHIOrDbg();
68 }
69
IRForTarget(lldb_private::ClangExpressionDeclMap * decl_map,bool resolve_vars,lldb_private::IRExecutionUnit & execution_unit,lldb_private::Stream & error_stream,const char * func_name)70 IRForTarget::IRForTarget(lldb_private::ClangExpressionDeclMap *decl_map,
71 bool resolve_vars,
72 lldb_private::IRExecutionUnit &execution_unit,
73 lldb_private::Stream &error_stream,
74 const char *func_name)
75 : ModulePass(ID), m_resolve_vars(resolve_vars), m_func_name(func_name),
76 m_module(nullptr), m_decl_map(decl_map),
77 m_CFStringCreateWithBytes(nullptr), m_sel_registerName(nullptr),
78 m_objc_getClass(nullptr), m_intptr_ty(nullptr),
79 m_error_stream(error_stream), m_execution_unit(execution_unit),
80 m_result_store(nullptr), m_result_is_pointer(false),
81 m_reloc_placeholder(nullptr),
82 m_entry_instruction_finder(FindEntryInstruction) {}
83
84 /* Handy utility functions used at several places in the code */
85
PrintValue(const Value * value,bool truncate=false)86 static std::string PrintValue(const Value *value, bool truncate = false) {
87 std::string s;
88 if (value) {
89 raw_string_ostream rso(s);
90 value->print(rso);
91 rso.flush();
92 if (truncate)
93 s.resize(s.length() - 1);
94 }
95 return s;
96 }
97
PrintType(const llvm::Type * type,bool truncate=false)98 static std::string PrintType(const llvm::Type *type, bool truncate = false) {
99 std::string s;
100 raw_string_ostream rso(s);
101 type->print(rso);
102 rso.flush();
103 if (truncate)
104 s.resize(s.length() - 1);
105 return s;
106 }
107
~IRForTarget()108 IRForTarget::~IRForTarget() {}
109
FixFunctionLinkage(llvm::Function & llvm_function)110 bool IRForTarget::FixFunctionLinkage(llvm::Function &llvm_function) {
111 llvm_function.setLinkage(GlobalValue::ExternalLinkage);
112
113 return true;
114 }
115
DeclForGlobal(const GlobalValue * global_val,Module * module)116 clang::NamedDecl *IRForTarget::DeclForGlobal(const GlobalValue *global_val,
117 Module *module) {
118 NamedMDNode *named_metadata =
119 module->getNamedMetadata("clang.global.decl.ptrs");
120
121 if (!named_metadata)
122 return nullptr;
123
124 unsigned num_nodes = named_metadata->getNumOperands();
125 unsigned node_index;
126
127 for (node_index = 0; node_index < num_nodes; ++node_index) {
128 llvm::MDNode *metadata_node =
129 dyn_cast<llvm::MDNode>(named_metadata->getOperand(node_index));
130 if (!metadata_node)
131 return nullptr;
132
133 if (metadata_node->getNumOperands() != 2)
134 continue;
135
136 if (mdconst::dyn_extract_or_null<GlobalValue>(
137 metadata_node->getOperand(0)) != global_val)
138 continue;
139
140 ConstantInt *constant_int =
141 mdconst::dyn_extract<ConstantInt>(metadata_node->getOperand(1));
142
143 if (!constant_int)
144 return nullptr;
145
146 uintptr_t ptr = constant_int->getZExtValue();
147
148 return reinterpret_cast<clang::NamedDecl *>(ptr);
149 }
150
151 return nullptr;
152 }
153
DeclForGlobal(GlobalValue * global_val)154 clang::NamedDecl *IRForTarget::DeclForGlobal(GlobalValue *global_val) {
155 return DeclForGlobal(global_val, m_module);
156 }
157
158 /// Returns true iff the mangled symbol is for a static guard variable.
isGuardVariableSymbol(llvm::StringRef mangled_symbol,bool check_ms_abi=true)159 static bool isGuardVariableSymbol(llvm::StringRef mangled_symbol,
160 bool check_ms_abi = true) {
161 bool result = mangled_symbol.startswith("_ZGV"); // Itanium ABI guard variable
162 if (check_ms_abi)
163 result |= mangled_symbol.endswith("@4IA"); // Microsoft ABI
164 return result;
165 }
166
CreateResultVariable(llvm::Function & llvm_function)167 bool IRForTarget::CreateResultVariable(llvm::Function &llvm_function) {
168 lldb_private::Log *log(
169 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
170
171 if (!m_resolve_vars)
172 return true;
173
174 // Find the result variable. If it doesn't exist, we can give up right here.
175
176 ValueSymbolTable &value_symbol_table = m_module->getValueSymbolTable();
177
178 llvm::StringRef result_name;
179 bool found_result = false;
180
181 for (StringMapEntry<llvm::Value *> &value_symbol : value_symbol_table) {
182 result_name = value_symbol.first();
183
184 // Check if this is a guard variable. It seems this causes some hiccups
185 // on Windows, so let's only check for Itanium guard variables.
186 bool is_guard_var = isGuardVariableSymbol(result_name, /*MS ABI*/ false);
187
188 if (result_name.contains("$__lldb_expr_result_ptr") && !is_guard_var) {
189 found_result = true;
190 m_result_is_pointer = true;
191 break;
192 }
193
194 if (result_name.contains("$__lldb_expr_result") && !is_guard_var) {
195 found_result = true;
196 m_result_is_pointer = false;
197 break;
198 }
199 }
200
201 if (!found_result) {
202 LLDB_LOG(log, "Couldn't find result variable");
203
204 return true;
205 }
206
207 LLDB_LOG(log, "Result name: \"{0}\"", result_name);
208
209 Value *result_value = m_module->getNamedValue(result_name);
210
211 if (!result_value) {
212 LLDB_LOG(log, "Result variable had no data");
213
214 m_error_stream.Format("Internal error [IRForTarget]: Result variable's "
215 "name ({0}) exists, but not its definition\n",
216 result_name);
217
218 return false;
219 }
220
221 LLDB_LOG(log, "Found result in the IR: \"{0}\"",
222 PrintValue(result_value, false));
223
224 GlobalVariable *result_global = dyn_cast<GlobalVariable>(result_value);
225
226 if (!result_global) {
227 LLDB_LOG(log, "Result variable isn't a GlobalVariable");
228
229 m_error_stream.Format("Internal error [IRForTarget]: Result variable ({0}) "
230 "is defined, but is not a global variable\n",
231 result_name);
232
233 return false;
234 }
235
236 clang::NamedDecl *result_decl = DeclForGlobal(result_global);
237 if (!result_decl) {
238 LLDB_LOG(log, "Result variable doesn't have a corresponding Decl");
239
240 m_error_stream.Format("Internal error [IRForTarget]: Result variable ({0}) "
241 "does not have a corresponding Clang entity\n",
242 result_name);
243
244 return false;
245 }
246
247 if (log) {
248 std::string decl_desc_str;
249 raw_string_ostream decl_desc_stream(decl_desc_str);
250 result_decl->print(decl_desc_stream);
251 decl_desc_stream.flush();
252
253 LLDB_LOG(log, "Found result decl: \"{0}\"", decl_desc_str);
254 }
255
256 clang::VarDecl *result_var = dyn_cast<clang::VarDecl>(result_decl);
257 if (!result_var) {
258 LLDB_LOG(log, "Result variable Decl isn't a VarDecl");
259
260 m_error_stream.Format("Internal error [IRForTarget]: Result variable "
261 "({0})'s corresponding Clang entity isn't a "
262 "variable\n",
263 result_name);
264
265 return false;
266 }
267
268 // Get the next available result name from m_decl_map and create the
269 // persistent variable for it
270
271 // If the result is an Lvalue, it is emitted as a pointer; see
272 // ASTResultSynthesizer::SynthesizeBodyResult.
273 if (m_result_is_pointer) {
274 clang::QualType pointer_qual_type = result_var->getType();
275 const clang::Type *pointer_type = pointer_qual_type.getTypePtr();
276
277 const clang::PointerType *pointer_pointertype =
278 pointer_type->getAs<clang::PointerType>();
279 const clang::ObjCObjectPointerType *pointer_objcobjpointertype =
280 pointer_type->getAs<clang::ObjCObjectPointerType>();
281
282 if (pointer_pointertype) {
283 clang::QualType element_qual_type = pointer_pointertype->getPointeeType();
284
285 m_result_type = lldb_private::TypeFromParser(
286 m_decl_map->GetTypeSystem()->GetType(element_qual_type));
287 } else if (pointer_objcobjpointertype) {
288 clang::QualType element_qual_type =
289 clang::QualType(pointer_objcobjpointertype->getObjectType(), 0);
290
291 m_result_type = lldb_private::TypeFromParser(
292 m_decl_map->GetTypeSystem()->GetType(element_qual_type));
293 } else {
294 LLDB_LOG(log, "Expected result to have pointer type, but it did not");
295
296 m_error_stream.Format("Internal error [IRForTarget]: Lvalue result ({0}) "
297 "is not a pointer variable\n",
298 result_name);
299
300 return false;
301 }
302 } else {
303 m_result_type = lldb_private::TypeFromParser(
304 m_decl_map->GetTypeSystem()->GetType(result_var->getType()));
305 }
306
307 lldb::TargetSP target_sp(m_execution_unit.GetTarget());
308 llvm::Optional<uint64_t> bit_size = m_result_type.GetBitSize(target_sp.get());
309 if (!bit_size) {
310 lldb_private::StreamString type_desc_stream;
311 m_result_type.DumpTypeDescription(&type_desc_stream);
312
313 LLDB_LOG(log, "Result type has unknown size");
314
315 m_error_stream.Printf("Error [IRForTarget]: Size of result type '%s' "
316 "couldn't be determined\n",
317 type_desc_stream.GetData());
318 return false;
319 }
320
321 if (log) {
322 lldb_private::StreamString type_desc_stream;
323 m_result_type.DumpTypeDescription(&type_desc_stream);
324
325 LLDB_LOG(log, "Result decl type: \"{0}\"", type_desc_stream.GetData());
326 }
327
328 m_result_name = lldb_private::ConstString("$RESULT_NAME");
329
330 LLDB_LOG(log, "Creating a new result global: \"{0}\" with size {1}",
331 m_result_name,
332 m_result_type.GetByteSize(target_sp.get()).getValueOr(0));
333
334 // Construct a new result global and set up its metadata
335
336 GlobalVariable *new_result_global = new GlobalVariable(
337 (*m_module), result_global->getType()->getElementType(),
338 false, /* not constant */
339 GlobalValue::ExternalLinkage, nullptr, /* no initializer */
340 m_result_name.GetCString());
341
342 // It's too late in compilation to create a new VarDecl for this, but we
343 // don't need to. We point the metadata at the old VarDecl. This creates an
344 // odd anomaly: a variable with a Value whose name is something like $0 and a
345 // Decl whose name is $__lldb_expr_result. This condition is handled in
346 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
347 // fixed up.
348
349 ConstantInt *new_constant_int =
350 ConstantInt::get(llvm::Type::getInt64Ty(m_module->getContext()),
351 reinterpret_cast<uintptr_t>(result_decl), false);
352
353 llvm::Metadata *values[2];
354 values[0] = ConstantAsMetadata::get(new_result_global);
355 values[1] = ConstantAsMetadata::get(new_constant_int);
356
357 ArrayRef<Metadata *> value_ref(values, 2);
358
359 MDNode *persistent_global_md = MDNode::get(m_module->getContext(), value_ref);
360 NamedMDNode *named_metadata =
361 m_module->getNamedMetadata("clang.global.decl.ptrs");
362 named_metadata->addOperand(persistent_global_md);
363
364 LLDB_LOG(log, "Replacing \"{0}\" with \"{1}\"", PrintValue(result_global),
365 PrintValue(new_result_global));
366
367 if (result_global->use_empty()) {
368 // We need to synthesize a store for this variable, because otherwise
369 // there's nothing to put into its equivalent persistent variable.
370
371 BasicBlock &entry_block(llvm_function.getEntryBlock());
372 Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg());
373
374 if (!first_entry_instruction)
375 return false;
376
377 if (!result_global->hasInitializer()) {
378 LLDB_LOG(log, "Couldn't find initializer for unused variable");
379
380 m_error_stream.Format("Internal error [IRForTarget]: Result variable "
381 "({0}) has no writes and no initializer\n",
382 result_name);
383
384 return false;
385 }
386
387 Constant *initializer = result_global->getInitializer();
388
389 StoreInst *synthesized_store =
390 new StoreInst(initializer, new_result_global, first_entry_instruction);
391
392 LLDB_LOG(log, "Synthesized result store \"{0}\"\n",
393 PrintValue(synthesized_store));
394 } else {
395 result_global->replaceAllUsesWith(new_result_global);
396 }
397
398 if (!m_decl_map->AddPersistentVariable(
399 result_decl, m_result_name, m_result_type, true, m_result_is_pointer))
400 return false;
401
402 result_global->eraseFromParent();
403
404 return true;
405 }
406
RewriteObjCConstString(llvm::GlobalVariable * ns_str,llvm::GlobalVariable * cstr)407 bool IRForTarget::RewriteObjCConstString(llvm::GlobalVariable *ns_str,
408 llvm::GlobalVariable *cstr) {
409 lldb_private::Log *log(
410 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
411
412 Type *ns_str_ty = ns_str->getType();
413
414 Type *i8_ptr_ty = Type::getInt8PtrTy(m_module->getContext());
415 Type *i32_ty = Type::getInt32Ty(m_module->getContext());
416 Type *i8_ty = Type::getInt8Ty(m_module->getContext());
417
418 if (!m_CFStringCreateWithBytes) {
419 lldb::addr_t CFStringCreateWithBytes_addr;
420
421 static lldb_private::ConstString g_CFStringCreateWithBytes_str(
422 "CFStringCreateWithBytes");
423
424 bool missing_weak = false;
425 CFStringCreateWithBytes_addr =
426 m_execution_unit.FindSymbol(g_CFStringCreateWithBytes_str,
427 missing_weak);
428 if (CFStringCreateWithBytes_addr == LLDB_INVALID_ADDRESS || missing_weak) {
429 LLDB_LOG(log, "Couldn't find CFStringCreateWithBytes in the target");
430
431 m_error_stream.Printf("Error [IRForTarget]: Rewriting an Objective-C "
432 "constant string requires "
433 "CFStringCreateWithBytes\n");
434
435 return false;
436 }
437
438 LLDB_LOG(log, "Found CFStringCreateWithBytes at {0}",
439 CFStringCreateWithBytes_addr);
440
441 // Build the function type:
442 //
443 // CFStringRef CFStringCreateWithBytes (
444 // CFAllocatorRef alloc,
445 // const UInt8 *bytes,
446 // CFIndex numBytes,
447 // CFStringEncoding encoding,
448 // Boolean isExternalRepresentation
449 // );
450 //
451 // We make the following substitutions:
452 //
453 // CFStringRef -> i8*
454 // CFAllocatorRef -> i8*
455 // UInt8 * -> i8*
456 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its
457 // pointer size for now) CFStringEncoding -> i32 Boolean -> i8
458
459 Type *arg_type_array[5];
460
461 arg_type_array[0] = i8_ptr_ty;
462 arg_type_array[1] = i8_ptr_ty;
463 arg_type_array[2] = m_intptr_ty;
464 arg_type_array[3] = i32_ty;
465 arg_type_array[4] = i8_ty;
466
467 ArrayRef<Type *> CFSCWB_arg_types(arg_type_array, 5);
468
469 llvm::FunctionType *CFSCWB_ty =
470 FunctionType::get(ns_str_ty, CFSCWB_arg_types, false);
471
472 // Build the constant containing the pointer to the function
473 PointerType *CFSCWB_ptr_ty = PointerType::getUnqual(CFSCWB_ty);
474 Constant *CFSCWB_addr_int =
475 ConstantInt::get(m_intptr_ty, CFStringCreateWithBytes_addr, false);
476 m_CFStringCreateWithBytes = {
477 CFSCWB_ty, ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty)};
478 }
479
480 ConstantDataSequential *string_array = nullptr;
481
482 if (cstr)
483 string_array = dyn_cast<ConstantDataSequential>(cstr->getInitializer());
484
485 Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty);
486 Constant *bytes_arg = cstr ? ConstantExpr::getBitCast(cstr, i8_ptr_ty)
487 : Constant::getNullValue(i8_ptr_ty);
488 Constant *numBytes_arg = ConstantInt::get(
489 m_intptr_ty, cstr ? (string_array->getNumElements() - 1) * string_array->getElementByteSize() : 0, false);
490 int encoding_flags = 0;
491 switch (cstr ? string_array->getElementByteSize() : 1) {
492 case 1:
493 encoding_flags = 0x08000100; /* 0x08000100 is kCFStringEncodingUTF8 */
494 break;
495 case 2:
496 encoding_flags = 0x0100; /* 0x0100 is kCFStringEncodingUTF16 */
497 break;
498 case 4:
499 encoding_flags = 0x0c000100; /* 0x0c000100 is kCFStringEncodingUTF32 */
500 break;
501 default:
502 encoding_flags = 0x0600; /* fall back to 0x0600, kCFStringEncodingASCII */
503 LLDB_LOG(log, "Encountered an Objective-C constant string with unusual "
504 "element size {0}",
505 string_array->getElementByteSize());
506 }
507 Constant *encoding_arg = ConstantInt::get(i32_ty, encoding_flags, false);
508 Constant *isExternal_arg =
509 ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */
510
511 Value *argument_array[5];
512
513 argument_array[0] = alloc_arg;
514 argument_array[1] = bytes_arg;
515 argument_array[2] = numBytes_arg;
516 argument_array[3] = encoding_arg;
517 argument_array[4] = isExternal_arg;
518
519 ArrayRef<Value *> CFSCWB_arguments(argument_array, 5);
520
521 FunctionValueCache CFSCWB_Caller(
522 [this, &CFSCWB_arguments](llvm::Function *function) -> llvm::Value * {
523 return CallInst::Create(
524 m_CFStringCreateWithBytes, CFSCWB_arguments,
525 "CFStringCreateWithBytes",
526 llvm::cast<Instruction>(
527 m_entry_instruction_finder.GetValue(function)));
528 });
529
530 if (!UnfoldConstant(ns_str, nullptr, CFSCWB_Caller, m_entry_instruction_finder,
531 m_error_stream)) {
532 LLDB_LOG(log, "Couldn't replace the NSString with the result of the call");
533
534 m_error_stream.Printf("error [IRForTarget internal]: Couldn't replace an "
535 "Objective-C constant string with a dynamic "
536 "string\n");
537
538 return false;
539 }
540
541 ns_str->eraseFromParent();
542
543 return true;
544 }
545
RewriteObjCConstStrings()546 bool IRForTarget::RewriteObjCConstStrings() {
547 lldb_private::Log *log(
548 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
549
550 ValueSymbolTable &value_symbol_table = m_module->getValueSymbolTable();
551
552 for (StringMapEntry<llvm::Value *> &value_symbol : value_symbol_table) {
553 llvm::StringRef value_name = value_symbol.first();
554
555 if (value_name.contains("_unnamed_cfstring_")) {
556 Value *nsstring_value = value_symbol.second;
557
558 GlobalVariable *nsstring_global =
559 dyn_cast<GlobalVariable>(nsstring_value);
560
561 if (!nsstring_global) {
562 LLDB_LOG(log, "NSString variable is not a GlobalVariable");
563
564 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
565 "constant string is not a global variable\n");
566
567 return false;
568 }
569
570 if (!nsstring_global->hasInitializer()) {
571 LLDB_LOG(log, "NSString variable does not have an initializer");
572
573 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
574 "constant string does not have an initializer\n");
575
576 return false;
577 }
578
579 ConstantStruct *nsstring_struct =
580 dyn_cast<ConstantStruct>(nsstring_global->getInitializer());
581
582 if (!nsstring_struct) {
583 LLDB_LOG(log,
584 "NSString variable's initializer is not a ConstantStruct");
585
586 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
587 "constant string is not a structure constant\n");
588
589 return false;
590 }
591
592 // We expect the following structure:
593 //
594 // struct {
595 // int *isa;
596 // int flags;
597 // char *str;
598 // long length;
599 // };
600
601 if (nsstring_struct->getNumOperands() != 4) {
602
603 LLDB_LOG(log,
604 "NSString variable's initializer structure has an "
605 "unexpected number of members. Should be 4, is {0}",
606 nsstring_struct->getNumOperands());
607
608 m_error_stream.Printf("Internal error [IRForTarget]: The struct for an "
609 "Objective-C constant string is not as "
610 "expected\n");
611
612 return false;
613 }
614
615 Constant *nsstring_member = nsstring_struct->getOperand(2);
616
617 if (!nsstring_member) {
618 LLDB_LOG(log, "NSString initializer's str element was empty");
619
620 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
621 "constant string does not have a string "
622 "initializer\n");
623
624 return false;
625 }
626
627 ConstantExpr *nsstring_expr = dyn_cast<ConstantExpr>(nsstring_member);
628
629 if (!nsstring_expr) {
630 LLDB_LOG(log,
631 "NSString initializer's str element is not a ConstantExpr");
632
633 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
634 "constant string's string initializer is not "
635 "constant\n");
636
637 return false;
638 }
639
640 GlobalVariable *cstr_global = nullptr;
641
642 if (nsstring_expr->getOpcode() == Instruction::GetElementPtr) {
643 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
644 cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
645 } else if (nsstring_expr->getOpcode() == Instruction::BitCast) {
646 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
647 cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
648 }
649
650 if (!cstr_global) {
651 LLDB_LOG(log,
652 "NSString initializer's str element is not a GlobalVariable");
653
654 m_error_stream.Printf("Internal error [IRForTarget]: Unhandled"
655 "constant string initializer\n");
656
657 return false;
658 }
659
660 if (!cstr_global->hasInitializer()) {
661 LLDB_LOG(log, "NSString initializer's str element does not have an "
662 "initializer");
663
664 m_error_stream.Printf("Internal error [IRForTarget]: An Objective-C "
665 "constant string's string initializer doesn't "
666 "point to initialized data\n");
667
668 return false;
669 }
670
671 /*
672 if (!cstr_array)
673 {
674 if (log)
675 log->PutCString("NSString initializer's str element is not a
676 ConstantArray");
677
678 if (m_error_stream)
679 m_error_stream.Printf("Internal error [IRForTarget]: An
680 Objective-C constant string's string initializer doesn't point to an
681 array\n");
682
683 return false;
684 }
685
686 if (!cstr_array->isCString())
687 {
688 if (log)
689 log->PutCString("NSString initializer's str element is not a C
690 string array");
691
692 if (m_error_stream)
693 m_error_stream.Printf("Internal error [IRForTarget]: An
694 Objective-C constant string's string initializer doesn't point to a C
695 string\n");
696
697 return false;
698 }
699 */
700
701 ConstantDataArray *cstr_array =
702 dyn_cast<ConstantDataArray>(cstr_global->getInitializer());
703
704 if (cstr_array)
705 LLDB_LOG(log, "Found NSString constant {0}, which contains \"{1}\"",
706 value_name, cstr_array->getAsString());
707 else
708 LLDB_LOG(log, "Found NSString constant {0}, which contains \"\"",
709 value_name);
710
711 if (!cstr_array)
712 cstr_global = nullptr;
713
714 if (!RewriteObjCConstString(nsstring_global, cstr_global)) {
715 LLDB_LOG(log, "Error rewriting the constant string");
716
717 // We don't print an error message here because RewriteObjCConstString
718 // has done so for us.
719
720 return false;
721 }
722 }
723 }
724
725 for (StringMapEntry<llvm::Value *> &value_symbol : value_symbol_table) {
726 llvm::StringRef value_name = value_symbol.first();
727
728 if (value_name == "__CFConstantStringClassReference") {
729 GlobalVariable *gv = dyn_cast<GlobalVariable>(value_symbol.second);
730
731 if (!gv) {
732 LLDB_LOG(log,
733 "__CFConstantStringClassReference is not a global variable");
734
735 m_error_stream.Printf("Internal error [IRForTarget]: Found a "
736 "CFConstantStringClassReference, but it is not a "
737 "global object\n");
738
739 return false;
740 }
741
742 gv->eraseFromParent();
743
744 break;
745 }
746 }
747
748 return true;
749 }
750
IsObjCSelectorRef(Value * value)751 static bool IsObjCSelectorRef(Value *value) {
752 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
753
754 return !(!global_variable || !global_variable->hasName() ||
755 !global_variable->getName().startswith("OBJC_SELECTOR_REFERENCES_"));
756 }
757
758 // This function does not report errors; its callers are responsible.
RewriteObjCSelector(Instruction * selector_load)759 bool IRForTarget::RewriteObjCSelector(Instruction *selector_load) {
760 lldb_private::Log *log(
761 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
762
763 LoadInst *load = dyn_cast<LoadInst>(selector_load);
764
765 if (!load)
766 return false;
767
768 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend
769 // gets represented as
770 //
771 // %tmp = load i8** @"OBJC_SELECTOR_REFERENCES_" ; <i8*> %call = call
772 // i8* (i8*, i8*, ...)* @objc_msgSend(i8* %obj, i8* %tmp, ...) ; <i8*>
773 //
774 // where %obj is the object pointer and %tmp is the selector.
775 //
776 // @"OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called
777 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_".
778 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_" contains the string.
779
780 // Find the pointer's initializer (a ConstantExpr with opcode GetElementPtr)
781 // and get the string from its target
782
783 GlobalVariable *_objc_selector_references_ =
784 dyn_cast<GlobalVariable>(load->getPointerOperand());
785
786 if (!_objc_selector_references_ ||
787 !_objc_selector_references_->hasInitializer())
788 return false;
789
790 Constant *osr_initializer = _objc_selector_references_->getInitializer();
791
792 ConstantExpr *osr_initializer_expr = dyn_cast<ConstantExpr>(osr_initializer);
793
794 if (!osr_initializer_expr ||
795 osr_initializer_expr->getOpcode() != Instruction::GetElementPtr)
796 return false;
797
798 Value *osr_initializer_base = osr_initializer_expr->getOperand(0);
799
800 if (!osr_initializer_base)
801 return false;
802
803 // Find the string's initializer (a ConstantArray) and get the string from it
804
805 GlobalVariable *_objc_meth_var_name_ =
806 dyn_cast<GlobalVariable>(osr_initializer_base);
807
808 if (!_objc_meth_var_name_ || !_objc_meth_var_name_->hasInitializer())
809 return false;
810
811 Constant *omvn_initializer = _objc_meth_var_name_->getInitializer();
812
813 ConstantDataArray *omvn_initializer_array =
814 dyn_cast<ConstantDataArray>(omvn_initializer);
815
816 if (!omvn_initializer_array->isString())
817 return false;
818
819 std::string omvn_initializer_string =
820 std::string(omvn_initializer_array->getAsString());
821
822 LLDB_LOG(log, "Found Objective-C selector reference \"{0}\"",
823 omvn_initializer_string);
824
825 // Construct a call to sel_registerName
826
827 if (!m_sel_registerName) {
828 lldb::addr_t sel_registerName_addr;
829
830 bool missing_weak = false;
831 static lldb_private::ConstString g_sel_registerName_str("sel_registerName");
832 sel_registerName_addr = m_execution_unit.FindSymbol(g_sel_registerName_str,
833 missing_weak);
834 if (sel_registerName_addr == LLDB_INVALID_ADDRESS || missing_weak)
835 return false;
836
837 LLDB_LOG(log, "Found sel_registerName at {0}", sel_registerName_addr);
838
839 // Build the function type: struct objc_selector
840 // *sel_registerName(uint8_t*)
841
842 // The below code would be "more correct," but in actuality what's required
843 // is uint8_t*
844 // Type *sel_type = StructType::get(m_module->getContext());
845 // Type *sel_ptr_type = PointerType::getUnqual(sel_type);
846 Type *sel_ptr_type = Type::getInt8PtrTy(m_module->getContext());
847
848 Type *type_array[1];
849
850 type_array[0] = llvm::Type::getInt8PtrTy(m_module->getContext());
851
852 ArrayRef<Type *> srN_arg_types(type_array, 1);
853
854 llvm::FunctionType *srN_type =
855 FunctionType::get(sel_ptr_type, srN_arg_types, false);
856
857 // Build the constant containing the pointer to the function
858 PointerType *srN_ptr_ty = PointerType::getUnqual(srN_type);
859 Constant *srN_addr_int =
860 ConstantInt::get(m_intptr_ty, sel_registerName_addr, false);
861 m_sel_registerName = {srN_type,
862 ConstantExpr::getIntToPtr(srN_addr_int, srN_ptr_ty)};
863 }
864
865 Value *argument_array[1];
866
867 Constant *omvn_pointer = ConstantExpr::getBitCast(
868 _objc_meth_var_name_, Type::getInt8PtrTy(m_module->getContext()));
869
870 argument_array[0] = omvn_pointer;
871
872 ArrayRef<Value *> srN_arguments(argument_array, 1);
873
874 CallInst *srN_call = CallInst::Create(m_sel_registerName, srN_arguments,
875 "sel_registerName", selector_load);
876
877 // Replace the load with the call in all users
878
879 selector_load->replaceAllUsesWith(srN_call);
880
881 selector_load->eraseFromParent();
882
883 return true;
884 }
885
RewriteObjCSelectors(BasicBlock & basic_block)886 bool IRForTarget::RewriteObjCSelectors(BasicBlock &basic_block) {
887 lldb_private::Log *log(
888 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
889
890 InstrList selector_loads;
891
892 for (Instruction &inst : basic_block) {
893 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
894 if (IsObjCSelectorRef(load->getPointerOperand()))
895 selector_loads.push_back(&inst);
896 }
897
898 for (Instruction *inst : selector_loads) {
899 if (!RewriteObjCSelector(inst)) {
900 m_error_stream.Printf("Internal error [IRForTarget]: Couldn't change a "
901 "static reference to an Objective-C selector to a "
902 "dynamic reference\n");
903
904 LLDB_LOG(log, "Couldn't rewrite a reference to an Objective-C selector");
905
906 return false;
907 }
908 }
909
910 return true;
911 }
912
IsObjCClassReference(Value * value)913 static bool IsObjCClassReference(Value *value) {
914 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
915
916 return !(!global_variable || !global_variable->hasName() ||
917 !global_variable->getName().startswith("OBJC_CLASS_REFERENCES_"));
918 }
919
920 // This function does not report errors; its callers are responsible.
RewriteObjCClassReference(Instruction * class_load)921 bool IRForTarget::RewriteObjCClassReference(Instruction *class_load) {
922 lldb_private::Log *log(
923 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
924
925 LoadInst *load = dyn_cast<LoadInst>(class_load);
926
927 if (!load)
928 return false;
929
930 // Unpack the class name from the reference. In LLVM IR, a reference to an
931 // Objective-C class gets represented as
932 //
933 // %tmp = load %struct._objc_class*,
934 // %struct._objc_class** @OBJC_CLASS_REFERENCES_, align 4
935 //
936 // @"OBJC_CLASS_REFERENCES_ is a bitcast of a character array called
937 // @OBJC_CLASS_NAME_. @OBJC_CLASS_NAME contains the string.
938
939 // Find the pointer's initializer (a ConstantExpr with opcode BitCast) and
940 // get the string from its target
941
942 GlobalVariable *_objc_class_references_ =
943 dyn_cast<GlobalVariable>(load->getPointerOperand());
944
945 if (!_objc_class_references_ ||
946 !_objc_class_references_->hasInitializer())
947 return false;
948
949 Constant *ocr_initializer = _objc_class_references_->getInitializer();
950
951 ConstantExpr *ocr_initializer_expr = dyn_cast<ConstantExpr>(ocr_initializer);
952
953 if (!ocr_initializer_expr ||
954 ocr_initializer_expr->getOpcode() != Instruction::BitCast)
955 return false;
956
957 Value *ocr_initializer_base = ocr_initializer_expr->getOperand(0);
958
959 if (!ocr_initializer_base)
960 return false;
961
962 // Find the string's initializer (a ConstantArray) and get the string from it
963
964 GlobalVariable *_objc_class_name_ =
965 dyn_cast<GlobalVariable>(ocr_initializer_base);
966
967 if (!_objc_class_name_ || !_objc_class_name_->hasInitializer())
968 return false;
969
970 Constant *ocn_initializer = _objc_class_name_->getInitializer();
971
972 ConstantDataArray *ocn_initializer_array =
973 dyn_cast<ConstantDataArray>(ocn_initializer);
974
975 if (!ocn_initializer_array->isString())
976 return false;
977
978 std::string ocn_initializer_string =
979 std::string(ocn_initializer_array->getAsString());
980
981 LLDB_LOG(log, "Found Objective-C class reference \"{0}\"",
982 ocn_initializer_string);
983
984 // Construct a call to objc_getClass
985
986 if (!m_objc_getClass) {
987 lldb::addr_t objc_getClass_addr;
988
989 bool missing_weak = false;
990 static lldb_private::ConstString g_objc_getClass_str("objc_getClass");
991 objc_getClass_addr = m_execution_unit.FindSymbol(g_objc_getClass_str,
992 missing_weak);
993 if (objc_getClass_addr == LLDB_INVALID_ADDRESS || missing_weak)
994 return false;
995
996 LLDB_LOG(log, "Found objc_getClass at {0}", objc_getClass_addr);
997
998 // Build the function type: %struct._objc_class *objc_getClass(i8*)
999
1000 Type *class_type = load->getType();
1001 Type *type_array[1];
1002 type_array[0] = llvm::Type::getInt8PtrTy(m_module->getContext());
1003
1004 ArrayRef<Type *> ogC_arg_types(type_array, 1);
1005
1006 llvm::FunctionType *ogC_type =
1007 FunctionType::get(class_type, ogC_arg_types, false);
1008
1009 // Build the constant containing the pointer to the function
1010 PointerType *ogC_ptr_ty = PointerType::getUnqual(ogC_type);
1011 Constant *ogC_addr_int =
1012 ConstantInt::get(m_intptr_ty, objc_getClass_addr, false);
1013 m_objc_getClass = {ogC_type,
1014 ConstantExpr::getIntToPtr(ogC_addr_int, ogC_ptr_ty)};
1015 }
1016
1017 Value *argument_array[1];
1018
1019 Constant *ocn_pointer = ConstantExpr::getBitCast(
1020 _objc_class_name_, Type::getInt8PtrTy(m_module->getContext()));
1021
1022 argument_array[0] = ocn_pointer;
1023
1024 ArrayRef<Value *> ogC_arguments(argument_array, 1);
1025
1026 CallInst *ogC_call = CallInst::Create(m_objc_getClass, ogC_arguments,
1027 "objc_getClass", class_load);
1028
1029 // Replace the load with the call in all users
1030
1031 class_load->replaceAllUsesWith(ogC_call);
1032
1033 class_load->eraseFromParent();
1034
1035 return true;
1036 }
1037
RewriteObjCClassReferences(BasicBlock & basic_block)1038 bool IRForTarget::RewriteObjCClassReferences(BasicBlock &basic_block) {
1039 lldb_private::Log *log(
1040 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1041
1042 InstrList class_loads;
1043
1044 for (Instruction &inst : basic_block) {
1045 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1046 if (IsObjCClassReference(load->getPointerOperand()))
1047 class_loads.push_back(&inst);
1048 }
1049
1050 for (Instruction *inst : class_loads) {
1051 if (!RewriteObjCClassReference(inst)) {
1052 m_error_stream.Printf("Internal error [IRForTarget]: Couldn't change a "
1053 "static reference to an Objective-C class to a "
1054 "dynamic reference\n");
1055
1056 LLDB_LOG(log, "Couldn't rewrite a reference to an Objective-C class");
1057
1058 return false;
1059 }
1060 }
1061
1062 return true;
1063 }
1064
1065 // This function does not report errors; its callers are responsible.
RewritePersistentAlloc(llvm::Instruction * persistent_alloc)1066 bool IRForTarget::RewritePersistentAlloc(llvm::Instruction *persistent_alloc) {
1067 lldb_private::Log *log(
1068 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1069
1070 AllocaInst *alloc = dyn_cast<AllocaInst>(persistent_alloc);
1071
1072 MDNode *alloc_md = alloc->getMetadata("clang.decl.ptr");
1073
1074 if (!alloc_md || !alloc_md->getNumOperands())
1075 return false;
1076
1077 ConstantInt *constant_int =
1078 mdconst::dyn_extract<ConstantInt>(alloc_md->getOperand(0));
1079
1080 if (!constant_int)
1081 return false;
1082
1083 // We attempt to register this as a new persistent variable with the DeclMap.
1084
1085 uintptr_t ptr = constant_int->getZExtValue();
1086
1087 clang::VarDecl *decl = reinterpret_cast<clang::VarDecl *>(ptr);
1088
1089 lldb_private::TypeFromParser result_decl_type(
1090 m_decl_map->GetTypeSystem()->GetType(decl->getType()));
1091
1092 StringRef decl_name(decl->getName());
1093 lldb_private::ConstString persistent_variable_name(decl_name.data(),
1094 decl_name.size());
1095 if (!m_decl_map->AddPersistentVariable(decl, persistent_variable_name,
1096 result_decl_type, false, false))
1097 return false;
1098
1099 GlobalVariable *persistent_global = new GlobalVariable(
1100 (*m_module), alloc->getType(), false, /* not constant */
1101 GlobalValue::ExternalLinkage, nullptr, /* no initializer */
1102 alloc->getName().str());
1103
1104 // What we're going to do here is make believe this was a regular old
1105 // external variable. That means we need to make the metadata valid.
1106
1107 NamedMDNode *named_metadata =
1108 m_module->getOrInsertNamedMetadata("clang.global.decl.ptrs");
1109
1110 llvm::Metadata *values[2];
1111 values[0] = ConstantAsMetadata::get(persistent_global);
1112 values[1] = ConstantAsMetadata::get(constant_int);
1113
1114 ArrayRef<llvm::Metadata *> value_ref(values, 2);
1115
1116 MDNode *persistent_global_md = MDNode::get(m_module->getContext(), value_ref);
1117 named_metadata->addOperand(persistent_global_md);
1118
1119 // Now, since the variable is a pointer variable, we will drop in a load of
1120 // that pointer variable.
1121
1122 LoadInst *persistent_load =
1123 new LoadInst(persistent_global->getType()->getPointerElementType(),
1124 persistent_global, "", alloc);
1125
1126 LLDB_LOG(log, "Replacing \"{0}\" with \"{1}\"", PrintValue(alloc),
1127 PrintValue(persistent_load));
1128
1129 alloc->replaceAllUsesWith(persistent_load);
1130 alloc->eraseFromParent();
1131
1132 return true;
1133 }
1134
RewritePersistentAllocs(llvm::BasicBlock & basic_block)1135 bool IRForTarget::RewritePersistentAllocs(llvm::BasicBlock &basic_block) {
1136 if (!m_resolve_vars)
1137 return true;
1138
1139 lldb_private::Log *log(
1140 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1141
1142 InstrList pvar_allocs;
1143
1144 for (Instruction &inst : basic_block) {
1145
1146 if (AllocaInst *alloc = dyn_cast<AllocaInst>(&inst)) {
1147 llvm::StringRef alloc_name = alloc->getName();
1148
1149 if (alloc_name.startswith("$") && !alloc_name.startswith("$__lldb")) {
1150 if (alloc_name.find_first_of("0123456789") == 1) {
1151 LLDB_LOG(log, "Rejecting a numeric persistent variable.");
1152
1153 m_error_stream.Printf("Error [IRForTarget]: Names starting with $0, "
1154 "$1, ... are reserved for use as result "
1155 "names\n");
1156
1157 return false;
1158 }
1159
1160 pvar_allocs.push_back(alloc);
1161 }
1162 }
1163 }
1164
1165 for (Instruction *inst : pvar_allocs) {
1166 if (!RewritePersistentAlloc(inst)) {
1167 m_error_stream.Printf("Internal error [IRForTarget]: Couldn't rewrite "
1168 "the creation of a persistent variable\n");
1169
1170 LLDB_LOG(log, "Couldn't rewrite the creation of a persistent variable");
1171
1172 return false;
1173 }
1174 }
1175
1176 return true;
1177 }
1178
1179 // This function does not report errors; its callers are responsible.
MaybeHandleVariable(Value * llvm_value_ptr)1180 bool IRForTarget::MaybeHandleVariable(Value *llvm_value_ptr) {
1181 lldb_private::Log *log(
1182 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1183
1184 LLDB_LOG(log, "MaybeHandleVariable ({0})", PrintValue(llvm_value_ptr));
1185
1186 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr)) {
1187 switch (constant_expr->getOpcode()) {
1188 default:
1189 break;
1190 case Instruction::GetElementPtr:
1191 case Instruction::BitCast:
1192 Value *s = constant_expr->getOperand(0);
1193 if (!MaybeHandleVariable(s))
1194 return false;
1195 }
1196 } else if (GlobalVariable *global_variable =
1197 dyn_cast<GlobalVariable>(llvm_value_ptr)) {
1198 if (!GlobalValue::isExternalLinkage(global_variable->getLinkage()))
1199 return true;
1200
1201 clang::NamedDecl *named_decl = DeclForGlobal(global_variable);
1202
1203 if (!named_decl) {
1204 if (IsObjCSelectorRef(llvm_value_ptr))
1205 return true;
1206
1207 if (!global_variable->hasExternalLinkage())
1208 return true;
1209
1210 LLDB_LOG(log, "Found global variable \"{0}\" without metadata",
1211 global_variable->getName());
1212
1213 return false;
1214 }
1215
1216 llvm::StringRef name(named_decl->getName());
1217
1218 clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl);
1219 if (value_decl == nullptr)
1220 return false;
1221
1222 lldb_private::CompilerType compiler_type =
1223 m_decl_map->GetTypeSystem()->GetType(value_decl->getType());
1224
1225 const Type *value_type = nullptr;
1226
1227 if (name.startswith("$")) {
1228 // The $__lldb_expr_result name indicates the return value has allocated
1229 // as a static variable. Per the comment at
1230 // ASTResultSynthesizer::SynthesizeBodyResult, accesses to this static
1231 // variable need to be redirected to the result of dereferencing a
1232 // pointer that is passed in as one of the arguments.
1233 //
1234 // Consequently, when reporting the size of the type, we report a pointer
1235 // type pointing to the type of $__lldb_expr_result, not the type itself.
1236 //
1237 // We also do this for any user-declared persistent variables.
1238 compiler_type = compiler_type.GetPointerType();
1239 value_type = PointerType::get(global_variable->getType(), 0);
1240 } else {
1241 value_type = global_variable->getType();
1242 }
1243
1244 auto *target = m_execution_unit.GetTarget().get();
1245 llvm::Optional<uint64_t> value_size = compiler_type.GetByteSize(target);
1246 if (!value_size)
1247 return false;
1248 llvm::Optional<size_t> opt_alignment =
1249 compiler_type.GetTypeBitAlign(target);
1250 if (!opt_alignment)
1251 return false;
1252 lldb::offset_t value_alignment = (*opt_alignment + 7ull) / 8ull;
1253
1254 LLDB_LOG(log,
1255 "Type of \"{0}\" is [clang \"{1}\", llvm \"{2}\"] [size {3}, "
1256 "align {4}]",
1257 name,
1258 lldb_private::ClangUtil::GetQualType(compiler_type).getAsString(),
1259 PrintType(value_type), *value_size, value_alignment);
1260
1261 if (named_decl)
1262 m_decl_map->AddValueToStruct(named_decl, lldb_private::ConstString(name),
1263 llvm_value_ptr, *value_size,
1264 value_alignment);
1265 } else if (dyn_cast<llvm::Function>(llvm_value_ptr)) {
1266 LLDB_LOG(log, "Function pointers aren't handled right now");
1267
1268 return false;
1269 }
1270
1271 return true;
1272 }
1273
1274 // This function does not report errors; its callers are responsible.
HandleSymbol(Value * symbol)1275 bool IRForTarget::HandleSymbol(Value *symbol) {
1276 lldb_private::Log *log(
1277 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1278
1279 lldb_private::ConstString name(symbol->getName().str().c_str());
1280
1281 lldb::addr_t symbol_addr =
1282 m_decl_map->GetSymbolAddress(name, lldb::eSymbolTypeAny);
1283
1284 if (symbol_addr == LLDB_INVALID_ADDRESS) {
1285 LLDB_LOG(log, "Symbol \"{0}\" had no address", name);
1286
1287 return false;
1288 }
1289
1290 LLDB_LOG(log, "Found \"{0}\" at {1}", name, symbol_addr);
1291
1292 Type *symbol_type = symbol->getType();
1293
1294 Constant *symbol_addr_int = ConstantInt::get(m_intptr_ty, symbol_addr, false);
1295
1296 Value *symbol_addr_ptr =
1297 ConstantExpr::getIntToPtr(symbol_addr_int, symbol_type);
1298
1299 LLDB_LOG(log, "Replacing {0} with {1}", PrintValue(symbol),
1300 PrintValue(symbol_addr_ptr));
1301
1302 symbol->replaceAllUsesWith(symbol_addr_ptr);
1303
1304 return true;
1305 }
1306
MaybeHandleCallArguments(CallInst * Old)1307 bool IRForTarget::MaybeHandleCallArguments(CallInst *Old) {
1308 lldb_private::Log *log(
1309 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1310
1311 LLDB_LOG(log, "MaybeHandleCallArguments({0})", PrintValue(Old));
1312
1313 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
1314 op_index < num_ops; ++op_index)
1315 // conservatively believe that this is a store
1316 if (!MaybeHandleVariable(Old->getArgOperand(op_index))) {
1317 m_error_stream.Printf("Internal error [IRForTarget]: Couldn't rewrite "
1318 "one of the arguments of a function call.\n");
1319
1320 return false;
1321 }
1322
1323 return true;
1324 }
1325
HandleObjCClass(Value * classlist_reference)1326 bool IRForTarget::HandleObjCClass(Value *classlist_reference) {
1327 lldb_private::Log *log(
1328 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1329
1330 GlobalVariable *global_variable =
1331 dyn_cast<GlobalVariable>(classlist_reference);
1332
1333 if (!global_variable)
1334 return false;
1335
1336 Constant *initializer = global_variable->getInitializer();
1337
1338 if (!initializer)
1339 return false;
1340
1341 if (!initializer->hasName())
1342 return false;
1343
1344 StringRef name(initializer->getName());
1345 lldb_private::ConstString name_cstr(name.str().c_str());
1346 lldb::addr_t class_ptr =
1347 m_decl_map->GetSymbolAddress(name_cstr, lldb::eSymbolTypeObjCClass);
1348
1349 LLDB_LOG(log, "Found reference to Objective-C class {0} ({1})", name,
1350 (unsigned long long)class_ptr);
1351
1352 if (class_ptr == LLDB_INVALID_ADDRESS)
1353 return false;
1354
1355 if (global_variable->use_empty())
1356 return false;
1357
1358 SmallVector<LoadInst *, 2> load_instructions;
1359
1360 for (llvm::User *u : global_variable->users()) {
1361 if (LoadInst *load_instruction = dyn_cast<LoadInst>(u))
1362 load_instructions.push_back(load_instruction);
1363 }
1364
1365 if (load_instructions.empty())
1366 return false;
1367
1368 Constant *class_addr = ConstantInt::get(m_intptr_ty, (uint64_t)class_ptr);
1369
1370 for (LoadInst *load_instruction : load_instructions) {
1371 Constant *class_bitcast =
1372 ConstantExpr::getIntToPtr(class_addr, load_instruction->getType());
1373
1374 load_instruction->replaceAllUsesWith(class_bitcast);
1375
1376 load_instruction->eraseFromParent();
1377 }
1378
1379 return true;
1380 }
1381
RemoveCXAAtExit(BasicBlock & basic_block)1382 bool IRForTarget::RemoveCXAAtExit(BasicBlock &basic_block) {
1383 std::vector<CallInst *> calls_to_remove;
1384
1385 for (Instruction &inst : basic_block) {
1386 CallInst *call = dyn_cast<CallInst>(&inst);
1387
1388 // MaybeHandleCallArguments handles error reporting; we are silent here
1389 if (!call)
1390 continue;
1391
1392 bool remove = false;
1393
1394 llvm::Function *func = call->getCalledFunction();
1395
1396 if (func && func->getName() == "__cxa_atexit")
1397 remove = true;
1398
1399 llvm::Value *val = call->getCalledOperand();
1400
1401 if (val && val->getName() == "__cxa_atexit")
1402 remove = true;
1403
1404 if (remove)
1405 calls_to_remove.push_back(call);
1406 }
1407
1408 for (CallInst *ci : calls_to_remove)
1409 ci->eraseFromParent();
1410
1411 return true;
1412 }
1413
ResolveCalls(BasicBlock & basic_block)1414 bool IRForTarget::ResolveCalls(BasicBlock &basic_block) {
1415 // Prepare the current basic block for execution in the remote process
1416
1417 for (Instruction &inst : basic_block) {
1418 CallInst *call = dyn_cast<CallInst>(&inst);
1419
1420 // MaybeHandleCallArguments handles error reporting; we are silent here
1421 if (call && !MaybeHandleCallArguments(call))
1422 return false;
1423 }
1424
1425 return true;
1426 }
1427
ResolveExternals(Function & llvm_function)1428 bool IRForTarget::ResolveExternals(Function &llvm_function) {
1429 lldb_private::Log *log(
1430 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1431
1432 for (GlobalVariable &global_var : m_module->globals()) {
1433 llvm::StringRef global_name = global_var.getName();
1434
1435 LLDB_LOG(log, "Examining {0}, DeclForGlobalValue returns {1}", global_name,
1436 static_cast<void *>(DeclForGlobal(&global_var)));
1437
1438 if (global_name.startswith("OBJC_IVAR")) {
1439 if (!HandleSymbol(&global_var)) {
1440 m_error_stream.Format("Error [IRForTarget]: Couldn't find Objective-C "
1441 "indirect ivar symbol {0}\n",
1442 global_name);
1443
1444 return false;
1445 }
1446 } else if (global_name.contains("OBJC_CLASSLIST_REFERENCES_$")) {
1447 if (!HandleObjCClass(&global_var)) {
1448 m_error_stream.Printf("Error [IRForTarget]: Couldn't resolve the class "
1449 "for an Objective-C static method call\n");
1450
1451 return false;
1452 }
1453 } else if (global_name.contains("OBJC_CLASSLIST_SUP_REFS_$")) {
1454 if (!HandleObjCClass(&global_var)) {
1455 m_error_stream.Printf("Error [IRForTarget]: Couldn't resolve the class "
1456 "for an Objective-C static method call\n");
1457
1458 return false;
1459 }
1460 } else if (DeclForGlobal(&global_var)) {
1461 if (!MaybeHandleVariable(&global_var)) {
1462 m_error_stream.Format("Internal error [IRForTarget]: Couldn't rewrite "
1463 "external variable {0}\n",
1464 global_name);
1465
1466 return false;
1467 }
1468 }
1469 }
1470
1471 return true;
1472 }
1473
isGuardVariableRef(Value * V)1474 static bool isGuardVariableRef(Value *V) {
1475 Constant *Old = dyn_cast<Constant>(V);
1476
1477 if (!Old)
1478 return false;
1479
1480 if (auto CE = dyn_cast<ConstantExpr>(V)) {
1481 if (CE->getOpcode() != Instruction::BitCast)
1482 return false;
1483
1484 Old = CE->getOperand(0);
1485 }
1486
1487 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
1488
1489 if (!GV || !GV->hasName() || !isGuardVariableSymbol(GV->getName()))
1490 return false;
1491
1492 return true;
1493 }
1494
TurnGuardLoadIntoZero(llvm::Instruction * guard_load)1495 void IRForTarget::TurnGuardLoadIntoZero(llvm::Instruction *guard_load) {
1496 Constant *zero(Constant::getNullValue(guard_load->getType()));
1497 guard_load->replaceAllUsesWith(zero);
1498 guard_load->eraseFromParent();
1499 }
1500
ExciseGuardStore(Instruction * guard_store)1501 static void ExciseGuardStore(Instruction *guard_store) {
1502 guard_store->eraseFromParent();
1503 }
1504
RemoveGuards(BasicBlock & basic_block)1505 bool IRForTarget::RemoveGuards(BasicBlock &basic_block) {
1506 // Eliminate any reference to guard variables found.
1507
1508 InstrList guard_loads;
1509 InstrList guard_stores;
1510
1511 for (Instruction &inst : basic_block) {
1512
1513 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1514 if (isGuardVariableRef(load->getPointerOperand()))
1515 guard_loads.push_back(&inst);
1516
1517 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1518 if (isGuardVariableRef(store->getPointerOperand()))
1519 guard_stores.push_back(&inst);
1520 }
1521
1522 for (Instruction *inst : guard_loads)
1523 TurnGuardLoadIntoZero(inst);
1524
1525 for (Instruction *inst : guard_stores)
1526 ExciseGuardStore(inst);
1527
1528 return true;
1529 }
1530
1531 // This function does not report errors; its callers are responsible.
UnfoldConstant(Constant * old_constant,llvm::Function * llvm_function,FunctionValueCache & value_maker,FunctionValueCache & entry_instruction_finder,lldb_private::Stream & error_stream)1532 bool IRForTarget::UnfoldConstant(Constant *old_constant,
1533 llvm::Function *llvm_function,
1534 FunctionValueCache &value_maker,
1535 FunctionValueCache &entry_instruction_finder,
1536 lldb_private::Stream &error_stream) {
1537 SmallVector<User *, 16> users;
1538
1539 // We do this because the use list might change, invalidating our iterator.
1540 // Much better to keep a work list ourselves.
1541 for (llvm::User *u : old_constant->users())
1542 users.push_back(u);
1543
1544 for (size_t i = 0; i < users.size(); ++i) {
1545 User *user = users[i];
1546
1547 if (Constant *constant = dyn_cast<Constant>(user)) {
1548 // synthesize a new non-constant equivalent of the constant
1549
1550 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant)) {
1551 switch (constant_expr->getOpcode()) {
1552 default:
1553 error_stream.Printf("error [IRForTarget internal]: Unhandled "
1554 "constant expression type: \"%s\"",
1555 PrintValue(constant_expr).c_str());
1556 return false;
1557 case Instruction::BitCast: {
1558 FunctionValueCache bit_cast_maker(
1559 [&value_maker, &entry_instruction_finder, old_constant,
1560 constant_expr](llvm::Function *function) -> llvm::Value * {
1561 // UnaryExpr
1562 // OperandList[0] is value
1563
1564 if (constant_expr->getOperand(0) != old_constant)
1565 return constant_expr;
1566
1567 return new BitCastInst(
1568 value_maker.GetValue(function), constant_expr->getType(),
1569 "", llvm::cast<Instruction>(
1570 entry_instruction_finder.GetValue(function)));
1571 });
1572
1573 if (!UnfoldConstant(constant_expr, llvm_function, bit_cast_maker,
1574 entry_instruction_finder, error_stream))
1575 return false;
1576 } break;
1577 case Instruction::GetElementPtr: {
1578 // GetElementPtrConstantExpr
1579 // OperandList[0] is base
1580 // OperandList[1]... are indices
1581
1582 FunctionValueCache get_element_pointer_maker(
1583 [&value_maker, &entry_instruction_finder, old_constant,
1584 constant_expr](llvm::Function *function) -> llvm::Value * {
1585 Value *ptr = constant_expr->getOperand(0);
1586
1587 if (ptr == old_constant)
1588 ptr = value_maker.GetValue(function);
1589
1590 std::vector<Value *> index_vector;
1591
1592 unsigned operand_index;
1593 unsigned num_operands = constant_expr->getNumOperands();
1594
1595 for (operand_index = 1; operand_index < num_operands;
1596 ++operand_index) {
1597 Value *operand = constant_expr->getOperand(operand_index);
1598
1599 if (operand == old_constant)
1600 operand = value_maker.GetValue(function);
1601
1602 index_vector.push_back(operand);
1603 }
1604
1605 ArrayRef<Value *> indices(index_vector);
1606
1607 return GetElementPtrInst::Create(
1608 nullptr, ptr, indices, "",
1609 llvm::cast<Instruction>(
1610 entry_instruction_finder.GetValue(function)));
1611 });
1612
1613 if (!UnfoldConstant(constant_expr, llvm_function,
1614 get_element_pointer_maker,
1615 entry_instruction_finder, error_stream))
1616 return false;
1617 } break;
1618 }
1619 } else {
1620 error_stream.Printf(
1621 "error [IRForTarget internal]: Unhandled constant type: \"%s\"",
1622 PrintValue(constant).c_str());
1623 return false;
1624 }
1625 } else {
1626 if (Instruction *inst = llvm::dyn_cast<Instruction>(user)) {
1627 if (llvm_function && inst->getParent()->getParent() != llvm_function) {
1628 error_stream.PutCString("error: Capturing non-local variables in "
1629 "expressions is unsupported.\n");
1630 return false;
1631 }
1632 inst->replaceUsesOfWith(
1633 old_constant, value_maker.GetValue(inst->getParent()->getParent()));
1634 } else {
1635 error_stream.Printf(
1636 "error [IRForTarget internal]: Unhandled non-constant type: \"%s\"",
1637 PrintValue(user).c_str());
1638 return false;
1639 }
1640 }
1641 }
1642
1643 if (!isa<GlobalValue>(old_constant)) {
1644 old_constant->destroyConstant();
1645 }
1646
1647 return true;
1648 }
1649
ReplaceVariables(Function & llvm_function)1650 bool IRForTarget::ReplaceVariables(Function &llvm_function) {
1651 if (!m_resolve_vars)
1652 return true;
1653
1654 lldb_private::Log *log(
1655 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1656
1657 m_decl_map->DoStructLayout();
1658
1659 LLDB_LOG(log, "Element arrangement:");
1660
1661 uint32_t num_elements;
1662 uint32_t element_index;
1663
1664 size_t size;
1665 lldb::offset_t alignment;
1666
1667 if (!m_decl_map->GetStructInfo(num_elements, size, alignment))
1668 return false;
1669
1670 Function::arg_iterator iter(llvm_function.arg_begin());
1671
1672 if (iter == llvm_function.arg_end()) {
1673 m_error_stream.Printf("Internal error [IRForTarget]: Wrapper takes no "
1674 "arguments (should take at least a struct pointer)");
1675
1676 return false;
1677 }
1678
1679 Argument *argument = &*iter;
1680
1681 if (argument->getName().equals("this")) {
1682 ++iter;
1683
1684 if (iter == llvm_function.arg_end()) {
1685 m_error_stream.Printf("Internal error [IRForTarget]: Wrapper takes only "
1686 "'this' argument (should take a struct pointer "
1687 "too)");
1688
1689 return false;
1690 }
1691
1692 argument = &*iter;
1693 } else if (argument->getName().equals("self")) {
1694 ++iter;
1695
1696 if (iter == llvm_function.arg_end()) {
1697 m_error_stream.Printf("Internal error [IRForTarget]: Wrapper takes only "
1698 "'self' argument (should take '_cmd' and a struct "
1699 "pointer too)");
1700
1701 return false;
1702 }
1703
1704 if (!iter->getName().equals("_cmd")) {
1705 m_error_stream.Format("Internal error [IRForTarget]: Wrapper takes '{0}' "
1706 "after 'self' argument (should take '_cmd')",
1707 iter->getName());
1708
1709 return false;
1710 }
1711
1712 ++iter;
1713
1714 if (iter == llvm_function.arg_end()) {
1715 m_error_stream.Printf("Internal error [IRForTarget]: Wrapper takes only "
1716 "'self' and '_cmd' arguments (should take a struct "
1717 "pointer too)");
1718
1719 return false;
1720 }
1721
1722 argument = &*iter;
1723 }
1724
1725 if (!argument->getName().equals("$__lldb_arg")) {
1726 m_error_stream.Format("Internal error [IRForTarget]: Wrapper takes an "
1727 "argument named '{0}' instead of the struct pointer",
1728 argument->getName());
1729
1730 return false;
1731 }
1732
1733 LLDB_LOG(log, "Arg: \"{0}\"", PrintValue(argument));
1734
1735 BasicBlock &entry_block(llvm_function.getEntryBlock());
1736 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
1737
1738 if (!FirstEntryInstruction) {
1739 m_error_stream.Printf("Internal error [IRForTarget]: Couldn't find the "
1740 "first instruction in the wrapper for use in "
1741 "rewriting");
1742
1743 return false;
1744 }
1745
1746 LLVMContext &context(m_module->getContext());
1747 IntegerType *offset_type(Type::getInt32Ty(context));
1748
1749 if (!offset_type) {
1750 m_error_stream.Printf(
1751 "Internal error [IRForTarget]: Couldn't produce an offset type");
1752
1753 return false;
1754 }
1755
1756 for (element_index = 0; element_index < num_elements; ++element_index) {
1757 const clang::NamedDecl *decl = nullptr;
1758 Value *value = nullptr;
1759 lldb::offset_t offset;
1760 lldb_private::ConstString name;
1761
1762 if (!m_decl_map->GetStructElement(decl, value, offset, name,
1763 element_index)) {
1764 m_error_stream.Printf(
1765 "Internal error [IRForTarget]: Structure information is incomplete");
1766
1767 return false;
1768 }
1769
1770 LLDB_LOG(log, " \"{0}\" (\"{1}\") placed at {2}", name,
1771 decl->getNameAsString(), offset);
1772
1773 if (value) {
1774 LLDB_LOG(log, " Replacing [{0}]", PrintValue(value));
1775
1776 FunctionValueCache body_result_maker(
1777 [this, name, offset_type, offset, argument,
1778 value](llvm::Function *function) -> llvm::Value * {
1779 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1780 // in cases where the result variable is an rvalue, we have to
1781 // synthesize a dereference of the appropriate structure entry in
1782 // order to produce the static variable that the AST thinks it is
1783 // accessing.
1784
1785 llvm::Instruction *entry_instruction = llvm::cast<Instruction>(
1786 m_entry_instruction_finder.GetValue(function));
1787
1788 ConstantInt *offset_int(
1789 ConstantInt::get(offset_type, offset, true));
1790 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(
1791 nullptr, argument, offset_int, "", entry_instruction);
1792
1793 if (name == m_result_name && !m_result_is_pointer) {
1794 BitCastInst *bit_cast = new BitCastInst(
1795 get_element_ptr, value->getType()->getPointerTo(), "",
1796 entry_instruction);
1797
1798 LoadInst *load =
1799 new LoadInst(bit_cast->getType()->getPointerElementType(),
1800 bit_cast, "", entry_instruction);
1801
1802 return load;
1803 } else {
1804 BitCastInst *bit_cast = new BitCastInst(
1805 get_element_ptr, value->getType(), "", entry_instruction);
1806
1807 return bit_cast;
1808 }
1809 });
1810
1811 if (Constant *constant = dyn_cast<Constant>(value)) {
1812 if (!UnfoldConstant(constant, &llvm_function, body_result_maker,
1813 m_entry_instruction_finder, m_error_stream)) {
1814 return false;
1815 }
1816 } else if (Instruction *instruction = dyn_cast<Instruction>(value)) {
1817 if (instruction->getParent()->getParent() != &llvm_function) {
1818 m_error_stream.PutCString("error: Capturing non-local variables in "
1819 "expressions is unsupported.\n");
1820 return false;
1821 }
1822 value->replaceAllUsesWith(
1823 body_result_maker.GetValue(instruction->getParent()->getParent()));
1824 } else {
1825 LLDB_LOG(log, "Unhandled non-constant type: \"{0}\"",
1826 PrintValue(value));
1827 return false;
1828 }
1829
1830 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1831 var->eraseFromParent();
1832 }
1833 }
1834
1835 LLDB_LOG(log, "Total structure [align {0}, size {1}]", (int64_t)alignment,
1836 (uint64_t)size);
1837
1838 return true;
1839 }
1840
runOnModule(Module & llvm_module)1841 bool IRForTarget::runOnModule(Module &llvm_module) {
1842 lldb_private::Log *log(
1843 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1844
1845 m_module = &llvm_module;
1846 m_target_data = std::make_unique<DataLayout>(m_module);
1847 m_intptr_ty = llvm::Type::getIntNTy(m_module->getContext(),
1848 m_target_data->getPointerSizeInBits());
1849
1850 if (log) {
1851 std::string s;
1852 raw_string_ostream oss(s);
1853
1854 m_module->print(oss, nullptr);
1855
1856 oss.flush();
1857
1858 LLDB_LOG(log, "Module as passed in to IRForTarget: \n\"{0}\"", s);
1859 }
1860
1861 Function *const main_function =
1862 m_func_name.IsEmpty() ? nullptr
1863 : m_module->getFunction(m_func_name.GetStringRef());
1864
1865 if (!m_func_name.IsEmpty() && !main_function) {
1866 LLDB_LOG(log, "Couldn't find \"{0}()\" in the module", m_func_name);
1867
1868 m_error_stream.Format("Internal error [IRForTarget]: Couldn't find wrapper "
1869 "'{0}' in the module",
1870 m_func_name);
1871
1872 return false;
1873 }
1874
1875 if (main_function) {
1876 if (!FixFunctionLinkage(*main_function)) {
1877 LLDB_LOG(log, "Couldn't fix the linkage for the function");
1878
1879 return false;
1880 }
1881 }
1882
1883 llvm::Type *int8_ty = Type::getInt8Ty(m_module->getContext());
1884
1885 m_reloc_placeholder = new llvm::GlobalVariable(
1886 (*m_module), int8_ty, false /* IsConstant */,
1887 GlobalVariable::InternalLinkage, Constant::getNullValue(int8_ty),
1888 "reloc_placeholder", nullptr /* InsertBefore */,
1889 GlobalVariable::NotThreadLocal /* ThreadLocal */, 0 /* AddressSpace */);
1890
1891 ////////////////////////////////////////////////////////////
1892 // Replace $__lldb_expr_result with a persistent variable
1893 //
1894
1895 if (main_function) {
1896 if (!CreateResultVariable(*main_function)) {
1897 LLDB_LOG(log, "CreateResultVariable() failed");
1898
1899 // CreateResultVariable() reports its own errors, so we don't do so here
1900
1901 return false;
1902 }
1903 }
1904
1905 if (log && log->GetVerbose()) {
1906 std::string s;
1907 raw_string_ostream oss(s);
1908
1909 m_module->print(oss, nullptr);
1910
1911 oss.flush();
1912
1913 LLDB_LOG(log, "Module after creating the result variable: \n\"{0}\"", s);
1914 }
1915
1916 for (llvm::Function &function : *m_module) {
1917 for (BasicBlock &bb : function) {
1918 if (!RemoveGuards(bb)) {
1919 LLDB_LOG(log, "RemoveGuards() failed");
1920
1921 // RemoveGuards() reports its own errors, so we don't do so here
1922
1923 return false;
1924 }
1925
1926 if (!RewritePersistentAllocs(bb)) {
1927 LLDB_LOG(log, "RewritePersistentAllocs() failed");
1928
1929 // RewritePersistentAllocs() reports its own errors, so we don't do so
1930 // here
1931
1932 return false;
1933 }
1934
1935 if (!RemoveCXAAtExit(bb)) {
1936 LLDB_LOG(log, "RemoveCXAAtExit() failed");
1937
1938 // RemoveCXAAtExit() reports its own errors, so we don't do so here
1939
1940 return false;
1941 }
1942 }
1943 }
1944
1945 ///////////////////////////////////////////////////////////////////////////////
1946 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1947 //
1948
1949 if (!RewriteObjCConstStrings()) {
1950 LLDB_LOG(log, "RewriteObjCConstStrings() failed");
1951
1952 // RewriteObjCConstStrings() reports its own errors, so we don't do so here
1953
1954 return false;
1955 }
1956
1957 for (llvm::Function &function : *m_module) {
1958 for (llvm::BasicBlock &bb : function) {
1959 if (!RewriteObjCSelectors(bb)) {
1960 LLDB_LOG(log, "RewriteObjCSelectors() failed");
1961
1962 // RewriteObjCSelectors() reports its own errors, so we don't do so
1963 // here
1964
1965 return false;
1966 }
1967
1968 if (!RewriteObjCClassReferences(bb)) {
1969 LLDB_LOG(log, "RewriteObjCClassReferences() failed");
1970
1971 // RewriteObjCClasses() reports its own errors, so we don't do so here
1972
1973 return false;
1974 }
1975 }
1976 }
1977
1978 for (llvm::Function &function : *m_module) {
1979 for (BasicBlock &bb : function) {
1980 if (!ResolveCalls(bb)) {
1981 LLDB_LOG(log, "ResolveCalls() failed");
1982
1983 // ResolveCalls() reports its own errors, so we don't do so here
1984
1985 return false;
1986 }
1987 }
1988 }
1989
1990 ////////////////////////////////////////////////////////////////////////
1991 // Run function-level passes that only make sense on the main function
1992 //
1993
1994 if (main_function) {
1995 if (!ResolveExternals(*main_function)) {
1996 LLDB_LOG(log, "ResolveExternals() failed");
1997
1998 // ResolveExternals() reports its own errors, so we don't do so here
1999
2000 return false;
2001 }
2002
2003 if (!ReplaceVariables(*main_function)) {
2004 LLDB_LOG(log, "ReplaceVariables() failed");
2005
2006 // ReplaceVariables() reports its own errors, so we don't do so here
2007
2008 return false;
2009 }
2010 }
2011
2012 if (log && log->GetVerbose()) {
2013 std::string s;
2014 raw_string_ostream oss(s);
2015
2016 m_module->print(oss, nullptr);
2017
2018 oss.flush();
2019
2020 LLDB_LOG(log, "Module after preparing for execution: \n\"{0}\"", s);
2021 }
2022
2023 return true;
2024 }
2025
assignPassManager(PMStack & pass_mgr_stack,PassManagerType pass_mgr_type)2026 void IRForTarget::assignPassManager(PMStack &pass_mgr_stack,
2027 PassManagerType pass_mgr_type) {}
2028
getPotentialPassManagerType() const2029 PassManagerType IRForTarget::getPotentialPassManagerType() const {
2030 return PMT_ModulePassManager;
2031 }
2032