blob: fceb67ff6ed6c62179d4e3c0f7383383d547837f [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();
274 clang::Type *pointer_type = pointer_qual_type.getTypePtr();
275 clang::PointerType *pointer_pointertype = dyn_cast<clang::PointerType>(pointer_type);
276
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);
1255
1256 if (const_expr && const_expr->getOpcode() == Instruction::BitCast)
1257 {
1258 fun = dyn_cast<Function>(const_expr->getOperand(0));
1259
1260 if (!fun)
Sean Callanan97c924e2011-01-27 01:07:04 +00001261 {
1262 if (m_error_stream)
1263 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is a cast of something not a function\n");
1264
Sean Callanan48443652010-12-02 19:47:57 +00001265 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001266 }
Sean Callanan65af7342010-09-08 20:04:08 +00001267 }
Sean Callananc4217a62010-12-06 23:53:20 +00001268 else if (const_expr && const_expr->getOpcode() == Instruction::IntToPtr)
1269 {
1270 return true; // already resolved
1271 }
Sean Callanan65af7342010-09-08 20:04:08 +00001272 else
1273 {
Sean Callanan97c924e2011-01-27 01:07:04 +00001274 if (m_error_stream)
1275 m_error_stream->Printf("Internal error [IRForTarget]: Called entity is not a function\n");
1276
Sean Callanan48443652010-12-02 19:47:57 +00001277 return false;
Sean Callanan65af7342010-09-08 20:04:08 +00001278 }
1279 }
Sean Callananba992c52010-07-27 02:07:53 +00001280
Greg Clayton8de27c72010-10-15 22:48:33 +00001281 lldb_private::ConstString str;
Sean Callananc04743d2010-09-28 21:13:03 +00001282
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001283 if (fun->isIntrinsic())
Sean Callananc04743d2010-09-28 21:13:03 +00001284 {
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001285 Intrinsic::ID intrinsic_id = (Intrinsic::ID)fun->getIntrinsicID();
Sean Callananc04743d2010-09-28 21:13:03 +00001286
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001287 switch (intrinsic_id)
1288 {
1289 default:
1290 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001291 log->Printf("Unresolved intrinsic \"%s\"", Intrinsic::getName(intrinsic_id).c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001292
1293 if (m_error_stream)
1294 m_error_stream->Printf("Internal error [IRForTarget]: Call to unhandled compiler intrinsic '%s'\n", Intrinsic::getName(intrinsic_id).c_str());
1295
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001296 return false;
1297 case Intrinsic::memcpy:
Greg Clayton8de27c72010-10-15 22:48:33 +00001298 {
1299 static lldb_private::ConstString g_memcpy_str ("memcpy");
1300 str = g_memcpy_str;
1301 }
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001302 break;
1303 }
Sean Callananc04743d2010-09-28 21:13:03 +00001304
Greg Clayton8de27c72010-10-15 22:48:33 +00001305 if (log && str)
Greg Claytonb5037af2010-11-15 01:47:11 +00001306 log->Printf("Resolved intrinsic name \"%s\"", str.GetCString());
Sean Callanan3cb1fd82010-09-28 23:55:00 +00001307 }
1308 else
1309 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001310 str.SetCStringWithLength (fun->getName().data(), fun->getName().size());
Sean Callananc04743d2010-09-28 21:13:03 +00001311 }
1312
Greg Clayton8de27c72010-10-15 22:48:33 +00001313 clang::NamedDecl *fun_decl = DeclForGlobalValue (llvm_module, fun);
Greg Claytonb5037af2010-11-15 01:47:11 +00001314 lldb::addr_t fun_addr = LLDB_INVALID_ADDRESS;
Sean Callananf5857a02010-07-31 01:32:05 +00001315 Value **fun_value_ptr = NULL;
Sean Callananba992c52010-07-27 02:07:53 +00001316
Sean Callananf5857a02010-07-31 01:32:05 +00001317 if (fun_decl)
Sean Callananba992c52010-07-27 02:07:53 +00001318 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001319 if (!m_decl_map->GetFunctionInfo (fun_decl, fun_value_ptr, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001320 {
Sean Callanan92aa6662010-09-07 21:49:41 +00001321 fun_value_ptr = NULL;
1322
Greg Clayton8de27c72010-10-15 22:48:33 +00001323 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callanan92aa6662010-09-07 21:49:41 +00001324 {
1325 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001326 log->Printf("Function \"%s\" had no address", str.GetCString());
Sean Callanan92aa6662010-09-07 21:49:41 +00001327
Sean Callanan97c924e2011-01-27 01:07:04 +00001328 if (m_error_stream)
1329 m_error_stream->Printf("Error [IRForTarget]: Call to a function '%s' that is not present in the target\n", str.GetCString());
1330
Sean Callanan92aa6662010-09-07 21:49:41 +00001331 return false;
1332 }
Sean Callananf5857a02010-07-31 01:32:05 +00001333 }
1334 }
1335 else
1336 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001337 if (!m_decl_map->GetFunctionAddress (str, fun_addr))
Sean Callananf5857a02010-07-31 01:32:05 +00001338 {
1339 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001340 log->Printf ("Metadataless function \"%s\" had no address", str.GetCString());
Sean Callanan97c924e2011-01-27 01:07:04 +00001341
1342 if (m_error_stream)
1343 m_error_stream->Printf("Error [IRForTarget]: Call to a symbol-only function '%s' that is not present in the target\n", str.GetCString());
1344
1345 return false;
Sean Callananf5857a02010-07-31 01:32:05 +00001346 }
Sean Callananba992c52010-07-27 02:07:53 +00001347 }
1348
1349 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001350 log->Printf("Found \"%s\" at 0x%llx", str.GetCString(), fun_addr);
Sean Callananba992c52010-07-27 02:07:53 +00001351
Sean Callananf5857a02010-07-31 01:32:05 +00001352 Value *fun_addr_ptr;
1353
1354 if (!fun_value_ptr || !*fun_value_ptr)
Sean Callanan02fbafa2010-07-27 21:39:39 +00001355 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001356 const IntegerType *intptr_ty = Type::getIntNTy(llvm_module.getContext(),
1357 (llvm_module.getPointerSize() == Module::Pointer64) ? 64 : 32);
Sean Callanan92aa6662010-09-07 21:49:41 +00001358 const FunctionType *fun_ty = fun->getFunctionType();
Sean Callanan02fbafa2010-07-27 21:39:39 +00001359 PointerType *fun_ptr_ty = PointerType::getUnqual(fun_ty);
1360 Constant *fun_addr_int = ConstantInt::get(intptr_ty, fun_addr, false);
Sean Callananf5857a02010-07-31 01:32:05 +00001361 fun_addr_ptr = ConstantExpr::getIntToPtr(fun_addr_int, fun_ptr_ty);
1362
1363 if (fun_value_ptr)
1364 *fun_value_ptr = fun_addr_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001365 }
Sean Callananf5857a02010-07-31 01:32:05 +00001366
1367 if (fun_value_ptr)
1368 fun_addr_ptr = *fun_value_ptr;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001369
Greg Clayton8de27c72010-10-15 22:48:33 +00001370 llvm_call_inst->setCalledFunction(fun_addr_ptr);
Sean Callanan02fbafa2010-07-27 21:39:39 +00001371
Greg Clayton8de27c72010-10-15 22:48:33 +00001372 ConstantArray *func_name = (ConstantArray*)ConstantArray::get(llvm_module.getContext(), str.GetCString());
Sean Callanane8a59a82010-09-13 21:34:21 +00001373
1374 Value *values[1];
1375 values[0] = func_name;
Greg Clayton8de27c72010-10-15 22:48:33 +00001376 MDNode *func_metadata = MDNode::get(llvm_module.getContext(), values, 1);
Sean Callanane8a59a82010-09-13 21:34:21 +00001377
Greg Clayton8de27c72010-10-15 22:48:33 +00001378 llvm_call_inst->setMetadata("lldb.call.realName", func_metadata);
Sean Callanane8a59a82010-09-13 21:34:21 +00001379
1380 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001381 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 +00001382
Sean Callananba992c52010-07-27 02:07:53 +00001383 return true;
1384}
1385
1386bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001387IRForTarget::ResolveCalls(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan8bce6652010-07-13 21:41:46 +00001388{
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001389 /////////////////////////////////////////////////////////////////////////
1390 // Prepare the current basic block for execution in the remote process
1391 //
1392
Sean Callanan02fbafa2010-07-27 21:39:39 +00001393 BasicBlock::iterator ii;
Sean Callanan8bce6652010-07-13 21:41:46 +00001394
Greg Clayton3c7feb42010-11-19 01:05:25 +00001395 for (ii = basic_block.begin();
1396 ii != basic_block.end();
Sean Callanan8bce6652010-07-13 21:41:46 +00001397 ++ii)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001398 {
Sean Callanan8bce6652010-07-13 21:41:46 +00001399 Instruction &inst = *ii;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001400
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001401 CallInst *call = dyn_cast<CallInst>(&inst);
Sean Callananba992c52010-07-27 02:07:53 +00001402
Sean Callanan97c924e2011-01-27 01:07:04 +00001403 // MaybeHandleCall handles error reporting; we are silent here
Greg Clayton3c7feb42010-11-19 01:05:25 +00001404 if (call && !MaybeHandleCall(llvm_module, call))
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001405 return false;
Sean Callanan48443652010-12-02 19:47:57 +00001406
Sean Callanan97c924e2011-01-27 01:07:04 +00001407 // MaybeHandleCallArguments handles error reporting; we are silent here
Sean Callanan48443652010-12-02 19:47:57 +00001408 if (call && !MaybeHandleCallArguments(llvm_module, call))
1409 return false;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001410 }
1411
1412 return true;
1413}
1414
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001415bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001416IRForTarget::ResolveExternals (Module &llvm_module, Function &llvm_function)
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001417{
Sean Callananae71e302010-11-18 22:21:58 +00001418 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1419
Greg Clayton3c7feb42010-11-19 01:05:25 +00001420 for (Module::global_iterator global = llvm_module.global_begin(), end = llvm_module.global_end();
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001421 global != end;
1422 ++global)
1423 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001424 if (log)
1425 log->Printf("Examining %s, DeclForGlobalValue returns %p",
1426 (*global).getName().str().c_str(),
1427 DeclForGlobalValue(llvm_module, global));
1428
Sean Callananc7674af2011-01-17 23:42:46 +00001429 if ((*global).getName().str().find("OBJC_IVAR") == 0)
1430 {
1431 if (!HandleSymbol(llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001432 {
1433 if (m_error_stream)
1434 m_error_stream->Printf("Error [IRForTarget]: Couldn't find Objective-C indirect ivar symbol %s\n", (*global).getName().str().c_str());
1435
Sean Callananc7674af2011-01-17 23:42:46 +00001436 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001437 }
Sean Callananc7674af2011-01-17 23:42:46 +00001438 }
1439 else if (DeclForGlobalValue(llvm_module, global))
1440 {
1441 if (!MaybeHandleVariable (llvm_module, global))
Sean Callanan97c924e2011-01-27 01:07:04 +00001442 {
1443 if (m_error_stream)
1444 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't rewrite external variable %s\n", (*global).getName().str().c_str());
1445
Sean Callananc7674af2011-01-17 23:42:46 +00001446 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001447 }
Sean Callananc7674af2011-01-17 23:42:46 +00001448 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001449 }
1450
1451 return true;
1452}
1453
Sean Callanan02fbafa2010-07-27 21:39:39 +00001454static bool isGuardVariableRef(Value *V)
Sean Callanan45839272010-07-24 01:37:44 +00001455{
Sean Callanan6ba533e2010-11-17 23:00:36 +00001456 Constant *Old;
Sean Callanan45839272010-07-24 01:37:44 +00001457
Sean Callanan6ba533e2010-11-17 23:00:36 +00001458 if (!(Old = dyn_cast<Constant>(V)))
Sean Callanan45839272010-07-24 01:37:44 +00001459 return false;
1460
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001461 ConstantExpr *CE;
1462
1463 if ((CE = dyn_cast<ConstantExpr>(V)))
1464 {
1465 if (CE->getOpcode() != Instruction::BitCast)
1466 return false;
1467
Sean Callanan6ba533e2010-11-17 23:00:36 +00001468 Old = CE->getOperand(0);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001469 }
1470
Sean Callanan6ba533e2010-11-17 23:00:36 +00001471 GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
Sean Callanan45839272010-07-24 01:37:44 +00001472
1473 if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
1474 return false;
1475
1476 return true;
1477}
1478
Greg Clayton3c7feb42010-11-19 01:05:25 +00001479static void TurnGuardLoadIntoZero(Instruction* guard_load, Module &llvm_module)
Sean Callanan45839272010-07-24 01:37:44 +00001480{
Greg Clayton3c7feb42010-11-19 01:05:25 +00001481 Constant* zero(ConstantInt::get(Type::getInt8Ty(llvm_module.getContext()), 0, true));
Sean Callanan45839272010-07-24 01:37:44 +00001482
1483 Value::use_iterator ui;
1484
1485 for (ui = guard_load->use_begin();
1486 ui != guard_load->use_end();
1487 ++ui)
Sean Callananb5b749c2010-07-27 01:17:28 +00001488 {
Greg Clayton6e713402010-07-30 20:30:44 +00001489 if (isa<Constant>(*ui))
Sean Callananb5b749c2010-07-27 01:17:28 +00001490 {
1491 // do nothing for the moment
1492 }
1493 else
1494 {
1495 ui->replaceUsesOfWith(guard_load, zero);
1496 }
1497 }
Sean Callanan45839272010-07-24 01:37:44 +00001498
1499 guard_load->eraseFromParent();
1500}
1501
1502static void ExciseGuardStore(Instruction* guard_store)
1503{
1504 guard_store->eraseFromParent();
1505}
1506
1507bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001508IRForTarget::RemoveGuards(Module &llvm_module, BasicBlock &basic_block)
Sean Callanan45839272010-07-24 01:37:44 +00001509{
1510 ///////////////////////////////////////////////////////
1511 // Eliminate any reference to guard variables found.
1512 //
1513
Sean Callanan02fbafa2010-07-27 21:39:39 +00001514 BasicBlock::iterator ii;
Sean Callanan45839272010-07-24 01:37:44 +00001515
Sean Callanan02fbafa2010-07-27 21:39:39 +00001516 typedef SmallVector <Instruction*, 2> InstrList;
Sean Callanan45839272010-07-24 01:37:44 +00001517 typedef InstrList::iterator InstrIterator;
1518
1519 InstrList guard_loads;
1520 InstrList guard_stores;
1521
Greg Clayton3c7feb42010-11-19 01:05:25 +00001522 for (ii = basic_block.begin();
1523 ii != basic_block.end();
Sean Callanan45839272010-07-24 01:37:44 +00001524 ++ii)
1525 {
1526 Instruction &inst = *ii;
1527
1528 if (LoadInst *load = dyn_cast<LoadInst>(&inst))
1529 if (isGuardVariableRef(load->getPointerOperand()))
1530 guard_loads.push_back(&inst);
1531
1532 if (StoreInst *store = dyn_cast<StoreInst>(&inst))
1533 if (isGuardVariableRef(store->getPointerOperand()))
1534 guard_stores.push_back(&inst);
1535 }
1536
1537 InstrIterator iter;
1538
1539 for (iter = guard_loads.begin();
1540 iter != guard_loads.end();
1541 ++iter)
Greg Clayton3c7feb42010-11-19 01:05:25 +00001542 TurnGuardLoadIntoZero(*iter, llvm_module);
Sean Callanan45839272010-07-24 01:37:44 +00001543
1544 for (iter = guard_stores.begin();
1545 iter != guard_stores.end();
1546 ++iter)
1547 ExciseGuardStore(*iter);
1548
1549 return true;
1550}
1551
Sean Callanan97c924e2011-01-27 01:07:04 +00001552// This function does not report errors; its callers are responsible.
Sean Callanan6ba533e2010-11-17 23:00:36 +00001553bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001554IRForTarget::UnfoldConstant(Constant *old_constant, Value *new_constant, Instruction *first_entry_inst)
Sean Callananbafd6852010-07-14 23:40:29 +00001555{
Greg Claytone005f2c2010-11-06 01:53:30 +00001556 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananbafd6852010-07-14 23:40:29 +00001557
1558 Value::use_iterator ui;
1559
Sean Callanana48fe162010-08-11 03:57:18 +00001560 SmallVector<User*, 16> users;
1561
1562 // We do this because the use list might change, invalidating our iterator.
1563 // Much better to keep a work list ourselves.
Greg Clayton3c7feb42010-11-19 01:05:25 +00001564 for (ui = old_constant->use_begin();
1565 ui != old_constant->use_end();
Sean Callananbafd6852010-07-14 23:40:29 +00001566 ++ui)
Sean Callanana48fe162010-08-11 03:57:18 +00001567 users.push_back(*ui);
Sean Callananbafd6852010-07-14 23:40:29 +00001568
Sean Callanana48fe162010-08-11 03:57:18 +00001569 for (int i = 0;
1570 i < users.size();
1571 ++i)
1572 {
1573 User *user = users[i];
1574
Sean Callananbafd6852010-07-14 23:40:29 +00001575 if (Constant *constant = dyn_cast<Constant>(user))
1576 {
1577 // synthesize a new non-constant equivalent of the constant
1578
1579 if (ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
1580 {
1581 switch (constant_expr->getOpcode())
1582 {
1583 default:
1584 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001585 log->Printf("Unhandled constant expression type: \"%s\"", PrintValue(constant_expr).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001586 return false;
1587 case Instruction::BitCast:
1588 {
1589 // UnaryExpr
1590 // OperandList[0] is value
1591
1592 Value *s = constant_expr->getOperand(0);
1593
Greg Clayton3c7feb42010-11-19 01:05:25 +00001594 if (s == old_constant)
1595 s = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001596
Greg Clayton3c7feb42010-11-19 01:05:25 +00001597 BitCastInst *bit_cast(new BitCastInst(s, old_constant->getType(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001598
Greg Clayton3c7feb42010-11-19 01:05:25 +00001599 UnfoldConstant(constant_expr, bit_cast, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001600 }
1601 break;
1602 case Instruction::GetElementPtr:
1603 {
1604 // GetElementPtrConstantExpr
1605 // OperandList[0] is base
1606 // OperandList[1]... are indices
1607
1608 Value *ptr = constant_expr->getOperand(0);
1609
Greg Clayton3c7feb42010-11-19 01:05:25 +00001610 if (ptr == old_constant)
1611 ptr = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001612
1613 SmallVector<Value*, 16> indices;
1614
1615 unsigned operand_index;
1616 unsigned num_operands = constant_expr->getNumOperands();
1617
1618 for (operand_index = 1;
1619 operand_index < num_operands;
1620 ++operand_index)
1621 {
1622 Value *operand = constant_expr->getOperand(operand_index);
1623
Greg Clayton3c7feb42010-11-19 01:05:25 +00001624 if (operand == old_constant)
1625 operand = new_constant;
Sean Callananbafd6852010-07-14 23:40:29 +00001626
1627 indices.push_back(operand);
1628 }
1629
Greg Clayton3c7feb42010-11-19 01:05:25 +00001630 GetElementPtrInst *get_element_ptr(GetElementPtrInst::Create(ptr, indices.begin(), indices.end(), "", first_entry_inst));
Sean Callananbafd6852010-07-14 23:40:29 +00001631
Greg Clayton3c7feb42010-11-19 01:05:25 +00001632 UnfoldConstant(constant_expr, get_element_ptr, first_entry_inst);
Sean Callananbafd6852010-07-14 23:40:29 +00001633 }
1634 break;
1635 }
1636 }
1637 else
1638 {
1639 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001640 log->Printf("Unhandled constant type: \"%s\"", PrintValue(constant).c_str());
Sean Callananbafd6852010-07-14 23:40:29 +00001641 return false;
1642 }
1643 }
1644 else
1645 {
1646 // simple fall-through case for non-constants
Greg Clayton3c7feb42010-11-19 01:05:25 +00001647 user->replaceUsesOfWith(old_constant, new_constant);
Sean Callananbafd6852010-07-14 23:40:29 +00001648 }
1649 }
1650
1651 return true;
1652}
1653
Sean Callanan8bce6652010-07-13 21:41:46 +00001654bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001655IRForTarget::ReplaceVariables (Module &llvm_module, Function &llvm_function)
Sean Callanan8bce6652010-07-13 21:41:46 +00001656{
Sean Callanane8a59a82010-09-13 21:34:21 +00001657 if (!m_resolve_vars)
1658 return true;
1659
Greg Claytone005f2c2010-11-06 01:53:30 +00001660 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8bce6652010-07-13 21:41:46 +00001661
1662 m_decl_map->DoStructLayout();
1663
1664 if (log)
1665 log->Printf("Element arrangement:");
1666
1667 uint32_t num_elements;
1668 uint32_t element_index;
1669
1670 size_t size;
1671 off_t alignment;
1672
1673 if (!m_decl_map->GetStructInfo (num_elements, size, alignment))
1674 return false;
1675
Greg Clayton3c7feb42010-11-19 01:05:25 +00001676 Function::arg_iterator iter(llvm_function.getArgumentList().begin());
Sean Callanan8bce6652010-07-13 21:41:46 +00001677
Greg Clayton3c7feb42010-11-19 01:05:25 +00001678 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001679 {
1680 if (m_error_stream)
1681 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes no arguments (should take at least a struct pointer)");
1682
Sean Callanan8bce6652010-07-13 21:41:46 +00001683 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001684 }
1685
Sean Callanan02fbafa2010-07-27 21:39:39 +00001686 Argument *argument = iter;
Sean Callanan8bce6652010-07-13 21:41:46 +00001687
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001688 if (argument->getName().equals("this"))
1689 {
1690 ++iter;
1691
Greg Clayton3c7feb42010-11-19 01:05:25 +00001692 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001693 {
1694 if (m_error_stream)
1695 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'this' argument (should take a struct pointer too)");
1696
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001697 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001698 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001699
1700 argument = iter;
1701 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001702 else if (argument->getName().equals("self"))
1703 {
1704 ++iter;
1705
1706 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001707 {
1708 if (m_error_stream)
1709 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' argument (should take '_cmd' and a struct pointer too)");
1710
Sean Callanan3aa7da52010-12-13 22:46:15 +00001711 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001712 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001713
1714 if (!iter->getName().equals("_cmd"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001715 {
1716 if (m_error_stream)
1717 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes '%s' after 'self' argument (should take '_cmd')", iter->getName().str().c_str());
1718
Sean Callanan3aa7da52010-12-13 22:46:15 +00001719 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001720 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001721
1722 ++iter;
1723
1724 if (iter == llvm_function.getArgumentList().end())
Sean Callanan97c924e2011-01-27 01:07:04 +00001725 {
1726 if (m_error_stream)
1727 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes only 'self' and '_cmd' arguments (should take a struct pointer too)");
1728
Sean Callanan3aa7da52010-12-13 22:46:15 +00001729 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001730 }
Sean Callanan3aa7da52010-12-13 22:46:15 +00001731
1732 argument = iter;
1733 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001734
Greg Clayton8de27c72010-10-15 22:48:33 +00001735 if (!argument->getName().equals("$__lldb_arg"))
Sean Callanan97c924e2011-01-27 01:07:04 +00001736 {
1737 if (m_error_stream)
1738 m_error_stream->Printf("Internal error [IRForTarget]: Wrapper takes an argument named '%s' instead of the struct pointer", argument->getName().str().c_str());
1739
Sean Callanan8bce6652010-07-13 21:41:46 +00001740 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001741 }
1742
Sean Callanan8bce6652010-07-13 21:41:46 +00001743 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001744 log->Printf("Arg: \"%s\"", PrintValue(argument).c_str());
Sean Callanan8bce6652010-07-13 21:41:46 +00001745
Greg Clayton3c7feb42010-11-19 01:05:25 +00001746 BasicBlock &entry_block(llvm_function.getEntryBlock());
Sean Callanan6ba533e2010-11-17 23:00:36 +00001747 Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg());
Sean Callanan8bce6652010-07-13 21:41:46 +00001748
Sean Callanan6ba533e2010-11-17 23:00:36 +00001749 if (!FirstEntryInstruction)
Sean Callanan97c924e2011-01-27 01:07:04 +00001750 {
1751 if (m_error_stream)
1752 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't find the first instruction in the wrapper for use in rewriting");
1753
Sean Callanan8bce6652010-07-13 21:41:46 +00001754 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001755 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001756
Greg Clayton3c7feb42010-11-19 01:05:25 +00001757 LLVMContext &context(llvm_module.getContext());
Sean Callanan8bce6652010-07-13 21:41:46 +00001758 const IntegerType *offset_type(Type::getInt32Ty(context));
1759
1760 if (!offset_type)
Sean Callanan97c924e2011-01-27 01:07:04 +00001761 {
1762 if (m_error_stream)
1763 m_error_stream->Printf("Internal error [IRForTarget]: Couldn't produce an offset type");
1764
Sean Callanan8bce6652010-07-13 21:41:46 +00001765 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001766 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001767
1768 for (element_index = 0; element_index < num_elements; ++element_index)
1769 {
1770 const clang::NamedDecl *decl;
Sean Callanan02fbafa2010-07-27 21:39:39 +00001771 Value *value;
Sean Callanan8bce6652010-07-13 21:41:46 +00001772 off_t offset;
Greg Clayton8de27c72010-10-15 22:48:33 +00001773 lldb_private::ConstString name;
Sean Callanan8bce6652010-07-13 21:41:46 +00001774
Sean Callanan45690fe2010-08-30 22:17:16 +00001775 if (!m_decl_map->GetStructElement (decl, value, offset, name, element_index))
Sean Callanan97c924e2011-01-27 01:07:04 +00001776 {
1777 if (m_error_stream)
1778 m_error_stream->Printf("Internal error [IRForTarget]: Structure information is incomplete");
1779
Sean Callanan8bce6652010-07-13 21:41:46 +00001780 return false;
Sean Callanan97c924e2011-01-27 01:07:04 +00001781 }
1782
Sean Callanan8bce6652010-07-13 21:41:46 +00001783 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001784 log->Printf(" \"%s\" [\"%s\"] (\"%s\") placed at %d",
Sean Callanan82b74c82010-08-12 01:56:52 +00001785 value->getName().str().c_str(),
Greg Clayton8de27c72010-10-15 22:48:33 +00001786 name.GetCString(),
Sean Callanan8bce6652010-07-13 21:41:46 +00001787 PrintValue(value, true).c_str(),
1788 offset);
1789
1790 ConstantInt *offset_int(ConstantInt::getSigned(offset_type, offset));
Sean Callanan6ba533e2010-11-17 23:00:36 +00001791 GetElementPtrInst *get_element_ptr = GetElementPtrInst::Create(argument, offset_int, "", FirstEntryInstruction);
Sean Callanan6a925532011-01-13 08:53:35 +00001792
1793 Value *replacement;
Sean Callanan8bce6652010-07-13 21:41:46 +00001794
Sean Callanan6a925532011-01-13 08:53:35 +00001795 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult, in cases where the result
1796 // variable is an rvalue, we have to synthesize a dereference of the appropriate structure
1797 // entry in order to produce the static variable that the AST thinks it is accessing.
1798 if (name == m_result_name && !m_result_is_pointer)
1799 {
1800 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType()->getPointerTo(), "", FirstEntryInstruction);
1801
1802 LoadInst *load = new LoadInst(bit_cast, "", FirstEntryInstruction);
1803
1804 replacement = load;
1805 }
Sean Callananbafd6852010-07-14 23:40:29 +00001806 else
Sean Callanan6a925532011-01-13 08:53:35 +00001807 {
1808 BitCastInst *bit_cast = new BitCastInst(get_element_ptr, value->getType(), "", FirstEntryInstruction);
1809
1810 replacement = bit_cast;
1811 }
1812
1813 if (Constant *constant = dyn_cast<Constant>(value))
1814 UnfoldConstant(constant, replacement, FirstEntryInstruction);
1815 else
1816 value->replaceAllUsesWith(replacement);
Sean Callananb51ee982010-11-02 23:51:17 +00001817
1818 if (GlobalVariable *var = dyn_cast<GlobalVariable>(value))
1819 var->eraseFromParent();
Sean Callanan8bce6652010-07-13 21:41:46 +00001820 }
1821
1822 if (log)
1823 log->Printf("Total structure [align %d, size %d]", alignment, size);
1824
1825 return true;
1826}
1827
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001828bool
Greg Clayton3c7feb42010-11-19 01:05:25 +00001829IRForTarget::runOnModule (Module &llvm_module)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001830{
Greg Claytone005f2c2010-11-06 01:53:30 +00001831 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001832
Greg Clayton3c7feb42010-11-19 01:05:25 +00001833 Function* function = llvm_module.getFunction(StringRef(m_func_name.c_str()));
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001834
1835 if (!function)
1836 {
1837 if (log)
Greg Claytonb5037af2010-11-15 01:47:11 +00001838 log->Printf("Couldn't find \"%s()\" in the module", m_func_name.c_str());
Sean Callanan97c924e2011-01-27 01:07:04 +00001839
1840 if (m_error_stream)
1841 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 +00001842
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001843 return false;
1844 }
1845
Sean Callanan02fbafa2010-07-27 21:39:39 +00001846 Function::iterator bbi;
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001847
Sean Callanan05a5a1b2010-12-16 03:17:46 +00001848 m_has_side_effects = HasSideEffects(llvm_module, *function);
1849
Sean Callanan82b74c82010-08-12 01:56:52 +00001850 ////////////////////////////////////////////////////////////
Greg Clayton8de27c72010-10-15 22:48:33 +00001851 // Replace $__lldb_expr_result with a persistent variable
Sean Callanan82b74c82010-08-12 01:56:52 +00001852 //
1853
Greg Clayton3c7feb42010-11-19 01:05:25 +00001854 if (!CreateResultVariable(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001855 {
1856 if (log)
1857 log->Printf("CreateResultVariable() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001858
1859 // CreateResultVariable() reports its own errors, so we don't do so here
1860
Sean Callanan82b74c82010-08-12 01:56:52 +00001861 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001862 }
Sean Callanan82b74c82010-08-12 01:56:52 +00001863
Sean Callanan6ba533e2010-11-17 23:00:36 +00001864 ///////////////////////////////////////////////////////////////////////////////
1865 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1866 //
Sean Callanan6ba533e2010-11-17 23:00:36 +00001867
Greg Clayton3c7feb42010-11-19 01:05:25 +00001868 if (!RewriteObjCConstStrings(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001869 {
1870 if (log)
1871 log->Printf("RewriteObjCConstStrings() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001872
1873 // RewriteObjCConstStrings() reports its own errors, so we don't do so here
1874
Sean Callanan6ba533e2010-11-17 23:00:36 +00001875 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001876 }
Sean Callanan6ba533e2010-11-17 23:00:36 +00001877
Sean Callananf5857a02010-07-31 01:32:05 +00001878 //////////////////////////////////
1879 // Run basic-block level passes
1880 //
1881
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001882 for (bbi = function->begin();
1883 bbi != function->end();
1884 ++bbi)
1885 {
Greg Clayton3c7feb42010-11-19 01:05:25 +00001886 if (!RemoveGuards(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001887 {
1888 if (log)
1889 log->Printf("RemoveGuards() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001890
1891 // RemoveGuards() reports its own errors, so we don't do so here
1892
Sean Callanan8c127202010-08-23 23:09:38 +00001893 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001894 }
Sean Callanan8c127202010-08-23 23:09:38 +00001895
Greg Clayton3c7feb42010-11-19 01:05:25 +00001896 if (!RewritePersistentAllocs(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001897 {
1898 if (log)
1899 log->Printf("RewritePersistentAllocs() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001900
1901 // RewritePersistentAllocs() reports its own errors, so we don't do so here
1902
Sean Callananf5857a02010-07-31 01:32:05 +00001903 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001904 }
Sean Callananf5857a02010-07-31 01:32:05 +00001905
Greg Clayton3c7feb42010-11-19 01:05:25 +00001906 if (!RewriteObjCSelectors(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001907 {
1908 if (log)
1909 log->Printf("RewriteObjCSelectors() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001910
1911 // RewriteObjCSelectors() reports its own errors, so we don't do so here
1912
Sean Callanana48fe162010-08-11 03:57:18 +00001913 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001914 }
Sean Callanana48fe162010-08-11 03:57:18 +00001915
Greg Clayton3c7feb42010-11-19 01:05:25 +00001916 if (!ResolveCalls(llvm_module, *bbi))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001917 {
1918 if (log)
1919 log->Printf("ResolveCalls() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001920
1921 // ResolveCalls() reports its own errors, so we don't do so here
1922
Sean Callanan8bce6652010-07-13 21:41:46 +00001923 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001924 }
Sean Callanan8bce6652010-07-13 21:41:46 +00001925 }
1926
Sean Callanan771131d2010-09-30 21:18:25 +00001927 ///////////////////////////////
1928 // Run function-level passes
1929 //
1930
Greg Clayton3c7feb42010-11-19 01:05:25 +00001931 if (!ResolveExternals(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001932 {
1933 if (log)
1934 log->Printf("ResolveExternals() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001935
1936 // ResolveExternals() reports its own errors, so we don't do so here
1937
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001938 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001939 }
Sean Callanan1d1b39c2010-11-08 00:31:32 +00001940
Greg Clayton3c7feb42010-11-19 01:05:25 +00001941 if (!ReplaceVariables(llvm_module, *function))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001942 {
1943 if (log)
1944 log->Printf("ReplaceVariables() failed");
Sean Callanan97c924e2011-01-27 01:07:04 +00001945
1946 // ReplaceVariables() reports its own errors, so we don't do so here
1947
Sean Callanan771131d2010-09-30 21:18:25 +00001948 return false;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001949 }
Sean Callanan771131d2010-09-30 21:18:25 +00001950
Sean Callanan8bce6652010-07-13 21:41:46 +00001951 if (log)
1952 {
Sean Callanan321fe9e2010-07-28 01:00:59 +00001953 std::string s;
1954 raw_string_ostream oss(s);
Sean Callanan8bce6652010-07-13 21:41:46 +00001955
Greg Clayton3c7feb42010-11-19 01:05:25 +00001956 llvm_module.print(oss, NULL);
Sean Callanan321fe9e2010-07-28 01:00:59 +00001957
1958 oss.flush();
1959
Greg Claytonb5037af2010-11-15 01:47:11 +00001960 log->Printf("Module after preparing for execution: \n\"%s\"", s.c_str());
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001961 }
1962
1963 return true;
1964}
1965
1966void
Greg Clayton3c7feb42010-11-19 01:05:25 +00001967IRForTarget::assignPassManager (PMStack &pass_mgr_stack, PassManagerType pass_mgr_type)
Sean Callanan5cf4a1c2010-07-03 01:35:46 +00001968{
1969}
1970
1971PassManagerType
1972IRForTarget::getPotentialPassManagerType() const
1973{
1974 return PMT_ModulePassManager;
1975}