blob: bdcb225aecb4491ce7641ce3e83b6657a78caf3b [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 Callanan03c997b2010-10-21 22:41:32 +0000904 if (alloc->getName().startswith("$") &&
905 !alloc->getName().startswith("$__lldb"))
Sean Callanana48fe162010-08-11 03:57:18 +0000906 pvar_allocs.push_back(alloc);
907 }
908
909 InstrIterator iter;
910
911 for (iter = pvar_allocs.begin();
912 iter != pvar_allocs.end();
913 ++iter)
914 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000915 if (!RewritePersistentAlloc(*iter, llvm_module))
Sean Callanana48fe162010-08-11 03:57:18 +0000916 {
917 if(log)
918 log->PutCString("Couldn't rewrite the creation of a persistent variable");
919 return false;
920 }
921 }
922
923 return true;
924}
925
Sean Callanan8bce6652010-07-13 21:41:46 +0000926static clang::NamedDecl *
Greg Clayton3c7feb42010-11-19 01:05:25 +0000927DeclForGlobalValue(Module &module, GlobalValue *global_value)
Sean Callanan8bce6652010-07-13 21:41:46 +0000928{
929 NamedMDNode *named_metadata = module.getNamedMetadata("clang.global.decl.ptrs");
930
931 if (!named_metadata)
932 return NULL;
933
934 unsigned num_nodes = named_metadata->getNumOperands();
935 unsigned node_index;
936
937 for (node_index = 0;
938 node_index < num_nodes;
939 ++node_index)
940 {
941 MDNode *metadata_node = named_metadata->getOperand(node_index);
942
943 if (!metadata_node)
944 return NULL;
945
946 if (metadata_node->getNumOperands() != 2)
Sean Callanana48fe162010-08-11 03:57:18 +0000947 continue;
Sean Callanan8bce6652010-07-13 21:41:46 +0000948
949 if (metadata_node->getOperand(0) != global_value)
950 continue;
951
952 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
953
954 if (!constant_int)
955 return NULL;
956
957 uintptr_t ptr = constant_int->getZExtValue();
958
959 return reinterpret_cast<clang::NamedDecl *>(ptr);
960 }
961
962 return NULL;
963}
964
965bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000966IRForTarget::MaybeHandleVariable (Module &llvm_module, Value *llvm_value_ptr)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +0000967{
Greg Claytone005f2c2010-11-06 01:53:30 +0000968 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan48443652010-12-02 19:47:57 +0000969
970 if (log)
Sean Callananb9f09a62010-12-06 22:16:55 +0000971 log->Printf("MaybeHandleVariable (%s)", PrintValue(llvm_value_ptr).c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000972
Greg Clayton8de27c72010-10-15 22:48:33 +0000973 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr))
Sean Callananbc2928a2010-08-03 00:23:29 +0000974 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000975 switch (constant_expr->getOpcode())
Sean Callananbc2928a2010-08-03 00:23:29 +0000976 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +0000977 default:
978 break;
979 case Instruction::GetElementPtr:
980 case Instruction::BitCast:
Sean Callananbc2928a2010-08-03 00:23:29 +0000981 Value *s = constant_expr->getOperand(0);
Sean Callanan48443652010-12-02 19:47:57 +0000982 if (!MaybeHandleVariable(llvm_module, s))
983 return false;
Sean Callananbc2928a2010-08-03 00:23:29 +0000984 }
985 }
Sean Callananf921cf52010-12-03 19:51:05 +0000986 else if (GlobalVariable *global_variable = dyn_cast<GlobalVariable>(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +0000987 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000988 clang::NamedDecl *named_decl = DeclForGlobalValue(llvm_module, global_variable);
Sean Callanan5cf4a1c2010-07-03 01:35:46 +0000989
Sean Callananf5857a02010-07-31 01:32:05 +0000990 if (!named_decl)
991 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000992 if (IsObjCSelectorRef(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +0000993 return true;
994
Sean Callanan7cd46742010-12-06 00:56:39 +0000995 if (!global_variable->hasExternalLinkage())
996 return true;
997
Sean Callananf5857a02010-07-31 01:32:05 +0000998 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000999 log->Printf("Found global variable \"%s\" without metadata", global_variable->getName().str().c_str());
Sean Callananf5857a02010-07-31 01:32:05 +00001000 return false;
1001 }
1002
Greg Clayton8de27c72010-10-15 22:48:33 +00001003 std::string name (named_decl->getName().str());
Sean Callanan810f22d2010-07-16 00:09:46 +00001004
Sean Callanan771131d2010-09-30 21:18:25 +00001005 void *opaque_type = NULL;
Sean Callananf328c9f2010-07-20 23:31:16 +00001006 clang::ASTContext *ast_context = NULL;
Sean Callanan810f22d2010-07-16 00:09:46 +00001007
1008 if (clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl))
Sean Callananf328c9f2010-07-20 23:31:16 +00001009 {
Sean Callanan771131d2010-09-30 21:18:25 +00001010 opaque_type = value_decl->getType().getAsOpaquePtr();
Sean Callananf328c9f2010-07-20 23:31:16 +00001011 ast_context = &value_decl->getASTContext();
1012 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001013 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001014 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001015 return false;
Sean Callananf328c9f2010-07-20 23:31:16 +00001016 }
Sean Callanan771131d2010-09-30 21:18:25 +00001017
Sean Callanan6a925532011-01-13 08:53:35 +00001018 clang::QualType qual_type;
1019 const Type *value_type;
1020
Sean Callanan97678d12011-01-13 21:23:32 +00001021 if (name[0] == '$')
Sean Callanan6a925532011-01-13 08:53:35 +00001022 {
1023 // The $__lldb_expr_result name indicates the the return value has allocated as
1024 // a static variable. Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1025 // accesses to this static variable need to be redirected to the result of dereferencing
1026 // a pointer that is passed in as one of the arguments.
1027 //
1028 // Consequently, when reporting the size of the type, we report a pointer type pointing
1029 // to the type of $__lldb_expr_result, not the type itself.
Sean Callanan97678d12011-01-13 21:23:32 +00001030 //
1031 // We also do this for any user-declared persistent variables.
Sean Callananf328c9f2010-07-20 23:31:16 +00001032
Sean Callanan6a925532011-01-13 08:53:35 +00001033 qual_type = ast_context->getPointerType(clang::QualType::getFromOpaquePtr(opaque_type));
1034 value_type = PointerType::get(global_variable->getType(), 0);
1035 }
1036 else
1037 {
1038 qual_type = clang::QualType::getFromOpaquePtr(opaque_type);
1039 value_type = global_variable->getType();
1040 }
Sean Callanan771131d2010-09-30 21:18:25 +00001041
1042 size_t value_size = (ast_context->getTypeSize(qual_type) + 7) / 8;
1043 off_t value_alignment = (ast_context->getTypeAlign(qual_type) + 7) / 8;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001044
Sean Callanan771131d2010-09-30 21:18:25 +00001045 if (log)
Sean Callanan97678d12011-01-13 21:23:32 +00001046 log->Printf("Type of \"%s\" is [clang \"%s\", llvm \"%s\"] [size %d, align %d]",
Sean Callanan771131d2010-09-30 21:18:25 +00001047 name.c_str(),
1048 qual_type.getAsString().c_str(),
1049 PrintType(value_type).c_str(),
1050 value_size,
1051 value_alignment);
Sean Callanan3aa7da52010-12-13 22:46:15 +00001052
Sean Callanan8bce6652010-07-13 21:41:46 +00001053
Sean Callanan8c127202010-08-23 23:09:38 +00001054 if (named_decl && !m_decl_map->AddValueToStruct(named_decl,
Greg Clayton8de27c72010-10-15 22:48:33 +00001055 lldb_private::ConstString (name.c_str()),
1056 llvm_value_ptr,
Sean Callananba992c52010-07-27 02:07:53 +00001057 value_size,
1058 value_alignment))
Sean Callanan8bce6652010-07-13 21:41:46 +00001059 return false;
1060 }
Sean Callananf3143b72010-12-03 03:02:31 +00001061 else if (dyn_cast<llvm::Function>(llvm_value_ptr))
Sean Callanan48443652010-12-02 19:47:57 +00001062 {
1063 if (log)
1064 log->Printf("Function pointers aren't handled right now");
1065
1066 return false;
1067 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001068
1069 return true;
1070}
1071
1072bool
Sean Callananc7674af2011-01-17 23:42:46 +00001073IRForTarget::HandleSymbol (Module &llvm_module,
1074 Value *symbol)
1075{
1076 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1077
1078 lldb_private::ConstString name(symbol->getName().str().c_str());
1079
1080 uint64_t symbol_addr;
1081
1082 if (!m_decl_map->GetSymbolAddress (name, symbol_addr))
1083 {
1084 if (log)
1085 log->Printf ("Symbol \"%s\" had no address", name.GetCString());
1086
1087 return false;
1088 }
1089
1090 if (log)
1091 log->Printf("Found \"%s\" at 0x%llx", name.GetCString(), symbol_addr);
1092
1093 const Type *symbol_type = symbol->getType();
1094
1095 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1096 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
1097
1098 Constant *symbol_addr_int = ConstantInt::get(intptr_ty, symbol_addr, false);
1099
1100 Value *symbol_addr_ptr = ConstantExpr::getIntToPtr(symbol_addr_int, symbol_type);
1101
1102 if (log)
1103 log->Printf("Replacing %s with %s", PrintValue(symbol).c_str(), PrintValue(symbol_addr_ptr).c_str());
1104
1105 symbol->replaceAllUsesWith(symbol_addr_ptr);
1106
1107 return true;
1108}
1109
1110bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001111IRForTarget::MaybeHandleCallArguments (Module &llvm_module, CallInst *Old)
Sean Callanandc27aba2010-10-05 22:26:43 +00001112{
Sean Callanan48443652010-12-02 19:47:57 +00001113 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1114
1115 if (log)
1116 log->Printf("MaybeHandleCallArguments(%s)", PrintValue(Old).c_str());
Sean Callanandc27aba2010-10-05 22:26:43 +00001117
Sean Callanan6ba533e2010-11-17 23:00:36 +00001118 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
Sean Callanandc27aba2010-10-05 22:26:43 +00001119 op_index < num_ops;
1120 ++op_index)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001121 if (!MaybeHandleVariable(llvm_module, Old->getArgOperand(op_index))) // conservatively believe that this is a store
Sean Callanandc27aba2010-10-05 22:26:43 +00001122 return false;
1123
1124 return true;
1125}
1126
1127bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001128IRForTarget::MaybeHandleCall (Module &llvm_module, CallInst *llvm_call_inst)
Sean Callananba992c52010-07-27 02:07:53 +00001129{
Greg Claytone005f2c2010-11-06 01:53:30 +00001130 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananba992c52010-07-27 02:07:53 +00001131
Greg Clayton8de27c72010-10-15 22:48:33 +00001132 Function *fun = llvm_call_inst->getCalledFunction();
Sean Callananba992c52010-07-27 02:07:53 +00001133
1134 if (fun == NULL)
Sean Callanan65af7342010-09-08 20:04:08 +00001135 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001136 Value *val = llvm_call_inst->getCalledValue();
Sean Callanan65af7342010-09-08 20:04:08 +00001137
1138 ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
1139
1140 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1141 {
1142 fun = dyn_cast<Function>(const_expr->getOperand(0));
1143
1144 if (!fun)
Sean Callanan48443652010-12-02 19:47:57 +00001145 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001146 }
Sean Callananc4217a62010-12-06 23:53:20 +00001147 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1148 {
1149 return true; // already resolved
1150 }
Sean Callanan65af7342010-09-08 20:04:08 +00001151 else
1152 {
Sean Callanan48443652010-12-02 19:47:57 +00001153 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001154 }
1155 }
Sean Callananba992c52010-07-27 02:07:53 +00001156
Greg Clayton8de27c72010-10-15 22:48:33 +00001157 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001158
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001159 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001160 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001161 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001162
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001163 switch (intrinsic_id)
1164 {
1165 default:
1166 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001167 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001168 return false;
1169 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001170 {
1171 static lldb_private::ConstString g_memcpy_str ("memcpy");
1172 str = g_memcpy_str;
1173 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001174 break;
1175 }
Sean Callananc04743d2010-09-28 21:13:03 +00001176
Greg Clayton8de27c72010-10-15 22:48:33 +00001177 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001178 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001179 }
1180 else
1181 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001182 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001183 }
1184
Greg Clayton8de27c72010-10-15 22:48:33 +00001185 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001186 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001187 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001188
Sean Callananf5857a02010-07-31 01:32:05 +00001189 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001190 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001191 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001192 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001193 fun_value_ptr = NULL;
1194
Greg Clayton8de27c72010-10-15 22:48:33 +00001195 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001196 {
1197 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001198 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001199
1200 return false;
1201 }
Sean Callananf5857a02010-07-31 01:32:05 +00001202 }
1203 }
1204 else
1205 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001206 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001207 {
1208 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001209 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callananf5857a02010-07-31 01:32:05 +00001210 }
Sean Callananba992c52010-07-27 02:07:53 +00001211 }
1212
1213 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001214 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001215
Sean Callananf5857a02010-07-31 01:32:05 +00001216 Value *fun_addr_ptr;
1217
1218 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001219 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001220 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1221 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001222 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001223 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1224 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001225 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1226
1227 if (fun_value_ptr)
1228 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001229 }
Sean Callananf5857a02010-07-31 01:32:05 +00001230
1231 if (fun_value_ptr)
1232 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001233
Greg Clayton8de27c72010-10-15 22:48:33 +00001234 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001235
Greg Clayton8de27c72010-10-15 22:48:33 +00001236 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001237
1238 Value *values[1];
1239 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001240 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001241
Greg Clayton8de27c72010-10-15 22:48:33 +00001242 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001243
1244 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001245 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 +00001246
Sean Callananba992c52010-07-27 02:07:53 +00001247 return true;
1248}
1249
1250bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001251IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001252{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001253 /////////////////////////////////////////////////////////////////////////
1254 // Prepare the current basic block for execution in the remote process
1255 //
1256
Sean Callanan02fbafa2010-07-27 21:39:39 +00001257 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001258
Greg Clayton3c7feb42010-11-19 01:05:25 +00001259 for (ii = basic_block.begin();
1260 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001261 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001262 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001263 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001264
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001265 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001266
Greg Clayton3c7feb42010-11-19 01:05:25 +00001267 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001268 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001269
1270 if (call && !MaybeHandleCallArguments(llvm_module, call))
1271 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001272 }
1273
1274 return true;
1275}
1276
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001277bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001278IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001279{
Sean Callananae71e302010-11-18 22:21:58 +00001280 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1281
Greg Clayton3c7feb42010-11-19 01:05:25 +00001282 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001283 global != end;
1284 ++global)
1285 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001286 if (log)
1287 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1288 (*global).getName().str().c_str(),
1289 DeclForGlobalValue(llvm_module, global));
1290
Sean Callananc7674af2011-01-17 23:42:46 +00001291 if ((*global).getName().str().find("OBJC_IVAR") == 0)
1292 {
1293 if (!HandleSymbol(llvm_module, global))
1294 return false;
1295 }
1296 else if (DeclForGlobalValue(llvm_module, global))
1297 {
1298 if (!MaybeHandleVariable (llvm_module, global))
1299 return false;
1300 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001301 }
1302
1303 return true;
1304}
1305
Sean Callanan02fbafa2010-07-27 21:39:39 +00001306static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001307{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001308 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001309
Sean Callanan6ba533e2010-11-17 23:00:36 +00001310 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001311 return false;
1312
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001313 ConstantExpr *CE;
1314
1315 if ((CE = dyn_cast<ConstantExpr>(V)))
1316 {
1317 if (CE->getOpcode() != Instruction::BitCast)
1318 return false;
1319
Sean Callanan6ba533e2010-11-17 23:00:36 +00001320 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001321 }
1322
Sean Callanan6ba533e2010-11-17 23:00:36 +00001323 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001324
1325 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1326 return false;
1327
1328 return true;
1329}
1330
Greg Clayton3c7feb42010-11-19 01:05:25 +00001331static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001332{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001333 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001334
1335 Value::use_iterator ui;
1336
1337 for (ui = guard_load->use_begin();
1338 ui != guard_load->use_end();
1339 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001340 {
Greg Clayton6e713402010-07-30 20:30:44 +00001341 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001342 {
1343 // do nothing for the moment
1344 }
1345 else
1346 {
1347 ui->replaceUsesOfWith(guard_load, zero);
1348 }
1349 }
Sean Callanan45839272010-07-24 01:37:44 +00001350
1351 guard_load->eraseFromParent();
1352}
1353
1354static void ExciseGuardStore(Instruction* guard_store)
1355{
1356 guard_store->eraseFromParent();
1357}
1358
1359bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001360IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001361{
1362 ///////////////////////////////////////////////////////
1363 // Eliminate any reference to guard variables found.
1364 //
1365
Sean Callanan02fbafa2010-07-27 21:39:39 +00001366 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001367
Sean Callanan02fbafa2010-07-27 21:39:39 +00001368 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001369 typedef InstrList::iterator InstrIterator;
1370
1371 InstrList guard_loads;
1372 InstrList guard_stores;
1373
Greg Clayton3c7feb42010-11-19 01:05:25 +00001374 for (ii = basic_block.begin();
1375 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001376 ++ii)
1377 {
1378 Instruction &inst = *ii;
1379
1380 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1381 if (isGuardVariableRef(load->getPointerOperand()))
1382 guard_loads.push_back(&inst);
1383
1384 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1385 if (isGuardVariableRef(store->getPointerOperand()))
1386 guard_stores.push_back(&inst);
1387 }
1388
1389 InstrIterator iter;
1390
1391 for (iter = guard_loads.begin();
1392 iter != guard_loads.end();
1393 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001394 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001395
1396 for (iter = guard_stores.begin();
1397 iter != guard_stores.end();
1398 ++iter)
1399 ExciseGuardStore(*iter);
1400
1401 return true;
1402}
1403
Sean Callanan6ba533e2010-11-17 23:00:36 +00001404bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001405IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001406{
Greg Claytone005f2c2010-11-06 01:53:30 +00001407 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001408
1409 Value::use_iterator ui;
1410
Sean Callanana48fe162010-08-11 03:57:18 +00001411 SmallVector<User*, 16> users;
1412
1413 // We do this because the use list might change, invalidating our iterator.
1414 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001415 for (ui = old_constant->use_begin();
1416 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001417 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001418 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001419
Sean Callanana48fe162010-08-11 03:57:18 +00001420 for (int i = 0;
1421 i < users.size();
1422 ++i)
1423 {
1424 User *user = users[i];
1425
Sean Callananbafd6852010-07-14 23:40:29 +00001426 if (Constant *constant = dyn_cast<Constant>(user))
1427 {
1428 // synthesize a new non-constant equivalent of the constant
1429
1430 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1431 {
1432 switch (constant_expr->getOpcode())
1433 {
1434 default:
1435 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001436 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001437 return false;
1438 case Instruction::BitCast:
1439 {
1440 // UnaryExpr
1441 // OperandList[0] is value
1442
1443 Value *s = constant_expr->getOperand(0);
1444
Greg Clayton3c7feb42010-11-19 01:05:25 +00001445 if (s == old_constant)
1446 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001447
Greg Clayton3c7feb42010-11-19 01:05:25 +00001448 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001449
Greg Clayton3c7feb42010-11-19 01:05:25 +00001450 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001451 }
1452 break;
1453 case Instruction::GetElementPtr:
1454 {
1455 // GetElementPtrConstantExpr
1456 // OperandList[0] is base
1457 // OperandList[1]... are indices
1458
1459 Value *ptr = constant_expr->getOperand(0);
1460
Greg Clayton3c7feb42010-11-19 01:05:25 +00001461 if (ptr == old_constant)
1462 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001463
1464 SmallVector<Value*, 16> indices;
1465
1466 unsigned operand_index;
1467 unsigned num_operands = constant_expr->getNumOperands();
1468
1469 for (operand_index = 1;
1470 operand_index < num_operands;
1471 ++operand_index)
1472 {
1473 Value *operand = constant_expr->getOperand(operand_index);
1474
Greg Clayton3c7feb42010-11-19 01:05:25 +00001475 if (operand == old_constant)
1476 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001477
1478 indices.push_back(operand);
1479 }
1480
Greg Clayton3c7feb42010-11-19 01:05:25 +00001481 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001482
Greg Clayton3c7feb42010-11-19 01:05:25 +00001483 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001484 }
1485 break;
1486 }
1487 }
1488 else
1489 {
1490 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001491 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001492 return false;
1493 }
1494 }
1495 else
1496 {
1497 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001498 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001499 }
1500 }
1501
1502 return true;
1503}
1504
Sean Callanan8bce6652010-07-13 21:41:46 +00001505bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001506IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001507{
Sean Callanane8a59a82010-09-13 21:34:21 +00001508 if (!m_resolve_vars)
1509 return true;
1510
Greg Claytone005f2c2010-11-06 01:53:30 +00001511 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001512
1513 m_decl_map->DoStructLayout();
1514
1515 if (log)
1516 log->Printf("Element arrangement:");
1517
1518 uint32_t num_elements;
1519 uint32_t element_index;
1520
1521 size_t size;
1522 off_t alignment;
1523
1524 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1525 return false;
1526
Greg Clayton3c7feb42010-11-19 01:05:25 +00001527 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001528
Greg Clayton3c7feb42010-11-19 01:05:25 +00001529 if (iter == llvm_function.getArgumentList().end())
Sean Callanan8bce6652010-07-13 21:41:46 +00001530 return false;
1531
Sean Callanan02fbafa2010-07-27 21:39:39 +00001532 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001533
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001534 if (argument->getName().equals("this"))
1535 {
1536 ++iter;
1537
Greg Clayton3c7feb42010-11-19 01:05:25 +00001538 if (iter == llvm_function.getArgumentList().end())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001539 return false;
1540
1541 argument = iter;
1542 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001543 else if (argument->getName().equals("self"))
1544 {
1545 ++iter;
1546
1547 if (iter == llvm_function.getArgumentList().end())
1548 return false;
1549
1550 if (!iter->getName().equals("_cmd"))
1551 return false;
1552
1553 ++iter;
1554
1555 if (iter == llvm_function.getArgumentList().end())
1556 return false;
1557
1558 argument = iter;
1559 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001560
Greg Clayton8de27c72010-10-15 22:48:33 +00001561 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan8bce6652010-07-13 21:41:46 +00001562 return false;
1563
1564 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001565 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001566
Greg Clayton3c7feb42010-11-19 01:05:25 +00001567 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001568 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001569
Sean Callanan6ba533e2010-11-17 23:00:36 +00001570 if (!FirstEntryInstruction)
Sean Callanan8bce6652010-07-13 21:41:46 +00001571 return false;
1572
Greg Clayton3c7feb42010-11-19 01:05:25 +00001573 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001574 const IntegerType *offset_type(Type::getInt32Ty(context));
1575
1576 if (!offset_type)
1577 return false;
1578
1579 for (element_index = 0; element_index < num_elements; ++element_index)
1580 {
1581 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001582 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001583 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001584 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001585
Sean Callanan45690fe2010-08-30 22:17:16 +00001586 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan8bce6652010-07-13 21:41:46 +00001587 return false;
1588
1589 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001590 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001591 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001592 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001593 PrintValue(value, true).c_str(),
1594 offset);
1595
1596 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001597 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
Sean Callanan6a925532011-01-13 08:53:35 +00001598
1599 Value *replacement;
Sean Callanan8bce6652010-07-13 21:41:46 +00001600
Sean Callanan6a925532011-01-13 08:53:35 +00001601 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult, in cases where the result
1602 // variable is an rvalue, we have to synthesize a dereference of the appropriate structure
1603 // entry in order to produce the static variable that the AST thinks it is accessing.
1604 if (name == m_result_name && !m_result_is_pointer)
1605 {
1606 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType()->getPointerTo(), "", FirstEntryInstruction);
1607
1608 LoadInst *load = new LoadInst(bit_cast, "", FirstEntryInstruction);
1609
1610 replacement = load;
1611 }
Sean Callananbafd6852010-07-14 23:40:29 +00001612 else
Sean Callanan6a925532011-01-13 08:53:35 +00001613 {
1614 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
1615
1616 replacement = bit_cast;
1617 }
1618
1619 if (Constant *constant = dyn_cast<Constant>(value))
1620 UnfoldConstant(constant, replacement, FirstEntryInstruction);
1621 else
1622 value->replaceAllUsesWith(replacement);
Sean Callananb51ee982010-11-02 23:51:17 +00001623
1624 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1625 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001626 }
1627
1628 if (log)
1629 log->Printf("Total structure [align %d, size %d]", alignment, size);
1630
1631 return true;
1632}
1633
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001634bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001635IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001636{
Greg Claytone005f2c2010-11-06 01:53:30 +00001637 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001638
Greg Clayton3c7feb42010-11-19 01:05:25 +00001639 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001640
1641 if (!function)
1642 {
1643 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001644 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan6a925532011-01-13 08:53:35 +00001645
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001646 return false;
1647 }
1648
Sean Callanan02fbafa2010-07-27 21:39:39 +00001649 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001650
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001651 m_has_side_effects = HasSideEffects(llvm_module, *function);
1652
Sean Callanan82b74c82010-08-12 01:56:52 +00001653 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001654 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001655 //
1656
Greg Clayton3c7feb42010-11-19 01:05:25 +00001657 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001658 {
1659 if (log)
1660 log->Printf("CreateResultVariable() failed");
Sean Callanan82b74c82010-08-12 01:56:52 +00001661 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001662 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001663
Sean Callanan6ba533e2010-11-17 23:00:36 +00001664 ///////////////////////////////////////////////////////////////////////////////
1665 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1666 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001667
Greg Clayton3c7feb42010-11-19 01:05:25 +00001668 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001669 {
1670 if (log)
1671 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan6ba533e2010-11-17 23:00:36 +00001672 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001673 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001674
Sean Callananf5857a02010-07-31 01:32:05 +00001675 //////////////////////////////////
1676 // Run basic-block level passes
1677 //
1678
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001679 for (bbi = function->begin();
1680 bbi != function->end();
1681 ++bbi)
1682 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001683 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001684 {
1685 if (log)
1686 log->Printf("RemoveGuards() failed");
Sean Callanan8c127202010-08-23 23:09:38 +00001687 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001688 }
Sean Callanan8c127202010-08-23 23:09:38 +00001689
Greg Clayton3c7feb42010-11-19 01:05:25 +00001690 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001691 {
1692 if (log)
1693 log->Printf("RewritePersistentAllocs() failed");
Sean Callananf5857a02010-07-31 01:32:05 +00001694 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001695 }
Sean Callananf5857a02010-07-31 01:32:05 +00001696
Greg Clayton3c7feb42010-11-19 01:05:25 +00001697 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001698 {
1699 if (log)
1700 log->Printf("RewriteObjCSelectors() failed");
Sean Callanana48fe162010-08-11 03:57:18 +00001701 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001702 }
Sean Callanana48fe162010-08-11 03:57:18 +00001703
Greg Clayton3c7feb42010-11-19 01:05:25 +00001704 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001705 {
1706 if (log)
1707 log->Printf("ResolveCalls() failed");
Sean Callanan8bce6652010-07-13 21:41:46 +00001708 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001709 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001710 }
1711
Sean Callanan771131d2010-09-30 21:18:25 +00001712 ///////////////////////////////
1713 // Run function-level passes
1714 //
1715
Greg Clayton3c7feb42010-11-19 01:05:25 +00001716 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001717 {
1718 if (log)
1719 log->Printf("ResolveExternals() failed");
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001720 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001721 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001722
Greg Clayton3c7feb42010-11-19 01:05:25 +00001723 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001724 {
1725 if (log)
1726 log->Printf("ReplaceVariables() failed");
Sean Callanan771131d2010-09-30 21:18:25 +00001727 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001728 }
Sean Callanan771131d2010-09-30 21:18:25 +00001729
Sean Callanan8bce6652010-07-13 21:41:46 +00001730 if (log)
1731 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001732 std::string s;
1733 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001734
Greg Clayton3c7feb42010-11-19 01:05:25 +00001735 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001736
1737 oss.flush();
1738
Greg Claytonb5037af2010-11-15 01:47:11 +00001739 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001740 }
1741
1742 return true;
1743}
1744
1745void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001746IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001747{
1748}
1749
1750PassManagerType
1751IRForTarget::getPotentialPassManagerType() const
1752{
1753 return PMT_ModulePassManager;
1754}