blob: 517ab13f72ac19c838ef3887d4872114316431fe [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,
Sean Callanan97c924e2011-01-27 01:07:04 +000038 lldb_private::Stream *error_stream,
Greg Clayton3c7feb42010-11-19 01:05:25 +000039 const char *func_name) :
Sean Callanan47a5c4c2010-09-23 03:01:22 +000040 ModulePass(ID),
Sean Callanan8bce6652010-07-13 21:41:46 +000041 m_decl_map(decl_map),
Sean Callanan6ba533e2010-11-17 23:00:36 +000042 m_CFStringCreateWithBytes(NULL),
Sean Callanan65dafa82010-08-27 01:01:44 +000043 m_sel_registerName(NULL),
Sean Callanane8a59a82010-09-13 21:34:21 +000044 m_func_name(func_name),
Sean Callanan05a5a1b2010-12-16 03:17:46 +000045 m_resolve_vars(resolve_vars),
46 m_const_result(const_result),
Sean Callanan6a925532011-01-13 08:53:35 +000047 m_has_side_effects(false),
Sean Callanan97c924e2011-01-27 01:07:04 +000048 m_result_is_pointer(false),
49 m_error_stream(error_stream)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000050{
51}
52
Sean Callanan771131d2010-09-30 21:18:25 +000053/* Handy utility functions used at several places in the code */
Sean Callanana48fe162010-08-11 03:57:18 +000054
55static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000056PrintValue(const Value *value, bool truncate = false)
Sean Callanana48fe162010-08-11 03:57:18 +000057{
58 std::string s;
59 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000060 value->print(rso);
Sean Callanana48fe162010-08-11 03:57:18 +000061 rso.flush();
62 if (truncate)
63 s.resize(s.length() - 1);
64 return s;
65}
66
Sean Callanan771131d2010-09-30 21:18:25 +000067static std::string
Greg Clayton3c7feb42010-11-19 01:05:25 +000068PrintType(const Type *type, bool truncate = false)
Sean Callanan771131d2010-09-30 21:18:25 +000069{
70 std::string s;
71 raw_string_ostream rso(s);
Greg Clayton3c7feb42010-11-19 01:05:25 +000072 type->print(rso);
Sean Callanan771131d2010-09-30 21:18:25 +000073 rso.flush();
74 if (truncate)
75 s.resize(s.length() - 1);
76 return s;
77}
78
Sean Callanan5cf4a1c2010-07-03 01:35:46 +000079IRForTarget::~IRForTarget()
80{
81}
82
Sean Callanan82b74c82010-08-12 01:56:52 +000083bool
Sean Callanan05a5a1b2010-12-16 03:17:46 +000084IRForTarget::HasSideEffects (llvm::Module &llvm_module,
85 llvm::Function &llvm_function)
86{
87 llvm::Function::iterator bbi;
88 BasicBlock::iterator ii;
89
90 for (bbi = llvm_function.begin();
91 bbi != llvm_function.end();
92 ++bbi)
93 {
94 BasicBlock &basic_block = *bbi;
95
96 for (ii = basic_block.begin();
97 ii != basic_block.end();
98 ++ii)
99 {
100 switch (ii->getOpcode())
101 {
102 default:
103 return true;
104 case Instruction::Store:
105 {
106 StoreInst *store_inst = dyn_cast<StoreInst>(ii);
107
108 Value *store_ptr = store_inst->getPointerOperand();
109
110 if (!isa <AllocaInst> (store_ptr))
111 return true;
112 else
113 break;
114 }
115 case Instruction::Load:
116 case Instruction::Alloca:
117 case Instruction::GetElementPtr:
118 case Instruction::Ret:
119 break;
120 }
121 }
122 }
123
124 return false;
125}
126
127void
128IRForTarget::MaybeSetConstantResult (llvm::Constant *initializer,
129 const lldb_private::ConstString &name,
130 lldb_private::TypeFromParser type)
131{
132 if (!m_const_result)
133 return;
134
135 if (llvm::ConstantInt *init_int = dyn_cast<llvm::ConstantInt>(initializer))
136 {
137 *m_const_result = m_decl_map->BuildIntegerVariable(name, type, init_int->getValue());
138 }
139}
140
141bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000142IRForTarget::CreateResultVariable (llvm::Module &llvm_module, llvm::Function &llvm_function)
Sean Callanan82b74c82010-08-12 01:56:52 +0000143{
Greg Claytone005f2c2010-11-06 01:53:30 +0000144 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000145
Sean Callanane8a59a82010-09-13 21:34:21 +0000146 if (!m_resolve_vars)
147 return true;
148
149 // Find the result variable. If it doesn't exist, we can give up right here.
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000150
Greg Clayton8de27c72010-10-15 22:48:33 +0000151 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000152
153 const char *result_name = NULL;
154
155 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
156 vi != ve;
157 ++vi)
158 {
Sean Callanan6a925532011-01-13 08:53:35 +0000159 if (strstr(vi->first(), "$__lldb_expr_result_ptr") &&
160 !strstr(vi->first(), "GV"))
161 {
162 result_name = vi->first();
163 m_result_is_pointer = true;
164 break;
165 }
166
Greg Clayton8de27c72010-10-15 22:48:33 +0000167 if (strstr(vi->first(), "$__lldb_expr_result") &&
Sean Callananc04743d2010-09-28 21:13:03 +0000168 !strstr(vi->first(), "GV"))
169 {
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000170 result_name = vi->first();
Sean Callanan6a925532011-01-13 08:53:35 +0000171 m_result_is_pointer = false;
Sean Callananc04743d2010-09-28 21:13:03 +0000172 break;
173 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000174 }
175
176 if (!result_name)
177 {
178 if (log)
179 log->PutCString("Couldn't find result variable");
180
181 return true;
182 }
183
Sean Callananc04743d2010-09-28 21:13:03 +0000184 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000185 log->Printf("Result name: \"%s\"", result_name);
Sean Callananc04743d2010-09-28 21:13:03 +0000186
Greg Clayton8de27c72010-10-15 22:48:33 +0000187 Value *result_value = llvm_module.getNamedValue(result_name);
Sean Callanan82b74c82010-08-12 01:56:52 +0000188
189 if (!result_value)
190 {
191 if (log)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000192 log->PutCString("Result variable had no data");
Sean Callanan6a925532011-01-13 08:53:35 +0000193
Sean Callanan97c924e2011-01-27 01:07:04 +0000194 if (m_error_stream)
195 m_error_stream->Printf("Internal error [IRForTarget]: Result variable's name (%s) exists, but not its definition\n", result_name);
196
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000197 return false;
Sean Callanan82b74c82010-08-12 01:56:52 +0000198 }
Sean Callanane8a59a82010-09-13 21:34:21 +0000199
Sean Callanan82b74c82010-08-12 01:56:52 +0000200 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000201 log->Printf("Found result in the IR: \"%s\"", PrintValue(result_value, false).c_str());
Sean Callanan82b74c82010-08-12 01:56:52 +0000202
203 GlobalVariable *result_global = dyn_cast<GlobalVariable>(result_value);
204
205 if (!result_global)
206 {
207 if (log)
208 log->PutCString("Result variable isn't a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000209
210 if (m_error_stream)
211 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) is defined, but is not a global variable\n", result_name);
212
Sean Callanan82b74c82010-08-12 01:56:52 +0000213 return false;
214 }
215
216 // Find the metadata and follow it to the VarDecl
217
Greg Clayton8de27c72010-10-15 22:48:33 +0000218 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanan82b74c82010-08-12 01:56:52 +0000219
220 if (!named_metadata)
221 {
222 if (log)
223 log->PutCString("No global metadata");
224
Sean Callanan97c924e2011-01-27 01:07:04 +0000225 if (m_error_stream)
226 m_error_stream->Printf("Internal error [IRForTarget]: No metadata\n");
227
Sean Callanan82b74c82010-08-12 01:56:52 +0000228 return false;
229 }
230
231 unsigned num_nodes = named_metadata->getNumOperands();
232 unsigned node_index;
233
234 MDNode *metadata_node = NULL;
235
236 for (node_index = 0;
237 node_index < num_nodes;
238 ++node_index)
239 {
240 metadata_node = named_metadata->getOperand(node_index);
241
242 if (metadata_node->getNumOperands() != 2)
243 continue;
244
245 if (metadata_node->getOperand(0) == result_global)
246 break;
247 }
248
249 if (!metadata_node)
250 {
251 if (log)
252 log->PutCString("Couldn't find result metadata");
Sean Callanan97c924e2011-01-27 01:07:04 +0000253
254 if (m_error_stream)
255 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) is a global variable, but has no metadata\n", result_name);
256
Sean Callanan82b74c82010-08-12 01:56:52 +0000257 return false;
258 }
259
260 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
261
Greg Claytonb5037af2010-11-15 01:47:11 +0000262 lldb::addr_t result_decl_intptr = constant_int->getZExtValue();
Sean Callanan82b74c82010-08-12 01:56:52 +0000263
264 clang::VarDecl *result_decl = reinterpret_cast<clang::VarDecl *>(result_decl_intptr);
265
266 // Get the next available result name from m_decl_map and create the persistent
267 // variable for it
268
Sean Callanan6a925532011-01-13 08:53:35 +0000269 lldb_private::TypeFromParser result_decl_type;
270
271 if (m_result_is_pointer)
272 {
273 clang::QualType pointer_qual_type = result_decl->getType();
Sean Callanand5b3c352011-01-27 04:42:51 +0000274 const clang::Type *pointer_type = pointer_qual_type.getTypePtr();
275 const clang::PointerType *pointer_pointertype = dyn_cast<clang::PointerType>(pointer_type);
Sean Callanan6a925532011-01-13 08:53:35 +0000276
277 if (!pointer_pointertype)
278 {
279 if (log)
280 log->PutCString("Expected result to have pointer type, but it did not");
Sean Callanan97c924e2011-01-27 01:07:04 +0000281
282 if (m_error_stream)
283 m_error_stream->Printf("Internal error [IRForTarget]: Lvalue result (%s) is not a pointer variable\n", result_name);
284
Sean Callanan6a925532011-01-13 08:53:35 +0000285 return false;
286 }
287
288 clang::QualType element_qual_type = pointer_pointertype->getPointeeType();
289
290 result_decl_type = lldb_private::TypeFromParser(element_qual_type.getAsOpaquePtr(),
291 &result_decl->getASTContext());
292 }
293 else
294 {
295 result_decl_type = lldb_private::TypeFromParser(result_decl->getType().getAsOpaquePtr(),
296 &result_decl->getASTContext());
297 }
298
299 m_result_name = m_decl_map->GetPersistentResultName();
300 // If the result is an Lvalue, it is emitted as a pointer; see
301 // ASTResultSynthesizer::SynthesizeBodyResult.
302 m_decl_map->AddPersistentVariable(result_decl,
303 m_result_name,
304 result_decl_type,
305 true,
306 m_result_is_pointer);
Sean Callanan82b74c82010-08-12 01:56:52 +0000307
308 if (log)
Sean Callanan6a925532011-01-13 08:53:35 +0000309 log->Printf("Creating a new result global: \"%s\"", m_result_name.GetCString());
Sean Callanan82b74c82010-08-12 01:56:52 +0000310
311 // Construct a new result global and set up its metadata
312
Greg Clayton8de27c72010-10-15 22:48:33 +0000313 GlobalVariable *new_result_global = new GlobalVariable(llvm_module,
Sean Callanan82b74c82010-08-12 01:56:52 +0000314 result_global->getType()->getElementType(),
315 false, /* not constant */
316 GlobalValue::ExternalLinkage,
317 NULL, /* no initializer */
Sean Callanan6a925532011-01-13 08:53:35 +0000318 m_result_name.GetCString ());
Sean Callanan82b74c82010-08-12 01:56:52 +0000319
320 // It's too late in compilation to create a new VarDecl for this, but we don't
321 // need to. We point the metadata at the old VarDecl. This creates an odd
322 // anomaly: a variable with a Value whose name is something like $0 and a
Greg Clayton8de27c72010-10-15 22:48:33 +0000323 // Decl whose name is $__lldb_expr_result. This condition is handled in
Sean Callanan82b74c82010-08-12 01:56:52 +0000324 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
325 // fixed up.
326
327 ConstantInt *new_constant_int = ConstantInt::get(constant_int->getType(),
328 result_decl_intptr,
329 false);
330
331 llvm::Value* values[2];
332 values[0] = new_result_global;
333 values[1] = new_constant_int;
334
Greg Clayton8de27c72010-10-15 22:48:33 +0000335 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanan82b74c82010-08-12 01:56:52 +0000336 named_metadata->addOperand(persistent_global_md);
337
338 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000339 log->Printf("Replacing \"%s\" with \"%s\"",
Sean Callanan2e2db532010-09-07 22:43:19 +0000340 PrintValue(result_global).c_str(),
Sean Callanan82b74c82010-08-12 01:56:52 +0000341 PrintValue(new_result_global).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000342
343 if (result_global->hasNUses(0))
344 {
345 // We need to synthesize a store for this variable, because otherwise
346 // there's nothing to put into its equivalent persistent variable.
Sean Callanan82b74c82010-08-12 01:56:52 +0000347
Greg Clayton8de27c72010-10-15 22:48:33 +0000348 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan2e2db532010-09-07 22:43:19 +0000349 Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg());
350
351 if (!first_entry_instruction)
352 return false;
353
354 if (!result_global->hasInitializer())
355 {
356 if (log)
357 log->Printf("Couldn't find initializer for unused variable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000358
359 if (m_error_stream)
360 m_error_stream->Printf("Internal error [IRForTarget]: Result variable (%s) has no writes and no initializer\n", result_name);
361
Sean Callanan2e2db532010-09-07 22:43:19 +0000362 return false;
363 }
364
365 Constant *initializer = result_global->getInitializer();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000366
367 // Here we write the initializer into a result variable assuming it
368 // can be computed statically.
369
370 if (!m_has_side_effects)
371 {
372 MaybeSetConstantResult (initializer,
Sean Callanan6a925532011-01-13 08:53:35 +0000373 m_result_name,
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000374 result_decl_type);
375 }
Sean Callanan2e2db532010-09-07 22:43:19 +0000376
377 StoreInst *synthesized_store = new StoreInst::StoreInst(initializer,
378 new_result_global,
379 first_entry_instruction);
380
381 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000382 log->Printf("Synthesized result store \"%s\"\n", PrintValue(synthesized_store).c_str());
Sean Callanan2e2db532010-09-07 22:43:19 +0000383 }
384 else
385 {
386 result_global->replaceAllUsesWith(new_result_global);
387 }
388
Sean Callanan82b74c82010-08-12 01:56:52 +0000389 result_global->eraseFromParent();
390
391 return true;
392}
393
Greg Clayton3c7feb42010-11-19 01:05:25 +0000394static void DebugUsers(lldb::LogSP &log, Value *value, uint8_t depth)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000395{
396 if (!depth)
397 return;
398
399 depth--;
400
Greg Clayton3c7feb42010-11-19 01:05:25 +0000401 log->Printf(" <Begin %d users>", value->getNumUses());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000402
Greg Clayton3c7feb42010-11-19 01:05:25 +0000403 for (Value::use_iterator ui = value->use_begin(), ue = value->use_end();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000404 ui != ue;
405 ++ui)
406 {
407 log->Printf(" <Use %p> %s", *ui, PrintValue(*ui).c_str());
408 DebugUsers(log, *ui, depth);
409 }
410
411 log->Printf(" <End uses>");
412}
413
414bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000415IRForTarget::RewriteObjCConstString (llvm::Module &llvm_module,
416 llvm::GlobalVariable *ns_str,
417 llvm::GlobalVariable *cstr,
418 Instruction *FirstEntryInstruction)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000419{
420 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
421
Greg Clayton3c7feb42010-11-19 01:05:25 +0000422 const Type *i8_ptr_ty = Type::getInt8PtrTy(llvm_module.getContext());
423 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
424 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
425 const Type *i32_ty = Type::getInt32Ty(llvm_module.getContext());
426 const Type *i8_ty = Type::getInt8Ty(llvm_module.getContext());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000427
428 if (!m_CFStringCreateWithBytes)
429 {
430 lldb::addr_t CFStringCreateWithBytes_addr;
431
432 static lldb_private::ConstString g_CFStringCreateWithBytes_str ("CFStringCreateWithBytes");
433
434 if (!m_decl_map->GetFunctionAddress (g_CFStringCreateWithBytes_str, CFStringCreateWithBytes_addr))
435 {
436 if (log)
437 log->PutCString("Couldn't find CFStringCreateWithBytes in the target");
438
Sean Callanan97c924e2011-01-27 01:07:04 +0000439 if (m_error_stream)
440 m_error_stream->Printf("Error [IRForTarget]: Rewriting an Objective-C constant string requires CFStringCreateWithBytes\n");
441
Sean Callanan6ba533e2010-11-17 23:00:36 +0000442 return false;
443 }
444
445 if (log)
446 log->Printf("Found CFStringCreateWithBytes at 0x%llx", CFStringCreateWithBytes_addr);
447
448 // Build the function type:
449 //
450 // CFStringRef CFStringCreateWithBytes (
451 // CFAllocatorRef alloc,
452 // const UInt8 *bytes,
453 // CFIndex numBytes,
454 // CFStringEncoding encoding,
455 // Boolean isExternalRepresentation
456 // );
457 //
458 // We make the following substitutions:
459 //
460 // CFStringRef -> i8*
461 // CFAllocatorRef -> i8*
462 // UInt8 * -> i8*
463 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its pointer size for now)
464 // CFStringEncoding -> i32
465 // Boolean -> i8
466
467 std::vector <const Type *> CFSCWB_arg_types;
468 CFSCWB_arg_types.push_back(i8_ptr_ty);
469 CFSCWB_arg_types.push_back(i8_ptr_ty);
470 CFSCWB_arg_types.push_back(intptr_ty);
471 CFSCWB_arg_types.push_back(i32_ty);
472 CFSCWB_arg_types.push_back(i8_ty);
473 llvm::Type *CFSCWB_ty = FunctionType::get(i8_ptr_ty, CFSCWB_arg_types, false);
474
475 // Build the constant containing the pointer to the function
476 PointerType *CFSCWB_ptr_ty = PointerType::getUnqual(CFSCWB_ty);
477 Constant *CFSCWB_addr_int = ConstantInt::get(intptr_ty, CFStringCreateWithBytes_addr, false);
478 m_CFStringCreateWithBytes = ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty);
479 }
480
Greg Clayton3c7feb42010-11-19 01:05:25 +0000481 ConstantArray *string_array = dyn_cast<ConstantArray>(cstr->getInitializer());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000482
483 SmallVector <Value*, 5> CFSCWB_arguments;
484
485 Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000486 Constant *bytes_arg = ConstantExpr::getBitCast(cstr, i8_ptr_ty);
Sean Callanan6ba533e2010-11-17 23:00:36 +0000487 Constant *numBytes_arg = ConstantInt::get(intptr_ty, string_array->getType()->getNumElements(), false);
488 Constant *encoding_arg = ConstantInt::get(i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */
489 Constant *isExternal_arg = ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */
490
491 CFSCWB_arguments.push_back(alloc_arg);
492 CFSCWB_arguments.push_back(bytes_arg);
493 CFSCWB_arguments.push_back(numBytes_arg);
494 CFSCWB_arguments.push_back(encoding_arg);
495 CFSCWB_arguments.push_back(isExternal_arg);
496
497 CallInst *CFSCWB_call = CallInst::Create(m_CFStringCreateWithBytes,
498 CFSCWB_arguments.begin(),
499 CFSCWB_arguments.end(),
500 "CFStringCreateWithBytes",
501 FirstEntryInstruction);
Sean Callananae71e302010-11-18 22:21:58 +0000502
Greg Clayton3c7feb42010-11-19 01:05:25 +0000503 if (!UnfoldConstant(ns_str, CFSCWB_call, FirstEntryInstruction))
Sean Callanan6ba533e2010-11-17 23:00:36 +0000504 {
505 if (log)
506 log->PutCString("Couldn't replace the NSString with the result of the call");
507
Sean Callanan97c924e2011-01-27 01:07:04 +0000508 if (m_error_stream)
509 m_error_stream->Printf("Error [IRForTarget]: Couldn't replace an Objective-C constant string with a dynamic string\n");
510
Sean Callanan6ba533e2010-11-17 23:00:36 +0000511 return false;
512 }
513
Greg Clayton3c7feb42010-11-19 01:05:25 +0000514 ns_str->eraseFromParent();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000515
516 return true;
517}
518
519bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000520IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_function)
Sean Callanan6ba533e2010-11-17 23:00:36 +0000521{
522 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
523
Greg Clayton3c7feb42010-11-19 01:05:25 +0000524 ValueSymbolTable& value_symbol_table = llvm_module.getValueSymbolTable();
Sean Callanan6ba533e2010-11-17 23:00:36 +0000525
Greg Clayton3c7feb42010-11-19 01:05:25 +0000526 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +0000527 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
528
529 if (!FirstEntryInstruction)
530 {
531 if (log)
532 log->PutCString("Couldn't find first instruction for rewritten Objective-C strings");
533
Sean Callanan97c924e2011-01-27 01:07:04 +0000534 if (m_error_stream)
535 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find the location for calls to CFStringCreateWithBytes\n");
536
Sean Callanan6ba533e2010-11-17 23:00:36 +0000537 return false;
538 }
539
540 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
541 vi != ve;
542 ++vi)
543 {
544 if (strstr(vi->first(), "_unnamed_cfstring_"))
545 {
546 Value *nsstring_value = vi->second;
547
548 GlobalVariable *nsstring_global = dyn_cast<GlobalVariable>(nsstring_value);
549
550 if (!nsstring_global)
551 {
552 if (log)
553 log->PutCString("NSString variable is not a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000554
555 if (m_error_stream)
556 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string is not a global variable\n");
557
Sean Callanan6ba533e2010-11-17 23:00:36 +0000558 return false;
559 }
560
561 if (!nsstring_global->hasInitializer())
562 {
563 if (log)
564 log->PutCString("NSString variable does not have an initializer");
Sean Callanan97c924e2011-01-27 01:07:04 +0000565
566 if (m_error_stream)
567 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string does not have an initializer\n");
568
Sean Callanan6ba533e2010-11-17 23:00:36 +0000569 return false;
570 }
571
572 ConstantStruct *nsstring_struct = dyn_cast<ConstantStruct>(nsstring_global->getInitializer());
573
574 if (!nsstring_struct)
575 {
576 if (log)
577 log->PutCString("NSString variable's initializer is not a ConstantStruct");
Sean Callanan97c924e2011-01-27 01:07:04 +0000578
579 if (m_error_stream)
580 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string is not a structure constant\n");
581
Sean Callanan6ba533e2010-11-17 23:00:36 +0000582 return false;
583 }
584
585 // We expect the following structure:
586 //
587 // struct {
588 // int *isa;
589 // int flags;
590 // char *str;
591 // long length;
592 // };
593
594 if (nsstring_struct->getNumOperands() != 4)
595 {
596 if (log)
597 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 +0000598
599 if (m_error_stream)
600 m_error_stream->Printf("Internal error [IRForTarget]: The struct for an Objective-C constant string is not as expected\n");
601
Sean Callanan6ba533e2010-11-17 23:00:36 +0000602 return false;
603 }
604
605 Constant *nsstring_member = nsstring_struct->getOperand(2);
606
607 if (!nsstring_member)
608 {
609 if (log)
610 log->PutCString("NSString initializer's str element was empty");
Sean Callanan97c924e2011-01-27 01:07:04 +0000611
612 if (m_error_stream)
613 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string does not have a string initializer\n");
614
Sean Callanan6ba533e2010-11-17 23:00:36 +0000615 return false;
616 }
617
618 ConstantExpr *nsstring_expr = dyn_cast<ConstantExpr>(nsstring_member);
619
620 if (!nsstring_expr)
621 {
622 if (log)
623 log->PutCString("NSString initializer's str element is not a ConstantExpr");
Sean Callanan97c924e2011-01-27 01:07:04 +0000624
625 if (m_error_stream)
626 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer is not constant\n");
627
Sean Callanan6ba533e2010-11-17 23:00:36 +0000628 return false;
629 }
630
631 if (nsstring_expr->getOpcode() != Instruction::GetElementPtr)
632 {
633 if (log)
634 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 +0000635
636 if (m_error_stream)
637 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer is not an array\n");
638
Sean Callanan6ba533e2010-11-17 23:00:36 +0000639 return false;
640 }
641
642 Constant *nsstring_cstr = nsstring_expr->getOperand(0);
643
644 GlobalVariable *cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr);
645
646 if (!cstr_global)
647 {
648 if (log)
649 log->PutCString("NSString initializer's str element is not a GlobalVariable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000650
651 if (m_error_stream)
652 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 +0000653
Sean Callanan6ba533e2010-11-17 23:00:36 +0000654 return false;
655 }
656
657 if (!cstr_global->hasInitializer())
658 {
659 if (log)
660 log->PutCString("NSString initializer's str element does not have an initializer");
Sean Callanan97c924e2011-01-27 01:07:04 +0000661
662 if (m_error_stream)
663 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to initialized data\n");
664
Sean Callanan6ba533e2010-11-17 23:00:36 +0000665 return false;
666 }
667
668 ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer());
669
670 if (!cstr_array)
671 {
672 if (log)
673 log->PutCString("NSString initializer's str element is not a ConstantArray");
Sean Callanan97c924e2011-01-27 01:07:04 +0000674
675 if (m_error_stream)
676 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to an array\n");
677
Sean Callanan6ba533e2010-11-17 23:00:36 +0000678 return false;
679 }
680
681 if (!cstr_array->isCString())
682 {
683 if (log)
684 log->PutCString("NSString initializer's str element is not a C string array");
Sean Callanan97c924e2011-01-27 01:07:04 +0000685
686 if (m_error_stream)
687 m_error_stream->Printf("Internal error [IRForTarget]: An Objective-C constant string's string initializer doesn't point to a C string\n");
688
Sean Callanan6ba533e2010-11-17 23:00:36 +0000689 return false;
690 }
691
692 if (log)
693 log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str());
694
Greg Clayton3c7feb42010-11-19 01:05:25 +0000695 if (!RewriteObjCConstString(llvm_module, nsstring_global, cstr_global, FirstEntryInstruction))
Sean Callanan97c924e2011-01-27 01:07:04 +0000696 {
Sean Callanan6ba533e2010-11-17 23:00:36 +0000697 if (log)
698 log->PutCString("Error rewriting the constant string");
Sean Callanan97c924e2011-01-27 01:07:04 +0000699
700 // We don't print an error message here because RewriteObjCConstString has done so for us.
701
Sean Callanan6ba533e2010-11-17 23:00:36 +0000702 return false;
703 }
Sean Callanan6ba533e2010-11-17 23:00:36 +0000704 }
705 }
706
707 for (ValueSymbolTable::iterator vi = value_symbol_table.begin(), ve = value_symbol_table.end();
708 vi != ve;
709 ++vi)
710 {
711 if (!strcmp(vi->first(), "__CFConstantStringClassReference"))
712 {
713 GlobalVariable *gv = dyn_cast<GlobalVariable>(vi->second);
714
715 if (!gv)
716 {
717 if (log)
718 log->PutCString("__CFConstantStringClassReference is not a global variable");
Sean Callanan97c924e2011-01-27 01:07:04 +0000719
720 if (m_error_stream)
721 m_error_stream->Printf("Internal error [IRForTarget]: Found a CFConstantStringClassReference, but it is not a global object\n");
722
Sean Callanan6ba533e2010-11-17 23:00:36 +0000723 return false;
724 }
725
726 gv->eraseFromParent();
727
728 break;
729 }
730 }
731
732 return true;
733}
734
Greg Clayton3c7feb42010-11-19 01:05:25 +0000735static bool IsObjCSelectorRef (Value *value)
Sean Callananf5857a02010-07-31 01:32:05 +0000736{
Greg Clayton3c7feb42010-11-19 01:05:25 +0000737 GlobalVariable *global_variable = dyn_cast<GlobalVariable>(value);
Sean Callananf5857a02010-07-31 01:32:05 +0000738
Greg Clayton3c7feb42010-11-19 01:05:25 +0000739 if (!global_variable || !global_variable->hasName() || !global_variable->getName().startswith("\01L_OBJC_SELECTOR_REFERENCES_"))
Sean Callananf5857a02010-07-31 01:32:05 +0000740 return false;
741
742 return true;
743}
744
Sean Callanan97c924e2011-01-27 01:07:04 +0000745// This function does not report errors; its callers are responsible.
Sean Callananf5857a02010-07-31 01:32:05 +0000746bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000747IRForTarget::RewriteObjCSelector (Instruction* selector_load, Module &llvm_module)
Sean Callananf5857a02010-07-31 01:32:05 +0000748{
Greg Claytone005f2c2010-11-06 01:53:30 +0000749 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000750
751 LoadInst *load = dyn_cast<LoadInst>(selector_load);
752
753 if (!load)
754 return false;
755
756 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend gets represented as
757 //
758 // %tmp = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_" ; <i8*>
759 // %call = call i8* (i8*, i8*, ...)* @objc_msgSend(i8* %obj, i8* %tmp, ...) ; <i8*>
760 //
761 // where %obj is the object pointer and %tmp is the selector.
762 //
Greg Clayton3c7feb42010-11-19 01:05:25 +0000763 // @"\01L_OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_".
764 // @"\01L_OBJC_llvm_moduleETH_VAR_NAllvm_moduleE_" contains the string.
Sean Callananf5857a02010-07-31 01:32:05 +0000765
766 // Find the pointer's initializer (a ConstantExpr with opcode GetElementPtr) and get the string from its target
767
768 GlobalVariable *_objc_selector_references_ = dyn_cast<GlobalVariable>(load->getPointerOperand());
769
770 if (!_objc_selector_references_ || !_objc_selector_references_->hasInitializer())
771 return false;
772
773 Constant *osr_initializer = _objc_selector_references_->getInitializer();
774
775 ConstantExpr *osr_initializer_expr = dyn_cast<ConstantExpr>(osr_initializer);
776
777 if (!osr_initializer_expr || osr_initializer_expr->getOpcode() != Instruction::GetElementPtr)
778 return false;
779
780 Value *osr_initializer_base = osr_initializer_expr->getOperand(0);
781
782 if (!osr_initializer_base)
783 return false;
784
785 // Find the string's initializer (a ConstantArray) and get the string from it
786
787 GlobalVariable *_objc_meth_var_name_ = dyn_cast<GlobalVariable>(osr_initializer_base);
788
789 if (!_objc_meth_var_name_ || !_objc_meth_var_name_->hasInitializer())
790 return false;
791
792 Constant *omvn_initializer = _objc_meth_var_name_->getInitializer();
793
794 ConstantArray *omvn_initializer_array = dyn_cast<ConstantArray>(omvn_initializer);
795
796 if (!omvn_initializer_array->isString())
797 return false;
798
799 std::string omvn_initializer_string = omvn_initializer_array->getAsString();
800
801 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000802 log->Printf("Found Objective-C selector reference \"%s\"", omvn_initializer_string.c_str());
Sean Callananf5857a02010-07-31 01:32:05 +0000803
804 // Construct a call to sel_registerName
805
806 if (!m_sel_registerName)
807 {
Greg Claytonb5037af2010-11-15 01:47:11 +0000808 lldb::addr_t sel_registerName_addr;
Sean Callananf5857a02010-07-31 01:32:05 +0000809
Greg Clayton8de27c72010-10-15 22:48:33 +0000810 static lldb_private::ConstString g_sel_registerName_str ("sel_registerName");
Greg Claytonb5037af2010-11-15 01:47:11 +0000811 if (!m_decl_map->GetFunctionAddress (g_sel_registerName_str, sel_registerName_addr))
Sean Callananf5857a02010-07-31 01:32:05 +0000812 return false;
813
Sean Callananc2c6f772010-10-26 00:31:56 +0000814 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +0000815 log->Printf("Found sel_registerName at 0x%llx", sel_registerName_addr);
Sean Callananc2c6f772010-10-26 00:31:56 +0000816
Sean Callananf5857a02010-07-31 01:32:05 +0000817 // Build the function type: struct objc_selector *sel_registerName(uint8_t*)
818
819 // The below code would be "more correct," but in actuality what's required is uint8_t*
Greg Clayton3c7feb42010-11-19 01:05:25 +0000820 //Type *sel_type = StructType::get(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000821 //Type *sel_ptr_type = PointerType::getUnqual(sel_type);
Greg Clayton3c7feb42010-11-19 01:05:25 +0000822 const Type *sel_ptr_type = Type::getInt8PtrTy(llvm_module.getContext());
Sean Callananf5857a02010-07-31 01:32:05 +0000823
824 std::vector <const Type *> srN_arg_types;
Greg Clayton3c7feb42010-11-19 01:05:25 +0000825 srN_arg_types.push_back(Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000826 llvm::Type *srN_type = FunctionType::get(sel_ptr_type, srN_arg_types, false);
827
828 // Build the constant containing the pointer to the function
Greg Clayton3c7feb42010-11-19 01:05:25 +0000829 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
830 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callananf5857a02010-07-31 01:32:05 +0000831 PointerType *srN_ptr_ty = PointerType::getUnqual(srN_type);
Greg Claytonb5037af2010-11-15 01:47:11 +0000832 Constant *srN_addr_int = ConstantInt::get(intptr_ty, sel_registerName_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +0000833 m_sel_registerName = ConstantExpr::getIntToPtr(srN_addr_int, srN_ptr_ty);
834 }
835
836 SmallVector <Value*, 1> srN_arguments;
837
Greg Clayton3c7feb42010-11-19 01:05:25 +0000838 Constant *omvn_pointer = ConstantExpr::getBitCast(_objc_meth_var_name_, Type::getInt8PtrTy(llvm_module.getContext()));
Sean Callananf5857a02010-07-31 01:32:05 +0000839
840 srN_arguments.push_back(omvn_pointer);
841
842 CallInst *srN_call = CallInst::Create(m_sel_registerName,
843 srN_arguments.begin(),
844 srN_arguments.end(),
Sean Callanan6ba533e2010-11-17 23:00:36 +0000845 "sel_registerName",
Sean Callananf5857a02010-07-31 01:32:05 +0000846 selector_load);
847
848 // Replace the load with the call in all users
849
850 selector_load->replaceAllUsesWith(srN_call);
851
852 selector_load->eraseFromParent();
853
854 return true;
855}
856
857bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000858IRForTarget::RewriteObjCSelectors (Module &llvm_module, BasicBlock &basic_block)
Sean Callananf5857a02010-07-31 01:32:05 +0000859{
Greg Claytone005f2c2010-11-06 01:53:30 +0000860 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf5857a02010-07-31 01:32:05 +0000861
862 BasicBlock::iterator ii;
863
864 typedef SmallVector <Instruction*, 2> InstrList;
865 typedef InstrList::iterator InstrIterator;
866
867 InstrList selector_loads;
868
Greg Clayton3c7feb42010-11-19 01:05:25 +0000869 for (ii = basic_block.begin();
870 ii != basic_block.end();
Sean Callananf5857a02010-07-31 01:32:05 +0000871 ++ii)
872 {
873 Instruction &inst = *ii;
874
875 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
Greg Clayton3c7feb42010-11-19 01:05:25 +0000876 if (IsObjCSelectorRef(load->getPointerOperand()))
Sean Callananf5857a02010-07-31 01:32:05 +0000877 selector_loads.push_back(&inst);
878 }
879
880 InstrIterator iter;
881
882 for (iter = selector_loads.begin();
883 iter != selector_loads.end();
884 ++iter)
885 {
Greg Clayton3c7feb42010-11-19 01:05:25 +0000886 if (!RewriteObjCSelector(*iter, llvm_module))
Sean Callananf5857a02010-07-31 01:32:05 +0000887 {
Sean Callanan97c924e2011-01-27 01:07:04 +0000888 if (m_error_stream)
889 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't change a static reference to an Objective-C selector to a dynamic reference\n");
890
Sean Callananf5857a02010-07-31 01:32:05 +0000891 if(log)
892 log->PutCString("Couldn't rewrite a reference to an Objective-C selector");
Sean Callanan97c924e2011-01-27 01:07:04 +0000893
Sean Callananf5857a02010-07-31 01:32:05 +0000894 return false;
895 }
896 }
897
898 return true;
899}
900
Sean Callanan97c924e2011-01-27 01:07:04 +0000901// This function does not report errors; its callers are responsible.
Sean Callanana48fe162010-08-11 03:57:18 +0000902bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000903IRForTarget::RewritePersistentAlloc (llvm::Instruction *persistent_alloc,
904 llvm::Module &llvm_module)
Sean Callanana48fe162010-08-11 03:57:18 +0000905{
Sean Callanan97678d12011-01-13 21:23:32 +0000906 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
907
Sean Callanana48fe162010-08-11 03:57:18 +0000908 AllocaInst *alloc = dyn_cast<AllocaInst>(persistent_alloc);
909
910 MDNode *alloc_md = alloc->getMetadata("clang.decl.ptr");
911
912 if (!alloc_md || !alloc_md->getNumOperands())
913 return false;
914
915 ConstantInt *constant_int = dyn_cast<ConstantInt>(alloc_md->getOperand(0));
916
917 if (!constant_int)
918 return false;
919
920 // We attempt to register this as a new persistent variable with the DeclMap.
921
922 uintptr_t ptr = constant_int->getZExtValue();
923
Sean Callanan82b74c82010-08-12 01:56:52 +0000924 clang::VarDecl *decl = reinterpret_cast<clang::VarDecl *>(ptr);
Sean Callanana48fe162010-08-11 03:57:18 +0000925
Sean Callanan82b74c82010-08-12 01:56:52 +0000926 lldb_private::TypeFromParser result_decl_type (decl->getType().getAsOpaquePtr(),
927 &decl->getASTContext());
928
Greg Clayton8de27c72010-10-15 22:48:33 +0000929 StringRef decl_name (decl->getName());
930 lldb_private::ConstString persistent_variable_name (decl_name.data(), decl_name.size());
Sean Callanan6a925532011-01-13 08:53:35 +0000931 if (!m_decl_map->AddPersistentVariable(decl, persistent_variable_name, result_decl_type, false, false))
Sean Callanana48fe162010-08-11 03:57:18 +0000932 return false;
933
Sean Callanan97678d12011-01-13 21:23:32 +0000934 GlobalVariable *persistent_global = new GlobalVariable(llvm_module,
935 alloc->getType(),
Sean Callanana48fe162010-08-11 03:57:18 +0000936 false, /* not constant */
937 GlobalValue::ExternalLinkage,
938 NULL, /* no initializer */
939 alloc->getName().str().c_str());
940
941 // What we're going to do here is make believe this was a regular old external
942 // variable. That means we need to make the metadata valid.
943
Greg Clayton8de27c72010-10-15 22:48:33 +0000944 NamedMDNode *named_metadata = llvm_module.getNamedMetadata("clang.global.decl.ptrs");
Sean Callanana48fe162010-08-11 03:57:18 +0000945
946 llvm::Value* values[2];
947 values[0] = persistent_global;
948 values[1] = constant_int;
949
Greg Clayton8de27c72010-10-15 22:48:33 +0000950 MDNode *persistent_global_md = MDNode::get(llvm_module.getContext(), values, 2);
Sean Callanana48fe162010-08-11 03:57:18 +0000951 named_metadata->addOperand(persistent_global_md);
952
Sean Callanan97678d12011-01-13 21:23:32 +0000953 // Now, since the variable is a pointer variable, we will drop in a load of that
954 // pointer variable.
955
956 LoadInst *persistent_load = new LoadInst (persistent_global, "", alloc);
957
958 if (log)
959 log->Printf("Replacing \"%s\" with \"%s\"",
960 PrintValue(alloc).c_str(),
961 PrintValue(persistent_load).c_str());
962
963 alloc->replaceAllUsesWith(persistent_load);
Sean Callanana48fe162010-08-11 03:57:18 +0000964 alloc->eraseFromParent();
965
966 return true;
967}
968
969bool
Greg Clayton3c7feb42010-11-19 01:05:25 +0000970IRForTarget::RewritePersistentAllocs(llvm::Module &llvm_module, llvm::BasicBlock &basic_block)
Sean Callanana48fe162010-08-11 03:57:18 +0000971{
Sean Callanane8a59a82010-09-13 21:34:21 +0000972 if (!m_resolve_vars)
973 return true;
974
Greg Claytone005f2c2010-11-06 01:53:30 +0000975 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanana48fe162010-08-11 03:57:18 +0000976
977 BasicBlock::iterator ii;
978
979 typedef SmallVector <Instruction*, 2> InstrList;
980 typedef InstrList::iterator InstrIterator;
981
982 InstrList pvar_allocs;
983
Greg Clayton3c7feb42010-11-19 01:05:25 +0000984 for (ii = basic_block.begin();
985 ii != basic_block.end();
Sean Callanana48fe162010-08-11 03:57:18 +0000986 ++ii)
987 {
988 Instruction &inst = *ii;
989
990 if (AllocaInst *alloc = dyn_cast<AllocaInst>(&inst))
Sean Callanan237e4742011-01-21 22:30:25 +0000991 {
992 llvm::StringRef alloc_name = alloc->getName();
993
994 if (alloc_name.startswith("$") &&
995 !alloc_name.startswith("$__lldb"))
996 {
997 if (alloc_name.find_first_of("0123456789") == 1)
998 {
999 if (log)
1000 log->Printf("Rejecting a numeric persistent variable.");
1001
Sean Callanan97c924e2011-01-27 01:07:04 +00001002 if (m_error_stream)
1003 m_error_stream->Printf("Error [IRForTarget]: Names starting with $0, $1, ... are reserved for use as result names\n");
1004
Sean Callanan237e4742011-01-21 22:30:25 +00001005 return false;
1006 }
1007
Sean Callanana48fe162010-08-11 03:57:18 +00001008 pvar_allocs.push_back(alloc);
Sean Callanan237e4742011-01-21 22:30:25 +00001009 }
1010 }
Sean Callanana48fe162010-08-11 03:57:18 +00001011 }
1012
1013 InstrIterator iter;
1014
1015 for (iter = pvar_allocs.begin();
1016 iter != pvar_allocs.end();
1017 ++iter)
1018 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001019 if (!RewritePersistentAlloc(*iter, llvm_module))
Sean Callanana48fe162010-08-11 03:57:18 +00001020 {
Sean Callanan97c924e2011-01-27 01:07:04 +00001021 if (m_error_stream)
1022 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite the creation of a persistent variable\n");
1023
Sean Callanana48fe162010-08-11 03:57:18 +00001024 if(log)
1025 log->PutCString("Couldn't rewrite the creation of a persistent variable");
Sean Callanan97c924e2011-01-27 01:07:04 +00001026
Sean Callanana48fe162010-08-11 03:57:18 +00001027 return false;
1028 }
1029 }
1030
1031 return true;
1032}
1033
Sean Callanan8bce6652010-07-13 21:41:46 +00001034static clang::NamedDecl *
Greg Clayton3c7feb42010-11-19 01:05:25 +00001035DeclForGlobalValue(Module &module, GlobalValue *global_value)
Sean Callanan8bce6652010-07-13 21:41:46 +00001036{
1037 NamedMDNode *named_metadata = module.getNamedMetadata("clang.global.decl.ptrs");
1038
1039 if (!named_metadata)
1040 return NULL;
1041
1042 unsigned num_nodes = named_metadata->getNumOperands();
1043 unsigned node_index;
1044
1045 for (node_index = 0;
1046 node_index < num_nodes;
1047 ++node_index)
1048 {
1049 MDNode *metadata_node = named_metadata->getOperand(node_index);
1050
1051 if (!metadata_node)
1052 return NULL;
1053
1054 if (metadata_node->getNumOperands() != 2)
Sean Callanana48fe162010-08-11 03:57:18 +00001055 continue;
Sean Callanan8bce6652010-07-13 21:41:46 +00001056
1057 if (metadata_node->getOperand(0) != global_value)
1058 continue;
1059
1060 ConstantInt *constant_int = dyn_cast<ConstantInt>(metadata_node->getOperand(1));
1061
1062 if (!constant_int)
1063 return NULL;
1064
1065 uintptr_t ptr = constant_int->getZExtValue();
1066
1067 return reinterpret_cast<clang::NamedDecl *>(ptr);
1068 }
1069
1070 return NULL;
1071}
1072
Sean Callanan97c924e2011-01-27 01:07:04 +00001073// This function does not report errors; its callers are responsible.
Sean Callanan8bce6652010-07-13 21:41:46 +00001074bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001075IRForTarget::MaybeHandleVariable (Module &llvm_module, Value *llvm_value_ptr)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001076{
Greg Claytone005f2c2010-11-06 01:53:30 +00001077 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan48443652010-12-02 19:47:57 +00001078
1079 if (log)
Sean Callananb9f09a62010-12-06 22:16:55 +00001080 log->Printf("MaybeHandleVariable (%s)", PrintValue(llvm_value_ptr).c_str());
Sean Callananf5857a02010-07-31 01:32:05 +00001081
Greg Clayton8de27c72010-10-15 22:48:33 +00001082 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(llvm_value_ptr))
Sean Callananbc2928a2010-08-03 00:23:29 +00001083 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001084 switch (constant_expr->getOpcode())
Sean Callananbc2928a2010-08-03 00:23:29 +00001085 {
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001086 default:
1087 break;
1088 case Instruction::GetElementPtr:
1089 case Instruction::BitCast:
Sean Callananbc2928a2010-08-03 00:23:29 +00001090 Value *s = constant_expr->getOperand(0);
Sean Callanan48443652010-12-02 19:47:57 +00001091 if (!MaybeHandleVariable(llvm_module, s))
1092 return false;
Sean Callananbc2928a2010-08-03 00:23:29 +00001093 }
1094 }
Sean Callananf921cf52010-12-03 19:51:05 +00001095 else if (GlobalVariable *global_variable = dyn_cast<GlobalVariable>(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001096 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001097 clang::NamedDecl *named_decl = DeclForGlobalValue(llvm_module, global_variable);
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001098
Sean Callananf5857a02010-07-31 01:32:05 +00001099 if (!named_decl)
1100 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001101 if (IsObjCSelectorRef(llvm_value_ptr))
Sean Callananf5857a02010-07-31 01:32:05 +00001102 return true;
1103
Sean Callanan7cd46742010-12-06 00:56:39 +00001104 if (!global_variable->hasExternalLinkage())
1105 return true;
1106
Sean Callananf5857a02010-07-31 01:32:05 +00001107 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001108 log->Printf("Found global variable \"%s\" without metadata", global_variable->getName().str().c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001109
Sean Callananf5857a02010-07-31 01:32:05 +00001110 return false;
1111 }
1112
Greg Clayton8de27c72010-10-15 22:48:33 +00001113 std::string name (named_decl->getName().str());
Sean Callanan810f22d2010-07-16 00:09:46 +00001114
Sean Callanan771131d2010-09-30 21:18:25 +00001115 void *opaque_type = NULL;
Sean Callananf328c9f2010-07-20 23:31:16 +00001116 clang::ASTContext *ast_context = NULL;
Sean Callanan810f22d2010-07-16 00:09:46 +00001117
1118 if (clang::ValueDecl *value_decl = dyn_cast<clang::ValueDecl>(named_decl))
Sean Callananf328c9f2010-07-20 23:31:16 +00001119 {
Sean Callanan771131d2010-09-30 21:18:25 +00001120 opaque_type = value_decl->getType().getAsOpaquePtr();
Sean Callananf328c9f2010-07-20 23:31:16 +00001121 ast_context = &value_decl->getASTContext();
1122 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001123 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001124 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001125 return false;
Sean Callananf328c9f2010-07-20 23:31:16 +00001126 }
Sean Callanan771131d2010-09-30 21:18:25 +00001127
Sean Callanan6a925532011-01-13 08:53:35 +00001128 clang::QualType qual_type;
1129 const Type *value_type;
1130
Sean Callanan97678d12011-01-13 21:23:32 +00001131 if (name[0] == '$')
Sean Callanan6a925532011-01-13 08:53:35 +00001132 {
1133 // The $__lldb_expr_result name indicates the the return value has allocated as
1134 // a static variable. Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1135 // accesses to this static variable need to be redirected to the result of dereferencing
1136 // a pointer that is passed in as one of the arguments.
1137 //
1138 // Consequently, when reporting the size of the type, we report a pointer type pointing
1139 // to the type of $__lldb_expr_result, not the type itself.
Sean Callanan97678d12011-01-13 21:23:32 +00001140 //
1141 // We also do this for any user-declared persistent variables.
Sean Callananf328c9f2010-07-20 23:31:16 +00001142
Sean Callanan6a925532011-01-13 08:53:35 +00001143 qual_type = ast_context->getPointerType(clang::QualType::getFromOpaquePtr(opaque_type));
1144 value_type = PointerType::get(global_variable->getType(), 0);
1145 }
1146 else
1147 {
1148 qual_type = clang::QualType::getFromOpaquePtr(opaque_type);
1149 value_type = global_variable->getType();
1150 }
Sean Callanan771131d2010-09-30 21:18:25 +00001151
1152 size_t value_size = (ast_context->getTypeSize(qual_type) + 7) / 8;
1153 off_t value_alignment = (ast_context->getTypeAlign(qual_type) + 7) / 8;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001154
Sean Callanan771131d2010-09-30 21:18:25 +00001155 if (log)
Sean Callanan97678d12011-01-13 21:23:32 +00001156 log->Printf("Type of \"%s\" is [clang \"%s\", llvm \"%s\"] [size %d, align %d]",
Sean Callanan771131d2010-09-30 21:18:25 +00001157 name.c_str(),
1158 qual_type.getAsString().c_str(),
1159 PrintType(value_type).c_str(),
1160 value_size,
1161 value_alignment);
Sean Callanan3aa7da52010-12-13 22:46:15 +00001162
Sean Callanan8bce6652010-07-13 21:41:46 +00001163
Sean Callanan8c127202010-08-23 23:09:38 +00001164 if (named_decl && !m_decl_map->AddValueToStruct(named_decl,
Greg Clayton8de27c72010-10-15 22:48:33 +00001165 lldb_private::ConstString (name.c_str()),
1166 llvm_value_ptr,
Sean Callananba992c52010-07-27 02:07:53 +00001167 value_size,
1168 value_alignment))
Sean Callanan8bce6652010-07-13 21:41:46 +00001169 return false;
1170 }
Sean Callananf3143b72010-12-03 03:02:31 +00001171 else if (dyn_cast<llvm::Function>(llvm_value_ptr))
Sean Callanan48443652010-12-02 19:47:57 +00001172 {
1173 if (log)
1174 log->Printf("Function pointers aren't handled right now");
1175
1176 return false;
1177 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001178
1179 return true;
1180}
1181
Sean Callanan97c924e2011-01-27 01:07:04 +00001182// This function does not report errors; its callers are responsible.
Sean Callanan8bce6652010-07-13 21:41:46 +00001183bool
Sean Callananc7674af2011-01-17 23:42:46 +00001184IRForTarget::HandleSymbol (Module &llvm_module,
1185 Value *symbol)
1186{
1187 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1188
1189 lldb_private::ConstString name(symbol->getName().str().c_str());
1190
1191 uint64_t symbol_addr;
1192
1193 if (!m_decl_map->GetSymbolAddress (name, symbol_addr))
1194 {
1195 if (log)
1196 log->Printf ("Symbol \"%s\" had no address", name.GetCString());
1197
1198 return false;
1199 }
1200
1201 if (log)
1202 log->Printf("Found \"%s\" at 0x%llx", name.GetCString(), symbol_addr);
1203
1204 const Type *symbol_type = symbol->getType();
1205
1206 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1207 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
1208
1209 Constant *symbol_addr_int = ConstantInt::get(intptr_ty, symbol_addr, false);
1210
1211 Value *symbol_addr_ptr = ConstantExpr::getIntToPtr(symbol_addr_int, symbol_type);
1212
1213 if (log)
1214 log->Printf("Replacing %s with %s", PrintValue(symbol).c_str(), PrintValue(symbol_addr_ptr).c_str());
1215
1216 symbol->replaceAllUsesWith(symbol_addr_ptr);
1217
1218 return true;
1219}
1220
1221bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001222IRForTarget::MaybeHandleCallArguments (Module &llvm_module, CallInst *Old)
Sean Callanandc27aba2010-10-05 22:26:43 +00001223{
Sean Callanan48443652010-12-02 19:47:57 +00001224 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1225
1226 if (log)
1227 log->Printf("MaybeHandleCallArguments(%s)", PrintValue(Old).c_str());
Sean Callanandc27aba2010-10-05 22:26:43 +00001228
Sean Callanan6ba533e2010-11-17 23:00:36 +00001229 for (unsigned op_index = 0, num_ops = Old->getNumArgOperands();
Sean Callanandc27aba2010-10-05 22:26:43 +00001230 op_index < num_ops;
1231 ++op_index)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001232 if (!MaybeHandleVariable(llvm_module, Old->getArgOperand(op_index))) // conservatively believe that this is a store
Sean Callanan97c924e2011-01-27 01:07:04 +00001233 {
1234 if (m_error_stream)
1235 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite one of the arguments of a function call.\n");
1236
Sean Callanandc27aba2010-10-05 22:26:43 +00001237 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001238 }
1239
Sean Callanandc27aba2010-10-05 22:26:43 +00001240 return true;
1241}
1242
1243bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001244IRForTarget::MaybeHandleCall (Module &llvm_module, CallInst *llvm_call_inst)
Sean Callananba992c52010-07-27 02:07:53 +00001245{
Greg Claytone005f2c2010-11-06 01:53:30 +00001246 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananba992c52010-07-27 02:07:53 +00001247
Greg Clayton8de27c72010-10-15 22:48:33 +00001248 Function *fun = llvm_call_inst->getCalledFunction();
Sean Callananba992c52010-07-27 02:07:53 +00001249
1250 if (fun == NULL)
Sean Callanan65af7342010-09-08 20:04:08 +00001251 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001252 Value *val = llvm_call_inst->getCalledValue();
Sean Callanan65af7342010-09-08 20:04:08 +00001253
1254 ConstantExpr *const_expr = dyn_cast<ConstantExpr>(val);
Sean Callanand5b3c352011-01-27 04:42:51 +00001255 LoadInst *load_inst = dyn_cast<LoadInst>(val);
Sean Callanan65af7342010-09-08 20:04:08 +00001256
1257 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1258 {
1259 fun = dyn_cast<Function>(const_expr->getOperand(0));
1260
1261 if (!fun)
Sean Callanan97c924e2011-01-27 01:07:04 +00001262 {
1263 if (m_error_stream)
1264 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is a cast of something not a function\n");
1265
Sean Callanan48443652010-12-02 19:47:57 +00001266 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001267 }
Sean Callanan65af7342010-09-08 20:04:08 +00001268 }
Sean Callananc4217a62010-12-06 23:53:20 +00001269 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1270 {
1271 return true; // already resolved
1272 }
Sean Callanand5b3c352011-01-27 04:42:51 +00001273 else if (load_inst)
1274 {
1275 return true; // virtual method call
1276 }
Sean Callanan65af7342010-09-08 20:04:08 +00001277 else
1278 {
Sean Callanan97c924e2011-01-27 01:07:04 +00001279 if (m_error_stream)
1280 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is not a function\n");
1281
Sean Callanan48443652010-12-02 19:47:57 +00001282 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001283 }
1284 }
Sean Callananba992c52010-07-27 02:07:53 +00001285
Greg Clayton8de27c72010-10-15 22:48:33 +00001286 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001287
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001288 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001289 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001290 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001291
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001292 switch (intrinsic_id)
1293 {
1294 default:
1295 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001296 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001297
1298 if (m_error_stream)
1299 m_error_stream->Printf("Internal error [IRForTarget]: Call to unhandled compiler intrinsic '%s'\n", Intrinsic::getName(intrinsic_id).c_str());
1300
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001301 return false;
1302 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001303 {
1304 static lldb_private::ConstString g_memcpy_str ("memcpy");
1305 str = g_memcpy_str;
1306 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001307 break;
1308 }
Sean Callananc04743d2010-09-28 21:13:03 +00001309
Greg Clayton8de27c72010-10-15 22:48:33 +00001310 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001311 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001312 }
1313 else
1314 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001315 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001316 }
1317
Greg Clayton8de27c72010-10-15 22:48:33 +00001318 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001319 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001320 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001321
Sean Callananf5857a02010-07-31 01:32:05 +00001322 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001323 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001324 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001325 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001326 fun_value_ptr = NULL;
1327
Greg Clayton8de27c72010-10-15 22:48:33 +00001328 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001329 {
1330 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001331 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001332
Sean Callanan97c924e2011-01-27 01:07:04 +00001333 if (m_error_stream)
1334 m_error_stream->Printf("Error [IRForTarget]: Call to a function '%s' that is not present in the target\n", str.GetCString());
1335
Sean Callanan92aa6662010-09-07 21:49:41 +00001336 return false;
1337 }
Sean Callananf5857a02010-07-31 01:32:05 +00001338 }
1339 }
1340 else
1341 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001342 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001343 {
1344 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001345 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callanan97c924e2011-01-27 01:07:04 +00001346
1347 if (m_error_stream)
1348 m_error_stream->Printf("Error [IRForTarget]: Call to a symbol-only function '%s' that is not present in the target\n", str.GetCString());
1349
1350 return false;
Sean Callananf5857a02010-07-31 01:32:05 +00001351 }
Sean Callananba992c52010-07-27 02:07:53 +00001352 }
1353
1354 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001355 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001356
Sean Callananf5857a02010-07-31 01:32:05 +00001357 Value *fun_addr_ptr;
1358
1359 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001360 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001361 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1362 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001363 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001364 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1365 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001366 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1367
1368 if (fun_value_ptr)
1369 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001370 }
Sean Callananf5857a02010-07-31 01:32:05 +00001371
1372 if (fun_value_ptr)
1373 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001374
Greg Clayton8de27c72010-10-15 22:48:33 +00001375 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001376
Greg Clayton8de27c72010-10-15 22:48:33 +00001377 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001378
1379 Value *values[1];
1380 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001381 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001382
Greg Clayton8de27c72010-10-15 22:48:33 +00001383 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001384
1385 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001386 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 +00001387
Sean Callananba992c52010-07-27 02:07:53 +00001388 return true;
1389}
1390
1391bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001392IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001393{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001394 /////////////////////////////////////////////////////////////////////////
1395 // Prepare the current basic block for execution in the remote process
1396 //
1397
Sean Callanan02fbafa2010-07-27 21:39:39 +00001398 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001399
Greg Clayton3c7feb42010-11-19 01:05:25 +00001400 for (ii = basic_block.begin();
1401 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001402 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001403 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001404 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001405
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001406 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001407
Sean Callanan97c924e2011-01-27 01:07:04 +00001408 // MaybeHandleCall handles error reporting; we are silent here
Greg Clayton3c7feb42010-11-19 01:05:25 +00001409 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001410 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001411
Sean Callanan97c924e2011-01-27 01:07:04 +00001412 // MaybeHandleCallArguments handles error reporting; we are silent here
Sean Callanan48443652010-12-02 19:47:57 +00001413 if (call && !MaybeHandleCallArguments(llvm_module, call))
1414 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001415 }
1416
1417 return true;
1418}
1419
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001420bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001421IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001422{
Sean Callananae71e302010-11-18 22:21:58 +00001423 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1424
Greg Clayton3c7feb42010-11-19 01:05:25 +00001425 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001426 global != end;
1427 ++global)
1428 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001429 if (log)
1430 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1431 (*global).getName().str().c_str(),
1432 DeclForGlobalValue(llvm_module, global));
1433
Sean Callananc7674af2011-01-17 23:42:46 +00001434 if ((*global).getName().str().find("OBJC_IVAR") == 0)
1435 {
1436 if (!HandleSymbol(llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001437 {
1438 if (m_error_stream)
1439 m_error_stream->Printf("Error [IRForTarget]: Couldn't find Objective-C indirect ivar symbol %s\n", (*global).getName().str().c_str());
1440
Sean Callananc7674af2011-01-17 23:42:46 +00001441 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001442 }
Sean Callananc7674af2011-01-17 23:42:46 +00001443 }
1444 else if (DeclForGlobalValue(llvm_module, global))
1445 {
1446 if (!MaybeHandleVariable (llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001447 {
1448 if (m_error_stream)
1449 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite external variable %s\n", (*global).getName().str().c_str());
1450
Sean Callananc7674af2011-01-17 23:42:46 +00001451 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001452 }
Sean Callananc7674af2011-01-17 23:42:46 +00001453 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001454 }
1455
1456 return true;
1457}
1458
Sean Callanan02fbafa2010-07-27 21:39:39 +00001459static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001460{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001461 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001462
Sean Callanan6ba533e2010-11-17 23:00:36 +00001463 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001464 return false;
1465
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001466 ConstantExpr *CE;
1467
1468 if ((CE = dyn_cast<ConstantExpr>(V)))
1469 {
1470 if (CE->getOpcode() != Instruction::BitCast)
1471 return false;
1472
Sean Callanan6ba533e2010-11-17 23:00:36 +00001473 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001474 }
1475
Sean Callanan6ba533e2010-11-17 23:00:36 +00001476 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001477
1478 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1479 return false;
1480
1481 return true;
1482}
1483
Greg Clayton3c7feb42010-11-19 01:05:25 +00001484static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001485{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001486 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001487
1488 Value::use_iterator ui;
1489
1490 for (ui = guard_load->use_begin();
1491 ui != guard_load->use_end();
1492 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001493 {
Greg Clayton6e713402010-07-30 20:30:44 +00001494 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001495 {
1496 // do nothing for the moment
1497 }
1498 else
1499 {
1500 ui->replaceUsesOfWith(guard_load, zero);
1501 }
1502 }
Sean Callanan45839272010-07-24 01:37:44 +00001503
1504 guard_load->eraseFromParent();
1505}
1506
1507static void ExciseGuardStore(Instruction* guard_store)
1508{
1509 guard_store->eraseFromParent();
1510}
1511
1512bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001513IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001514{
1515 ///////////////////////////////////////////////////////
1516 // Eliminate any reference to guard variables found.
1517 //
1518
Sean Callanan02fbafa2010-07-27 21:39:39 +00001519 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001520
Sean Callanan02fbafa2010-07-27 21:39:39 +00001521 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001522 typedef InstrList::iterator InstrIterator;
1523
1524 InstrList guard_loads;
1525 InstrList guard_stores;
1526
Greg Clayton3c7feb42010-11-19 01:05:25 +00001527 for (ii = basic_block.begin();
1528 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001529 ++ii)
1530 {
1531 Instruction &inst = *ii;
1532
1533 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1534 if (isGuardVariableRef(load->getPointerOperand()))
1535 guard_loads.push_back(&inst);
1536
1537 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1538 if (isGuardVariableRef(store->getPointerOperand()))
1539 guard_stores.push_back(&inst);
1540 }
1541
1542 InstrIterator iter;
1543
1544 for (iter = guard_loads.begin();
1545 iter != guard_loads.end();
1546 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001547 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001548
1549 for (iter = guard_stores.begin();
1550 iter != guard_stores.end();
1551 ++iter)
1552 ExciseGuardStore(*iter);
1553
1554 return true;
1555}
1556
Sean Callanan97c924e2011-01-27 01:07:04 +00001557// This function does not report errors; its callers are responsible.
Sean Callanan6ba533e2010-11-17 23:00:36 +00001558bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001559IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001560{
Greg Claytone005f2c2010-11-06 01:53:30 +00001561 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001562
1563 Value::use_iterator ui;
1564
Sean Callanana48fe162010-08-11 03:57:18 +00001565 SmallVector<User*, 16> users;
1566
1567 // We do this because the use list might change, invalidating our iterator.
1568 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001569 for (ui = old_constant->use_begin();
1570 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001571 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001572 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001573
Sean Callanana48fe162010-08-11 03:57:18 +00001574 for (int i = 0;
1575 i < users.size();
1576 ++i)
1577 {
1578 User *user = users[i];
1579
Sean Callananbafd6852010-07-14 23:40:29 +00001580 if (Constant *constant = dyn_cast<Constant>(user))
1581 {
1582 // synthesize a new non-constant equivalent of the constant
1583
1584 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1585 {
1586 switch (constant_expr->getOpcode())
1587 {
1588 default:
1589 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001590 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001591 return false;
1592 case Instruction::BitCast:
1593 {
1594 // UnaryExpr
1595 // OperandList[0] is value
1596
1597 Value *s = constant_expr->getOperand(0);
1598
Greg Clayton3c7feb42010-11-19 01:05:25 +00001599 if (s == old_constant)
1600 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001601
Greg Clayton3c7feb42010-11-19 01:05:25 +00001602 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001603
Greg Clayton3c7feb42010-11-19 01:05:25 +00001604 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001605 }
1606 break;
1607 case Instruction::GetElementPtr:
1608 {
1609 // GetElementPtrConstantExpr
1610 // OperandList[0] is base
1611 // OperandList[1]... are indices
1612
1613 Value *ptr = constant_expr->getOperand(0);
1614
Greg Clayton3c7feb42010-11-19 01:05:25 +00001615 if (ptr == old_constant)
1616 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001617
1618 SmallVector<Value*, 16> indices;
1619
1620 unsigned operand_index;
1621 unsigned num_operands = constant_expr->getNumOperands();
1622
1623 for (operand_index = 1;
1624 operand_index < num_operands;
1625 ++operand_index)
1626 {
1627 Value *operand = constant_expr->getOperand(operand_index);
1628
Greg Clayton3c7feb42010-11-19 01:05:25 +00001629 if (operand == old_constant)
1630 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001631
1632 indices.push_back(operand);
1633 }
1634
Greg Clayton3c7feb42010-11-19 01:05:25 +00001635 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001636
Greg Clayton3c7feb42010-11-19 01:05:25 +00001637 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001638 }
1639 break;
1640 }
1641 }
1642 else
1643 {
1644 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001645 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001646 return false;
1647 }
1648 }
1649 else
1650 {
1651 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001652 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001653 }
1654 }
1655
1656 return true;
1657}
1658
Sean Callanan8bce6652010-07-13 21:41:46 +00001659bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001660IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001661{
Sean Callanane8a59a82010-09-13 21:34:21 +00001662 if (!m_resolve_vars)
1663 return true;
1664
Greg Claytone005f2c2010-11-06 01:53:30 +00001665 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001666
1667 m_decl_map->DoStructLayout();
1668
1669 if (log)
1670 log->Printf("Element arrangement:");
1671
1672 uint32_t num_elements;
1673 uint32_t element_index;
1674
1675 size_t size;
1676 off_t alignment;
1677
1678 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1679 return false;
1680
Greg Clayton3c7feb42010-11-19 01:05:25 +00001681 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001682
Greg Clayton3c7feb42010-11-19 01:05:25 +00001683 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001684 {
1685 if (m_error_stream)
1686 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes no arguments (should take at least a struct pointer)");
1687
Sean Callanan8bce6652010-07-13 21:41:46 +00001688 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001689 }
1690
Sean Callanan02fbafa2010-07-27 21:39:39 +00001691 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001692
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001693 if (argument->getName().equals("this"))
1694 {
1695 ++iter;
1696
Greg Clayton3c7feb42010-11-19 01:05:25 +00001697 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001698 {
1699 if (m_error_stream)
1700 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'this' argument (should take a struct pointer too)");
1701
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001702 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001703 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001704
1705 argument = iter;
1706 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001707 else if (argument->getName().equals("self"))
1708 {
1709 ++iter;
1710
1711 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001712 {
1713 if (m_error_stream)
1714 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' argument (should take '_cmd' and a struct pointer too)");
1715
Sean Callanan3aa7da52010-12-13 22:46:15 +00001716 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001717 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001718
1719 if (!iter->getName().equals("_cmd"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001720 {
1721 if (m_error_stream)
1722 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes '%s' after 'self' argument (should take '_cmd')", iter->getName().str().c_str());
1723
Sean Callanan3aa7da52010-12-13 22:46:15 +00001724 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001725 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001726
1727 ++iter;
1728
1729 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001730 {
1731 if (m_error_stream)
1732 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' and '_cmd' arguments (should take a struct pointer too)");
1733
Sean Callanan3aa7da52010-12-13 22:46:15 +00001734 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001735 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001736
1737 argument = iter;
1738 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001739
Greg Clayton8de27c72010-10-15 22:48:33 +00001740 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001741 {
1742 if (m_error_stream)
1743 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes an argument named '%s' instead of the struct pointer", argument->getName().str().c_str());
1744
Sean Callanan8bce6652010-07-13 21:41:46 +00001745 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001746 }
1747
Sean Callanan8bce6652010-07-13 21:41:46 +00001748 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001749 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001750
Greg Clayton3c7feb42010-11-19 01:05:25 +00001751 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001752 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001753
Sean Callanan6ba533e2010-11-17 23:00:36 +00001754 if (!FirstEntryInstruction)
Sean Callanan97c924e2011-01-27 01:07:04 +00001755 {
1756 if (m_error_stream)
1757 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find the first instruction in the wrapper for use in rewriting");
1758
Sean Callanan8bce6652010-07-13 21:41:46 +00001759 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001760 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001761
Greg Clayton3c7feb42010-11-19 01:05:25 +00001762 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001763 const IntegerType *offset_type(Type::getInt32Ty(context));
1764
1765 if (!offset_type)
Sean Callanan97c924e2011-01-27 01:07:04 +00001766 {
1767 if (m_error_stream)
1768 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't produce an offset type");
1769
Sean Callanan8bce6652010-07-13 21:41:46 +00001770 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001771 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001772
1773 for (element_index = 0; element_index < num_elements; ++element_index)
1774 {
1775 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001776 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001777 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001778 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001779
Sean Callanan45690fe2010-08-30 22:17:16 +00001780 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan97c924e2011-01-27 01:07:04 +00001781 {
1782 if (m_error_stream)
1783 m_error_stream->Printf("Internal error [IRForTarget]: Structure information is incomplete");
1784
Sean Callanan8bce6652010-07-13 21:41:46 +00001785 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001786 }
1787
Sean Callanan8bce6652010-07-13 21:41:46 +00001788 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001789 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001790 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001791 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001792 PrintValue(value, true).c_str(),
1793 offset);
1794
1795 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001796 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
Sean Callanan6a925532011-01-13 08:53:35 +00001797
1798 Value *replacement;
Sean Callanan8bce6652010-07-13 21:41:46 +00001799
Sean Callanan6a925532011-01-13 08:53:35 +00001800 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult, in cases where the result
1801 // variable is an rvalue, we have to synthesize a dereference of the appropriate structure
1802 // entry in order to produce the static variable that the AST thinks it is accessing.
1803 if (name == m_result_name && !m_result_is_pointer)
1804 {
1805 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType()->getPointerTo(), "", FirstEntryInstruction);
1806
1807 LoadInst *load = new LoadInst(bit_cast, "", FirstEntryInstruction);
1808
1809 replacement = load;
1810 }
Sean Callananbafd6852010-07-14 23:40:29 +00001811 else
Sean Callanan6a925532011-01-13 08:53:35 +00001812 {
1813 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
1814
1815 replacement = bit_cast;
1816 }
1817
1818 if (Constant *constant = dyn_cast<Constant>(value))
1819 UnfoldConstant(constant, replacement, FirstEntryInstruction);
1820 else
1821 value->replaceAllUsesWith(replacement);
Sean Callananb51ee982010-11-02 23:51:17 +00001822
1823 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1824 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001825 }
1826
1827 if (log)
1828 log->Printf("Total structure [align %d, size %d]", alignment, size);
1829
1830 return true;
1831}
1832
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001833bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001834IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001835{
Greg Claytone005f2c2010-11-06 01:53:30 +00001836 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001837
Greg Clayton3c7feb42010-11-19 01:05:25 +00001838 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001839
1840 if (!function)
1841 {
1842 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001843 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001844
1845 if (m_error_stream)
1846 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 +00001847
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001848 return false;
1849 }
1850
Sean Callanan02fbafa2010-07-27 21:39:39 +00001851 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001852
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001853 m_has_side_effects = HasSideEffects(llvm_module, *function);
1854
Sean Callanan82b74c82010-08-12 01:56:52 +00001855 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001856 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001857 //
1858
Greg Clayton3c7feb42010-11-19 01:05:25 +00001859 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001860 {
1861 if (log)
1862 log->Printf("CreateResultVariable() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001863
1864 // CreateResultVariable() reports its own errors, so we don't do so here
1865
Sean Callanan82b74c82010-08-12 01:56:52 +00001866 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001867 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001868
Sean Callanan6ba533e2010-11-17 23:00:36 +00001869 ///////////////////////////////////////////////////////////////////////////////
1870 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1871 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001872
Greg Clayton3c7feb42010-11-19 01:05:25 +00001873 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001874 {
1875 if (log)
1876 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001877
1878 // RewriteObjCConstStrings() reports its own errors, so we don't do so here
1879
Sean Callanan6ba533e2010-11-17 23:00:36 +00001880 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001881 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001882
Sean Callananf5857a02010-07-31 01:32:05 +00001883 //////////////////////////////////
1884 // Run basic-block level passes
1885 //
1886
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001887 for (bbi = function->begin();
1888 bbi != function->end();
1889 ++bbi)
1890 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001891 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001892 {
1893 if (log)
1894 log->Printf("RemoveGuards() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001895
1896 // RemoveGuards() reports its own errors, so we don't do so here
1897
Sean Callanan8c127202010-08-23 23:09:38 +00001898 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001899 }
Sean Callanan8c127202010-08-23 23:09:38 +00001900
Greg Clayton3c7feb42010-11-19 01:05:25 +00001901 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001902 {
1903 if (log)
1904 log->Printf("RewritePersistentAllocs() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001905
1906 // RewritePersistentAllocs() reports its own errors, so we don't do so here
1907
Sean Callananf5857a02010-07-31 01:32:05 +00001908 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001909 }
Sean Callananf5857a02010-07-31 01:32:05 +00001910
Greg Clayton3c7feb42010-11-19 01:05:25 +00001911 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001912 {
1913 if (log)
1914 log->Printf("RewriteObjCSelectors() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001915
1916 // RewriteObjCSelectors() reports its own errors, so we don't do so here
1917
Sean Callanana48fe162010-08-11 03:57:18 +00001918 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001919 }
Sean Callanana48fe162010-08-11 03:57:18 +00001920
Greg Clayton3c7feb42010-11-19 01:05:25 +00001921 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001922 {
1923 if (log)
1924 log->Printf("ResolveCalls() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001925
1926 // ResolveCalls() reports its own errors, so we don't do so here
1927
Sean Callanan8bce6652010-07-13 21:41:46 +00001928 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001929 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001930 }
1931
Sean Callanan771131d2010-09-30 21:18:25 +00001932 ///////////////////////////////
1933 // Run function-level passes
1934 //
1935
Greg Clayton3c7feb42010-11-19 01:05:25 +00001936 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001937 {
1938 if (log)
1939 log->Printf("ResolveExternals() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001940
1941 // ResolveExternals() reports its own errors, so we don't do so here
1942
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001943 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001944 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001945
Greg Clayton3c7feb42010-11-19 01:05:25 +00001946 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001947 {
1948 if (log)
1949 log->Printf("ReplaceVariables() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001950
1951 // ReplaceVariables() reports its own errors, so we don't do so here
1952
Sean Callanan771131d2010-09-30 21:18:25 +00001953 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001954 }
Sean Callanan771131d2010-09-30 21:18:25 +00001955
Sean Callanan8bce6652010-07-13 21:41:46 +00001956 if (log)
1957 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001958 std::string s;
1959 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001960
Greg Clayton3c7feb42010-11-19 01:05:25 +00001961 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001962
1963 oss.flush();
1964
Greg Claytonb5037af2010-11-15 01:47:11 +00001965 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001966 }
1967
1968 return true;
1969}
1970
1971void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001972IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001973{
1974}
1975
1976PassManagerType
1977IRForTarget::getPotentialPassManagerType() const
1978{
1979 return PMT_ModulePassManager;
1980}