blob: 4581712ceaab4e649c1fdb08c01c81c25dfd2d64 [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"
Sean Callanan2a8c3382011-04-14 02:01:31 +000013#include "llvm/Constants.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000014#include "llvm/InstrTypes.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000015#include "llvm/Instructions.h"
Sean Callanan3cb1fd82010-09-28 23:55:00 +000016#include "llvm/Intrinsics.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000017#include "llvm/Module.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000018#include "llvm/Target/TargetData.h"
Sean Callanan82b74c82010-08-12 01:56:52 +000019#include "llvm/ValueSymbolTable.h"
Sean Callanan8bce6652010-07-13 21:41:46 +000020
21#include "clang/AST/ASTContext.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000022
Greg Clayton8de27c72010-10-15 22:48:33 +000023#include "lldb/Core/ConstString.h"
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000024#include "lldb/Core/dwarf.h"
25#include "lldb/Core/Log.h"
26#include "lldb/Core/Scalar.h"
27#include "lldb/Core/StreamString.h"
28#include "lldb/Expression/ClangExpressionDeclMap.h"
29
30#include <map>
31
32using namespace llvm;
33
Sean Callanan3351dac2010-08-18 18:50:51 +000034static char ID;
35
Greg Clayton3c7feb42010-11-19 01:05:25 +000036IRForTarget::IRForTarget (lldb_private::ClangExpressionDeclMap *decl_map,
37 bool resolve_vars,
Sean Callanan05a5a1b2010-12-16 03:17:46 +000038 lldb::ClangExpressionVariableSP *const_result,
Sean Callanan97c924e2011-01-27 01:07:04 +000039 lldb_private::Stream *error_stream,
Greg Clayton3c7feb42010-11-19 01:05:25 +000040 const char *func_name) :
Sean Callanan47a5c4c2010-09-23 03:01:22 +000041 ModulePass(ID),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000042 m_resolve_vars(resolve_vars),
43 m_func_name(func_name),
Sean Callanan8bce6652010-07-13 21:41:46 +000044 m_decl_map(decl_map),
Sean Callanan6ba533e2010-11-17 23:00:36 +000045 m_CFStringCreateWithBytes(NULL),
Sean Callanan65dafa82010-08-27 01:01:44 +000046 m_sel_registerName(NULL),
Sean Callanan05a5a1b2010-12-16 03:17:46 +000047 m_const_result(const_result),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000048 m_error_stream(error_stream),
Sean Callanan6a925532011-01-13 08:53:35 +000049 m_has_side_effects(false),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000050 m_result_is_pointer(false)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000051{
52}
53
Sean Callanan771131d2010-09-30 21:18:25 +000054/* Handy utility functions used at several places in the code */
Sean Callanana48fe162010-08-11 03:57:18 +000055
56static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000057PrintValue(const Value *value, bool truncate = false)
Sean Callanana48fe162010-08-11 03:57:18 +000058{
59 std::string s;
60 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000061 value->print(rso);
Sean Callanana48fe162010-08-11 03:57:18 +000062 rso.flush();
63 if (truncate)
64 s.resize(s.length() - 1);
65 return s;
66}
67
Sean Callanan771131d2010-09-30 21:18:25 +000068static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000069PrintType(const Type *type, bool truncate = false)
Sean Callanan771131d2010-09-30 21:18:25 +000070{
71 std::string s;
72 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000073 type->print(rso);
Sean Callanan771131d2010-09-30 21:18:25 +000074 rso.flush();
75 if (truncate)
76 s.resize(s.length() - 1);
77 return s;
78}
79
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000080IRForTarget::~IRForTarget()
81{
82}
83
Sean Callanan82b74c82010-08-12 01:56:52 +000084bool
Sean Callanan05a5a1b2010-12-16 03:17:46 +000085IRForTarget::HasSideEffects (llvm::Module &llvm_module,
86 llvm::Function &llvm_function)
87{
88 llvm::Function::iterator bbi;
89 BasicBlock::iterator ii;
90
91 for (bbi = llvm_function.begin();
92 bbi != llvm_function.end();
93 ++bbi)
94 {
95 BasicBlock &basic_block = *bbi;
96
97 for (ii = basic_block.begin();
98 ii != basic_block.end();
99 ++ii)
100 {
101 switch (ii->getOpcode())
102 {
103 default:
104 return true;
105 case Instruction::Store:
106 {
107 StoreInst *store_inst = dyn_cast<StoreInst>(ii);
108
109 Value *store_ptr = store_inst->getPointerOperand();
110
111 if (!isa <AllocaInst> (store_ptr))
112 return true;
113 else
114 break;
115 }
116 case Instruction::Load:
117 case Instruction::Alloca:
118 case Instruction::GetElementPtr:
119 case Instruction::Ret:
120 break;
121 }
122 }
123 }
124
125 return false;
126}
127
128void
129IRForTarget::MaybeSetConstantResult (llvm::Constant *initializer,
130 const lldb_private::ConstString &name,
131 lldb_private::TypeFromParser type)
132{
133 if (!m_const_result)
134 return;
135
136 if (llvm::ConstantInt *init_int = dyn_cast<llvm::ConstantInt>(initializer))
137 {
138 *m_const_result = m_decl_map->BuildIntegerVariable(name, type, init_int->getValue());
139 }
140}
141
142bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000143IRForTarget::CreateResultVariable (llvm::Module &llvm_module, llvm::Function &llvm_function)
Sean Callanan82b74c82010-08-12 01:56:52 +0000144{
Greg Claytone005f2c2010-11-06 01:53:30 +0000145 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000146
Sean Callanane8a59a82010-09-13 21:34:21 +0000147 if (!m_resolve_vars)
148 return true;
149
150 // Find the result variable. If it doesn't exist, we can give up right here.
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000151
Greg Clayton8de27c72010-10-15 22:48:33 +0000152 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000153
154 const char *result_name = NULL;
155
156 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
157 vi != ve;
158 ++vi)
159 {
Sean Callanan6a925532011-01-13 08:53:35 +0000160 if (strstr(vi->first(), "$__lldb_expr_result_ptr") &&
161 !strstr(vi->first(), "GV"))
162 {
163 result_name = vi->first();
164 m_result_is_pointer = true;
165 break;
166 }
167
Greg Clayton8de27c72010-10-15 22:48:33 +0000168 if (strstr(vi->first(), "$__lldb_expr_result") &&
Sean Callananc04743d2010-09-28 21:13:03 +0000169 !strstr(vi->first(), "GV"))
170 {
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000171 result_name = vi->first();
Sean Callanan6a925532011-01-13 08:53:35 +0000172 m_result_is_pointer = false;
Sean Callananc04743d2010-09-28 21:13:03 +0000173 break;
174 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000175 }
176
177 if (!result_name)
178 {
179 if (log)
180 log->PutCString("Couldn't find result variable");
181
182 return true;
183 }
184
Sean Callananc04743d2010-09-28 21:13:03 +0000185 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000186 log->Printf("Result name: \"%s\"", result_name);
Sean Callananc04743d2010-09-28 21:13:03 +0000187
Greg Clayton8de27c72010-10-15 22:48:33 +0000188 Value *result_value = llvm_module.getNamedValue(result_name);
Sean Callanan82b74c82010-08-12 01:56:52 +0000189
190 if (!result_value)
191 {
192 if (log)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000193 log->PutCString("Result variable had no data");
Sean Callanan6a925532011-01-13 08:53:35 +0000194
Sean Callanan97c924e2011-01-27 01:07:04 +0000195 if (m_error_stream)
196 m_error_stream->Printf("Internal error [IRForTarget]: Result variable's name (%s) exists, but not its definition\n", result_name);
197
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000198 return false;
Sean Callanan82b74c82010-08-12 01:56:52 +0000199 }
Sean Callanane8a59a82010-09-13 21:34:21 +0000200
Sean Callanan82b74c82010-08-12 01:56:52 +0000201 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000202 log->Printf("Found result in the IR: \"%s\"", PrintValue(result_value, false).c_str());
Sean Callanan82b74c82010-08-12 01:56:52 +0000203
204 GlobalVariable *result_global = dyn_cast<GlobalVariable>(result_value);
205
206 if (!result_global)
207 {
208 if (log)
209 log->PutCString("Result variable isn't a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000210
211 if (m_error_stream)
212 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) is defined, but is not a global variable\n", result_name);
213
Sean Callanan82b74c82010-08-12 01:56:52 +0000214 return false;
215 }
216
217 // Find the metadata and follow it to the VarDecl
218
Greg Clayton8de27c72010-10-15 22:48:33 +0000219 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanan82b74c82010-08-12 01:56:52 +0000220
221 if (!named_metadata)
222 {
223 if (log)
224 log->PutCString("No global metadata");
225
Sean Callanan97c924e2011-01-27 01:07:04 +0000226 if (m_error_stream)
227 m_error_stream->Printf("Internal error [IRForTarget]: No metadata\n");
228
Sean Callanan82b74c82010-08-12 01:56:52 +0000229 return false;
230 }
231
232 unsigned num_nodes = named_metadata->getNumOperands();
233 unsigned node_index;
234
235 MDNode *metadata_node = NULL;
236
237 for (node_index = 0;
238 node_index < num_nodes;
239 ++node_index)
240 {
241 metadata_node = named_metadata->getOperand(node_index);
242
243 if (metadata_node->getNumOperands() != 2)
244 continue;
245
246 if (metadata_node->getOperand(0) == result_global)
247 break;
248 }
249
250 if (!metadata_node)
251 {
252 if (log)
253 log->PutCString("Couldn't find result metadata");
Sean Callanan97c924e2011-01-27 01:07:04 +0000254
255 if (m_error_stream)
256 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) is a global variable, but has no metadata\n", result_name);
257
Sean Callanan82b74c82010-08-12 01:56:52 +0000258 return false;
259 }
260
261 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
262
Greg Claytonb5037af2010-11-15 01:47:11 +0000263 lldb::addr_t result_decl_intptr = constant_int->getZExtValue();
Sean Callanan82b74c82010-08-12 01:56:52 +0000264
265 clang::VarDecl *result_decl = reinterpret_cast<clang::VarDecl *>(result_decl_intptr);
266
267 // Get the next available result name from m_decl_map and create the persistent
268 // variable for it
269
Sean Callanan6a925532011-01-13 08:53:35 +0000270 lldb_private::TypeFromParser result_decl_type;
271
272 if (m_result_is_pointer)
273 {
274 clang::QualType pointer_qual_type = result_decl->getType();
Sean Callanand5b3c352011-01-27 04:42:51 +0000275 const clang::Type *pointer_type = pointer_qual_type.getTypePtr();
276 const clang::PointerType *pointer_pointertype = dyn_cast<clang::PointerType>(pointer_type);
Sean Callanan6a925532011-01-13 08:53:35 +0000277
278 if (!pointer_pointertype)
279 {
280 if (log)
281 log->PutCString("Expected result to have pointer type, but it did not");
Sean Callanan97c924e2011-01-27 01:07:04 +0000282
283 if (m_error_stream)
284 m_error_stream->Printf("Internal error [IRForTarget]: Lvalue result (%s) is not a pointer variable\n", result_name);
285
Sean Callanan6a925532011-01-13 08:53:35 +0000286 return false;
287 }
288
289 clang::QualType element_qual_type = pointer_pointertype->getPointeeType();
290
291 result_decl_type = lldb_private::TypeFromParser(element_qual_type.getAsOpaquePtr(),
292 &result_decl->getASTContext());
293 }
294 else
295 {
296 result_decl_type = lldb_private::TypeFromParser(result_decl->getType().getAsOpaquePtr(),
297 &result_decl->getASTContext());
298 }
299
300 m_result_name = m_decl_map->GetPersistentResultName();
301 // If the result is an Lvalue, it is emitted as a pointer; see
302 // ASTResultSynthesizer::SynthesizeBodyResult.
303 m_decl_map->AddPersistentVariable(result_decl,
304 m_result_name,
305 result_decl_type,
306 true,
307 m_result_is_pointer);
Sean Callanan82b74c82010-08-12 01:56:52 +0000308
309 if (log)
Sean Callanan6a925532011-01-13 08:53:35 +0000310 log->Printf("Creating a new result global: \"%s\"", m_result_name.GetCString());
Sean Callanan82b74c82010-08-12 01:56:52 +0000311
312 // Construct a new result global and set up its metadata
313
Greg Clayton8de27c72010-10-15 22:48:33 +0000314 GlobalVariable *new_result_global = new GlobalVariable(llvm_module,
Sean Callanan82b74c82010-08-12 01:56:52 +0000315 result_global->getType()->getElementType(),
316 false, /* not constant */
317 GlobalValue::ExternalLinkage,
318 NULL, /* no initializer */
Sean Callanan6a925532011-01-13 08:53:35 +0000319 m_result_name.GetCString ());
Sean Callanan82b74c82010-08-12 01:56:52 +0000320
321 // It's too late in compilation to create a new VarDecl for this, but we don't
322 // need to. We point the metadata at the old VarDecl. This creates an odd
323 // anomaly: a variable with a Value whose name is something like $0 and a
Greg Clayton8de27c72010-10-15 22:48:33 +0000324 // Decl whose name is $__lldb_expr_result. This condition is handled in
Sean Callanan82b74c82010-08-12 01:56:52 +0000325 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
326 // fixed up.
327
328 ConstantInt *new_constant_int = ConstantInt::get(constant_int->getType(),
329 result_decl_intptr,
330 false);
331
332 llvm::Value* values[2];
333 values[0] = new_result_global;
334 values[1] = new_constant_int;
335
Greg Clayton8de27c72010-10-15 22:48:33 +0000336 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanan82b74c82010-08-12 01:56:52 +0000337 named_metadata->addOperand(persistent_global_md);
338
339 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000340 log->Printf("Replacing \"%s\" with \"%s\"",
Sean Callanan2e2db532010-09-07 22:43:19 +0000341 PrintValue(result_global).c_str(),
Sean Callanan82b74c82010-08-12 01:56:52 +0000342 PrintValue(new_result_global).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000343
344 if (result_global->hasNUses(0))
345 {
346 // We need to synthesize a store for this variable, because otherwise
347 // there's nothing to put into its equivalent persistent variable.
Sean Callanan82b74c82010-08-12 01:56:52 +0000348
Greg Clayton8de27c72010-10-15 22:48:33 +0000349 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan2e2db532010-09-07 22:43:19 +0000350 Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg());
351
352 if (!first_entry_instruction)
353 return false;
354
355 if (!result_global->hasInitializer())
356 {
357 if (log)
358 log->Printf("Couldn't find initializer for unused variable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000359
360 if (m_error_stream)
361 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) has no writes and no initializer\n", result_name);
362
Sean Callanan2e2db532010-09-07 22:43:19 +0000363 return false;
364 }
365
366 Constant *initializer = result_global->getInitializer();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000367
368 // Here we write the initializer into a result variable assuming it
369 // can be computed statically.
370
371 if (!m_has_side_effects)
372 {
373 MaybeSetConstantResult (initializer,
Sean Callanan6a925532011-01-13 08:53:35 +0000374 m_result_name,
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000375 result_decl_type);
376 }
Sean Callanan2e2db532010-09-07 22:43:19 +0000377
Greg Clayton2c344ca2011-02-05 02:28:58 +0000378 StoreInst *synthesized_store = new StoreInst(initializer,
379 new_result_global,
380 first_entry_instruction);
Sean Callanan2e2db532010-09-07 22:43:19 +0000381
382 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000383 log->Printf("Synthesized result store \"%s\"\n", PrintValue(synthesized_store).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000384 }
385 else
386 {
387 result_global->replaceAllUsesWith(new_result_global);
388 }
389
Sean Callanan82b74c82010-08-12 01:56:52 +0000390 result_global->eraseFromParent();
391
392 return true;
393}
394
Greg Clayton3c7feb42010-11-19 01:05:25 +0000395static void DebugUsers(lldb::LogSP &log, Value *value, uint8_t depth)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000396{
397 if (!depth)
398 return;
399
400 depth--;
401
Greg Clayton3c7feb42010-11-19 01:05:25 +0000402 log->Printf(" <Begin %d users>", value->getNumUses());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000403
Greg Clayton3c7feb42010-11-19 01:05:25 +0000404 for (Value::use_iterator ui = value->use_begin(), ue = value->use_end();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000405 ui != ue;
406 ++ui)
407 {
408 log->Printf(" <Use %p> %s", *ui, PrintValue(*ui).c_str());
409 DebugUsers(log, *ui, depth);
410 }
411
412 log->Printf(" <End uses>");
413}
414
415bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000416IRForTarget::RewriteObjCConstString (llvm::Module &llvm_module,
417 llvm::GlobalVariable *ns_str,
418 llvm::GlobalVariable *cstr,
419 Instruction *FirstEntryInstruction)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000420{
421 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
422
Greg Clayton3c7feb42010-11-19 01:05:25 +0000423 const Type *i8_ptr_ty = Type::getInt8PtrTy(llvm_module.getContext());
424 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
425 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
426 const Type *i32_ty = Type::getInt32Ty(llvm_module.getContext());
427 const Type *i8_ty = Type::getInt8Ty(llvm_module.getContext());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000428
429 if (!m_CFStringCreateWithBytes)
430 {
431 lldb::addr_t CFStringCreateWithBytes_addr;
432
433 static lldb_private::ConstString g_CFStringCreateWithBytes_str ("CFStringCreateWithBytes");
434
435 if (!m_decl_map->GetFunctionAddress (g_CFStringCreateWithBytes_str, CFStringCreateWithBytes_addr))
436 {
437 if (log)
438 log->PutCString("Couldn't find CFStringCreateWithBytes in the target");
439
Sean Callanan97c924e2011-01-27 01:07:04 +0000440 if (m_error_stream)
441 m_error_stream->Printf("Error [IRForTarget]: Rewriting an Objective-C constant string requires CFStringCreateWithBytes\n");
442
Sean Callanan6ba533e2010-11-17 23:00:36 +0000443 return false;
444 }
445
446 if (log)
447 log->Printf("Found CFStringCreateWithBytes at 0x%llx", CFStringCreateWithBytes_addr);
448
449 // Build the function type:
450 //
451 // CFStringRef CFStringCreateWithBytes (
452 // CFAllocatorRef alloc,
453 // const UInt8 *bytes,
454 // CFIndex numBytes,
455 // CFStringEncoding encoding,
456 // Boolean isExternalRepresentation
457 // );
458 //
459 // We make the following substitutions:
460 //
461 // CFStringRef -> i8*
462 // CFAllocatorRef -> i8*
463 // UInt8 * -> i8*
464 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its pointer size for now)
465 // CFStringEncoding -> i32
466 // Boolean -> i8
467
468 std::vector <const Type *> CFSCWB_arg_types;
469 CFSCWB_arg_types.push_back(i8_ptr_ty);
470 CFSCWB_arg_types.push_back(i8_ptr_ty);
471 CFSCWB_arg_types.push_back(intptr_ty);
472 CFSCWB_arg_types.push_back(i32_ty);
473 CFSCWB_arg_types.push_back(i8_ty);
474 llvm::Type *CFSCWB_ty = FunctionType::get(i8_ptr_ty, CFSCWB_arg_types, false);
475
476 // Build the constant containing the pointer to the function
477 PointerType *CFSCWB_ptr_ty = PointerType::getUnqual(CFSCWB_ty);
478 Constant *CFSCWB_addr_int = ConstantInt::get(intptr_ty, CFStringCreateWithBytes_addr, false);
479 m_CFStringCreateWithBytes = ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty);
480 }
481
Sean Callanan0ece5262011-02-10 22:17:53 +0000482 ConstantArray *string_array;
483
484 if (cstr)
485 string_array = dyn_cast<ConstantArray>(cstr->getInitializer());
486 else
487 string_array = NULL;
Sean Callanan6ba533e2010-11-17 23:00:36 +0000488
489 SmallVector <Value*, 5> CFSCWB_arguments;
490
491 Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty);
Sean Callanan0ece5262011-02-10 22:17:53 +0000492 Constant *bytes_arg = cstr ? ConstantExpr::getBitCast(cstr, i8_ptr_ty) : Constant::getNullValue(i8_ptr_ty);
493 Constant *numBytes_arg = ConstantInt::get(intptr_ty, cstr ? string_array->getType()->getNumElements() - 1 : 0, false);
Sean Callanan6ba533e2010-11-17 23:00:36 +0000494 Constant *encoding_arg = ConstantInt::get(i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */
495 Constant *isExternal_arg = ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */
496
497 CFSCWB_arguments.push_back(alloc_arg);
498 CFSCWB_arguments.push_back(bytes_arg);
499 CFSCWB_arguments.push_back(numBytes_arg);
500 CFSCWB_arguments.push_back(encoding_arg);
501 CFSCWB_arguments.push_back(isExternal_arg);
502
503 CallInst *CFSCWB_call = CallInst::Create(m_CFStringCreateWithBytes,
504 CFSCWB_arguments.begin(),
505 CFSCWB_arguments.end(),
506 "CFStringCreateWithBytes",
507 FirstEntryInstruction);
Sean Callananae71e302010-11-18 22:21:58 +0000508
Greg Clayton3c7feb42010-11-19 01:05:25 +0000509 if (!UnfoldConstant(ns_str, CFSCWB_call, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000510 {
511 if (log)
512 log->PutCString("Couldn't replace the NSString with the result of the call");
513
Sean Callanan97c924e2011-01-27 01:07:04 +0000514 if (m_error_stream)
515 m_error_stream->Printf("Error [IRForTarget]: Couldn't replace an Objective-C constant string with a dynamic string\n");
516
Sean Callanan6ba533e2010-11-17 23:00:36 +0000517 return false;
518 }
519
Greg Clayton3c7feb42010-11-19 01:05:25 +0000520 ns_str->eraseFromParent();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000521
522 return true;
523}
524
525bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000526IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_function)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000527{
528 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
529
Greg Clayton3c7feb42010-11-19 01:05:25 +0000530 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000531
Greg Clayton3c7feb42010-11-19 01:05:25 +0000532 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000533 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
534
535 if (!FirstEntryInstruction)
536 {
537 if (log)
538 log->PutCString("Couldn't find first instruction for rewritten Objective-C strings");
539
Sean Callanan97c924e2011-01-27 01:07:04 +0000540 if (m_error_stream)
541 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find the location for calls to CFStringCreateWithBytes\n");
542
Sean Callanan6ba533e2010-11-17 23:00:36 +0000543 return false;
544 }
545
546 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
547 vi != ve;
548 ++vi)
549 {
550 if (strstr(vi->first(), "_unnamed_cfstring_"))
551 {
552 Value *nsstring_value = vi->second;
553
554 GlobalVariable *nsstring_global = dyn_cast<GlobalVariable>(nsstring_value);
555
556 if (!nsstring_global)
557 {
558 if (log)
559 log->PutCString("NSString variable is not a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000560
561 if (m_error_stream)
562 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string is not a global variable\n");
563
Sean Callanan6ba533e2010-11-17 23:00:36 +0000564 return false;
565 }
566
567 if (!nsstring_global->hasInitializer())
568 {
569 if (log)
570 log->PutCString("NSString variable does not have an initializer");
Sean Callanan97c924e2011-01-27 01:07:04 +0000571
572 if (m_error_stream)
573 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string does not have an initializer\n");
574
Sean Callanan6ba533e2010-11-17 23:00:36 +0000575 return false;
576 }
577
578 ConstantStruct *nsstring_struct = dyn_cast<ConstantStruct>(nsstring_global->getInitializer());
579
580 if (!nsstring_struct)
581 {
582 if (log)
583 log->PutCString("NSString variable's initializer is not a ConstantStruct");
Sean Callanan97c924e2011-01-27 01:07:04 +0000584
585 if (m_error_stream)
586 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string is not a structure constant\n");
587
Sean Callanan6ba533e2010-11-17 23:00:36 +0000588 return false;
589 }
590
591 // We expect the following structure:
592 //
593 // struct {
594 // int *isa;
595 // int flags;
596 // char *str;
597 // long length;
598 // };
599
600 if (nsstring_struct->getNumOperands() != 4)
601 {
602 if (log)
603 log->Printf("NSString variable's initializer structure has an unexpected number of members. Should be 4, is %d", nsstring_struct->getNumOperands());
Sean Callanan97c924e2011-01-27 01:07:04 +0000604
605 if (m_error_stream)
606 m_error_stream->Printf("Internal error [IRForTarget]: The struct for an Objective-C constant string is not as expected\n");
607
Sean Callanan6ba533e2010-11-17 23:00:36 +0000608 return false;
609 }
610
611 Constant *nsstring_member = nsstring_struct->getOperand(2);
612
613 if (!nsstring_member)
614 {
615 if (log)
616 log->PutCString("NSString initializer's str element was empty");
Sean Callanan97c924e2011-01-27 01:07:04 +0000617
618 if (m_error_stream)
619 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string does not have a string initializer\n");
620
Sean Callanan6ba533e2010-11-17 23:00:36 +0000621 return false;
622 }
623
624 ConstantExpr *nsstring_expr = dyn_cast<ConstantExpr>(nsstring_member);
625
626 if (!nsstring_expr)
627 {
628 if (log)
629 log->PutCString("NSString initializer's str element is not a ConstantExpr");
Sean Callanan97c924e2011-01-27 01:07:04 +0000630
631 if (m_error_stream)
632 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer is not constant\n");
633
Sean Callanan6ba533e2010-11-17 23:00:36 +0000634 return false;
635 }
636
637 if (nsstring_expr->getOpcode() != Instruction::GetElementPtr)
638 {
639 if (log)
640 log->Printf("NSString initializer's str element is not a GetElementPtr expression, it's a %s", nsstring_expr->getOpcodeName());
Sean Callanan97c924e2011-01-27 01:07:04 +0000641
642 if (m_error_stream)
643 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer is not an array\n");
644
Sean Callanan6ba533e2010-11-17 23:00:36 +0000645 return false;
646 }
647
648 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
649
650 GlobalVariable *cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
651
652 if (!cstr_global)
653 {
654 if (log)
655 log->PutCString("NSString initializer's str element is not a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000656
657 if (m_error_stream)
658 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to a global\n");
Sean Callanan65e2aee2010-11-20 02:06:01 +0000659
Sean Callanan6ba533e2010-11-17 23:00:36 +0000660 return false;
661 }
662
663 if (!cstr_global->hasInitializer())
664 {
665 if (log)
666 log->PutCString("NSString initializer's str element does not have an initializer");
Sean Callanan97c924e2011-01-27 01:07:04 +0000667
668 if (m_error_stream)
669 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to initialized data\n");
670
Sean Callanan6ba533e2010-11-17 23:00:36 +0000671 return false;
672 }
Sean Callanan0ece5262011-02-10 22:17:53 +0000673
674 /*
Sean Callanan6ba533e2010-11-17 23:00:36 +0000675 if (!cstr_array)
676 {
677 if (log)
678 log->PutCString("NSString initializer's str element is not a ConstantArray");
Sean Callanan97c924e2011-01-27 01:07:04 +0000679
680 if (m_error_stream)
681 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to an array\n");
682
Sean Callanan6ba533e2010-11-17 23:00:36 +0000683 return false;
684 }
685
686 if (!cstr_array->isCString())
687 {
688 if (log)
689 log->PutCString("NSString initializer's str element is not a C string array");
Sean Callanan97c924e2011-01-27 01:07:04 +0000690
691 if (m_error_stream)
692 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to a C string\n");
693
Sean Callanan6ba533e2010-11-17 23:00:36 +0000694 return false;
695 }
Sean Callanan0ece5262011-02-10 22:17:53 +0000696 */
697
698 ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000699
700 if (log)
Sean Callanan0ece5262011-02-10 22:17:53 +0000701 {
702 if (cstr_array)
703 log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str());
704 else
705 log->Printf("Found NSString constant %s, which contains \"\"", vi->first());
706 }
707
708 if (!cstr_array)
709 cstr_global = NULL;
Sean Callanan6ba533e2010-11-17 23:00:36 +0000710
Greg Clayton3c7feb42010-11-19 01:05:25 +0000711 if (!RewriteObjCConstString(llvm_module, nsstring_global, cstr_global, FirstEntryInstruction))
Sean Callanan97c924e2011-01-27 01:07:04 +0000712 {
Sean Callanan6ba533e2010-11-17 23:00:36 +0000713 if (log)
714 log->PutCString("Error rewriting the constant string");
Sean Callanan97c924e2011-01-27 01:07:04 +0000715
716 // We don't print an error message here because RewriteObjCConstString has done so for us.
717
Sean Callanan6ba533e2010-11-17 23:00:36 +0000718 return false;
719 }
Sean Callanan6ba533e2010-11-17 23:00:36 +0000720 }
721 }
722
723 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
724 vi != ve;
725 ++vi)
726 {
727 if (!strcmp(vi->first(), "__CFConstantStringClassReference"))
728 {
729 GlobalVariable *gv = dyn_cast<GlobalVariable>(vi->second);
730
731 if (!gv)
732 {
733 if (log)
734 log->PutCString("__CFConstantStringClassReference is not a global variable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000735
736 if (m_error_stream)
737 m_error_stream->Printf("Internal error [IRForTarget]: Found a CFConstantStringClassReference, but it is not a global object\n");
738
Sean Callanan6ba533e2010-11-17 23:00:36 +0000739 return false;
740 }
741
742 gv->eraseFromParent();
743
744 break;
745 }
746 }
747
748 return true;
749}
750
Greg Clayton3c7feb42010-11-19 01:05:25 +0000751static bool IsObjCSelectorRef (Value *value)
Sean Callananf5857a02010-07-31 01:32:05 +0000752{
Greg Clayton3c7feb42010-11-19 01:05:25 +0000753 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
Sean Callananf5857a02010-07-31 01:32:05 +0000754
Greg Clayton3c7feb42010-11-19 01:05:25 +0000755 if (!global_variable || !global_variable->hasName() || !global_variable->getName().startswith("\01L_OBJC_SELECTOR_REFERENCES_"))
Sean Callananf5857a02010-07-31 01:32:05 +0000756 return false;
757
758 return true;
759}
760
Sean Callanan97c924e2011-01-27 01:07:04 +0000761// This function does not report errors; its callers are responsible.
Sean Callananf5857a02010-07-31 01:32:05 +0000762bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000763IRForTarget::RewriteObjCSelector (Instruction* selector_load, Module &llvm_module)
Sean Callananf5857a02010-07-31 01:32:05 +0000764{
Greg Claytone005f2c2010-11-06 01:53:30 +0000765 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000766
767 LoadInst *load = dyn_cast<LoadInst>(selector_load);
768
769 if (!load)
770 return false;
771
772 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend gets represented as
773 //
774 // %tmp = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_" ; <i8*>
775 // %call = call i8* (i8*, i8*, ...)* @objc_msgSend(i8* %obj, i8* %tmp, ...) ; <i8*>
776 //
777 // where %obj is the object pointer and %tmp is the selector.
778 //
Greg Clayton3c7feb42010-11-19 01:05:25 +0000779 // @"\01L_OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_".
780 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_" contains the string.
Sean Callananf5857a02010-07-31 01:32:05 +0000781
782 // Find the pointer's initializer (a ConstantExpr with opcode GetElementPtr) and get the string from its target
783
784 GlobalVariable *_objc_selector_references_ = dyn_cast<GlobalVariable>(load->getPointerOperand());
785
786 if (!_objc_selector_references_ || !_objc_selector_references_->hasInitializer())
787 return false;
788
789 Constant *osr_initializer = _objc_selector_references_->getInitializer();
790
791 ConstantExpr *osr_initializer_expr = dyn_cast<ConstantExpr>(osr_initializer);
792
793 if (!osr_initializer_expr || osr_initializer_expr->getOpcode() != Instruction::GetElementPtr)
794 return false;
795
796 Value *osr_initializer_base = osr_initializer_expr->getOperand(0);
797
798 if (!osr_initializer_base)
799 return false;
800
801 // Find the string's initializer (a ConstantArray) and get the string from it
802
803 GlobalVariable *_objc_meth_var_name_ = dyn_cast<GlobalVariable>(osr_initializer_base);
804
805 if (!_objc_meth_var_name_ || !_objc_meth_var_name_->hasInitializer())
806 return false;
807
808 Constant *omvn_initializer = _objc_meth_var_name_->getInitializer();
809
810 ConstantArray *omvn_initializer_array = dyn_cast<ConstantArray>(omvn_initializer);
811
812 if (!omvn_initializer_array->isString())
813 return false;
814
815 std::string omvn_initializer_string = omvn_initializer_array->getAsString();
816
817 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000818 log->Printf("Found Objective-C selector reference \"%s\"", omvn_initializer_string.c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000819
820 // Construct a call to sel_registerName
821
822 if (!m_sel_registerName)
823 {
Greg Claytonb5037af2010-11-15 01:47:11 +0000824 lldb::addr_t sel_registerName_addr;
Sean Callananf5857a02010-07-31 01:32:05 +0000825
Greg Clayton8de27c72010-10-15 22:48:33 +0000826 static lldb_private::ConstString g_sel_registerName_str ("sel_registerName");
Greg Claytonb5037af2010-11-15 01:47:11 +0000827 if (!m_decl_map->GetFunctionAddress (g_sel_registerName_str, sel_registerName_addr))
Sean Callananf5857a02010-07-31 01:32:05 +0000828 return false;
829
Sean Callananc2c6f772010-10-26 00:31:56 +0000830 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000831 log->Printf("Found sel_registerName at 0x%llx", sel_registerName_addr);
Sean Callananc2c6f772010-10-26 00:31:56 +0000832
Sean Callananf5857a02010-07-31 01:32:05 +0000833 // Build the function type: struct objc_selector *sel_registerName(uint8_t*)
834
835 // The below code would be "more correct," but in actuality what's required is uint8_t*
Greg Clayton3c7feb42010-11-19 01:05:25 +0000836 //Type *sel_type = StructType::get(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000837 //Type *sel_ptr_type = PointerType::getUnqual(sel_type);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000838 const Type *sel_ptr_type = Type::getInt8PtrTy(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000839
840 std::vector <const Type *> srN_arg_types;
Greg Clayton3c7feb42010-11-19 01:05:25 +0000841 srN_arg_types.push_back(Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000842 llvm::Type *srN_type = FunctionType::get(sel_ptr_type, srN_arg_types, false);
843
844 // Build the constant containing the pointer to the function
Greg Clayton3c7feb42010-11-19 01:05:25 +0000845 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
846 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callananf5857a02010-07-31 01:32:05 +0000847 PointerType *srN_ptr_ty = PointerType::getUnqual(srN_type);
Greg Claytonb5037af2010-11-15 01:47:11 +0000848 Constant *srN_addr_int = ConstantInt::get(intptr_ty, sel_registerName_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +0000849 m_sel_registerName = ConstantExpr::getIntToPtr(srN_addr_int, srN_ptr_ty);
850 }
851
852 SmallVector <Value*, 1> srN_arguments;
853
Greg Clayton3c7feb42010-11-19 01:05:25 +0000854 Constant *omvn_pointer = ConstantExpr::getBitCast(_objc_meth_var_name_, Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000855
856 srN_arguments.push_back(omvn_pointer);
857
858 CallInst *srN_call = CallInst::Create(m_sel_registerName,
859 srN_arguments.begin(),
860 srN_arguments.end(),
Sean Callanan6ba533e2010-11-17 23:00:36 +0000861 "sel_registerName",
Sean Callananf5857a02010-07-31 01:32:05 +0000862 selector_load);
863
864 // Replace the load with the call in all users
865
866 selector_load->replaceAllUsesWith(srN_call);
867
868 selector_load->eraseFromParent();
869
870 return true;
871}
872
873bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000874IRForTarget::RewriteObjCSelectors (Module &llvm_module, BasicBlock &basic_block)
Sean Callananf5857a02010-07-31 01:32:05 +0000875{
Greg Claytone005f2c2010-11-06 01:53:30 +0000876 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000877
878 BasicBlock::iterator ii;
879
880 typedef SmallVector <Instruction*, 2> InstrList;
881 typedef InstrList::iterator InstrIterator;
882
883 InstrList selector_loads;
884
Greg Clayton3c7feb42010-11-19 01:05:25 +0000885 for (ii = basic_block.begin();
886 ii != basic_block.end();
Sean Callananf5857a02010-07-31 01:32:05 +0000887 ++ii)
888 {
889 Instruction &inst = *ii;
890
891 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
Greg Clayton3c7feb42010-11-19 01:05:25 +0000892 if (IsObjCSelectorRef(load->getPointerOperand()))
Sean Callananf5857a02010-07-31 01:32:05 +0000893 selector_loads.push_back(&inst);
894 }
895
896 InstrIterator iter;
897
898 for (iter = selector_loads.begin();
899 iter != selector_loads.end();
900 ++iter)
901 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000902 if (!RewriteObjCSelector(*iter, llvm_module))
Sean Callananf5857a02010-07-31 01:32:05 +0000903 {
Sean Callanan97c924e2011-01-27 01:07:04 +0000904 if (m_error_stream)
905 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't change a static reference to an Objective-C selector to a dynamic reference\n");
906
Sean Callananf5857a02010-07-31 01:32:05 +0000907 if(log)
908 log->PutCString("Couldn't rewrite a reference to an Objective-C selector");
Sean Callanan97c924e2011-01-27 01:07:04 +0000909
Sean Callananf5857a02010-07-31 01:32:05 +0000910 return false;
911 }
912 }
913
914 return true;
915}
916
Sean Callanan97c924e2011-01-27 01:07:04 +0000917// This function does not report errors; its callers are responsible.
Sean Callanana48fe162010-08-11 03:57:18 +0000918bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000919IRForTarget::RewritePersistentAlloc (llvm::Instruction *persistent_alloc,
920 llvm::Module &llvm_module)
Sean Callanana48fe162010-08-11 03:57:18 +0000921{
Sean Callanan97678d12011-01-13 21:23:32 +0000922 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
923
Sean Callanana48fe162010-08-11 03:57:18 +0000924 AllocaInst *alloc = dyn_cast<AllocaInst>(persistent_alloc);
925
926 MDNode *alloc_md = alloc->getMetadata("clang.decl.ptr");
927
928 if (!alloc_md || !alloc_md->getNumOperands())
929 return false;
930
931 ConstantInt *constant_int = dyn_cast<ConstantInt>(alloc_md->getOperand(0));
932
933 if (!constant_int)
934 return false;
935
936 // We attempt to register this as a new persistent variable with the DeclMap.
937
938 uintptr_t ptr = constant_int->getZExtValue();
939
Sean Callanan82b74c82010-08-12 01:56:52 +0000940 clang::VarDecl *decl = reinterpret_cast<clang::VarDecl *>(ptr);
Sean Callanana48fe162010-08-11 03:57:18 +0000941
Sean Callanan82b74c82010-08-12 01:56:52 +0000942 lldb_private::TypeFromParser result_decl_type (decl->getType().getAsOpaquePtr(),
943 &decl->getASTContext());
944
Greg Clayton8de27c72010-10-15 22:48:33 +0000945 StringRef decl_name (decl->getName());
946 lldb_private::ConstString persistent_variable_name (decl_name.data(), decl_name.size());
Sean Callanan6a925532011-01-13 08:53:35 +0000947 if (!m_decl_map->AddPersistentVariable(decl, persistent_variable_name, result_decl_type, false, false))
Sean Callanana48fe162010-08-11 03:57:18 +0000948 return false;
949
Sean Callanan97678d12011-01-13 21:23:32 +0000950 GlobalVariable *persistent_global = new GlobalVariable(llvm_module,
951 alloc->getType(),
Sean Callanana48fe162010-08-11 03:57:18 +0000952 false, /* not constant */
953 GlobalValue::ExternalLinkage,
954 NULL, /* no initializer */
955 alloc->getName().str().c_str());
956
957 // What we're going to do here is make believe this was a regular old external
958 // variable. That means we need to make the metadata valid.
959
Greg Clayton8de27c72010-10-15 22:48:33 +0000960 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanana48fe162010-08-11 03:57:18 +0000961
962 llvm::Value* values[2];
963 values[0] = persistent_global;
964 values[1] = constant_int;
965
Greg Clayton8de27c72010-10-15 22:48:33 +0000966 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanana48fe162010-08-11 03:57:18 +0000967 named_metadata->addOperand(persistent_global_md);
968
Sean Callanan97678d12011-01-13 21:23:32 +0000969 // Now, since the variable is a pointer variable, we will drop in a load of that
970 // pointer variable.
971
972 LoadInst *persistent_load = new LoadInst (persistent_global, "", alloc);
973
974 if (log)
975 log->Printf("Replacing \"%s\" with \"%s\"",
976 PrintValue(alloc).c_str(),
977 PrintValue(persistent_load).c_str());
978
979 alloc->replaceAllUsesWith(persistent_load);
Sean Callanana48fe162010-08-11 03:57:18 +0000980 alloc->eraseFromParent();
981
982 return true;
983}
984
985bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000986IRForTarget::RewritePersistentAllocs(llvm::Module &llvm_module, llvm::BasicBlock &basic_block)
Sean Callanana48fe162010-08-11 03:57:18 +0000987{
Sean Callanane8a59a82010-09-13 21:34:21 +0000988 if (!m_resolve_vars)
989 return true;
990
Greg Claytone005f2c2010-11-06 01:53:30 +0000991 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanana48fe162010-08-11 03:57:18 +0000992
993 BasicBlock::iterator ii;
994
995 typedef SmallVector <Instruction*, 2> InstrList;
996 typedef InstrList::iterator InstrIterator;
997
998 InstrList pvar_allocs;
999
Greg Clayton3c7feb42010-11-19 01:05:25 +00001000 for (ii = basic_block.begin();
1001 ii != basic_block.end();
Sean Callanana48fe162010-08-11 03:57:18 +00001002 ++ii)
1003 {
1004 Instruction &inst = *ii;
1005
1006 if (AllocaInst *alloc = dyn_cast<AllocaInst>(&inst))
Sean Callanan237e4742011-01-21 22:30:25 +00001007 {
1008 llvm::StringRef alloc_name = alloc->getName();
1009
1010 if (alloc_name.startswith("$") &&
1011 !alloc_name.startswith("$__lldb"))
1012 {
1013 if (alloc_name.find_first_of("0123456789") == 1)
1014 {
1015 if (log)
1016 log->Printf("Rejecting a numeric persistent variable.");
1017
Sean Callanan97c924e2011-01-27 01:07:04 +00001018 if (m_error_stream)
1019 m_error_stream->Printf("Error [IRForTarget]: Names starting with $0, $1, ... are reserved for use as result names\n");
1020
Sean Callanan237e4742011-01-21 22:30:25 +00001021 return false;
1022 }
1023
Sean Callanana48fe162010-08-11 03:57:18 +00001024 pvar_allocs.push_back(alloc);
Sean Callanan237e4742011-01-21 22:30:25 +00001025 }
1026 }
Sean Callanana48fe162010-08-11 03:57:18 +00001027 }
1028
1029 InstrIterator iter;
1030
1031 for (iter = pvar_allocs.begin();
1032 iter != pvar_allocs.end();
1033 ++iter)
1034 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001035 if (!RewritePersistentAlloc(*iter, llvm_module))
Sean Callanana48fe162010-08-11 03:57:18 +00001036 {
Sean Callanan97c924e2011-01-27 01:07:04 +00001037 if (m_error_stream)
1038 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite the creation of a persistent variable\n");
1039
Sean Callanana48fe162010-08-11 03:57:18 +00001040 if(log)
1041 log->PutCString("Couldn't rewrite the creation of a persistent variable");
Sean Callanan97c924e2011-01-27 01:07:04 +00001042
Sean Callanana48fe162010-08-11 03:57:18 +00001043 return false;
1044 }
1045 }
1046
1047 return true;
1048}
1049
Sean Callanan8bce6652010-07-13 21:41:46 +00001050static clang::NamedDecl *
Greg Clayton3c7feb42010-11-19 01:05:25 +00001051DeclForGlobalValue(Module &module, GlobalValue *global_value)
Sean Callanan8bce6652010-07-13 21:41:46 +00001052{
1053 NamedMDNode *named_metadata = module.getNamedMetadata("clang.global.decl.ptrs");
1054
1055 if (!named_metadata)
1056 return NULL;
1057
1058 unsigned num_nodes = named_metadata->getNumOperands();
1059 unsigned node_index;
1060
1061 for (node_index = 0;
1062 node_index < num_nodes;
1063 ++node_index)
1064 {
1065 MDNode *metadata_node = named_metadata->getOperand(node_index);
1066
1067 if (!metadata_node)
1068 return NULL;
1069
1070 if (metadata_node->getNumOperands() != 2)
Sean Callanana48fe162010-08-11 03:57:18 +00001071 continue;
Sean Callanan8bce6652010-07-13 21:41:46 +00001072
1073 if (metadata_node->getOperand(0) != global_value)
1074 continue;
1075
1076 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
1077
1078 if (!constant_int)
1079 return NULL;
1080
1081 uintptr_t ptr = constant_int->getZExtValue();
1082
1083 return reinterpret_cast<clang::NamedDecl *>(ptr);
1084 }
1085
1086 return NULL;
1087}
1088
Sean Callanan97c924e2011-01-27 01:07:04 +00001089// This function does not report errors; its callers are responsible.
Sean Callanan8bce6652010-07-13 21:41:46 +00001090bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001091IRForTarget::MaybeHandleVariable (Module &llvm_module, Value *llvm_value_ptr)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001092{
Greg Claytone005f2c2010-11-06 01:53:30 +00001093 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan48443652010-12-02 19:47:57 +00001094
1095 if (log)
Sean Callananb9f09a62010-12-06 22:16:55 +00001096 log->Printf("MaybeHandleVariable (%s)", PrintValue(llvm_value_ptr).c_str());
Sean Callananf5857a02010-07-31 01:32:05 +00001097
Greg Clayton8de27c72010-10-15 22:48:33 +00001098 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr))
Sean Callananbc2928a2010-08-03 00:23:29 +00001099 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001100 switch (constant_expr->getOpcode())
Sean Callananbc2928a2010-08-03 00:23:29 +00001101 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001102 default:
1103 break;
1104 case Instruction::GetElementPtr:
1105 case Instruction::BitCast:
Sean Callananbc2928a2010-08-03 00:23:29 +00001106 Value *s = constant_expr->getOperand(0);
Sean Callanan48443652010-12-02 19:47:57 +00001107 if (!MaybeHandleVariable(llvm_module, s))
1108 return false;
Sean Callananbc2928a2010-08-03 00:23:29 +00001109 }
1110 }
Sean Callananf921cf52010-12-03 19:51:05 +00001111 else if (GlobalVariable *global_variable = dyn_cast<GlobalVariable>(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001112 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001113 clang::NamedDecl *named_decl = DeclForGlobalValue(llvm_module, global_variable);
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001114
Sean Callananf5857a02010-07-31 01:32:05 +00001115 if (!named_decl)
1116 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001117 if (IsObjCSelectorRef(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001118 return true;
1119
Sean Callanan7cd46742010-12-06 00:56:39 +00001120 if (!global_variable->hasExternalLinkage())
1121 return true;
1122
Sean Callananf5857a02010-07-31 01:32:05 +00001123 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001124 log->Printf("Found global variable \"%s\" without metadata", global_variable->getName().str().c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001125
Sean Callananf5857a02010-07-31 01:32:05 +00001126 return false;
1127 }
1128
Greg Clayton8de27c72010-10-15 22:48:33 +00001129 std::string name (named_decl->getName().str());
Sean Callanan810f22d2010-07-16 00:09:46 +00001130
Sean Callanan771131d2010-09-30 21:18:25 +00001131 void *opaque_type = NULL;
Sean Callananf328c9f2010-07-20 23:31:16 +00001132 clang::ASTContext *ast_context = NULL;
Sean Callanan810f22d2010-07-16 00:09:46 +00001133
1134 if (clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl))
Sean Callananf328c9f2010-07-20 23:31:16 +00001135 {
Sean Callanan771131d2010-09-30 21:18:25 +00001136 opaque_type = value_decl->getType().getAsOpaquePtr();
Sean Callananf328c9f2010-07-20 23:31:16 +00001137 ast_context = &value_decl->getASTContext();
1138 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001139 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001140 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001141 return false;
Sean Callananf328c9f2010-07-20 23:31:16 +00001142 }
Sean Callanan771131d2010-09-30 21:18:25 +00001143
Sean Callanan6a925532011-01-13 08:53:35 +00001144 clang::QualType qual_type;
1145 const Type *value_type;
1146
Sean Callanan97678d12011-01-13 21:23:32 +00001147 if (name[0] == '$')
Sean Callanan6a925532011-01-13 08:53:35 +00001148 {
1149 // The $__lldb_expr_result name indicates the the return value has allocated as
1150 // a static variable. Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1151 // accesses to this static variable need to be redirected to the result of dereferencing
1152 // a pointer that is passed in as one of the arguments.
1153 //
1154 // Consequently, when reporting the size of the type, we report a pointer type pointing
1155 // to the type of $__lldb_expr_result, not the type itself.
Sean Callanan97678d12011-01-13 21:23:32 +00001156 //
1157 // We also do this for any user-declared persistent variables.
Sean Callananf328c9f2010-07-20 23:31:16 +00001158
Sean Callanan6a925532011-01-13 08:53:35 +00001159 qual_type = ast_context->getPointerType(clang::QualType::getFromOpaquePtr(opaque_type));
1160 value_type = PointerType::get(global_variable->getType(), 0);
1161 }
1162 else
1163 {
1164 qual_type = clang::QualType::getFromOpaquePtr(opaque_type);
1165 value_type = global_variable->getType();
1166 }
Sean Callanan771131d2010-09-30 21:18:25 +00001167
1168 size_t value_size = (ast_context->getTypeSize(qual_type) + 7) / 8;
1169 off_t value_alignment = (ast_context->getTypeAlign(qual_type) + 7) / 8;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001170
Sean Callanan771131d2010-09-30 21:18:25 +00001171 if (log)
Sean Callanan97678d12011-01-13 21:23:32 +00001172 log->Printf("Type of \"%s\" is [clang \"%s\", llvm \"%s\"] [size %d, align %d]",
Sean Callanan771131d2010-09-30 21:18:25 +00001173 name.c_str(),
1174 qual_type.getAsString().c_str(),
1175 PrintType(value_type).c_str(),
1176 value_size,
1177 value_alignment);
Sean Callanan3aa7da52010-12-13 22:46:15 +00001178
Sean Callanan8bce6652010-07-13 21:41:46 +00001179
Sean Callanan8c127202010-08-23 23:09:38 +00001180 if (named_decl && !m_decl_map->AddValueToStruct(named_decl,
Greg Clayton8de27c72010-10-15 22:48:33 +00001181 lldb_private::ConstString (name.c_str()),
1182 llvm_value_ptr,
Sean Callananba992c52010-07-27 02:07:53 +00001183 value_size,
1184 value_alignment))
Sean Callanan8bce6652010-07-13 21:41:46 +00001185 return false;
1186 }
Sean Callananf3143b72010-12-03 03:02:31 +00001187 else if (dyn_cast<llvm::Function>(llvm_value_ptr))
Sean Callanan48443652010-12-02 19:47:57 +00001188 {
1189 if (log)
1190 log->Printf("Function pointers aren't handled right now");
1191
1192 return false;
1193 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001194
1195 return true;
1196}
1197
Sean Callanan97c924e2011-01-27 01:07:04 +00001198// This function does not report errors; its callers are responsible.
Sean Callanan8bce6652010-07-13 21:41:46 +00001199bool
Sean Callananc7674af2011-01-17 23:42:46 +00001200IRForTarget::HandleSymbol (Module &llvm_module,
1201 Value *symbol)
1202{
1203 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1204
1205 lldb_private::ConstString name(symbol->getName().str().c_str());
1206
1207 uint64_t symbol_addr;
1208
1209 if (!m_decl_map->GetSymbolAddress (name, symbol_addr))
1210 {
1211 if (log)
1212 log->Printf ("Symbol \"%s\" had no address", name.GetCString());
1213
1214 return false;
1215 }
1216
1217 if (log)
1218 log->Printf("Found \"%s\" at 0x%llx", name.GetCString(), symbol_addr);
1219
1220 const Type *symbol_type = symbol->getType();
1221
1222 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1223 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
1224
1225 Constant *symbol_addr_int = ConstantInt::get(intptr_ty, symbol_addr, false);
1226
1227 Value *symbol_addr_ptr = ConstantExpr::getIntToPtr(symbol_addr_int, symbol_type);
1228
1229 if (log)
1230 log->Printf("Replacing %s with %s", PrintValue(symbol).c_str(), PrintValue(symbol_addr_ptr).c_str());
1231
1232 symbol->replaceAllUsesWith(symbol_addr_ptr);
1233
1234 return true;
1235}
1236
1237bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001238IRForTarget::MaybeHandleCallArguments (Module &llvm_module, CallInst *Old)
Sean Callanandc27aba2010-10-05 22:26:43 +00001239{
Sean Callanan48443652010-12-02 19:47:57 +00001240 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1241
1242 if (log)
1243 log->Printf("MaybeHandleCallArguments(%s)", PrintValue(Old).c_str());
Sean Callanandc27aba2010-10-05 22:26:43 +00001244
Sean Callanan6ba533e2010-11-17 23:00:36 +00001245 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
Sean Callanandc27aba2010-10-05 22:26:43 +00001246 op_index < num_ops;
1247 ++op_index)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001248 if (!MaybeHandleVariable(llvm_module, Old->getArgOperand(op_index))) // conservatively believe that this is a store
Sean Callanan97c924e2011-01-27 01:07:04 +00001249 {
1250 if (m_error_stream)
1251 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite one of the arguments of a function call.\n");
1252
Sean Callanandc27aba2010-10-05 22:26:43 +00001253 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001254 }
1255
Sean Callanandc27aba2010-10-05 22:26:43 +00001256 return true;
1257}
1258
1259bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001260IRForTarget::MaybeHandleCall (Module &llvm_module, CallInst *llvm_call_inst)
Sean Callananba992c52010-07-27 02:07:53 +00001261{
Greg Claytone005f2c2010-11-06 01:53:30 +00001262 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananba992c52010-07-27 02:07:53 +00001263
Greg Clayton8de27c72010-10-15 22:48:33 +00001264 Function *fun = llvm_call_inst->getCalledFunction();
Sean Callananba992c52010-07-27 02:07:53 +00001265
1266 if (fun == NULL)
Sean Callanan65af7342010-09-08 20:04:08 +00001267 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001268 Value *val = llvm_call_inst->getCalledValue();
Sean Callanan65af7342010-09-08 20:04:08 +00001269
1270 ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
Sean Callanand5b3c352011-01-27 04:42:51 +00001271 LoadInst *load_inst = dyn_cast<LoadInst>(val);
Sean Callanan65af7342010-09-08 20:04:08 +00001272
1273 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1274 {
1275 fun = dyn_cast<Function>(const_expr->getOperand(0));
1276
1277 if (!fun)
Sean Callanan97c924e2011-01-27 01:07:04 +00001278 {
1279 if (m_error_stream)
1280 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is a cast of something not a function\n");
1281
Sean Callanan48443652010-12-02 19:47:57 +00001282 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001283 }
Sean Callanan65af7342010-09-08 20:04:08 +00001284 }
Sean Callananc4217a62010-12-06 23:53:20 +00001285 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1286 {
1287 return true; // already resolved
1288 }
Sean Callanand5b3c352011-01-27 04:42:51 +00001289 else if (load_inst)
1290 {
1291 return true; // virtual method call
1292 }
Sean Callanan65af7342010-09-08 20:04:08 +00001293 else
1294 {
Sean Callanan97c924e2011-01-27 01:07:04 +00001295 if (m_error_stream)
1296 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is not a function\n");
1297
Sean Callanan48443652010-12-02 19:47:57 +00001298 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001299 }
1300 }
Sean Callananba992c52010-07-27 02:07:53 +00001301
Greg Clayton8de27c72010-10-15 22:48:33 +00001302 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001303
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001304 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001305 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001306 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001307
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001308 switch (intrinsic_id)
1309 {
1310 default:
1311 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001312 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001313
1314 if (m_error_stream)
1315 m_error_stream->Printf("Internal error [IRForTarget]: Call to unhandled compiler intrinsic '%s'\n", Intrinsic::getName(intrinsic_id).c_str());
1316
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001317 return false;
1318 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001319 {
1320 static lldb_private::ConstString g_memcpy_str ("memcpy");
1321 str = g_memcpy_str;
1322 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001323 break;
1324 }
Sean Callananc04743d2010-09-28 21:13:03 +00001325
Greg Clayton8de27c72010-10-15 22:48:33 +00001326 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001327 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001328 }
1329 else
1330 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001331 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001332 }
1333
Greg Clayton8de27c72010-10-15 22:48:33 +00001334 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001335 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001336 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001337
Sean Callananf5857a02010-07-31 01:32:05 +00001338 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001339 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001340 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001341 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001342 fun_value_ptr = NULL;
1343
Greg Clayton8de27c72010-10-15 22:48:33 +00001344 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001345 {
1346 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001347 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001348
Sean Callanan97c924e2011-01-27 01:07:04 +00001349 if (m_error_stream)
1350 m_error_stream->Printf("Error [IRForTarget]: Call to a function '%s' that is not present in the target\n", str.GetCString());
1351
Sean Callanan92aa6662010-09-07 21:49:41 +00001352 return false;
1353 }
Sean Callananf5857a02010-07-31 01:32:05 +00001354 }
1355 }
1356 else
1357 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001358 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001359 {
1360 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001361 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callanan97c924e2011-01-27 01:07:04 +00001362
1363 if (m_error_stream)
1364 m_error_stream->Printf("Error [IRForTarget]: Call to a symbol-only function '%s' that is not present in the target\n", str.GetCString());
1365
1366 return false;
Sean Callananf5857a02010-07-31 01:32:05 +00001367 }
Sean Callananba992c52010-07-27 02:07:53 +00001368 }
1369
1370 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001371 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001372
Sean Callananf5857a02010-07-31 01:32:05 +00001373 Value *fun_addr_ptr;
1374
1375 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001376 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001377 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1378 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001379 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001380 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1381 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001382 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1383
1384 if (fun_value_ptr)
1385 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001386 }
Sean Callananf5857a02010-07-31 01:32:05 +00001387
1388 if (fun_value_ptr)
1389 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001390
Greg Clayton8de27c72010-10-15 22:48:33 +00001391 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001392
Greg Clayton8de27c72010-10-15 22:48:33 +00001393 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001394
1395 Value *values[1];
1396 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001397 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001398
Greg Clayton8de27c72010-10-15 22:48:33 +00001399 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001400
1401 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001402 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 +00001403
Sean Callananba992c52010-07-27 02:07:53 +00001404 return true;
1405}
1406
1407bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001408IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001409{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001410 /////////////////////////////////////////////////////////////////////////
1411 // Prepare the current basic block for execution in the remote process
1412 //
1413
Sean Callanan02fbafa2010-07-27 21:39:39 +00001414 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001415
Greg Clayton3c7feb42010-11-19 01:05:25 +00001416 for (ii = basic_block.begin();
1417 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001418 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001419 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001420 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001421
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001422 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001423
Sean Callanan97c924e2011-01-27 01:07:04 +00001424 // MaybeHandleCall handles error reporting; we are silent here
Greg Clayton3c7feb42010-11-19 01:05:25 +00001425 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001426 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001427
Sean Callanan97c924e2011-01-27 01:07:04 +00001428 // MaybeHandleCallArguments handles error reporting; we are silent here
Sean Callanan48443652010-12-02 19:47:57 +00001429 if (call && !MaybeHandleCallArguments(llvm_module, call))
1430 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001431 }
1432
1433 return true;
1434}
1435
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001436bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001437IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001438{
Sean Callananae71e302010-11-18 22:21:58 +00001439 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1440
Greg Clayton3c7feb42010-11-19 01:05:25 +00001441 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001442 global != end;
1443 ++global)
1444 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001445 if (log)
1446 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1447 (*global).getName().str().c_str(),
1448 DeclForGlobalValue(llvm_module, global));
1449
Sean Callananc7674af2011-01-17 23:42:46 +00001450 if ((*global).getName().str().find("OBJC_IVAR") == 0)
1451 {
1452 if (!HandleSymbol(llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001453 {
1454 if (m_error_stream)
1455 m_error_stream->Printf("Error [IRForTarget]: Couldn't find Objective-C indirect ivar symbol %s\n", (*global).getName().str().c_str());
1456
Sean Callananc7674af2011-01-17 23:42:46 +00001457 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001458 }
Sean Callananc7674af2011-01-17 23:42:46 +00001459 }
1460 else if (DeclForGlobalValue(llvm_module, global))
1461 {
1462 if (!MaybeHandleVariable (llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001463 {
1464 if (m_error_stream)
1465 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite external variable %s\n", (*global).getName().str().c_str());
1466
Sean Callananc7674af2011-01-17 23:42:46 +00001467 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001468 }
Sean Callananc7674af2011-01-17 23:42:46 +00001469 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001470 }
1471
1472 return true;
1473}
1474
Sean Callanan02fbafa2010-07-27 21:39:39 +00001475static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001476{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001477 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001478
Sean Callanan6ba533e2010-11-17 23:00:36 +00001479 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001480 return false;
1481
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001482 ConstantExpr *CE;
1483
1484 if ((CE = dyn_cast<ConstantExpr>(V)))
1485 {
1486 if (CE->getOpcode() != Instruction::BitCast)
1487 return false;
1488
Sean Callanan6ba533e2010-11-17 23:00:36 +00001489 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001490 }
1491
Sean Callanan6ba533e2010-11-17 23:00:36 +00001492 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001493
1494 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1495 return false;
1496
1497 return true;
1498}
1499
Greg Clayton3c7feb42010-11-19 01:05:25 +00001500static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001501{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001502 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001503
1504 Value::use_iterator ui;
1505
1506 for (ui = guard_load->use_begin();
1507 ui != guard_load->use_end();
1508 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001509 {
Greg Clayton6e713402010-07-30 20:30:44 +00001510 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001511 {
1512 // do nothing for the moment
1513 }
1514 else
1515 {
1516 ui->replaceUsesOfWith(guard_load, zero);
1517 }
1518 }
Sean Callanan45839272010-07-24 01:37:44 +00001519
1520 guard_load->eraseFromParent();
1521}
1522
1523static void ExciseGuardStore(Instruction* guard_store)
1524{
1525 guard_store->eraseFromParent();
1526}
1527
1528bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001529IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001530{
1531 ///////////////////////////////////////////////////////
1532 // Eliminate any reference to guard variables found.
1533 //
1534
Sean Callanan02fbafa2010-07-27 21:39:39 +00001535 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001536
Sean Callanan02fbafa2010-07-27 21:39:39 +00001537 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001538 typedef InstrList::iterator InstrIterator;
1539
1540 InstrList guard_loads;
1541 InstrList guard_stores;
1542
Greg Clayton3c7feb42010-11-19 01:05:25 +00001543 for (ii = basic_block.begin();
1544 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001545 ++ii)
1546 {
1547 Instruction &inst = *ii;
1548
1549 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1550 if (isGuardVariableRef(load->getPointerOperand()))
1551 guard_loads.push_back(&inst);
1552
1553 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1554 if (isGuardVariableRef(store->getPointerOperand()))
1555 guard_stores.push_back(&inst);
1556 }
1557
1558 InstrIterator iter;
1559
1560 for (iter = guard_loads.begin();
1561 iter != guard_loads.end();
1562 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001563 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001564
1565 for (iter = guard_stores.begin();
1566 iter != guard_stores.end();
1567 ++iter)
1568 ExciseGuardStore(*iter);
1569
1570 return true;
1571}
1572
Sean Callanan97c924e2011-01-27 01:07:04 +00001573// This function does not report errors; its callers are responsible.
Sean Callanan6ba533e2010-11-17 23:00:36 +00001574bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001575IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001576{
Greg Claytone005f2c2010-11-06 01:53:30 +00001577 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001578
1579 Value::use_iterator ui;
1580
Sean Callanana48fe162010-08-11 03:57:18 +00001581 SmallVector<User*, 16> users;
1582
1583 // We do this because the use list might change, invalidating our iterator.
1584 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001585 for (ui = old_constant->use_begin();
1586 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001587 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001588 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001589
Sean Callanana48fe162010-08-11 03:57:18 +00001590 for (int i = 0;
1591 i < users.size();
1592 ++i)
1593 {
1594 User *user = users[i];
1595
Sean Callananbafd6852010-07-14 23:40:29 +00001596 if (Constant *constant = dyn_cast<Constant>(user))
1597 {
1598 // synthesize a new non-constant equivalent of the constant
1599
1600 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1601 {
1602 switch (constant_expr->getOpcode())
1603 {
1604 default:
1605 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001606 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001607 return false;
1608 case Instruction::BitCast:
1609 {
1610 // UnaryExpr
1611 // OperandList[0] is value
1612
1613 Value *s = constant_expr->getOperand(0);
1614
Greg Clayton3c7feb42010-11-19 01:05:25 +00001615 if (s == old_constant)
1616 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001617
Greg Clayton3c7feb42010-11-19 01:05:25 +00001618 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001619
Greg Clayton3c7feb42010-11-19 01:05:25 +00001620 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001621 }
1622 break;
1623 case Instruction::GetElementPtr:
1624 {
1625 // GetElementPtrConstantExpr
1626 // OperandList[0] is base
1627 // OperandList[1]... are indices
1628
1629 Value *ptr = constant_expr->getOperand(0);
1630
Greg Clayton3c7feb42010-11-19 01:05:25 +00001631 if (ptr == old_constant)
1632 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001633
1634 SmallVector<Value*, 16> indices;
1635
1636 unsigned operand_index;
1637 unsigned num_operands = constant_expr->getNumOperands();
1638
1639 for (operand_index = 1;
1640 operand_index < num_operands;
1641 ++operand_index)
1642 {
1643 Value *operand = constant_expr->getOperand(operand_index);
1644
Greg Clayton3c7feb42010-11-19 01:05:25 +00001645 if (operand == old_constant)
1646 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001647
1648 indices.push_back(operand);
1649 }
1650
Greg Clayton3c7feb42010-11-19 01:05:25 +00001651 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001652
Greg Clayton3c7feb42010-11-19 01:05:25 +00001653 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001654 }
1655 break;
1656 }
1657 }
1658 else
1659 {
1660 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001661 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001662 return false;
1663 }
1664 }
1665 else
1666 {
1667 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001668 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001669 }
1670 }
1671
1672 return true;
1673}
1674
Sean Callanan8bce6652010-07-13 21:41:46 +00001675bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001676IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001677{
Sean Callanane8a59a82010-09-13 21:34:21 +00001678 if (!m_resolve_vars)
1679 return true;
1680
Greg Claytone005f2c2010-11-06 01:53:30 +00001681 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001682
1683 m_decl_map->DoStructLayout();
1684
1685 if (log)
1686 log->Printf("Element arrangement:");
1687
1688 uint32_t num_elements;
1689 uint32_t element_index;
1690
1691 size_t size;
1692 off_t alignment;
1693
1694 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1695 return false;
1696
Greg Clayton3c7feb42010-11-19 01:05:25 +00001697 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001698
Greg Clayton3c7feb42010-11-19 01:05:25 +00001699 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001700 {
1701 if (m_error_stream)
1702 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes no arguments (should take at least a struct pointer)");
1703
Sean Callanan8bce6652010-07-13 21:41:46 +00001704 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001705 }
1706
Sean Callanan02fbafa2010-07-27 21:39:39 +00001707 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001708
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001709 if (argument->getName().equals("this"))
1710 {
1711 ++iter;
1712
Greg Clayton3c7feb42010-11-19 01:05:25 +00001713 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001714 {
1715 if (m_error_stream)
1716 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'this' argument (should take a struct pointer too)");
1717
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001718 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001719 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001720
1721 argument = iter;
1722 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001723 else if (argument->getName().equals("self"))
1724 {
1725 ++iter;
1726
1727 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001728 {
1729 if (m_error_stream)
1730 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' argument (should take '_cmd' and a struct pointer too)");
1731
Sean Callanan3aa7da52010-12-13 22:46:15 +00001732 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001733 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001734
1735 if (!iter->getName().equals("_cmd"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001736 {
1737 if (m_error_stream)
1738 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes '%s' after 'self' argument (should take '_cmd')", iter->getName().str().c_str());
1739
Sean Callanan3aa7da52010-12-13 22:46:15 +00001740 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001741 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001742
1743 ++iter;
1744
1745 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001746 {
1747 if (m_error_stream)
1748 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' and '_cmd' arguments (should take a struct pointer too)");
1749
Sean Callanan3aa7da52010-12-13 22:46:15 +00001750 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001751 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001752
1753 argument = iter;
1754 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001755
Greg Clayton8de27c72010-10-15 22:48:33 +00001756 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001757 {
1758 if (m_error_stream)
1759 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes an argument named '%s' instead of the struct pointer", argument->getName().str().c_str());
1760
Sean Callanan8bce6652010-07-13 21:41:46 +00001761 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001762 }
1763
Sean Callanan8bce6652010-07-13 21:41:46 +00001764 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001765 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001766
Greg Clayton3c7feb42010-11-19 01:05:25 +00001767 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001768 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001769
Sean Callanan6ba533e2010-11-17 23:00:36 +00001770 if (!FirstEntryInstruction)
Sean Callanan97c924e2011-01-27 01:07:04 +00001771 {
1772 if (m_error_stream)
1773 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find the first instruction in the wrapper for use in rewriting");
1774
Sean Callanan8bce6652010-07-13 21:41:46 +00001775 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001776 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001777
Greg Clayton3c7feb42010-11-19 01:05:25 +00001778 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001779 const IntegerType *offset_type(Type::getInt32Ty(context));
1780
1781 if (!offset_type)
Sean Callanan97c924e2011-01-27 01:07:04 +00001782 {
1783 if (m_error_stream)
1784 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't produce an offset type");
1785
Sean Callanan8bce6652010-07-13 21:41:46 +00001786 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001787 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001788
1789 for (element_index = 0; element_index < num_elements; ++element_index)
1790 {
1791 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001792 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001793 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001794 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001795
Sean Callanan45690fe2010-08-30 22:17:16 +00001796 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan97c924e2011-01-27 01:07:04 +00001797 {
1798 if (m_error_stream)
1799 m_error_stream->Printf("Internal error [IRForTarget]: Structure information is incomplete");
1800
Sean Callanan8bce6652010-07-13 21:41:46 +00001801 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001802 }
1803
Sean Callanan8bce6652010-07-13 21:41:46 +00001804 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001805 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001806 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001807 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001808 PrintValue(value, true).c_str(),
1809 offset);
1810
1811 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001812 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
Sean Callanan6a925532011-01-13 08:53:35 +00001813
1814 Value *replacement;
Sean Callanan8bce6652010-07-13 21:41:46 +00001815
Sean Callanan6a925532011-01-13 08:53:35 +00001816 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult, in cases where the result
1817 // variable is an rvalue, we have to synthesize a dereference of the appropriate structure
1818 // entry in order to produce the static variable that the AST thinks it is accessing.
1819 if (name == m_result_name && !m_result_is_pointer)
1820 {
1821 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType()->getPointerTo(), "", FirstEntryInstruction);
1822
1823 LoadInst *load = new LoadInst(bit_cast, "", FirstEntryInstruction);
1824
1825 replacement = load;
1826 }
Sean Callananbafd6852010-07-14 23:40:29 +00001827 else
Sean Callanan6a925532011-01-13 08:53:35 +00001828 {
1829 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
1830
1831 replacement = bit_cast;
1832 }
1833
1834 if (Constant *constant = dyn_cast<Constant>(value))
1835 UnfoldConstant(constant, replacement, FirstEntryInstruction);
1836 else
1837 value->replaceAllUsesWith(replacement);
Sean Callananb51ee982010-11-02 23:51:17 +00001838
1839 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1840 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001841 }
1842
1843 if (log)
1844 log->Printf("Total structure [align %d, size %d]", alignment, size);
1845
1846 return true;
1847}
1848
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001849bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001850IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001851{
Greg Claytone005f2c2010-11-06 01:53:30 +00001852 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001853
Greg Clayton3c7feb42010-11-19 01:05:25 +00001854 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001855
1856 if (!function)
1857 {
1858 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001859 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001860
1861 if (m_error_stream)
1862 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find wrapper '%s' in the mdoule", m_func_name.c_str());
Sean Callanan6a925532011-01-13 08:53:35 +00001863
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001864 return false;
1865 }
1866
Sean Callanan02fbafa2010-07-27 21:39:39 +00001867 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001868
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001869 m_has_side_effects = HasSideEffects(llvm_module, *function);
1870
Sean Callanan82b74c82010-08-12 01:56:52 +00001871 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001872 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001873 //
1874
Greg Clayton3c7feb42010-11-19 01:05:25 +00001875 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001876 {
1877 if (log)
1878 log->Printf("CreateResultVariable() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001879
1880 // CreateResultVariable() reports its own errors, so we don't do so here
1881
Sean Callanan82b74c82010-08-12 01:56:52 +00001882 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001883 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001884
Sean Callanan6ba533e2010-11-17 23:00:36 +00001885 ///////////////////////////////////////////////////////////////////////////////
1886 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1887 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001888
Greg Clayton3c7feb42010-11-19 01:05:25 +00001889 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001890 {
1891 if (log)
1892 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001893
1894 // RewriteObjCConstStrings() reports its own errors, so we don't do so here
1895
Sean Callanan6ba533e2010-11-17 23:00:36 +00001896 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001897 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001898
Sean Callananf5857a02010-07-31 01:32:05 +00001899 //////////////////////////////////
1900 // Run basic-block level passes
1901 //
1902
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001903 for (bbi = function->begin();
1904 bbi != function->end();
1905 ++bbi)
1906 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001907 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001908 {
1909 if (log)
1910 log->Printf("RemoveGuards() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001911
1912 // RemoveGuards() reports its own errors, so we don't do so here
1913
Sean Callanan8c127202010-08-23 23:09:38 +00001914 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001915 }
Sean Callanan8c127202010-08-23 23:09:38 +00001916
Greg Clayton3c7feb42010-11-19 01:05:25 +00001917 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001918 {
1919 if (log)
1920 log->Printf("RewritePersistentAllocs() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001921
1922 // RewritePersistentAllocs() reports its own errors, so we don't do so here
1923
Sean Callananf5857a02010-07-31 01:32:05 +00001924 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001925 }
Sean Callananf5857a02010-07-31 01:32:05 +00001926
Greg Clayton3c7feb42010-11-19 01:05:25 +00001927 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001928 {
1929 if (log)
1930 log->Printf("RewriteObjCSelectors() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001931
1932 // RewriteObjCSelectors() reports its own errors, so we don't do so here
1933
Sean Callanana48fe162010-08-11 03:57:18 +00001934 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001935 }
Sean Callanana48fe162010-08-11 03:57:18 +00001936
Greg Clayton3c7feb42010-11-19 01:05:25 +00001937 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001938 {
1939 if (log)
1940 log->Printf("ResolveCalls() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001941
1942 // ResolveCalls() reports its own errors, so we don't do so here
1943
Sean Callanan8bce6652010-07-13 21:41:46 +00001944 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001945 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001946 }
1947
Sean Callanan771131d2010-09-30 21:18:25 +00001948 ///////////////////////////////
1949 // Run function-level passes
1950 //
1951
Greg Clayton3c7feb42010-11-19 01:05:25 +00001952 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001953 {
1954 if (log)
1955 log->Printf("ResolveExternals() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001956
1957 // ResolveExternals() reports its own errors, so we don't do so here
1958
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001959 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001960 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001961
Greg Clayton3c7feb42010-11-19 01:05:25 +00001962 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001963 {
1964 if (log)
1965 log->Printf("ReplaceVariables() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001966
1967 // ReplaceVariables() reports its own errors, so we don't do so here
1968
Sean Callanan771131d2010-09-30 21:18:25 +00001969 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001970 }
Sean Callanan771131d2010-09-30 21:18:25 +00001971
Sean Callanan8bce6652010-07-13 21:41:46 +00001972 if (log)
1973 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001974 std::string s;
1975 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001976
Greg Clayton3c7feb42010-11-19 01:05:25 +00001977 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001978
1979 oss.flush();
1980
Greg Claytonb5037af2010-11-15 01:47:11 +00001981 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001982 }
1983
1984 return true;
1985}
1986
1987void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001988IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001989{
1990}
1991
1992PassManagerType
1993IRForTarget::getPotentialPassManagerType() const
1994{
1995 return PMT_ModulePassManager;
1996}