blob: bf4d7aea446e33d73b56ae93aee6f792af49ed81 [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),
Sean Callanan6a925532011-01-13 08:53:35 +000046 m_has_side_effects(false),
47 m_result_is_pointer(false)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000048{
49}
50
Sean Callanan771131d2010-09-30 21:18:25 +000051/* Handy utility functions used at several places in the code */
Sean Callanana48fe162010-08-11 03:57:18 +000052
53static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000054PrintValue(const Value *value, bool truncate = false)
Sean Callanana48fe162010-08-11 03:57:18 +000055{
56 std::string s;
57 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000058 value->print(rso);
Sean Callanana48fe162010-08-11 03:57:18 +000059 rso.flush();
60 if (truncate)
61 s.resize(s.length() - 1);
62 return s;
63}
64
Sean Callanan771131d2010-09-30 21:18:25 +000065static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000066PrintType(const Type *type, bool truncate = false)
Sean Callanan771131d2010-09-30 21:18:25 +000067{
68 std::string s;
69 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000070 type->print(rso);
Sean Callanan771131d2010-09-30 21:18:25 +000071 rso.flush();
72 if (truncate)
73 s.resize(s.length() - 1);
74 return s;
75}
76
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000077IRForTarget::~IRForTarget()
78{
79}
80
Sean Callanan82b74c82010-08-12 01:56:52 +000081bool
Sean Callanan05a5a1b2010-12-16 03:17:46 +000082IRForTarget::HasSideEffects (llvm::Module &llvm_module,
83 llvm::Function &llvm_function)
84{
85 llvm::Function::iterator bbi;
86 BasicBlock::iterator ii;
87
88 for (bbi = llvm_function.begin();
89 bbi != llvm_function.end();
90 ++bbi)
91 {
92 BasicBlock &basic_block = *bbi;
93
94 for (ii = basic_block.begin();
95 ii != basic_block.end();
96 ++ii)
97 {
98 switch (ii->getOpcode())
99 {
100 default:
101 return true;
102 case Instruction::Store:
103 {
104 StoreInst *store_inst = dyn_cast<StoreInst>(ii);
105
106 Value *store_ptr = store_inst->getPointerOperand();
107
108 if (!isa <AllocaInst> (store_ptr))
109 return true;
110 else
111 break;
112 }
113 case Instruction::Load:
114 case Instruction::Alloca:
115 case Instruction::GetElementPtr:
116 case Instruction::Ret:
117 break;
118 }
119 }
120 }
121
122 return false;
123}
124
125void
126IRForTarget::MaybeSetConstantResult (llvm::Constant *initializer,
127 const lldb_private::ConstString &name,
128 lldb_private::TypeFromParser type)
129{
130 if (!m_const_result)
131 return;
132
133 if (llvm::ConstantInt *init_int = dyn_cast<llvm::ConstantInt>(initializer))
134 {
135 *m_const_result = m_decl_map->BuildIntegerVariable(name, type, init_int->getValue());
136 }
137}
138
139bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000140IRForTarget::CreateResultVariable (llvm::Module &llvm_module, llvm::Function &llvm_function)
Sean Callanan82b74c82010-08-12 01:56:52 +0000141{
Greg Claytone005f2c2010-11-06 01:53:30 +0000142 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000143
Sean Callanane8a59a82010-09-13 21:34:21 +0000144 if (!m_resolve_vars)
145 return true;
146
147 // Find the result variable. If it doesn't exist, we can give up right here.
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000148
Greg Clayton8de27c72010-10-15 22:48:33 +0000149 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000150
151 const char *result_name = NULL;
152
153 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
154 vi != ve;
155 ++vi)
156 {
Sean Callanan6a925532011-01-13 08:53:35 +0000157 if (strstr(vi->first(), "$__lldb_expr_result_ptr") &&
158 !strstr(vi->first(), "GV"))
159 {
160 result_name = vi->first();
161 m_result_is_pointer = true;
162 break;
163 }
164
Greg Clayton8de27c72010-10-15 22:48:33 +0000165 if (strstr(vi->first(), "$__lldb_expr_result") &&
Sean Callananc04743d2010-09-28 21:13:03 +0000166 !strstr(vi->first(), "GV"))
167 {
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000168 result_name = vi->first();
Sean Callanan6a925532011-01-13 08:53:35 +0000169 m_result_is_pointer = false;
Sean Callananc04743d2010-09-28 21:13:03 +0000170 break;
171 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000172 }
173
174 if (!result_name)
175 {
176 if (log)
177 log->PutCString("Couldn't find result variable");
178
179 return true;
180 }
181
Sean Callananc04743d2010-09-28 21:13:03 +0000182 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000183 log->Printf("Result name: \"%s\"", result_name);
Sean Callananc04743d2010-09-28 21:13:03 +0000184
Greg Clayton8de27c72010-10-15 22:48:33 +0000185 Value *result_value = llvm_module.getNamedValue(result_name);
Sean Callanan82b74c82010-08-12 01:56:52 +0000186
187 if (!result_value)
188 {
189 if (log)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000190 log->PutCString("Result variable had no data");
Sean Callanan6a925532011-01-13 08:53:35 +0000191
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000192 return false;
Sean Callanan82b74c82010-08-12 01:56:52 +0000193 }
Sean Callanane8a59a82010-09-13 21:34:21 +0000194
Sean Callanan82b74c82010-08-12 01:56:52 +0000195 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000196 log->Printf("Found result in the IR: \"%s\"", PrintValue(result_value, false).c_str());
Sean Callanan82b74c82010-08-12 01:56:52 +0000197
198 GlobalVariable *result_global = dyn_cast<GlobalVariable>(result_value);
199
200 if (!result_global)
201 {
202 if (log)
203 log->PutCString("Result variable isn't a GlobalVariable");
204 return false;
205 }
206
207 // Find the metadata and follow it to the VarDecl
208
Greg Clayton8de27c72010-10-15 22:48:33 +0000209 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanan82b74c82010-08-12 01:56:52 +0000210
211 if (!named_metadata)
212 {
213 if (log)
214 log->PutCString("No global metadata");
215
216 return false;
217 }
218
219 unsigned num_nodes = named_metadata->getNumOperands();
220 unsigned node_index;
221
222 MDNode *metadata_node = NULL;
223
224 for (node_index = 0;
225 node_index < num_nodes;
226 ++node_index)
227 {
228 metadata_node = named_metadata->getOperand(node_index);
229
230 if (metadata_node->getNumOperands() != 2)
231 continue;
232
233 if (metadata_node->getOperand(0) == result_global)
234 break;
235 }
236
237 if (!metadata_node)
238 {
239 if (log)
240 log->PutCString("Couldn't find result metadata");
241 return false;
242 }
243
244 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
245
Greg Claytonb5037af2010-11-15 01:47:11 +0000246 lldb::addr_t result_decl_intptr = constant_int->getZExtValue();
Sean Callanan82b74c82010-08-12 01:56:52 +0000247
248 clang::VarDecl *result_decl = reinterpret_cast<clang::VarDecl *>(result_decl_intptr);
249
250 // Get the next available result name from m_decl_map and create the persistent
251 // variable for it
252
Sean Callanan6a925532011-01-13 08:53:35 +0000253 lldb_private::TypeFromParser result_decl_type;
254
255 if (m_result_is_pointer)
256 {
257 clang::QualType pointer_qual_type = result_decl->getType();
258 clang::Type *pointer_type = pointer_qual_type.getTypePtr();
259 clang::PointerType *pointer_pointertype = dyn_cast<clang::PointerType>(pointer_type);
260
261 if (!pointer_pointertype)
262 {
263 if (log)
264 log->PutCString("Expected result to have pointer type, but it did not");
265 return false;
266 }
267
268 clang::QualType element_qual_type = pointer_pointertype->getPointeeType();
269
270 result_decl_type = lldb_private::TypeFromParser(element_qual_type.getAsOpaquePtr(),
271 &result_decl->getASTContext());
272 }
273 else
274 {
275 result_decl_type = lldb_private::TypeFromParser(result_decl->getType().getAsOpaquePtr(),
276 &result_decl->getASTContext());
277 }
278
279 m_result_name = m_decl_map->GetPersistentResultName();
280 // If the result is an Lvalue, it is emitted as a pointer; see
281 // ASTResultSynthesizer::SynthesizeBodyResult.
282 m_decl_map->AddPersistentVariable(result_decl,
283 m_result_name,
284 result_decl_type,
285 true,
286 m_result_is_pointer);
Sean Callanan82b74c82010-08-12 01:56:52 +0000287
288 if (log)
Sean Callanan6a925532011-01-13 08:53:35 +0000289 log->Printf("Creating a new result global: \"%s\"", m_result_name.GetCString());
Sean Callanan82b74c82010-08-12 01:56:52 +0000290
291 // Construct a new result global and set up its metadata
292
Greg Clayton8de27c72010-10-15 22:48:33 +0000293 GlobalVariable *new_result_global = new GlobalVariable(llvm_module,
Sean Callanan82b74c82010-08-12 01:56:52 +0000294 result_global->getType()->getElementType(),
295 false, /* not constant */
296 GlobalValue::ExternalLinkage,
297 NULL, /* no initializer */
Sean Callanan6a925532011-01-13 08:53:35 +0000298 m_result_name.GetCString ());
Sean Callanan82b74c82010-08-12 01:56:52 +0000299
300 // It's too late in compilation to create a new VarDecl for this, but we don't
301 // need to. We point the metadata at the old VarDecl. This creates an odd
302 // anomaly: a variable with a Value whose name is something like $0 and a
Greg Clayton8de27c72010-10-15 22:48:33 +0000303 // Decl whose name is $__lldb_expr_result. This condition is handled in
Sean Callanan82b74c82010-08-12 01:56:52 +0000304 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
305 // fixed up.
306
307 ConstantInt *new_constant_int = ConstantInt::get(constant_int->getType(),
308 result_decl_intptr,
309 false);
310
311 llvm::Value* values[2];
312 values[0] = new_result_global;
313 values[1] = new_constant_int;
314
Greg Clayton8de27c72010-10-15 22:48:33 +0000315 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanan82b74c82010-08-12 01:56:52 +0000316 named_metadata->addOperand(persistent_global_md);
317
318 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000319 log->Printf("Replacing \"%s\" with \"%s\"",
Sean Callanan2e2db532010-09-07 22:43:19 +0000320 PrintValue(result_global).c_str(),
Sean Callanan82b74c82010-08-12 01:56:52 +0000321 PrintValue(new_result_global).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000322
323 if (result_global->hasNUses(0))
324 {
325 // We need to synthesize a store for this variable, because otherwise
326 // there's nothing to put into its equivalent persistent variable.
Sean Callanan82b74c82010-08-12 01:56:52 +0000327
Greg Clayton8de27c72010-10-15 22:48:33 +0000328 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan2e2db532010-09-07 22:43:19 +0000329 Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg());
330
331 if (!first_entry_instruction)
332 return false;
333
334 if (!result_global->hasInitializer())
335 {
336 if (log)
337 log->Printf("Couldn't find initializer for unused variable");
338 return false;
339 }
340
341 Constant *initializer = result_global->getInitializer();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000342
343 // Here we write the initializer into a result variable assuming it
344 // can be computed statically.
345
346 if (!m_has_side_effects)
347 {
348 MaybeSetConstantResult (initializer,
Sean Callanan6a925532011-01-13 08:53:35 +0000349 m_result_name,
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000350 result_decl_type);
351 }
Sean Callanan2e2db532010-09-07 22:43:19 +0000352
353 StoreInst *synthesized_store = new StoreInst::StoreInst(initializer,
354 new_result_global,
355 first_entry_instruction);
356
357 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000358 log->Printf("Synthesized result store \"%s\"\n", PrintValue(synthesized_store).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000359 }
360 else
361 {
362 result_global->replaceAllUsesWith(new_result_global);
363 }
364
Sean Callanan82b74c82010-08-12 01:56:52 +0000365 result_global->eraseFromParent();
366
367 return true;
368}
369
Greg Clayton3c7feb42010-11-19 01:05:25 +0000370static void DebugUsers(lldb::LogSP &log, Value *value, uint8_t depth)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000371{
372 if (!depth)
373 return;
374
375 depth--;
376
Greg Clayton3c7feb42010-11-19 01:05:25 +0000377 log->Printf(" <Begin %d users>", value->getNumUses());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000378
Greg Clayton3c7feb42010-11-19 01:05:25 +0000379 for (Value::use_iterator ui = value->use_begin(), ue = value->use_end();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000380 ui != ue;
381 ++ui)
382 {
383 log->Printf(" <Use %p> %s", *ui, PrintValue(*ui).c_str());
384 DebugUsers(log, *ui, depth);
385 }
386
387 log->Printf(" <End uses>");
388}
389
390bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000391IRForTarget::RewriteObjCConstString (llvm::Module &llvm_module,
392 llvm::GlobalVariable *ns_str,
393 llvm::GlobalVariable *cstr,
394 Instruction *FirstEntryInstruction)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000395{
396 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
397
Greg Clayton3c7feb42010-11-19 01:05:25 +0000398 const Type *i8_ptr_ty = Type::getInt8PtrTy(llvm_module.getContext());
399 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
400 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
401 const Type *i32_ty = Type::getInt32Ty(llvm_module.getContext());
402 const Type *i8_ty = Type::getInt8Ty(llvm_module.getContext());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000403
404 if (!m_CFStringCreateWithBytes)
405 {
406 lldb::addr_t CFStringCreateWithBytes_addr;
407
408 static lldb_private::ConstString g_CFStringCreateWithBytes_str ("CFStringCreateWithBytes");
409
410 if (!m_decl_map->GetFunctionAddress (g_CFStringCreateWithBytes_str, CFStringCreateWithBytes_addr))
411 {
412 if (log)
413 log->PutCString("Couldn't find CFStringCreateWithBytes in the target");
414
415 return false;
416 }
417
418 if (log)
419 log->Printf("Found CFStringCreateWithBytes at 0x%llx", CFStringCreateWithBytes_addr);
420
421 // Build the function type:
422 //
423 // CFStringRef CFStringCreateWithBytes (
424 // CFAllocatorRef alloc,
425 // const UInt8 *bytes,
426 // CFIndex numBytes,
427 // CFStringEncoding encoding,
428 // Boolean isExternalRepresentation
429 // );
430 //
431 // We make the following substitutions:
432 //
433 // CFStringRef -> i8*
434 // CFAllocatorRef -> i8*
435 // UInt8 * -> i8*
436 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its pointer size for now)
437 // CFStringEncoding -> i32
438 // Boolean -> i8
439
440 std::vector <const Type *> CFSCWB_arg_types;
441 CFSCWB_arg_types.push_back(i8_ptr_ty);
442 CFSCWB_arg_types.push_back(i8_ptr_ty);
443 CFSCWB_arg_types.push_back(intptr_ty);
444 CFSCWB_arg_types.push_back(i32_ty);
445 CFSCWB_arg_types.push_back(i8_ty);
446 llvm::Type *CFSCWB_ty = FunctionType::get(i8_ptr_ty, CFSCWB_arg_types, false);
447
448 // Build the constant containing the pointer to the function
449 PointerType *CFSCWB_ptr_ty = PointerType::getUnqual(CFSCWB_ty);
450 Constant *CFSCWB_addr_int = ConstantInt::get(intptr_ty, CFStringCreateWithBytes_addr, false);
451 m_CFStringCreateWithBytes = ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty);
452 }
453
Greg Clayton3c7feb42010-11-19 01:05:25 +0000454 ConstantArray *string_array = dyn_cast<ConstantArray>(cstr->getInitializer());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000455
456 SmallVector <Value*, 5> CFSCWB_arguments;
457
458 Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000459 Constant *bytes_arg = ConstantExpr::getBitCast(cstr, i8_ptr_ty);
Sean Callanan6ba533e2010-11-17 23:00:36 +0000460 Constant *numBytes_arg = ConstantInt::get(intptr_ty, string_array->getType()->getNumElements(), false);
461 Constant *encoding_arg = ConstantInt::get(i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */
462 Constant *isExternal_arg = ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */
463
464 CFSCWB_arguments.push_back(alloc_arg);
465 CFSCWB_arguments.push_back(bytes_arg);
466 CFSCWB_arguments.push_back(numBytes_arg);
467 CFSCWB_arguments.push_back(encoding_arg);
468 CFSCWB_arguments.push_back(isExternal_arg);
469
470 CallInst *CFSCWB_call = CallInst::Create(m_CFStringCreateWithBytes,
471 CFSCWB_arguments.begin(),
472 CFSCWB_arguments.end(),
473 "CFStringCreateWithBytes",
474 FirstEntryInstruction);
Sean Callananae71e302010-11-18 22:21:58 +0000475
Greg Clayton3c7feb42010-11-19 01:05:25 +0000476 if (!UnfoldConstant(ns_str, CFSCWB_call, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000477 {
478 if (log)
479 log->PutCString("Couldn't replace the NSString with the result of the call");
480
481 return false;
482 }
483
Greg Clayton3c7feb42010-11-19 01:05:25 +0000484 ns_str->eraseFromParent();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000485
486 return true;
487}
488
489bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000490IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_function)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000491{
492 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
493
Greg Clayton3c7feb42010-11-19 01:05:25 +0000494 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000495
Greg Clayton3c7feb42010-11-19 01:05:25 +0000496 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000497 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
498
499 if (!FirstEntryInstruction)
500 {
501 if (log)
502 log->PutCString("Couldn't find first instruction for rewritten Objective-C strings");
503
504 return false;
505 }
506
507 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
508 vi != ve;
509 ++vi)
510 {
511 if (strstr(vi->first(), "_unnamed_cfstring_"))
512 {
513 Value *nsstring_value = vi->second;
514
515 GlobalVariable *nsstring_global = dyn_cast<GlobalVariable>(nsstring_value);
516
517 if (!nsstring_global)
518 {
519 if (log)
520 log->PutCString("NSString variable is not a GlobalVariable");
521 return false;
522 }
523
524 if (!nsstring_global->hasInitializer())
525 {
526 if (log)
527 log->PutCString("NSString variable does not have an initializer");
528 return false;
529 }
530
531 ConstantStruct *nsstring_struct = dyn_cast<ConstantStruct>(nsstring_global->getInitializer());
532
533 if (!nsstring_struct)
534 {
535 if (log)
536 log->PutCString("NSString variable's initializer is not a ConstantStruct");
537 return false;
538 }
539
540 // We expect the following structure:
541 //
542 // struct {
543 // int *isa;
544 // int flags;
545 // char *str;
546 // long length;
547 // };
548
549 if (nsstring_struct->getNumOperands() != 4)
550 {
551 if (log)
552 log->Printf("NSString variable's initializer structure has an unexpected number of members. Should be 4, is %d", nsstring_struct->getNumOperands());
553 return false;
554 }
555
556 Constant *nsstring_member = nsstring_struct->getOperand(2);
557
558 if (!nsstring_member)
559 {
560 if (log)
561 log->PutCString("NSString initializer's str element was empty");
562 return false;
563 }
564
565 ConstantExpr *nsstring_expr = dyn_cast<ConstantExpr>(nsstring_member);
566
567 if (!nsstring_expr)
568 {
569 if (log)
570 log->PutCString("NSString initializer's str element is not a ConstantExpr");
571 return false;
572 }
573
574 if (nsstring_expr->getOpcode() != Instruction::GetElementPtr)
575 {
576 if (log)
577 log->Printf("NSString initializer's str element is not a GetElementPtr expression, it's a %s", nsstring_expr->getOpcodeName());
578 return false;
579 }
580
581 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
582
583 GlobalVariable *cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
584
585 if (!cstr_global)
586 {
587 if (log)
588 log->PutCString("NSString initializer's str element is not a GlobalVariable");
Sean Callanan65e2aee2010-11-20 02:06:01 +0000589
Sean Callanan6ba533e2010-11-17 23:00:36 +0000590 return false;
591 }
592
593 if (!cstr_global->hasInitializer())
594 {
595 if (log)
596 log->PutCString("NSString initializer's str element does not have an initializer");
597 return false;
598 }
599
600 ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer());
601
602 if (!cstr_array)
603 {
604 if (log)
605 log->PutCString("NSString initializer's str element is not a ConstantArray");
606 return false;
607 }
608
609 if (!cstr_array->isCString())
610 {
611 if (log)
612 log->PutCString("NSString initializer's str element is not a C string array");
613 return false;
614 }
615
616 if (log)
617 log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str());
618
Greg Clayton3c7feb42010-11-19 01:05:25 +0000619 if (!RewriteObjCConstString(llvm_module, nsstring_global, cstr_global, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000620 {
621 if (log)
622 log->PutCString("Error rewriting the constant string");
623 return false;
624 }
625
626
627 }
628 }
629
630 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
631 vi != ve;
632 ++vi)
633 {
634 if (!strcmp(vi->first(), "__CFConstantStringClassReference"))
635 {
636 GlobalVariable *gv = dyn_cast<GlobalVariable>(vi->second);
637
638 if (!gv)
639 {
640 if (log)
641 log->PutCString("__CFConstantStringClassReference is not a global variable");
642 return false;
643 }
644
645 gv->eraseFromParent();
646
647 break;
648 }
649 }
650
651 return true;
652}
653
Greg Clayton3c7feb42010-11-19 01:05:25 +0000654static bool IsObjCSelectorRef (Value *value)
Sean Callananf5857a02010-07-31 01:32:05 +0000655{
Greg Clayton3c7feb42010-11-19 01:05:25 +0000656 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
Sean Callananf5857a02010-07-31 01:32:05 +0000657
Greg Clayton3c7feb42010-11-19 01:05:25 +0000658 if (!global_variable || !global_variable->hasName() || !global_variable->getName().startswith("\01L_OBJC_SELECTOR_REFERENCES_"))
Sean Callananf5857a02010-07-31 01:32:05 +0000659 return false;
660
661 return true;
662}
663
664bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000665IRForTarget::RewriteObjCSelector (Instruction* selector_load, Module &llvm_module)
Sean Callananf5857a02010-07-31 01:32:05 +0000666{
Greg Claytone005f2c2010-11-06 01:53:30 +0000667 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000668
669 LoadInst *load = dyn_cast<LoadInst>(selector_load);
670
671 if (!load)
672 return false;
673
674 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend gets represented as
675 //
676 // %tmp = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_" ; <i8*>
677 // %call = call i8* (i8*, i8*, ...)* @objc_msgSend(i8* %obj, i8* %tmp, ...) ; <i8*>
678 //
679 // where %obj is the object pointer and %tmp is the selector.
680 //
Greg Clayton3c7feb42010-11-19 01:05:25 +0000681 // @"\01L_OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_".
682 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_" contains the string.
Sean Callananf5857a02010-07-31 01:32:05 +0000683
684 // Find the pointer's initializer (a ConstantExpr with opcode GetElementPtr) and get the string from its target
685
686 GlobalVariable *_objc_selector_references_ = dyn_cast<GlobalVariable>(load->getPointerOperand());
687
688 if (!_objc_selector_references_ || !_objc_selector_references_->hasInitializer())
689 return false;
690
691 Constant *osr_initializer = _objc_selector_references_->getInitializer();
692
693 ConstantExpr *osr_initializer_expr = dyn_cast<ConstantExpr>(osr_initializer);
694
695 if (!osr_initializer_expr || osr_initializer_expr->getOpcode() != Instruction::GetElementPtr)
696 return false;
697
698 Value *osr_initializer_base = osr_initializer_expr->getOperand(0);
699
700 if (!osr_initializer_base)
701 return false;
702
703 // Find the string's initializer (a ConstantArray) and get the string from it
704
705 GlobalVariable *_objc_meth_var_name_ = dyn_cast<GlobalVariable>(osr_initializer_base);
706
707 if (!_objc_meth_var_name_ || !_objc_meth_var_name_->hasInitializer())
708 return false;
709
710 Constant *omvn_initializer = _objc_meth_var_name_->getInitializer();
711
712 ConstantArray *omvn_initializer_array = dyn_cast<ConstantArray>(omvn_initializer);
713
714 if (!omvn_initializer_array->isString())
715 return false;
716
717 std::string omvn_initializer_string = omvn_initializer_array->getAsString();
718
719 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000720 log->Printf("Found Objective-C selector reference \"%s\"", omvn_initializer_string.c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000721
722 // Construct a call to sel_registerName
723
724 if (!m_sel_registerName)
725 {
Greg Claytonb5037af2010-11-15 01:47:11 +0000726 lldb::addr_t sel_registerName_addr;
Sean Callananf5857a02010-07-31 01:32:05 +0000727
Greg Clayton8de27c72010-10-15 22:48:33 +0000728 static lldb_private::ConstString g_sel_registerName_str ("sel_registerName");
Greg Claytonb5037af2010-11-15 01:47:11 +0000729 if (!m_decl_map->GetFunctionAddress (g_sel_registerName_str, sel_registerName_addr))
Sean Callananf5857a02010-07-31 01:32:05 +0000730 return false;
731
Sean Callananc2c6f772010-10-26 00:31:56 +0000732 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000733 log->Printf("Found sel_registerName at 0x%llx", sel_registerName_addr);
Sean Callananc2c6f772010-10-26 00:31:56 +0000734
Sean Callananf5857a02010-07-31 01:32:05 +0000735 // Build the function type: struct objc_selector *sel_registerName(uint8_t*)
736
737 // The below code would be "more correct," but in actuality what's required is uint8_t*
Greg Clayton3c7feb42010-11-19 01:05:25 +0000738 //Type *sel_type = StructType::get(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000739 //Type *sel_ptr_type = PointerType::getUnqual(sel_type);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000740 const Type *sel_ptr_type = Type::getInt8PtrTy(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000741
742 std::vector <const Type *> srN_arg_types;
Greg Clayton3c7feb42010-11-19 01:05:25 +0000743 srN_arg_types.push_back(Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000744 llvm::Type *srN_type = FunctionType::get(sel_ptr_type, srN_arg_types, false);
745
746 // Build the constant containing the pointer to the function
Greg Clayton3c7feb42010-11-19 01:05:25 +0000747 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
748 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callananf5857a02010-07-31 01:32:05 +0000749 PointerType *srN_ptr_ty = PointerType::getUnqual(srN_type);
Greg Claytonb5037af2010-11-15 01:47:11 +0000750 Constant *srN_addr_int = ConstantInt::get(intptr_ty, sel_registerName_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +0000751 m_sel_registerName = ConstantExpr::getIntToPtr(srN_addr_int, srN_ptr_ty);
752 }
753
754 SmallVector <Value*, 1> srN_arguments;
755
Greg Clayton3c7feb42010-11-19 01:05:25 +0000756 Constant *omvn_pointer = ConstantExpr::getBitCast(_objc_meth_var_name_, Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000757
758 srN_arguments.push_back(omvn_pointer);
759
760 CallInst *srN_call = CallInst::Create(m_sel_registerName,
761 srN_arguments.begin(),
762 srN_arguments.end(),
Sean Callanan6ba533e2010-11-17 23:00:36 +0000763 "sel_registerName",
Sean Callananf5857a02010-07-31 01:32:05 +0000764 selector_load);
765
766 // Replace the load with the call in all users
767
768 selector_load->replaceAllUsesWith(srN_call);
769
770 selector_load->eraseFromParent();
771
772 return true;
773}
774
775bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000776IRForTarget::RewriteObjCSelectors (Module &llvm_module, BasicBlock &basic_block)
Sean Callananf5857a02010-07-31 01:32:05 +0000777{
Greg Claytone005f2c2010-11-06 01:53:30 +0000778 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000779
780 BasicBlock::iterator ii;
781
782 typedef SmallVector <Instruction*, 2> InstrList;
783 typedef InstrList::iterator InstrIterator;
784
785 InstrList selector_loads;
786
Greg Clayton3c7feb42010-11-19 01:05:25 +0000787 for (ii = basic_block.begin();
788 ii != basic_block.end();
Sean Callananf5857a02010-07-31 01:32:05 +0000789 ++ii)
790 {
791 Instruction &inst = *ii;
792
793 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
Greg Clayton3c7feb42010-11-19 01:05:25 +0000794 if (IsObjCSelectorRef(load->getPointerOperand()))
Sean Callananf5857a02010-07-31 01:32:05 +0000795 selector_loads.push_back(&inst);
796 }
797
798 InstrIterator iter;
799
800 for (iter = selector_loads.begin();
801 iter != selector_loads.end();
802 ++iter)
803 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000804 if (!RewriteObjCSelector(*iter, llvm_module))
Sean Callananf5857a02010-07-31 01:32:05 +0000805 {
806 if(log)
807 log->PutCString("Couldn't rewrite a reference to an Objective-C selector");
808 return false;
809 }
810 }
811
812 return true;
813}
814
Sean Callanana48fe162010-08-11 03:57:18 +0000815bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000816IRForTarget::RewritePersistentAlloc (llvm::Instruction *persistent_alloc,
817 llvm::Module &llvm_module)
Sean Callanana48fe162010-08-11 03:57:18 +0000818{
Sean Callanan97678d12011-01-13 21:23:32 +0000819 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
820
Sean Callanana48fe162010-08-11 03:57:18 +0000821 AllocaInst *alloc = dyn_cast<AllocaInst>(persistent_alloc);
822
823 MDNode *alloc_md = alloc->getMetadata("clang.decl.ptr");
824
825 if (!alloc_md || !alloc_md->getNumOperands())
826 return false;
827
828 ConstantInt *constant_int = dyn_cast<ConstantInt>(alloc_md->getOperand(0));
829
830 if (!constant_int)
831 return false;
832
833 // We attempt to register this as a new persistent variable with the DeclMap.
834
835 uintptr_t ptr = constant_int->getZExtValue();
836
Sean Callanan82b74c82010-08-12 01:56:52 +0000837 clang::VarDecl *decl = reinterpret_cast<clang::VarDecl *>(ptr);
Sean Callanana48fe162010-08-11 03:57:18 +0000838
Sean Callanan82b74c82010-08-12 01:56:52 +0000839 lldb_private::TypeFromParser result_decl_type (decl->getType().getAsOpaquePtr(),
840 &decl->getASTContext());
841
Greg Clayton8de27c72010-10-15 22:48:33 +0000842 StringRef decl_name (decl->getName());
843 lldb_private::ConstString persistent_variable_name (decl_name.data(), decl_name.size());
Sean Callanan6a925532011-01-13 08:53:35 +0000844 if (!m_decl_map->AddPersistentVariable(decl, persistent_variable_name, result_decl_type, false, false))
Sean Callanana48fe162010-08-11 03:57:18 +0000845 return false;
846
Sean Callanan97678d12011-01-13 21:23:32 +0000847 GlobalVariable *persistent_global = new GlobalVariable(llvm_module,
848 alloc->getType(),
Sean Callanana48fe162010-08-11 03:57:18 +0000849 false, /* not constant */
850 GlobalValue::ExternalLinkage,
851 NULL, /* no initializer */
852 alloc->getName().str().c_str());
853
854 // What we're going to do here is make believe this was a regular old external
855 // variable. That means we need to make the metadata valid.
856
Greg Clayton8de27c72010-10-15 22:48:33 +0000857 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanana48fe162010-08-11 03:57:18 +0000858
859 llvm::Value* values[2];
860 values[0] = persistent_global;
861 values[1] = constant_int;
862
Greg Clayton8de27c72010-10-15 22:48:33 +0000863 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanana48fe162010-08-11 03:57:18 +0000864 named_metadata->addOperand(persistent_global_md);
865
Sean Callanan97678d12011-01-13 21:23:32 +0000866 // Now, since the variable is a pointer variable, we will drop in a load of that
867 // pointer variable.
868
869 LoadInst *persistent_load = new LoadInst (persistent_global, "", alloc);
870
871 if (log)
872 log->Printf("Replacing \"%s\" with \"%s\"",
873 PrintValue(alloc).c_str(),
874 PrintValue(persistent_load).c_str());
875
876 alloc->replaceAllUsesWith(persistent_load);
Sean Callanana48fe162010-08-11 03:57:18 +0000877 alloc->eraseFromParent();
878
879 return true;
880}
881
882bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000883IRForTarget::RewritePersistentAllocs(llvm::Module &llvm_module, llvm::BasicBlock &basic_block)
Sean Callanana48fe162010-08-11 03:57:18 +0000884{
Sean Callanane8a59a82010-09-13 21:34:21 +0000885 if (!m_resolve_vars)
886 return true;
887
Greg Claytone005f2c2010-11-06 01:53:30 +0000888 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanana48fe162010-08-11 03:57:18 +0000889
890 BasicBlock::iterator ii;
891
892 typedef SmallVector <Instruction*, 2> InstrList;
893 typedef InstrList::iterator InstrIterator;
894
895 InstrList pvar_allocs;
896
Greg Clayton3c7feb42010-11-19 01:05:25 +0000897 for (ii = basic_block.begin();
898 ii != basic_block.end();
Sean Callanana48fe162010-08-11 03:57:18 +0000899 ++ii)
900 {
901 Instruction &inst = *ii;
902
903 if (AllocaInst *alloc = dyn_cast<AllocaInst>(&inst))
Sean Callanan237e4742011-01-21 22:30:25 +0000904 {
905 llvm::StringRef alloc_name = alloc->getName();
906
907 if (alloc_name.startswith("$") &&
908 !alloc_name.startswith("$__lldb"))
909 {
910 if (alloc_name.find_first_of("0123456789") == 1)
911 {
912 if (log)
913 log->Printf("Rejecting a numeric persistent variable.");
914
915 return false;
916 }
917
Sean Callanana48fe162010-08-11 03:57:18 +0000918 pvar_allocs.push_back(alloc);
Sean Callanan237e4742011-01-21 22:30:25 +0000919 }
920 }
Sean Callanana48fe162010-08-11 03:57:18 +0000921 }
922
923 InstrIterator iter;
924
925 for (iter = pvar_allocs.begin();
926 iter != pvar_allocs.end();
927 ++iter)
928 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000929 if (!RewritePersistentAlloc(*iter, llvm_module))
Sean Callanana48fe162010-08-11 03:57:18 +0000930 {
931 if(log)
932 log->PutCString("Couldn't rewrite the creation of a persistent variable");
933 return false;
934 }
935 }
936
937 return true;
938}
939
Sean Callanan8bce6652010-07-13 21:41:46 +0000940static clang::NamedDecl *
Greg Clayton3c7feb42010-11-19 01:05:25 +0000941DeclForGlobalValue(Module &module, GlobalValue *global_value)
Sean Callanan8bce6652010-07-13 21:41:46 +0000942{
943 NamedMDNode *named_metadata = module.getNamedMetadata("clang.global.decl.ptrs");
944
945 if (!named_metadata)
946 return NULL;
947
948 unsigned num_nodes = named_metadata->getNumOperands();
949 unsigned node_index;
950
951 for (node_index = 0;
952 node_index < num_nodes;
953 ++node_index)
954 {
955 MDNode *metadata_node = named_metadata->getOperand(node_index);
956
957 if (!metadata_node)
958 return NULL;
959
960 if (metadata_node->getNumOperands() != 2)
Sean Callanana48fe162010-08-11 03:57:18 +0000961 continue;
Sean Callanan8bce6652010-07-13 21:41:46 +0000962
963 if (metadata_node->getOperand(0) != global_value)
964 continue;
965
966 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
967
968 if (!constant_int)
969 return NULL;
970
971 uintptr_t ptr = constant_int->getZExtValue();
972
973 return reinterpret_cast<clang::NamedDecl *>(ptr);
974 }
975
976 return NULL;
977}
978
979bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000980IRForTarget::MaybeHandleVariable (Module &llvm_module, Value *llvm_value_ptr)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +0000981{
Greg Claytone005f2c2010-11-06 01:53:30 +0000982 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan48443652010-12-02 19:47:57 +0000983
984 if (log)
Sean Callananb9f09a62010-12-06 22:16:55 +0000985 log->Printf("MaybeHandleVariable (%s)", PrintValue(llvm_value_ptr).c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000986
Greg Clayton8de27c72010-10-15 22:48:33 +0000987 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr))
Sean Callananbc2928a2010-08-03 00:23:29 +0000988 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000989 switch (constant_expr->getOpcode())
Sean Callananbc2928a2010-08-03 00:23:29 +0000990 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000991 default:
992 break;
993 case Instruction::GetElementPtr:
994 case Instruction::BitCast:
Sean Callananbc2928a2010-08-03 00:23:29 +0000995 Value *s = constant_expr->getOperand(0);
Sean Callanan48443652010-12-02 19:47:57 +0000996 if (!MaybeHandleVariable(llvm_module, s))
997 return false;
Sean Callananbc2928a2010-08-03 00:23:29 +0000998 }
999 }
Sean Callananf921cf52010-12-03 19:51:05 +00001000 else if (GlobalVariable *global_variable = dyn_cast<GlobalVariable>(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001001 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001002 clang::NamedDecl *named_decl = DeclForGlobalValue(llvm_module, global_variable);
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001003
Sean Callananf5857a02010-07-31 01:32:05 +00001004 if (!named_decl)
1005 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001006 if (IsObjCSelectorRef(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001007 return true;
1008
Sean Callanan7cd46742010-12-06 00:56:39 +00001009 if (!global_variable->hasExternalLinkage())
1010 return true;
1011
Sean Callananf5857a02010-07-31 01:32:05 +00001012 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001013 log->Printf("Found global variable \"%s\" without metadata", global_variable->getName().str().c_str());
Sean Callananf5857a02010-07-31 01:32:05 +00001014 return false;
1015 }
1016
Greg Clayton8de27c72010-10-15 22:48:33 +00001017 std::string name (named_decl->getName().str());
Sean Callanan810f22d2010-07-16 00:09:46 +00001018
Sean Callanan771131d2010-09-30 21:18:25 +00001019 void *opaque_type = NULL;
Sean Callananf328c9f2010-07-20 23:31:16 +00001020 clang::ASTContext *ast_context = NULL;
Sean Callanan810f22d2010-07-16 00:09:46 +00001021
1022 if (clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl))
Sean Callananf328c9f2010-07-20 23:31:16 +00001023 {
Sean Callanan771131d2010-09-30 21:18:25 +00001024 opaque_type = value_decl->getType().getAsOpaquePtr();
Sean Callananf328c9f2010-07-20 23:31:16 +00001025 ast_context = &value_decl->getASTContext();
1026 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001027 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001028 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001029 return false;
Sean Callananf328c9f2010-07-20 23:31:16 +00001030 }
Sean Callanan771131d2010-09-30 21:18:25 +00001031
Sean Callanan6a925532011-01-13 08:53:35 +00001032 clang::QualType qual_type;
1033 const Type *value_type;
1034
Sean Callanan97678d12011-01-13 21:23:32 +00001035 if (name[0] == '$')
Sean Callanan6a925532011-01-13 08:53:35 +00001036 {
1037 // The $__lldb_expr_result name indicates the the return value has allocated as
1038 // a static variable. Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1039 // accesses to this static variable need to be redirected to the result of dereferencing
1040 // a pointer that is passed in as one of the arguments.
1041 //
1042 // Consequently, when reporting the size of the type, we report a pointer type pointing
1043 // to the type of $__lldb_expr_result, not the type itself.
Sean Callanan97678d12011-01-13 21:23:32 +00001044 //
1045 // We also do this for any user-declared persistent variables.
Sean Callananf328c9f2010-07-20 23:31:16 +00001046
Sean Callanan6a925532011-01-13 08:53:35 +00001047 qual_type = ast_context->getPointerType(clang::QualType::getFromOpaquePtr(opaque_type));
1048 value_type = PointerType::get(global_variable->getType(), 0);
1049 }
1050 else
1051 {
1052 qual_type = clang::QualType::getFromOpaquePtr(opaque_type);
1053 value_type = global_variable->getType();
1054 }
Sean Callanan771131d2010-09-30 21:18:25 +00001055
1056 size_t value_size = (ast_context->getTypeSize(qual_type) + 7) / 8;
1057 off_t value_alignment = (ast_context->getTypeAlign(qual_type) + 7) / 8;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001058
Sean Callanan771131d2010-09-30 21:18:25 +00001059 if (log)
Sean Callanan97678d12011-01-13 21:23:32 +00001060 log->Printf("Type of \"%s\" is [clang \"%s\", llvm \"%s\"] [size %d, align %d]",
Sean Callanan771131d2010-09-30 21:18:25 +00001061 name.c_str(),
1062 qual_type.getAsString().c_str(),
1063 PrintType(value_type).c_str(),
1064 value_size,
1065 value_alignment);
Sean Callanan3aa7da52010-12-13 22:46:15 +00001066
Sean Callanan8bce6652010-07-13 21:41:46 +00001067
Sean Callanan8c127202010-08-23 23:09:38 +00001068 if (named_decl && !m_decl_map->AddValueToStruct(named_decl,
Greg Clayton8de27c72010-10-15 22:48:33 +00001069 lldb_private::ConstString (name.c_str()),
1070 llvm_value_ptr,
Sean Callananba992c52010-07-27 02:07:53 +00001071 value_size,
1072 value_alignment))
Sean Callanan8bce6652010-07-13 21:41:46 +00001073 return false;
1074 }
Sean Callananf3143b72010-12-03 03:02:31 +00001075 else if (dyn_cast<llvm::Function>(llvm_value_ptr))
Sean Callanan48443652010-12-02 19:47:57 +00001076 {
1077 if (log)
1078 log->Printf("Function pointers aren't handled right now");
1079
1080 return false;
1081 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001082
1083 return true;
1084}
1085
1086bool
Sean Callananc7674af2011-01-17 23:42:46 +00001087IRForTarget::HandleSymbol (Module &llvm_module,
1088 Value *symbol)
1089{
1090 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1091
1092 lldb_private::ConstString name(symbol->getName().str().c_str());
1093
1094 uint64_t symbol_addr;
1095
1096 if (!m_decl_map->GetSymbolAddress (name, symbol_addr))
1097 {
1098 if (log)
1099 log->Printf ("Symbol \"%s\" had no address", name.GetCString());
1100
1101 return false;
1102 }
1103
1104 if (log)
1105 log->Printf("Found \"%s\" at 0x%llx", name.GetCString(), symbol_addr);
1106
1107 const Type *symbol_type = symbol->getType();
1108
1109 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1110 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
1111
1112 Constant *symbol_addr_int = ConstantInt::get(intptr_ty, symbol_addr, false);
1113
1114 Value *symbol_addr_ptr = ConstantExpr::getIntToPtr(symbol_addr_int, symbol_type);
1115
1116 if (log)
1117 log->Printf("Replacing %s with %s", PrintValue(symbol).c_str(), PrintValue(symbol_addr_ptr).c_str());
1118
1119 symbol->replaceAllUsesWith(symbol_addr_ptr);
1120
1121 return true;
1122}
1123
1124bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001125IRForTarget::MaybeHandleCallArguments (Module &llvm_module, CallInst *Old)
Sean Callanandc27aba2010-10-05 22:26:43 +00001126{
Sean Callanan48443652010-12-02 19:47:57 +00001127 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1128
1129 if (log)
1130 log->Printf("MaybeHandleCallArguments(%s)", PrintValue(Old).c_str());
Sean Callanandc27aba2010-10-05 22:26:43 +00001131
Sean Callanan6ba533e2010-11-17 23:00:36 +00001132 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
Sean Callanandc27aba2010-10-05 22:26:43 +00001133 op_index < num_ops;
1134 ++op_index)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001135 if (!MaybeHandleVariable(llvm_module, Old->getArgOperand(op_index))) // conservatively believe that this is a store
Sean Callanandc27aba2010-10-05 22:26:43 +00001136 return false;
1137
1138 return true;
1139}
1140
1141bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001142IRForTarget::MaybeHandleCall (Module &llvm_module, CallInst *llvm_call_inst)
Sean Callananba992c52010-07-27 02:07:53 +00001143{
Greg Claytone005f2c2010-11-06 01:53:30 +00001144 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananba992c52010-07-27 02:07:53 +00001145
Greg Clayton8de27c72010-10-15 22:48:33 +00001146 Function *fun = llvm_call_inst->getCalledFunction();
Sean Callananba992c52010-07-27 02:07:53 +00001147
1148 if (fun == NULL)
Sean Callanan65af7342010-09-08 20:04:08 +00001149 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001150 Value *val = llvm_call_inst->getCalledValue();
Sean Callanan65af7342010-09-08 20:04:08 +00001151
1152 ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
1153
1154 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1155 {
1156 fun = dyn_cast<Function>(const_expr->getOperand(0));
1157
1158 if (!fun)
Sean Callanan48443652010-12-02 19:47:57 +00001159 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001160 }
Sean Callananc4217a62010-12-06 23:53:20 +00001161 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1162 {
1163 return true; // already resolved
1164 }
Sean Callanan65af7342010-09-08 20:04:08 +00001165 else
1166 {
Sean Callanan48443652010-12-02 19:47:57 +00001167 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001168 }
1169 }
Sean Callananba992c52010-07-27 02:07:53 +00001170
Greg Clayton8de27c72010-10-15 22:48:33 +00001171 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001172
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001173 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001174 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001175 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001176
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001177 switch (intrinsic_id)
1178 {
1179 default:
1180 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001181 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001182 return false;
1183 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001184 {
1185 static lldb_private::ConstString g_memcpy_str ("memcpy");
1186 str = g_memcpy_str;
1187 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001188 break;
1189 }
Sean Callananc04743d2010-09-28 21:13:03 +00001190
Greg Clayton8de27c72010-10-15 22:48:33 +00001191 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001192 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001193 }
1194 else
1195 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001196 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001197 }
1198
Greg Clayton8de27c72010-10-15 22:48:33 +00001199 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001200 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001201 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001202
Sean Callananf5857a02010-07-31 01:32:05 +00001203 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001204 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001205 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001206 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001207 fun_value_ptr = NULL;
1208
Greg Clayton8de27c72010-10-15 22:48:33 +00001209 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001210 {
1211 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001212 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001213
1214 return false;
1215 }
Sean Callananf5857a02010-07-31 01:32:05 +00001216 }
1217 }
1218 else
1219 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001220 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001221 {
1222 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001223 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callananf5857a02010-07-31 01:32:05 +00001224 }
Sean Callananba992c52010-07-27 02:07:53 +00001225 }
1226
1227 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001228 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001229
Sean Callananf5857a02010-07-31 01:32:05 +00001230 Value *fun_addr_ptr;
1231
1232 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001233 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001234 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1235 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001236 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001237 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1238 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001239 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1240
1241 if (fun_value_ptr)
1242 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001243 }
Sean Callananf5857a02010-07-31 01:32:05 +00001244
1245 if (fun_value_ptr)
1246 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001247
Greg Clayton8de27c72010-10-15 22:48:33 +00001248 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001249
Greg Clayton8de27c72010-10-15 22:48:33 +00001250 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001251
1252 Value *values[1];
1253 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001254 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001255
Greg Clayton8de27c72010-10-15 22:48:33 +00001256 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001257
1258 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001259 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 +00001260
Sean Callananba992c52010-07-27 02:07:53 +00001261 return true;
1262}
1263
1264bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001265IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001266{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001267 /////////////////////////////////////////////////////////////////////////
1268 // Prepare the current basic block for execution in the remote process
1269 //
1270
Sean Callanan02fbafa2010-07-27 21:39:39 +00001271 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001272
Greg Clayton3c7feb42010-11-19 01:05:25 +00001273 for (ii = basic_block.begin();
1274 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001275 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001276 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001277 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001278
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001279 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001280
Greg Clayton3c7feb42010-11-19 01:05:25 +00001281 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001282 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001283
1284 if (call && !MaybeHandleCallArguments(llvm_module, call))
1285 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001286 }
1287
1288 return true;
1289}
1290
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001291bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001292IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001293{
Sean Callananae71e302010-11-18 22:21:58 +00001294 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1295
Greg Clayton3c7feb42010-11-19 01:05:25 +00001296 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001297 global != end;
1298 ++global)
1299 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001300 if (log)
1301 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1302 (*global).getName().str().c_str(),
1303 DeclForGlobalValue(llvm_module, global));
1304
Sean Callananc7674af2011-01-17 23:42:46 +00001305 if ((*global).getName().str().find("OBJC_IVAR") == 0)
1306 {
1307 if (!HandleSymbol(llvm_module, global))
1308 return false;
1309 }
1310 else if (DeclForGlobalValue(llvm_module, global))
1311 {
1312 if (!MaybeHandleVariable (llvm_module, global))
1313 return false;
1314 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001315 }
1316
1317 return true;
1318}
1319
Sean Callanan02fbafa2010-07-27 21:39:39 +00001320static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001321{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001322 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001323
Sean Callanan6ba533e2010-11-17 23:00:36 +00001324 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001325 return false;
1326
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001327 ConstantExpr *CE;
1328
1329 if ((CE = dyn_cast<ConstantExpr>(V)))
1330 {
1331 if (CE->getOpcode() != Instruction::BitCast)
1332 return false;
1333
Sean Callanan6ba533e2010-11-17 23:00:36 +00001334 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001335 }
1336
Sean Callanan6ba533e2010-11-17 23:00:36 +00001337 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001338
1339 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1340 return false;
1341
1342 return true;
1343}
1344
Greg Clayton3c7feb42010-11-19 01:05:25 +00001345static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001346{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001347 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001348
1349 Value::use_iterator ui;
1350
1351 for (ui = guard_load->use_begin();
1352 ui != guard_load->use_end();
1353 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001354 {
Greg Clayton6e713402010-07-30 20:30:44 +00001355 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001356 {
1357 // do nothing for the moment
1358 }
1359 else
1360 {
1361 ui->replaceUsesOfWith(guard_load, zero);
1362 }
1363 }
Sean Callanan45839272010-07-24 01:37:44 +00001364
1365 guard_load->eraseFromParent();
1366}
1367
1368static void ExciseGuardStore(Instruction* guard_store)
1369{
1370 guard_store->eraseFromParent();
1371}
1372
1373bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001374IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001375{
1376 ///////////////////////////////////////////////////////
1377 // Eliminate any reference to guard variables found.
1378 //
1379
Sean Callanan02fbafa2010-07-27 21:39:39 +00001380 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001381
Sean Callanan02fbafa2010-07-27 21:39:39 +00001382 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001383 typedef InstrList::iterator InstrIterator;
1384
1385 InstrList guard_loads;
1386 InstrList guard_stores;
1387
Greg Clayton3c7feb42010-11-19 01:05:25 +00001388 for (ii = basic_block.begin();
1389 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001390 ++ii)
1391 {
1392 Instruction &inst = *ii;
1393
1394 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1395 if (isGuardVariableRef(load->getPointerOperand()))
1396 guard_loads.push_back(&inst);
1397
1398 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1399 if (isGuardVariableRef(store->getPointerOperand()))
1400 guard_stores.push_back(&inst);
1401 }
1402
1403 InstrIterator iter;
1404
1405 for (iter = guard_loads.begin();
1406 iter != guard_loads.end();
1407 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001408 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001409
1410 for (iter = guard_stores.begin();
1411 iter != guard_stores.end();
1412 ++iter)
1413 ExciseGuardStore(*iter);
1414
1415 return true;
1416}
1417
Sean Callanan6ba533e2010-11-17 23:00:36 +00001418bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001419IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001420{
Greg Claytone005f2c2010-11-06 01:53:30 +00001421 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001422
1423 Value::use_iterator ui;
1424
Sean Callanana48fe162010-08-11 03:57:18 +00001425 SmallVector<User*, 16> users;
1426
1427 // We do this because the use list might change, invalidating our iterator.
1428 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001429 for (ui = old_constant->use_begin();
1430 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001431 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001432 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001433
Sean Callanana48fe162010-08-11 03:57:18 +00001434 for (int i = 0;
1435 i < users.size();
1436 ++i)
1437 {
1438 User *user = users[i];
1439
Sean Callananbafd6852010-07-14 23:40:29 +00001440 if (Constant *constant = dyn_cast<Constant>(user))
1441 {
1442 // synthesize a new non-constant equivalent of the constant
1443
1444 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1445 {
1446 switch (constant_expr->getOpcode())
1447 {
1448 default:
1449 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001450 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001451 return false;
1452 case Instruction::BitCast:
1453 {
1454 // UnaryExpr
1455 // OperandList[0] is value
1456
1457 Value *s = constant_expr->getOperand(0);
1458
Greg Clayton3c7feb42010-11-19 01:05:25 +00001459 if (s == old_constant)
1460 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001461
Greg Clayton3c7feb42010-11-19 01:05:25 +00001462 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001463
Greg Clayton3c7feb42010-11-19 01:05:25 +00001464 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001465 }
1466 break;
1467 case Instruction::GetElementPtr:
1468 {
1469 // GetElementPtrConstantExpr
1470 // OperandList[0] is base
1471 // OperandList[1]... are indices
1472
1473 Value *ptr = constant_expr->getOperand(0);
1474
Greg Clayton3c7feb42010-11-19 01:05:25 +00001475 if (ptr == old_constant)
1476 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001477
1478 SmallVector<Value*, 16> indices;
1479
1480 unsigned operand_index;
1481 unsigned num_operands = constant_expr->getNumOperands();
1482
1483 for (operand_index = 1;
1484 operand_index < num_operands;
1485 ++operand_index)
1486 {
1487 Value *operand = constant_expr->getOperand(operand_index);
1488
Greg Clayton3c7feb42010-11-19 01:05:25 +00001489 if (operand == old_constant)
1490 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001491
1492 indices.push_back(operand);
1493 }
1494
Greg Clayton3c7feb42010-11-19 01:05:25 +00001495 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001496
Greg Clayton3c7feb42010-11-19 01:05:25 +00001497 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001498 }
1499 break;
1500 }
1501 }
1502 else
1503 {
1504 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001505 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001506 return false;
1507 }
1508 }
1509 else
1510 {
1511 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001512 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001513 }
1514 }
1515
1516 return true;
1517}
1518
Sean Callanan8bce6652010-07-13 21:41:46 +00001519bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001520IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001521{
Sean Callanane8a59a82010-09-13 21:34:21 +00001522 if (!m_resolve_vars)
1523 return true;
1524
Greg Claytone005f2c2010-11-06 01:53:30 +00001525 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001526
1527 m_decl_map->DoStructLayout();
1528
1529 if (log)
1530 log->Printf("Element arrangement:");
1531
1532 uint32_t num_elements;
1533 uint32_t element_index;
1534
1535 size_t size;
1536 off_t alignment;
1537
1538 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1539 return false;
1540
Greg Clayton3c7feb42010-11-19 01:05:25 +00001541 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001542
Greg Clayton3c7feb42010-11-19 01:05:25 +00001543 if (iter == llvm_function.getArgumentList().end())
Sean Callanan8bce6652010-07-13 21:41:46 +00001544 return false;
1545
Sean Callanan02fbafa2010-07-27 21:39:39 +00001546 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001547
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001548 if (argument->getName().equals("this"))
1549 {
1550 ++iter;
1551
Greg Clayton3c7feb42010-11-19 01:05:25 +00001552 if (iter == llvm_function.getArgumentList().end())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001553 return false;
1554
1555 argument = iter;
1556 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001557 else if (argument->getName().equals("self"))
1558 {
1559 ++iter;
1560
1561 if (iter == llvm_function.getArgumentList().end())
1562 return false;
1563
1564 if (!iter->getName().equals("_cmd"))
1565 return false;
1566
1567 ++iter;
1568
1569 if (iter == llvm_function.getArgumentList().end())
1570 return false;
1571
1572 argument = iter;
1573 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001574
Greg Clayton8de27c72010-10-15 22:48:33 +00001575 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan8bce6652010-07-13 21:41:46 +00001576 return false;
1577
1578 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001579 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001580
Greg Clayton3c7feb42010-11-19 01:05:25 +00001581 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001582 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001583
Sean Callanan6ba533e2010-11-17 23:00:36 +00001584 if (!FirstEntryInstruction)
Sean Callanan8bce6652010-07-13 21:41:46 +00001585 return false;
1586
Greg Clayton3c7feb42010-11-19 01:05:25 +00001587 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001588 const IntegerType *offset_type(Type::getInt32Ty(context));
1589
1590 if (!offset_type)
1591 return false;
1592
1593 for (element_index = 0; element_index < num_elements; ++element_index)
1594 {
1595 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001596 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001597 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001598 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001599
Sean Callanan45690fe2010-08-30 22:17:16 +00001600 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan8bce6652010-07-13 21:41:46 +00001601 return false;
1602
1603 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001604 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001605 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001606 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001607 PrintValue(value, true).c_str(),
1608 offset);
1609
1610 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001611 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
Sean Callanan6a925532011-01-13 08:53:35 +00001612
1613 Value *replacement;
Sean Callanan8bce6652010-07-13 21:41:46 +00001614
Sean Callanan6a925532011-01-13 08:53:35 +00001615 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult, in cases where the result
1616 // variable is an rvalue, we have to synthesize a dereference of the appropriate structure
1617 // entry in order to produce the static variable that the AST thinks it is accessing.
1618 if (name == m_result_name && !m_result_is_pointer)
1619 {
1620 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType()->getPointerTo(), "", FirstEntryInstruction);
1621
1622 LoadInst *load = new LoadInst(bit_cast, "", FirstEntryInstruction);
1623
1624 replacement = load;
1625 }
Sean Callananbafd6852010-07-14 23:40:29 +00001626 else
Sean Callanan6a925532011-01-13 08:53:35 +00001627 {
1628 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
1629
1630 replacement = bit_cast;
1631 }
1632
1633 if (Constant *constant = dyn_cast<Constant>(value))
1634 UnfoldConstant(constant, replacement, FirstEntryInstruction);
1635 else
1636 value->replaceAllUsesWith(replacement);
Sean Callananb51ee982010-11-02 23:51:17 +00001637
1638 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1639 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001640 }
1641
1642 if (log)
1643 log->Printf("Total structure [align %d, size %d]", alignment, size);
1644
1645 return true;
1646}
1647
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001648bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001649IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001650{
Greg Claytone005f2c2010-11-06 01:53:30 +00001651 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001652
Greg Clayton3c7feb42010-11-19 01:05:25 +00001653 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001654
1655 if (!function)
1656 {
1657 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001658 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan6a925532011-01-13 08:53:35 +00001659
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001660 return false;
1661 }
1662
Sean Callanan02fbafa2010-07-27 21:39:39 +00001663 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001664
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001665 m_has_side_effects = HasSideEffects(llvm_module, *function);
1666
Sean Callanan82b74c82010-08-12 01:56:52 +00001667 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001668 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001669 //
1670
Greg Clayton3c7feb42010-11-19 01:05:25 +00001671 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001672 {
1673 if (log)
1674 log->Printf("CreateResultVariable() failed");
Sean Callanan82b74c82010-08-12 01:56:52 +00001675 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001676 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001677
Sean Callanan6ba533e2010-11-17 23:00:36 +00001678 ///////////////////////////////////////////////////////////////////////////////
1679 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1680 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001681
Greg Clayton3c7feb42010-11-19 01:05:25 +00001682 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001683 {
1684 if (log)
1685 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan6ba533e2010-11-17 23:00:36 +00001686 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001687 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001688
Sean Callananf5857a02010-07-31 01:32:05 +00001689 //////////////////////////////////
1690 // Run basic-block level passes
1691 //
1692
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001693 for (bbi = function->begin();
1694 bbi != function->end();
1695 ++bbi)
1696 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001697 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001698 {
1699 if (log)
1700 log->Printf("RemoveGuards() failed");
Sean Callanan8c127202010-08-23 23:09:38 +00001701 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001702 }
Sean Callanan8c127202010-08-23 23:09:38 +00001703
Greg Clayton3c7feb42010-11-19 01:05:25 +00001704 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001705 {
1706 if (log)
1707 log->Printf("RewritePersistentAllocs() failed");
Sean Callananf5857a02010-07-31 01:32:05 +00001708 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001709 }
Sean Callananf5857a02010-07-31 01:32:05 +00001710
Greg Clayton3c7feb42010-11-19 01:05:25 +00001711 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001712 {
1713 if (log)
1714 log->Printf("RewriteObjCSelectors() failed");
Sean Callanana48fe162010-08-11 03:57:18 +00001715 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001716 }
Sean Callanana48fe162010-08-11 03:57:18 +00001717
Greg Clayton3c7feb42010-11-19 01:05:25 +00001718 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001719 {
1720 if (log)
1721 log->Printf("ResolveCalls() failed");
Sean Callanan8bce6652010-07-13 21:41:46 +00001722 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001723 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001724 }
1725
Sean Callanan771131d2010-09-30 21:18:25 +00001726 ///////////////////////////////
1727 // Run function-level passes
1728 //
1729
Greg Clayton3c7feb42010-11-19 01:05:25 +00001730 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001731 {
1732 if (log)
1733 log->Printf("ResolveExternals() failed");
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001734 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001735 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001736
Greg Clayton3c7feb42010-11-19 01:05:25 +00001737 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001738 {
1739 if (log)
1740 log->Printf("ReplaceVariables() failed");
Sean Callanan771131d2010-09-30 21:18:25 +00001741 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001742 }
Sean Callanan771131d2010-09-30 21:18:25 +00001743
Sean Callanan8bce6652010-07-13 21:41:46 +00001744 if (log)
1745 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001746 std::string s;
1747 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001748
Greg Clayton3c7feb42010-11-19 01:05:25 +00001749 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001750
1751 oss.flush();
1752
Greg Claytonb5037af2010-11-15 01:47:11 +00001753 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001754 }
1755
1756 return true;
1757}
1758
1759void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001760IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001761{
1762}
1763
1764PassManagerType
1765IRForTarget::getPotentialPassManagerType() const
1766{
1767 return PMT_ModulePassManager;
1768}