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