blob: ab3afeb104f83930e57f544df0275a2d3c4e9ed5 [file] [log] [blame]
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001//===-- 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 "lldb/Expression/IRForTarget.h"
11
12#include "llvm/Support/raw_ostream.h"
13#include "llvm/InstrTypes.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000014#include "llvm/Instructions.h"
Sean Callanan3cb1fd82010-09-28 23:55:00 +000015#include "llvm/Intrinsics.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000016#include "llvm/Module.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000017#include "llvm/Target/TargetData.h"
Sean Callanan82b74c82010-08-12 01:56:52 +000018#include "llvm/ValueSymbolTable.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000019
20#include "clang/AST/ASTContext.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000021
Greg Clayton8de27c72010-10-15 22:48:33 +000022#include "lldb/Core/ConstString.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000023#include "lldb/Core/dwarf.h"
24#include "lldb/Core/Log.h"
25#include "lldb/Core/Scalar.h"
26#include "lldb/Core/StreamString.h"
27#include "lldb/Expression/ClangExpressionDeclMap.h"
28
29#include <map>
30
31using namespace llvm;
32
Sean Callanan3351dac2010-08-18 18:50:51 +000033static char ID;
34
Greg Clayton3c7feb42010-11-19 01:05:25 +000035IRForTarget::IRForTarget (lldb_private::ClangExpressionDeclMap *decl_map,
36 bool resolve_vars,
Sean Callanan05a5a1b2010-12-16 03:17:46 +000037 lldb::ClangExpressionVariableSP *const_result,
Greg Clayton3c7feb42010-11-19 01:05:25 +000038 const char *func_name) :
Sean Callanan47a5c4c2010-09-23 03:01:22 +000039 ModulePass(ID),
Sean Callanan8bce6652010-07-13 21:41:46 +000040 m_decl_map(decl_map),
Sean Callanan6ba533e2010-11-17 23:00:36 +000041 m_CFStringCreateWithBytes(NULL),
Sean Callanan65dafa82010-08-27 01:01:44 +000042 m_sel_registerName(NULL),
Sean Callanane8a59a82010-09-13 21:34:21 +000043 m_func_name(func_name),
Sean Callanan05a5a1b2010-12-16 03:17:46 +000044 m_resolve_vars(resolve_vars),
45 m_const_result(const_result),
46 m_has_side_effects(NULL)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000047{
48}
49
Sean Callanan771131d2010-09-30 21:18:25 +000050/* Handy utility functions used at several places in the code */
Sean Callanana48fe162010-08-11 03:57:18 +000051
52static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000053PrintValue(const Value *value, bool truncate = false)
Sean Callanana48fe162010-08-11 03:57:18 +000054{
55 std::string s;
56 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000057 value->print(rso);
Sean Callanana48fe162010-08-11 03:57:18 +000058 rso.flush();
59 if (truncate)
60 s.resize(s.length() - 1);
61 return s;
62}
63
Sean Callanan771131d2010-09-30 21:18:25 +000064static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000065PrintType(const Type *type, bool truncate = false)
Sean Callanan771131d2010-09-30 21:18:25 +000066{
67 std::string s;
68 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000069 type->print(rso);
Sean Callanan771131d2010-09-30 21:18:25 +000070 rso.flush();
71 if (truncate)
72 s.resize(s.length() - 1);
73 return s;
74}
75
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000076IRForTarget::~IRForTarget()
77{
78}
79
Sean Callanan82b74c82010-08-12 01:56:52 +000080bool
Sean Callanan05a5a1b2010-12-16 03:17:46 +000081IRForTarget::HasSideEffects (llvm::Module &llvm_module,
82 llvm::Function &llvm_function)
83{
84 llvm::Function::iterator bbi;
85 BasicBlock::iterator ii;
86
87 for (bbi = llvm_function.begin();
88 bbi != llvm_function.end();
89 ++bbi)
90 {
91 BasicBlock &basic_block = *bbi;
92
93 for (ii = basic_block.begin();
94 ii != basic_block.end();
95 ++ii)
96 {
97 switch (ii->getOpcode())
98 {
99 default:
100 return true;
101 case Instruction::Store:
102 {
103 StoreInst *store_inst = dyn_cast<StoreInst>(ii);
104
105 Value *store_ptr = store_inst->getPointerOperand();
106
107 if (!isa <AllocaInst> (store_ptr))
108 return true;
109 else
110 break;
111 }
112 case Instruction::Load:
113 case Instruction::Alloca:
114 case Instruction::GetElementPtr:
115 case Instruction::Ret:
116 break;
117 }
118 }
119 }
120
121 return false;
122}
123
124void
125IRForTarget::MaybeSetConstantResult (llvm::Constant *initializer,
126 const lldb_private::ConstString &name,
127 lldb_private::TypeFromParser type)
128{
129 if (!m_const_result)
130 return;
131
132 if (llvm::ConstantInt *init_int = dyn_cast<llvm::ConstantInt>(initializer))
133 {
134 *m_const_result = m_decl_map->BuildIntegerVariable(name, type, init_int->getValue());
135 }
136}
137
138bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000139IRForTarget::CreateResultVariable (llvm::Module &llvm_module, llvm::Function &llvm_function)
Sean Callanan82b74c82010-08-12 01:56:52 +0000140{
Greg Claytone005f2c2010-11-06 01:53:30 +0000141 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000142
Sean Callanane8a59a82010-09-13 21:34:21 +0000143 if (!m_resolve_vars)
144 return true;
145
146 // Find the result variable. If it doesn't exist, we can give up right here.
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000147
Greg Clayton8de27c72010-10-15 22:48:33 +0000148 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000149
150 const char *result_name = NULL;
151
152 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
153 vi != ve;
154 ++vi)
155 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000156 if (strstr(vi->first(), "$__lldb_expr_result") &&
Sean Callananc04743d2010-09-28 21:13:03 +0000157 !strstr(vi->first(), "GV"))
158 {
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000159 result_name = vi->first();
Sean Callananc04743d2010-09-28 21:13:03 +0000160 break;
161 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000162 }
163
164 if (!result_name)
165 {
166 if (log)
167 log->PutCString("Couldn't find result variable");
168
169 return true;
170 }
171
Sean Callananc04743d2010-09-28 21:13:03 +0000172 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000173 log->Printf("Result name: \"%s\"", result_name);
Sean Callananc04743d2010-09-28 21:13:03 +0000174
Greg Clayton8de27c72010-10-15 22:48:33 +0000175 Value *result_value = llvm_module.getNamedValue(result_name);
Sean Callanan82b74c82010-08-12 01:56:52 +0000176
177 if (!result_value)
178 {
179 if (log)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000180 log->PutCString("Result variable had no data");
Sean Callanane8a59a82010-09-13 21:34:21 +0000181
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000182 return false;
Sean Callanan82b74c82010-08-12 01:56:52 +0000183 }
Sean Callanane8a59a82010-09-13 21:34:21 +0000184
Sean Callanan82b74c82010-08-12 01:56:52 +0000185 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000186 log->Printf("Found result in the IR: \"%s\"", PrintValue(result_value, false).c_str());
Sean Callanan82b74c82010-08-12 01:56:52 +0000187
188 GlobalVariable *result_global = dyn_cast<GlobalVariable>(result_value);
189
190 if (!result_global)
191 {
192 if (log)
193 log->PutCString("Result variable isn't a GlobalVariable");
194 return false;
195 }
196
197 // Find the metadata and follow it to the VarDecl
198
Greg Clayton8de27c72010-10-15 22:48:33 +0000199 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanan82b74c82010-08-12 01:56:52 +0000200
201 if (!named_metadata)
202 {
203 if (log)
204 log->PutCString("No global metadata");
205
206 return false;
207 }
208
209 unsigned num_nodes = named_metadata->getNumOperands();
210 unsigned node_index;
211
212 MDNode *metadata_node = NULL;
213
214 for (node_index = 0;
215 node_index < num_nodes;
216 ++node_index)
217 {
218 metadata_node = named_metadata->getOperand(node_index);
219
220 if (metadata_node->getNumOperands() != 2)
221 continue;
222
223 if (metadata_node->getOperand(0) == result_global)
224 break;
225 }
226
227 if (!metadata_node)
228 {
229 if (log)
230 log->PutCString("Couldn't find result metadata");
231 return false;
232 }
233
234 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
235
Greg Claytonb5037af2010-11-15 01:47:11 +0000236 lldb::addr_t result_decl_intptr = constant_int->getZExtValue();
Sean Callanan82b74c82010-08-12 01:56:52 +0000237
238 clang::VarDecl *result_decl = reinterpret_cast<clang::VarDecl *>(result_decl_intptr);
239
240 // Get the next available result name from m_decl_map and create the persistent
241 // variable for it
242
243 lldb_private::TypeFromParser result_decl_type (result_decl->getType().getAsOpaquePtr(),
244 &result_decl->getASTContext());
Greg Clayton8de27c72010-10-15 22:48:33 +0000245
246 lldb_private::ConstString new_result_name (m_decl_map->GetPersistentResultName());
247 m_decl_map->AddPersistentVariable(result_decl, new_result_name, result_decl_type);
Sean Callanan82b74c82010-08-12 01:56:52 +0000248
249 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000250 log->Printf("Creating a new result global: \"%s\"", new_result_name.GetCString());
Sean Callanan82b74c82010-08-12 01:56:52 +0000251
252 // Construct a new result global and set up its metadata
253
Greg Clayton8de27c72010-10-15 22:48:33 +0000254 GlobalVariable *new_result_global = new GlobalVariable(llvm_module,
Sean Callanan82b74c82010-08-12 01:56:52 +0000255 result_global->getType()->getElementType(),
256 false, /* not constant */
257 GlobalValue::ExternalLinkage,
258 NULL, /* no initializer */
Greg Clayton8de27c72010-10-15 22:48:33 +0000259 new_result_name.GetCString ());
Sean Callanan82b74c82010-08-12 01:56:52 +0000260
261 // It's too late in compilation to create a new VarDecl for this, but we don't
262 // need to. We point the metadata at the old VarDecl. This creates an odd
263 // anomaly: a variable with a Value whose name is something like $0 and a
Greg Clayton8de27c72010-10-15 22:48:33 +0000264 // Decl whose name is $__lldb_expr_result. This condition is handled in
Sean Callanan82b74c82010-08-12 01:56:52 +0000265 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
266 // fixed up.
267
268 ConstantInt *new_constant_int = ConstantInt::get(constant_int->getType(),
269 result_decl_intptr,
270 false);
271
272 llvm::Value* values[2];
273 values[0] = new_result_global;
274 values[1] = new_constant_int;
275
Greg Clayton8de27c72010-10-15 22:48:33 +0000276 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanan82b74c82010-08-12 01:56:52 +0000277 named_metadata->addOperand(persistent_global_md);
278
279 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000280 log->Printf("Replacing \"%s\" with \"%s\"",
Sean Callanan2e2db532010-09-07 22:43:19 +0000281 PrintValue(result_global).c_str(),
Sean Callanan82b74c82010-08-12 01:56:52 +0000282 PrintValue(new_result_global).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000283
284 if (result_global->hasNUses(0))
285 {
286 // We need to synthesize a store for this variable, because otherwise
287 // there's nothing to put into its equivalent persistent variable.
Sean Callanan82b74c82010-08-12 01:56:52 +0000288
Greg Clayton8de27c72010-10-15 22:48:33 +0000289 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan2e2db532010-09-07 22:43:19 +0000290 Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg());
291
292 if (!first_entry_instruction)
293 return false;
294
295 if (!result_global->hasInitializer())
296 {
297 if (log)
298 log->Printf("Couldn't find initializer for unused variable");
299 return false;
300 }
301
302 Constant *initializer = result_global->getInitializer();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000303
304 // Here we write the initializer into a result variable assuming it
305 // can be computed statically.
306
307 if (!m_has_side_effects)
308 {
309 MaybeSetConstantResult (initializer,
310 new_result_name,
311 result_decl_type);
312 }
Sean Callanan2e2db532010-09-07 22:43:19 +0000313
314 StoreInst *synthesized_store = new StoreInst::StoreInst(initializer,
315 new_result_global,
316 first_entry_instruction);
317
318 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000319 log->Printf("Synthesized result store \"%s\"\n", PrintValue(synthesized_store).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000320 }
321 else
322 {
323 result_global->replaceAllUsesWith(new_result_global);
324 }
325
Sean Callanan82b74c82010-08-12 01:56:52 +0000326 result_global->eraseFromParent();
327
328 return true;
329}
330
Greg Clayton3c7feb42010-11-19 01:05:25 +0000331static void DebugUsers(lldb::LogSP &log, Value *value, uint8_t depth)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000332{
333 if (!depth)
334 return;
335
336 depth--;
337
Greg Clayton3c7feb42010-11-19 01:05:25 +0000338 log->Printf(" <Begin %d users>", value->getNumUses());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000339
Greg Clayton3c7feb42010-11-19 01:05:25 +0000340 for (Value::use_iterator ui = value->use_begin(), ue = value->use_end();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000341 ui != ue;
342 ++ui)
343 {
344 log->Printf(" <Use %p> %s", *ui, PrintValue(*ui).c_str());
345 DebugUsers(log, *ui, depth);
346 }
347
348 log->Printf(" <End uses>");
349}
350
351bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000352IRForTarget::RewriteObjCConstString (llvm::Module &llvm_module,
353 llvm::GlobalVariable *ns_str,
354 llvm::GlobalVariable *cstr,
355 Instruction *FirstEntryInstruction)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000356{
357 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
358
Greg Clayton3c7feb42010-11-19 01:05:25 +0000359 const Type *i8_ptr_ty = Type::getInt8PtrTy(llvm_module.getContext());
360 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
361 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
362 const Type *i32_ty = Type::getInt32Ty(llvm_module.getContext());
363 const Type *i8_ty = Type::getInt8Ty(llvm_module.getContext());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000364
365 if (!m_CFStringCreateWithBytes)
366 {
367 lldb::addr_t CFStringCreateWithBytes_addr;
368
369 static lldb_private::ConstString g_CFStringCreateWithBytes_str ("CFStringCreateWithBytes");
370
371 if (!m_decl_map->GetFunctionAddress (g_CFStringCreateWithBytes_str, CFStringCreateWithBytes_addr))
372 {
373 if (log)
374 log->PutCString("Couldn't find CFStringCreateWithBytes in the target");
375
376 return false;
377 }
378
379 if (log)
380 log->Printf("Found CFStringCreateWithBytes at 0x%llx", CFStringCreateWithBytes_addr);
381
382 // Build the function type:
383 //
384 // CFStringRef CFStringCreateWithBytes (
385 // CFAllocatorRef alloc,
386 // const UInt8 *bytes,
387 // CFIndex numBytes,
388 // CFStringEncoding encoding,
389 // Boolean isExternalRepresentation
390 // );
391 //
392 // We make the following substitutions:
393 //
394 // CFStringRef -> i8*
395 // CFAllocatorRef -> i8*
396 // UInt8 * -> i8*
397 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its pointer size for now)
398 // CFStringEncoding -> i32
399 // Boolean -> i8
400
401 std::vector <const Type *> CFSCWB_arg_types;
402 CFSCWB_arg_types.push_back(i8_ptr_ty);
403 CFSCWB_arg_types.push_back(i8_ptr_ty);
404 CFSCWB_arg_types.push_back(intptr_ty);
405 CFSCWB_arg_types.push_back(i32_ty);
406 CFSCWB_arg_types.push_back(i8_ty);
407 llvm::Type *CFSCWB_ty = FunctionType::get(i8_ptr_ty, CFSCWB_arg_types, false);
408
409 // Build the constant containing the pointer to the function
410 PointerType *CFSCWB_ptr_ty = PointerType::getUnqual(CFSCWB_ty);
411 Constant *CFSCWB_addr_int = ConstantInt::get(intptr_ty, CFStringCreateWithBytes_addr, false);
412 m_CFStringCreateWithBytes = ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty);
413 }
414
Greg Clayton3c7feb42010-11-19 01:05:25 +0000415 ConstantArray *string_array = dyn_cast<ConstantArray>(cstr->getInitializer());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000416
417 SmallVector <Value*, 5> CFSCWB_arguments;
418
419 Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000420 Constant *bytes_arg = ConstantExpr::getBitCast(cstr, i8_ptr_ty);
Sean Callanan6ba533e2010-11-17 23:00:36 +0000421 Constant *numBytes_arg = ConstantInt::get(intptr_ty, string_array->getType()->getNumElements(), false);
422 Constant *encoding_arg = ConstantInt::get(i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */
423 Constant *isExternal_arg = ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */
424
425 CFSCWB_arguments.push_back(alloc_arg);
426 CFSCWB_arguments.push_back(bytes_arg);
427 CFSCWB_arguments.push_back(numBytes_arg);
428 CFSCWB_arguments.push_back(encoding_arg);
429 CFSCWB_arguments.push_back(isExternal_arg);
430
431 CallInst *CFSCWB_call = CallInst::Create(m_CFStringCreateWithBytes,
432 CFSCWB_arguments.begin(),
433 CFSCWB_arguments.end(),
434 "CFStringCreateWithBytes",
435 FirstEntryInstruction);
Sean Callananae71e302010-11-18 22:21:58 +0000436
Greg Clayton3c7feb42010-11-19 01:05:25 +0000437 if (!UnfoldConstant(ns_str, CFSCWB_call, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000438 {
439 if (log)
440 log->PutCString("Couldn't replace the NSString with the result of the call");
441
442 return false;
443 }
444
Greg Clayton3c7feb42010-11-19 01:05:25 +0000445 ns_str->eraseFromParent();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000446
447 return true;
448}
449
450bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000451IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_function)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000452{
453 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
454
Greg Clayton3c7feb42010-11-19 01:05:25 +0000455 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000456
Greg Clayton3c7feb42010-11-19 01:05:25 +0000457 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000458 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
459
460 if (!FirstEntryInstruction)
461 {
462 if (log)
463 log->PutCString("Couldn't find first instruction for rewritten Objective-C strings");
464
465 return false;
466 }
467
468 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
469 vi != ve;
470 ++vi)
471 {
472 if (strstr(vi->first(), "_unnamed_cfstring_"))
473 {
474 Value *nsstring_value = vi->second;
475
476 GlobalVariable *nsstring_global = dyn_cast<GlobalVariable>(nsstring_value);
477
478 if (!nsstring_global)
479 {
480 if (log)
481 log->PutCString("NSString variable is not a GlobalVariable");
482 return false;
483 }
484
485 if (!nsstring_global->hasInitializer())
486 {
487 if (log)
488 log->PutCString("NSString variable does not have an initializer");
489 return false;
490 }
491
492 ConstantStruct *nsstring_struct = dyn_cast<ConstantStruct>(nsstring_global->getInitializer());
493
494 if (!nsstring_struct)
495 {
496 if (log)
497 log->PutCString("NSString variable's initializer is not a ConstantStruct");
498 return false;
499 }
500
501 // We expect the following structure:
502 //
503 // struct {
504 // int *isa;
505 // int flags;
506 // char *str;
507 // long length;
508 // };
509
510 if (nsstring_struct->getNumOperands() != 4)
511 {
512 if (log)
513 log->Printf("NSString variable's initializer structure has an unexpected number of members. Should be 4, is %d", nsstring_struct->getNumOperands());
514 return false;
515 }
516
517 Constant *nsstring_member = nsstring_struct->getOperand(2);
518
519 if (!nsstring_member)
520 {
521 if (log)
522 log->PutCString("NSString initializer's str element was empty");
523 return false;
524 }
525
526 ConstantExpr *nsstring_expr = dyn_cast<ConstantExpr>(nsstring_member);
527
528 if (!nsstring_expr)
529 {
530 if (log)
531 log->PutCString("NSString initializer's str element is not a ConstantExpr");
532 return false;
533 }
534
535 if (nsstring_expr->getOpcode() != Instruction::GetElementPtr)
536 {
537 if (log)
538 log->Printf("NSString initializer's str element is not a GetElementPtr expression, it's a %s", nsstring_expr->getOpcodeName());
539 return false;
540 }
541
542 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
543
544 GlobalVariable *cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
545
546 if (!cstr_global)
547 {
548 if (log)
549 log->PutCString("NSString initializer's str element is not a GlobalVariable");
Sean Callanan65e2aee2010-11-20 02:06:01 +0000550
Sean Callanan6ba533e2010-11-17 23:00:36 +0000551 return false;
552 }
553
554 if (!cstr_global->hasInitializer())
555 {
556 if (log)
557 log->PutCString("NSString initializer's str element does not have an initializer");
558 return false;
559 }
560
561 ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer());
562
563 if (!cstr_array)
564 {
565 if (log)
566 log->PutCString("NSString initializer's str element is not a ConstantArray");
567 return false;
568 }
569
570 if (!cstr_array->isCString())
571 {
572 if (log)
573 log->PutCString("NSString initializer's str element is not a C string array");
574 return false;
575 }
576
577 if (log)
578 log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str());
579
Greg Clayton3c7feb42010-11-19 01:05:25 +0000580 if (!RewriteObjCConstString(llvm_module, nsstring_global, cstr_global, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000581 {
582 if (log)
583 log->PutCString("Error rewriting the constant string");
584 return false;
585 }
586
587
588 }
589 }
590
591 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
592 vi != ve;
593 ++vi)
594 {
595 if (!strcmp(vi->first(), "__CFConstantStringClassReference"))
596 {
597 GlobalVariable *gv = dyn_cast<GlobalVariable>(vi->second);
598
599 if (!gv)
600 {
601 if (log)
602 log->PutCString("__CFConstantStringClassReference is not a global variable");
603 return false;
604 }
605
606 gv->eraseFromParent();
607
608 break;
609 }
610 }
611
612 return true;
613}
614
Greg Clayton3c7feb42010-11-19 01:05:25 +0000615static bool IsObjCSelectorRef (Value *value)
Sean Callananf5857a02010-07-31 01:32:05 +0000616{
Greg Clayton3c7feb42010-11-19 01:05:25 +0000617 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
Sean Callananf5857a02010-07-31 01:32:05 +0000618
Greg Clayton3c7feb42010-11-19 01:05:25 +0000619 if (!global_variable || !global_variable->hasName() || !global_variable->getName().startswith("\01L_OBJC_SELECTOR_REFERENCES_"))
Sean Callananf5857a02010-07-31 01:32:05 +0000620 return false;
621
622 return true;
623}
624
625bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000626IRForTarget::RewriteObjCSelector (Instruction* selector_load, Module &llvm_module)
Sean Callananf5857a02010-07-31 01:32:05 +0000627{
Greg Claytone005f2c2010-11-06 01:53:30 +0000628 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000629
630 LoadInst *load = dyn_cast<LoadInst>(selector_load);
631
632 if (!load)
633 return false;
634
635 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend gets represented as
636 //
637 // %tmp = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_" ; <i8*>
638 // %call = call i8* (i8*, i8*, ...)* @objc_msgSend(i8* %obj, i8* %tmp, ...) ; <i8*>
639 //
640 // where %obj is the object pointer and %tmp is the selector.
641 //
Greg Clayton3c7feb42010-11-19 01:05:25 +0000642 // @"\01L_OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_".
643 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_" contains the string.
Sean Callananf5857a02010-07-31 01:32:05 +0000644
645 // Find the pointer's initializer (a ConstantExpr with opcode GetElementPtr) and get the string from its target
646
647 GlobalVariable *_objc_selector_references_ = dyn_cast<GlobalVariable>(load->getPointerOperand());
648
649 if (!_objc_selector_references_ || !_objc_selector_references_->hasInitializer())
650 return false;
651
652 Constant *osr_initializer = _objc_selector_references_->getInitializer();
653
654 ConstantExpr *osr_initializer_expr = dyn_cast<ConstantExpr>(osr_initializer);
655
656 if (!osr_initializer_expr || osr_initializer_expr->getOpcode() != Instruction::GetElementPtr)
657 return false;
658
659 Value *osr_initializer_base = osr_initializer_expr->getOperand(0);
660
661 if (!osr_initializer_base)
662 return false;
663
664 // Find the string's initializer (a ConstantArray) and get the string from it
665
666 GlobalVariable *_objc_meth_var_name_ = dyn_cast<GlobalVariable>(osr_initializer_base);
667
668 if (!_objc_meth_var_name_ || !_objc_meth_var_name_->hasInitializer())
669 return false;
670
671 Constant *omvn_initializer = _objc_meth_var_name_->getInitializer();
672
673 ConstantArray *omvn_initializer_array = dyn_cast<ConstantArray>(omvn_initializer);
674
675 if (!omvn_initializer_array->isString())
676 return false;
677
678 std::string omvn_initializer_string = omvn_initializer_array->getAsString();
679
680 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000681 log->Printf("Found Objective-C selector reference \"%s\"", omvn_initializer_string.c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000682
683 // Construct a call to sel_registerName
684
685 if (!m_sel_registerName)
686 {
Greg Claytonb5037af2010-11-15 01:47:11 +0000687 lldb::addr_t sel_registerName_addr;
Sean Callananf5857a02010-07-31 01:32:05 +0000688
Greg Clayton8de27c72010-10-15 22:48:33 +0000689 static lldb_private::ConstString g_sel_registerName_str ("sel_registerName");
Greg Claytonb5037af2010-11-15 01:47:11 +0000690 if (!m_decl_map->GetFunctionAddress (g_sel_registerName_str, sel_registerName_addr))
Sean Callananf5857a02010-07-31 01:32:05 +0000691 return false;
692
Sean Callananc2c6f772010-10-26 00:31:56 +0000693 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000694 log->Printf("Found sel_registerName at 0x%llx", sel_registerName_addr);
Sean Callananc2c6f772010-10-26 00:31:56 +0000695
Sean Callananf5857a02010-07-31 01:32:05 +0000696 // Build the function type: struct objc_selector *sel_registerName(uint8_t*)
697
698 // The below code would be "more correct," but in actuality what's required is uint8_t*
Greg Clayton3c7feb42010-11-19 01:05:25 +0000699 //Type *sel_type = StructType::get(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000700 //Type *sel_ptr_type = PointerType::getUnqual(sel_type);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000701 const Type *sel_ptr_type = Type::getInt8PtrTy(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000702
703 std::vector <const Type *> srN_arg_types;
Greg Clayton3c7feb42010-11-19 01:05:25 +0000704 srN_arg_types.push_back(Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000705 llvm::Type *srN_type = FunctionType::get(sel_ptr_type, srN_arg_types, false);
706
707 // Build the constant containing the pointer to the function
Greg Clayton3c7feb42010-11-19 01:05:25 +0000708 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
709 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callananf5857a02010-07-31 01:32:05 +0000710 PointerType *srN_ptr_ty = PointerType::getUnqual(srN_type);
Greg Claytonb5037af2010-11-15 01:47:11 +0000711 Constant *srN_addr_int = ConstantInt::get(intptr_ty, sel_registerName_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +0000712 m_sel_registerName = ConstantExpr::getIntToPtr(srN_addr_int, srN_ptr_ty);
713 }
714
715 SmallVector <Value*, 1> srN_arguments;
716
Greg Clayton3c7feb42010-11-19 01:05:25 +0000717 Constant *omvn_pointer = ConstantExpr::getBitCast(_objc_meth_var_name_, Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000718
719 srN_arguments.push_back(omvn_pointer);
720
721 CallInst *srN_call = CallInst::Create(m_sel_registerName,
722 srN_arguments.begin(),
723 srN_arguments.end(),
Sean Callanan6ba533e2010-11-17 23:00:36 +0000724 "sel_registerName",
Sean Callananf5857a02010-07-31 01:32:05 +0000725 selector_load);
726
727 // Replace the load with the call in all users
728
729 selector_load->replaceAllUsesWith(srN_call);
730
731 selector_load->eraseFromParent();
732
733 return true;
734}
735
736bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000737IRForTarget::RewriteObjCSelectors (Module &llvm_module, BasicBlock &basic_block)
Sean Callananf5857a02010-07-31 01:32:05 +0000738{
Greg Claytone005f2c2010-11-06 01:53:30 +0000739 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000740
741 BasicBlock::iterator ii;
742
743 typedef SmallVector <Instruction*, 2> InstrList;
744 typedef InstrList::iterator InstrIterator;
745
746 InstrList selector_loads;
747
Greg Clayton3c7feb42010-11-19 01:05:25 +0000748 for (ii = basic_block.begin();
749 ii != basic_block.end();
Sean Callananf5857a02010-07-31 01:32:05 +0000750 ++ii)
751 {
752 Instruction &inst = *ii;
753
754 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
Greg Clayton3c7feb42010-11-19 01:05:25 +0000755 if (IsObjCSelectorRef(load->getPointerOperand()))
Sean Callananf5857a02010-07-31 01:32:05 +0000756 selector_loads.push_back(&inst);
757 }
758
759 InstrIterator iter;
760
761 for (iter = selector_loads.begin();
762 iter != selector_loads.end();
763 ++iter)
764 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000765 if (!RewriteObjCSelector(*iter, llvm_module))
Sean Callananf5857a02010-07-31 01:32:05 +0000766 {
767 if(log)
768 log->PutCString("Couldn't rewrite a reference to an Objective-C selector");
769 return false;
770 }
771 }
772
773 return true;
774}
775
Sean Callanana48fe162010-08-11 03:57:18 +0000776bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000777IRForTarget::RewritePersistentAlloc (llvm::Instruction *persistent_alloc,
778 llvm::Module &llvm_module)
Sean Callanana48fe162010-08-11 03:57:18 +0000779{
780 AllocaInst *alloc = dyn_cast<AllocaInst>(persistent_alloc);
781
782 MDNode *alloc_md = alloc->getMetadata("clang.decl.ptr");
783
784 if (!alloc_md || !alloc_md->getNumOperands())
785 return false;
786
787 ConstantInt *constant_int = dyn_cast<ConstantInt>(alloc_md->getOperand(0));
788
789 if (!constant_int)
790 return false;
791
792 // We attempt to register this as a new persistent variable with the DeclMap.
793
794 uintptr_t ptr = constant_int->getZExtValue();
795
Sean Callanan82b74c82010-08-12 01:56:52 +0000796 clang::VarDecl *decl = reinterpret_cast<clang::VarDecl *>(ptr);
Sean Callanana48fe162010-08-11 03:57:18 +0000797
Sean Callanan82b74c82010-08-12 01:56:52 +0000798 lldb_private::TypeFromParser result_decl_type (decl->getType().getAsOpaquePtr(),
799 &decl->getASTContext());
800
Greg Clayton8de27c72010-10-15 22:48:33 +0000801 StringRef decl_name (decl->getName());
802 lldb_private::ConstString persistent_variable_name (decl_name.data(), decl_name.size());
803 if (!m_decl_map->AddPersistentVariable(decl, persistent_variable_name, result_decl_type))
Sean Callanana48fe162010-08-11 03:57:18 +0000804 return false;
805
Greg Clayton8de27c72010-10-15 22:48:33 +0000806 GlobalVariable *persistent_global = new GlobalVariable(llvm_module,
Sean Callanana48fe162010-08-11 03:57:18 +0000807 alloc->getType()->getElementType(),
808 false, /* not constant */
809 GlobalValue::ExternalLinkage,
810 NULL, /* no initializer */
811 alloc->getName().str().c_str());
812
813 // What we're going to do here is make believe this was a regular old external
814 // variable. That means we need to make the metadata valid.
815
Greg Clayton8de27c72010-10-15 22:48:33 +0000816 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanana48fe162010-08-11 03:57:18 +0000817
818 llvm::Value* values[2];
819 values[0] = persistent_global;
820 values[1] = constant_int;
821
Greg Clayton8de27c72010-10-15 22:48:33 +0000822 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanana48fe162010-08-11 03:57:18 +0000823 named_metadata->addOperand(persistent_global_md);
824
825 alloc->replaceAllUsesWith(persistent_global);
826 alloc->eraseFromParent();
827
828 return true;
829}
830
831bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000832IRForTarget::RewritePersistentAllocs(llvm::Module &llvm_module, llvm::BasicBlock &basic_block)
Sean Callanana48fe162010-08-11 03:57:18 +0000833{
Sean Callanane8a59a82010-09-13 21:34:21 +0000834 if (!m_resolve_vars)
835 return true;
836
Greg Claytone005f2c2010-11-06 01:53:30 +0000837 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanana48fe162010-08-11 03:57:18 +0000838
839 BasicBlock::iterator ii;
840
841 typedef SmallVector <Instruction*, 2> InstrList;
842 typedef InstrList::iterator InstrIterator;
843
844 InstrList pvar_allocs;
845
Greg Clayton3c7feb42010-11-19 01:05:25 +0000846 for (ii = basic_block.begin();
847 ii != basic_block.end();
Sean Callanana48fe162010-08-11 03:57:18 +0000848 ++ii)
849 {
850 Instruction &inst = *ii;
851
852 if (AllocaInst *alloc = dyn_cast<AllocaInst>(&inst))
Sean Callanan03c997b2010-10-21 22:41:32 +0000853 if (alloc->getName().startswith("$") &&
854 !alloc->getName().startswith("$__lldb"))
Sean Callanana48fe162010-08-11 03:57:18 +0000855 pvar_allocs.push_back(alloc);
856 }
857
858 InstrIterator iter;
859
860 for (iter = pvar_allocs.begin();
861 iter != pvar_allocs.end();
862 ++iter)
863 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000864 if (!RewritePersistentAlloc(*iter, llvm_module))
Sean Callanana48fe162010-08-11 03:57:18 +0000865 {
866 if(log)
867 log->PutCString("Couldn't rewrite the creation of a persistent variable");
868 return false;
869 }
870 }
871
872 return true;
873}
874
Sean Callanan8bce6652010-07-13 21:41:46 +0000875static clang::NamedDecl *
Greg Clayton3c7feb42010-11-19 01:05:25 +0000876DeclForGlobalValue(Module &module, GlobalValue *global_value)
Sean Callanan8bce6652010-07-13 21:41:46 +0000877{
878 NamedMDNode *named_metadata = module.getNamedMetadata("clang.global.decl.ptrs");
879
880 if (!named_metadata)
881 return NULL;
882
883 unsigned num_nodes = named_metadata->getNumOperands();
884 unsigned node_index;
885
886 for (node_index = 0;
887 node_index < num_nodes;
888 ++node_index)
889 {
890 MDNode *metadata_node = named_metadata->getOperand(node_index);
891
892 if (!metadata_node)
893 return NULL;
894
895 if (metadata_node->getNumOperands() != 2)
Sean Callanana48fe162010-08-11 03:57:18 +0000896 continue;
Sean Callanan8bce6652010-07-13 21:41:46 +0000897
898 if (metadata_node->getOperand(0) != global_value)
899 continue;
900
901 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
902
903 if (!constant_int)
904 return NULL;
905
906 uintptr_t ptr = constant_int->getZExtValue();
907
908 return reinterpret_cast<clang::NamedDecl *>(ptr);
909 }
910
911 return NULL;
912}
913
914bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000915IRForTarget::MaybeHandleVariable (Module &llvm_module, Value *llvm_value_ptr)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +0000916{
Greg Claytone005f2c2010-11-06 01:53:30 +0000917 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan48443652010-12-02 19:47:57 +0000918
919 if (log)
Sean Callananb9f09a62010-12-06 22:16:55 +0000920 log->Printf("MaybeHandleVariable (%s)", PrintValue(llvm_value_ptr).c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000921
Greg Clayton8de27c72010-10-15 22:48:33 +0000922 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr))
Sean Callananbc2928a2010-08-03 00:23:29 +0000923 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000924 switch (constant_expr->getOpcode())
Sean Callananbc2928a2010-08-03 00:23:29 +0000925 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000926 default:
927 break;
928 case Instruction::GetElementPtr:
929 case Instruction::BitCast:
Sean Callananbc2928a2010-08-03 00:23:29 +0000930 Value *s = constant_expr->getOperand(0);
Sean Callanan48443652010-12-02 19:47:57 +0000931 if (!MaybeHandleVariable(llvm_module, s))
932 return false;
Sean Callananbc2928a2010-08-03 00:23:29 +0000933 }
934 }
Sean Callananf921cf52010-12-03 19:51:05 +0000935 else if (GlobalVariable *global_variable = dyn_cast<GlobalVariable>(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +0000936 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000937 clang::NamedDecl *named_decl = DeclForGlobalValue(llvm_module, global_variable);
Sean Callanan5cf4a1c2010-07-03 01:35:46 +0000938
Sean Callananf5857a02010-07-31 01:32:05 +0000939 if (!named_decl)
940 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000941 if (IsObjCSelectorRef(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +0000942 return true;
943
Sean Callanan7cd46742010-12-06 00:56:39 +0000944 if (!global_variable->hasExternalLinkage())
945 return true;
946
Sean Callananf5857a02010-07-31 01:32:05 +0000947 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000948 log->Printf("Found global variable \"%s\" without metadata", global_variable->getName().str().c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000949 return false;
950 }
951
Greg Clayton8de27c72010-10-15 22:48:33 +0000952 std::string name (named_decl->getName().str());
Sean Callanan810f22d2010-07-16 00:09:46 +0000953
Sean Callanan771131d2010-09-30 21:18:25 +0000954 void *opaque_type = NULL;
Sean Callananf328c9f2010-07-20 23:31:16 +0000955 clang::ASTContext *ast_context = NULL;
Sean Callanan810f22d2010-07-16 00:09:46 +0000956
957 if (clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl))
Sean Callananf328c9f2010-07-20 23:31:16 +0000958 {
Sean Callanan771131d2010-09-30 21:18:25 +0000959 opaque_type = value_decl->getType().getAsOpaquePtr();
Sean Callananf328c9f2010-07-20 23:31:16 +0000960 ast_context = &value_decl->getASTContext();
961 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000962 else
Sean Callananf328c9f2010-07-20 23:31:16 +0000963 {
Sean Callanan810f22d2010-07-16 00:09:46 +0000964 return false;
Sean Callananf328c9f2010-07-20 23:31:16 +0000965 }
Sean Callanan771131d2010-09-30 21:18:25 +0000966
967 clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_type));
Sean Callananf328c9f2010-07-20 23:31:16 +0000968
Sean Callanan02fbafa2010-07-27 21:39:39 +0000969 const Type *value_type = global_variable->getType();
Sean Callanan771131d2010-09-30 21:18:25 +0000970
971 size_t value_size = (ast_context->getTypeSize(qual_type) + 7) / 8;
972 off_t value_alignment = (ast_context->getTypeAlign(qual_type) + 7) / 8;
Sean Callanan3aa7da52010-12-13 22:46:15 +0000973
Sean Callanan771131d2010-09-30 21:18:25 +0000974 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000975 log->Printf("Type of \"%s\" is [clang \"%s\", lldb \"%s\"] [size %d, align %d]",
Sean Callanan771131d2010-09-30 21:18:25 +0000976 name.c_str(),
977 qual_type.getAsString().c_str(),
978 PrintType(value_type).c_str(),
979 value_size,
980 value_alignment);
Sean Callanan3aa7da52010-12-13 22:46:15 +0000981
Sean Callanan8bce6652010-07-13 21:41:46 +0000982
Sean Callanan8c127202010-08-23 23:09:38 +0000983 if (named_decl && !m_decl_map->AddValueToStruct(named_decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000984 lldb_private::ConstString (name.c_str()),
985 llvm_value_ptr,
Sean Callananba992c52010-07-27 02:07:53 +0000986 value_size,
987 value_alignment))
Sean Callanan8bce6652010-07-13 21:41:46 +0000988 return false;
989 }
Sean Callananf3143b72010-12-03 03:02:31 +0000990 else if (dyn_cast<llvm::Function>(llvm_value_ptr))
Sean Callanan48443652010-12-02 19:47:57 +0000991 {
992 if (log)
993 log->Printf("Function pointers aren't handled right now");
994
995 return false;
996 }
Sean Callanan8bce6652010-07-13 21:41:46 +0000997
998 return true;
999}
1000
1001bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001002IRForTarget::MaybeHandleCallArguments (Module &llvm_module, CallInst *Old)
Sean Callanandc27aba2010-10-05 22:26:43 +00001003{
Sean Callanan48443652010-12-02 19:47:57 +00001004 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1005
1006 if (log)
1007 log->Printf("MaybeHandleCallArguments(%s)", PrintValue(Old).c_str());
Sean Callanandc27aba2010-10-05 22:26:43 +00001008
Sean Callanan6ba533e2010-11-17 23:00:36 +00001009 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
Sean Callanandc27aba2010-10-05 22:26:43 +00001010 op_index < num_ops;
1011 ++op_index)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001012 if (!MaybeHandleVariable(llvm_module, Old->getArgOperand(op_index))) // conservatively believe that this is a store
Sean Callanandc27aba2010-10-05 22:26:43 +00001013 return false;
1014
1015 return true;
1016}
1017
1018bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001019IRForTarget::MaybeHandleCall (Module &llvm_module, CallInst *llvm_call_inst)
Sean Callananba992c52010-07-27 02:07:53 +00001020{
Greg Claytone005f2c2010-11-06 01:53:30 +00001021 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananba992c52010-07-27 02:07:53 +00001022
Greg Clayton8de27c72010-10-15 22:48:33 +00001023 Function *fun = llvm_call_inst->getCalledFunction();
Sean Callananba992c52010-07-27 02:07:53 +00001024
1025 if (fun == NULL)
Sean Callanan65af7342010-09-08 20:04:08 +00001026 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001027 Value *val = llvm_call_inst->getCalledValue();
Sean Callanan65af7342010-09-08 20:04:08 +00001028
1029 ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
1030
1031 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1032 {
1033 fun = dyn_cast<Function>(const_expr->getOperand(0));
1034
1035 if (!fun)
Sean Callanan48443652010-12-02 19:47:57 +00001036 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001037 }
Sean Callananc4217a62010-12-06 23:53:20 +00001038 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1039 {
1040 return true; // already resolved
1041 }
Sean Callanan65af7342010-09-08 20:04:08 +00001042 else
1043 {
Sean Callanan48443652010-12-02 19:47:57 +00001044 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001045 }
1046 }
Sean Callananba992c52010-07-27 02:07:53 +00001047
Greg Clayton8de27c72010-10-15 22:48:33 +00001048 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001049
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001050 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001051 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001052 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001053
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001054 switch (intrinsic_id)
1055 {
1056 default:
1057 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001058 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001059 return false;
1060 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001061 {
1062 static lldb_private::ConstString g_memcpy_str ("memcpy");
1063 str = g_memcpy_str;
1064 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001065 break;
1066 }
Sean Callananc04743d2010-09-28 21:13:03 +00001067
Greg Clayton8de27c72010-10-15 22:48:33 +00001068 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001069 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001070 }
1071 else
1072 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001073 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001074 }
1075
Greg Clayton8de27c72010-10-15 22:48:33 +00001076 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001077 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001078 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001079
Sean Callananf5857a02010-07-31 01:32:05 +00001080 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001081 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001082 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001083 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001084 fun_value_ptr = NULL;
1085
Greg Clayton8de27c72010-10-15 22:48:33 +00001086 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001087 {
1088 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001089 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001090
1091 return false;
1092 }
Sean Callananf5857a02010-07-31 01:32:05 +00001093 }
1094 }
1095 else
1096 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001097 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001098 {
1099 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001100 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callananf5857a02010-07-31 01:32:05 +00001101 }
Sean Callananba992c52010-07-27 02:07:53 +00001102 }
1103
1104 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001105 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001106
Sean Callananf5857a02010-07-31 01:32:05 +00001107 Value *fun_addr_ptr;
1108
1109 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001110 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001111 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1112 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001113 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001114 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1115 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001116 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1117
1118 if (fun_value_ptr)
1119 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001120 }
Sean Callananf5857a02010-07-31 01:32:05 +00001121
1122 if (fun_value_ptr)
1123 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001124
Greg Clayton8de27c72010-10-15 22:48:33 +00001125 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001126
Greg Clayton8de27c72010-10-15 22:48:33 +00001127 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001128
1129 Value *values[1];
1130 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001131 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001132
Greg Clayton8de27c72010-10-15 22:48:33 +00001133 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001134
1135 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001136 log->Printf("Set metadata for %p [%d, \"%s\"]", llvm_call_inst, func_name->isString(), func_name->getAsString().c_str());
Sean Callanane8a59a82010-09-13 21:34:21 +00001137
Sean Callananba992c52010-07-27 02:07:53 +00001138 return true;
1139}
1140
1141bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001142IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001143{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001144 /////////////////////////////////////////////////////////////////////////
1145 // Prepare the current basic block for execution in the remote process
1146 //
1147
Sean Callanan02fbafa2010-07-27 21:39:39 +00001148 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001149
Greg Clayton3c7feb42010-11-19 01:05:25 +00001150 for (ii = basic_block.begin();
1151 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001152 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001153 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001154 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001155
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001156 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001157
Greg Clayton3c7feb42010-11-19 01:05:25 +00001158 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001159 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001160
1161 if (call && !MaybeHandleCallArguments(llvm_module, call))
1162 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001163 }
1164
1165 return true;
1166}
1167
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001168bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001169IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001170{
Sean Callananae71e302010-11-18 22:21:58 +00001171 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1172
Greg Clayton3c7feb42010-11-19 01:05:25 +00001173 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001174 global != end;
1175 ++global)
1176 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001177 if (log)
1178 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1179 (*global).getName().str().c_str(),
1180 DeclForGlobalValue(llvm_module, global));
1181
1182 if (DeclForGlobalValue(llvm_module, global) &&
1183 !MaybeHandleVariable (llvm_module, global))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001184 return false;
1185 }
1186
1187 return true;
1188}
1189
Sean Callanan02fbafa2010-07-27 21:39:39 +00001190static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001191{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001192 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001193
Sean Callanan6ba533e2010-11-17 23:00:36 +00001194 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001195 return false;
1196
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001197 ConstantExpr *CE;
1198
1199 if ((CE = dyn_cast<ConstantExpr>(V)))
1200 {
1201 if (CE->getOpcode() != Instruction::BitCast)
1202 return false;
1203
Sean Callanan6ba533e2010-11-17 23:00:36 +00001204 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001205 }
1206
Sean Callanan6ba533e2010-11-17 23:00:36 +00001207 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001208
1209 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1210 return false;
1211
1212 return true;
1213}
1214
Greg Clayton3c7feb42010-11-19 01:05:25 +00001215static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001216{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001217 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001218
1219 Value::use_iterator ui;
1220
1221 for (ui = guard_load->use_begin();
1222 ui != guard_load->use_end();
1223 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001224 {
Greg Clayton6e713402010-07-30 20:30:44 +00001225 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001226 {
1227 // do nothing for the moment
1228 }
1229 else
1230 {
1231 ui->replaceUsesOfWith(guard_load, zero);
1232 }
1233 }
Sean Callanan45839272010-07-24 01:37:44 +00001234
1235 guard_load->eraseFromParent();
1236}
1237
1238static void ExciseGuardStore(Instruction* guard_store)
1239{
1240 guard_store->eraseFromParent();
1241}
1242
1243bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001244IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001245{
1246 ///////////////////////////////////////////////////////
1247 // Eliminate any reference to guard variables found.
1248 //
1249
Sean Callanan02fbafa2010-07-27 21:39:39 +00001250 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001251
Sean Callanan02fbafa2010-07-27 21:39:39 +00001252 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001253 typedef InstrList::iterator InstrIterator;
1254
1255 InstrList guard_loads;
1256 InstrList guard_stores;
1257
Greg Clayton3c7feb42010-11-19 01:05:25 +00001258 for (ii = basic_block.begin();
1259 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001260 ++ii)
1261 {
1262 Instruction &inst = *ii;
1263
1264 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1265 if (isGuardVariableRef(load->getPointerOperand()))
1266 guard_loads.push_back(&inst);
1267
1268 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1269 if (isGuardVariableRef(store->getPointerOperand()))
1270 guard_stores.push_back(&inst);
1271 }
1272
1273 InstrIterator iter;
1274
1275 for (iter = guard_loads.begin();
1276 iter != guard_loads.end();
1277 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001278 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001279
1280 for (iter = guard_stores.begin();
1281 iter != guard_stores.end();
1282 ++iter)
1283 ExciseGuardStore(*iter);
1284
1285 return true;
1286}
1287
Sean Callanan6ba533e2010-11-17 23:00:36 +00001288bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001289IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001290{
Greg Claytone005f2c2010-11-06 01:53:30 +00001291 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001292
1293 Value::use_iterator ui;
1294
Sean Callanana48fe162010-08-11 03:57:18 +00001295 SmallVector<User*, 16> users;
1296
1297 // We do this because the use list might change, invalidating our iterator.
1298 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001299 for (ui = old_constant->use_begin();
1300 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001301 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001302 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001303
Sean Callanana48fe162010-08-11 03:57:18 +00001304 for (int i = 0;
1305 i < users.size();
1306 ++i)
1307 {
1308 User *user = users[i];
1309
Sean Callananbafd6852010-07-14 23:40:29 +00001310 if (Constant *constant = dyn_cast<Constant>(user))
1311 {
1312 // synthesize a new non-constant equivalent of the constant
1313
1314 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1315 {
1316 switch (constant_expr->getOpcode())
1317 {
1318 default:
1319 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001320 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001321 return false;
1322 case Instruction::BitCast:
1323 {
1324 // UnaryExpr
1325 // OperandList[0] is value
1326
1327 Value *s = constant_expr->getOperand(0);
1328
Greg Clayton3c7feb42010-11-19 01:05:25 +00001329 if (s == old_constant)
1330 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001331
Greg Clayton3c7feb42010-11-19 01:05:25 +00001332 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001333
Greg Clayton3c7feb42010-11-19 01:05:25 +00001334 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001335 }
1336 break;
1337 case Instruction::GetElementPtr:
1338 {
1339 // GetElementPtrConstantExpr
1340 // OperandList[0] is base
1341 // OperandList[1]... are indices
1342
1343 Value *ptr = constant_expr->getOperand(0);
1344
Greg Clayton3c7feb42010-11-19 01:05:25 +00001345 if (ptr == old_constant)
1346 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001347
1348 SmallVector<Value*, 16> indices;
1349
1350 unsigned operand_index;
1351 unsigned num_operands = constant_expr->getNumOperands();
1352
1353 for (operand_index = 1;
1354 operand_index < num_operands;
1355 ++operand_index)
1356 {
1357 Value *operand = constant_expr->getOperand(operand_index);
1358
Greg Clayton3c7feb42010-11-19 01:05:25 +00001359 if (operand == old_constant)
1360 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001361
1362 indices.push_back(operand);
1363 }
1364
Greg Clayton3c7feb42010-11-19 01:05:25 +00001365 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001366
Greg Clayton3c7feb42010-11-19 01:05:25 +00001367 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001368 }
1369 break;
1370 }
1371 }
1372 else
1373 {
1374 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001375 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001376 return false;
1377 }
1378 }
1379 else
1380 {
1381 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001382 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001383 }
1384 }
1385
1386 return true;
1387}
1388
Sean Callanan8bce6652010-07-13 21:41:46 +00001389bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001390IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001391{
Sean Callanane8a59a82010-09-13 21:34:21 +00001392 if (!m_resolve_vars)
1393 return true;
1394
Greg Claytone005f2c2010-11-06 01:53:30 +00001395 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001396
1397 m_decl_map->DoStructLayout();
1398
1399 if (log)
1400 log->Printf("Element arrangement:");
1401
1402 uint32_t num_elements;
1403 uint32_t element_index;
1404
1405 size_t size;
1406 off_t alignment;
1407
1408 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1409 return false;
1410
Greg Clayton3c7feb42010-11-19 01:05:25 +00001411 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001412
Greg Clayton3c7feb42010-11-19 01:05:25 +00001413 if (iter == llvm_function.getArgumentList().end())
Sean Callanan8bce6652010-07-13 21:41:46 +00001414 return false;
1415
Sean Callanan02fbafa2010-07-27 21:39:39 +00001416 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001417
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001418 if (argument->getName().equals("this"))
1419 {
1420 ++iter;
1421
Greg Clayton3c7feb42010-11-19 01:05:25 +00001422 if (iter == llvm_function.getArgumentList().end())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001423 return false;
1424
1425 argument = iter;
1426 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001427 else if (argument->getName().equals("self"))
1428 {
1429 ++iter;
1430
1431 if (iter == llvm_function.getArgumentList().end())
1432 return false;
1433
1434 if (!iter->getName().equals("_cmd"))
1435 return false;
1436
1437 ++iter;
1438
1439 if (iter == llvm_function.getArgumentList().end())
1440 return false;
1441
1442 argument = iter;
1443 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001444
Greg Clayton8de27c72010-10-15 22:48:33 +00001445 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan8bce6652010-07-13 21:41:46 +00001446 return false;
1447
1448 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001449 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001450
Greg Clayton3c7feb42010-11-19 01:05:25 +00001451 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001452 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001453
Sean Callanan6ba533e2010-11-17 23:00:36 +00001454 if (!FirstEntryInstruction)
Sean Callanan8bce6652010-07-13 21:41:46 +00001455 return false;
1456
Greg Clayton3c7feb42010-11-19 01:05:25 +00001457 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001458 const IntegerType *offset_type(Type::getInt32Ty(context));
1459
1460 if (!offset_type)
1461 return false;
1462
1463 for (element_index = 0; element_index < num_elements; ++element_index)
1464 {
1465 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001466 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001467 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001468 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001469
Sean Callanan45690fe2010-08-30 22:17:16 +00001470 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan8bce6652010-07-13 21:41:46 +00001471 return false;
1472
1473 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001474 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001475 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001476 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001477 PrintValue(value, true).c_str(),
1478 offset);
1479
1480 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001481 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
1482 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
Sean Callanan8bce6652010-07-13 21:41:46 +00001483
Sean Callananbafd6852010-07-14 23:40:29 +00001484 if (Constant *constant = dyn_cast<Constant>(value))
Sean Callanan6ba533e2010-11-17 23:00:36 +00001485 UnfoldConstant(constant, bit_cast, FirstEntryInstruction);
Sean Callananbafd6852010-07-14 23:40:29 +00001486 else
1487 value->replaceAllUsesWith(bit_cast);
Sean Callananb51ee982010-11-02 23:51:17 +00001488
1489 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1490 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001491 }
1492
1493 if (log)
1494 log->Printf("Total structure [align %d, size %d]", alignment, size);
1495
1496 return true;
1497}
1498
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001499bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001500IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001501{
Greg Claytone005f2c2010-11-06 01:53:30 +00001502 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001503
Greg Clayton3c7feb42010-11-19 01:05:25 +00001504 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001505
1506 if (!function)
1507 {
1508 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001509 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001510
1511 return false;
1512 }
1513
Sean Callanan02fbafa2010-07-27 21:39:39 +00001514 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001515
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001516 m_has_side_effects = HasSideEffects(llvm_module, *function);
1517
Sean Callanan82b74c82010-08-12 01:56:52 +00001518 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001519 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001520 //
1521
Greg Clayton3c7feb42010-11-19 01:05:25 +00001522 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001523 {
1524 if (log)
1525 log->Printf("CreateResultVariable() failed");
Sean Callanan82b74c82010-08-12 01:56:52 +00001526 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001527 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001528
Sean Callanan6ba533e2010-11-17 23:00:36 +00001529 ///////////////////////////////////////////////////////////////////////////////
1530 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1531 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001532
Greg Clayton3c7feb42010-11-19 01:05:25 +00001533 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001534 {
1535 if (log)
1536 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan6ba533e2010-11-17 23:00:36 +00001537 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001538 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001539
Sean Callananf5857a02010-07-31 01:32:05 +00001540 //////////////////////////////////
1541 // Run basic-block level passes
1542 //
1543
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001544 for (bbi = function->begin();
1545 bbi != function->end();
1546 ++bbi)
1547 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001548 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001549 {
1550 if (log)
1551 log->Printf("RemoveGuards() failed");
Sean Callanan8c127202010-08-23 23:09:38 +00001552 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001553 }
Sean Callanan8c127202010-08-23 23:09:38 +00001554
Greg Clayton3c7feb42010-11-19 01:05:25 +00001555 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001556 {
1557 if (log)
1558 log->Printf("RewritePersistentAllocs() failed");
Sean Callananf5857a02010-07-31 01:32:05 +00001559 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001560 }
Sean Callananf5857a02010-07-31 01:32:05 +00001561
Greg Clayton3c7feb42010-11-19 01:05:25 +00001562 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001563 {
1564 if (log)
1565 log->Printf("RewriteObjCSelectors() failed");
Sean Callanana48fe162010-08-11 03:57:18 +00001566 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001567 }
Sean Callanana48fe162010-08-11 03:57:18 +00001568
Greg Clayton3c7feb42010-11-19 01:05:25 +00001569 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001570 {
1571 if (log)
1572 log->Printf("ResolveCalls() failed");
Sean Callanan8bce6652010-07-13 21:41:46 +00001573 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001574 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001575 }
1576
Sean Callanan771131d2010-09-30 21:18:25 +00001577 ///////////////////////////////
1578 // Run function-level passes
1579 //
1580
Greg Clayton3c7feb42010-11-19 01:05:25 +00001581 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001582 {
1583 if (log)
1584 log->Printf("ResolveExternals() failed");
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001585 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001586 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001587
Greg Clayton3c7feb42010-11-19 01:05:25 +00001588 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001589 {
1590 if (log)
1591 log->Printf("ReplaceVariables() failed");
Sean Callanan771131d2010-09-30 21:18:25 +00001592 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001593 }
Sean Callanan771131d2010-09-30 21:18:25 +00001594
Sean Callanan8bce6652010-07-13 21:41:46 +00001595 if (log)
1596 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001597 std::string s;
1598 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001599
Greg Clayton3c7feb42010-11-19 01:05:25 +00001600 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001601
1602 oss.flush();
1603
Greg Claytonb5037af2010-11-15 01:47:11 +00001604 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001605 }
1606
1607 return true;
1608}
1609
1610void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001611IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001612{
1613}
1614
1615PassManagerType
1616IRForTarget::getPotentialPassManagerType() const
1617{
1618 return PMT_ModulePassManager;
1619}