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