1 //===-- IRForTarget.cpp ---------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "IRForTarget.h"
11 #include "ClangExpressionDeclMap.h"
12 #include "ClangUtil.h"
14 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
15 #include "llvm/IR/Constants.h"
16 #include "llvm/IR/DataLayout.h"
17 #include "llvm/IR/Operator.h"
18 #include "llvm/IR/InstrTypes.h"
19 #include "llvm/IR/Instructions.h"
20 #include "llvm/IR/Intrinsics.h"
21 #include "llvm/IR/LegacyPassManager.h"
22 #include "llvm/IR/Metadata.h"
23 #include "llvm/IR/Module.h"
24 #include "llvm/IR/ValueSymbolTable.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include "llvm/Transforms/IPO.h"
28 #include "clang/AST/ASTContext.h"
30 #include "lldb/Core/dwarf.h"
31 #include "lldb/Expression/IRExecutionUnit.h"
32 #include "lldb/Expression/IRInterpreter.h"
33 #include "lldb/Symbol/CompilerType.h"
34 #include "lldb/Utility/ConstString.h"
35 #include "lldb/Utility/DataBufferHeap.h"
36 #include "lldb/Utility/Endian.h"
37 #include "lldb/Utility/LLDBLog.h"
38 #include "lldb/Utility/Log.h"
39 #include "lldb/Utility/Scalar.h"
40 #include "lldb/Utility/StreamString.h"
46 using lldb_private::LLDBLog
;
48 typedef SmallVector
<Instruction
*, 2> InstrList
;
50 IRForTarget::FunctionValueCache::FunctionValueCache(Maker
const &maker
)
51 : m_maker(maker
), m_values() {}
53 IRForTarget::FunctionValueCache::~FunctionValueCache() = default;
56 IRForTarget::FunctionValueCache::GetValue(llvm::Function
*function
) {
57 if (!m_values
.count(function
)) {
58 llvm::Value
*ret
= m_maker(function
);
59 m_values
[function
] = ret
;
62 return m_values
[function
];
65 static llvm::Value
*FindEntryInstruction(llvm::Function
*function
) {
66 if (function
->empty())
69 return function
->getEntryBlock().getFirstNonPHIOrDbg();
72 IRForTarget::IRForTarget(lldb_private::ClangExpressionDeclMap
*decl_map
,
74 lldb_private::IRExecutionUnit
&execution_unit
,
75 lldb_private::Stream
&error_stream
,
76 const char *func_name
)
77 : m_resolve_vars(resolve_vars
), m_func_name(func_name
),
78 m_decl_map(decl_map
), m_error_stream(error_stream
),
79 m_execution_unit(execution_unit
),
80 m_entry_instruction_finder(FindEntryInstruction
) {}
82 /* Handy utility functions used at several places in the code */
84 static std::string
PrintValue(const Value
*value
, bool truncate
= false) {
87 raw_string_ostream
rso(s
);
90 s
.resize(s
.length() - 1);
95 static std::string
PrintType(const llvm::Type
*type
, bool truncate
= false) {
97 raw_string_ostream
rso(s
);
100 s
.resize(s
.length() - 1);
104 bool IRForTarget::FixFunctionLinkage(llvm::Function
&llvm_function
) {
105 llvm_function
.setLinkage(GlobalValue::ExternalLinkage
);
110 clang::NamedDecl
*IRForTarget::DeclForGlobal(const GlobalValue
*global_val
,
112 NamedMDNode
*named_metadata
=
113 module
->getNamedMetadata("clang.global.decl.ptrs");
118 unsigned num_nodes
= named_metadata
->getNumOperands();
121 for (node_index
= 0; node_index
< num_nodes
; ++node_index
) {
122 llvm::MDNode
*metadata_node
=
123 dyn_cast
<llvm::MDNode
>(named_metadata
->getOperand(node_index
));
127 if (metadata_node
->getNumOperands() != 2)
130 if (mdconst::dyn_extract_or_null
<GlobalValue
>(
131 metadata_node
->getOperand(0)) != global_val
)
134 ConstantInt
*constant_int
=
135 mdconst::dyn_extract
<ConstantInt
>(metadata_node
->getOperand(1));
140 uintptr_t ptr
= constant_int
->getZExtValue();
142 return reinterpret_cast<clang::NamedDecl
*>(ptr
);
148 clang::NamedDecl
*IRForTarget::DeclForGlobal(GlobalValue
*global_val
) {
149 return DeclForGlobal(global_val
, m_module
);
152 /// Returns true iff the mangled symbol is for a static guard variable.
153 static bool isGuardVariableSymbol(llvm::StringRef mangled_symbol
,
154 bool check_ms_abi
= true) {
156 mangled_symbol
.starts_with("_ZGV"); // Itanium ABI guard variable
158 result
|= mangled_symbol
.ends_with("@4IA"); // Microsoft ABI
162 bool IRForTarget::CreateResultVariable(llvm::Function
&llvm_function
) {
163 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
168 // Find the result variable. If it doesn't exist, we can give up right here.
170 ValueSymbolTable
&value_symbol_table
= m_module
->getValueSymbolTable();
172 llvm::StringRef result_name
;
173 bool found_result
= false;
175 for (StringMapEntry
<llvm::Value
*> &value_symbol
: value_symbol_table
) {
176 result_name
= value_symbol
.first();
178 // Check if this is a guard variable. It seems this causes some hiccups
179 // on Windows, so let's only check for Itanium guard variables.
180 bool is_guard_var
= isGuardVariableSymbol(result_name
, /*MS ABI*/ false);
182 if (result_name
.contains("$__lldb_expr_result_ptr") && !is_guard_var
) {
184 m_result_is_pointer
= true;
188 if (result_name
.contains("$__lldb_expr_result") && !is_guard_var
) {
190 m_result_is_pointer
= false;
196 LLDB_LOG(log
, "Couldn't find result variable");
201 LLDB_LOG(log
, "Result name: \"{0}\"", result_name
);
203 Value
*result_value
= m_module
->getNamedValue(result_name
);
206 LLDB_LOG(log
, "Result variable had no data");
208 m_error_stream
.Format("Internal error [IRForTarget]: Result variable's "
209 "name ({0}) exists, but not its definition\n",
215 LLDB_LOG(log
, "Found result in the IR: \"{0}\"",
216 PrintValue(result_value
, false));
218 GlobalVariable
*result_global
= dyn_cast
<GlobalVariable
>(result_value
);
220 if (!result_global
) {
221 LLDB_LOG(log
, "Result variable isn't a GlobalVariable");
223 m_error_stream
.Format("Internal error [IRForTarget]: Result variable ({0}) "
224 "is defined, but is not a global variable\n",
230 clang::NamedDecl
*result_decl
= DeclForGlobal(result_global
);
232 LLDB_LOG(log
, "Result variable doesn't have a corresponding Decl");
234 m_error_stream
.Format("Internal error [IRForTarget]: Result variable ({0}) "
235 "does not have a corresponding Clang entity\n",
242 std::string decl_desc_str
;
243 raw_string_ostream
decl_desc_stream(decl_desc_str
);
244 result_decl
->print(decl_desc_stream
);
246 LLDB_LOG(log
, "Found result decl: \"{0}\"", decl_desc_str
);
249 clang::VarDecl
*result_var
= dyn_cast
<clang::VarDecl
>(result_decl
);
251 LLDB_LOG(log
, "Result variable Decl isn't a VarDecl");
253 m_error_stream
.Format("Internal error [IRForTarget]: Result variable "
254 "({0})'s corresponding Clang entity isn't a "
261 // Get the next available result name from m_decl_map and create the
262 // persistent variable for it
264 // If the result is an Lvalue, it is emitted as a pointer; see
265 // ASTResultSynthesizer::SynthesizeBodyResult.
266 if (m_result_is_pointer
) {
267 clang::QualType pointer_qual_type
= result_var
->getType();
268 const clang::Type
*pointer_type
= pointer_qual_type
.getTypePtr();
270 const clang::PointerType
*pointer_pointertype
=
271 pointer_type
->getAs
<clang::PointerType
>();
272 const clang::ObjCObjectPointerType
*pointer_objcobjpointertype
=
273 pointer_type
->getAs
<clang::ObjCObjectPointerType
>();
275 if (pointer_pointertype
) {
276 clang::QualType element_qual_type
= pointer_pointertype
->getPointeeType();
278 m_result_type
= lldb_private::TypeFromParser(
279 m_decl_map
->GetTypeSystem()->GetType(element_qual_type
));
280 } else if (pointer_objcobjpointertype
) {
281 clang::QualType element_qual_type
=
282 clang::QualType(pointer_objcobjpointertype
->getObjectType(), 0);
284 m_result_type
= lldb_private::TypeFromParser(
285 m_decl_map
->GetTypeSystem()->GetType(element_qual_type
));
287 LLDB_LOG(log
, "Expected result to have pointer type, but it did not");
289 m_error_stream
.Format("Internal error [IRForTarget]: Lvalue result ({0}) "
290 "is not a pointer variable\n",
296 m_result_type
= lldb_private::TypeFromParser(
297 m_decl_map
->GetTypeSystem()->GetType(result_var
->getType()));
300 lldb::TargetSP
target_sp(m_execution_unit
.GetTarget());
301 std::optional
<uint64_t> bit_size
= m_result_type
.GetBitSize(target_sp
.get());
303 lldb_private::StreamString type_desc_stream
;
304 m_result_type
.DumpTypeDescription(&type_desc_stream
);
306 LLDB_LOG(log
, "Result type has unknown size");
308 m_error_stream
.Printf("Error [IRForTarget]: Size of result type '%s' "
309 "couldn't be determined\n",
310 type_desc_stream
.GetData());
315 lldb_private::StreamString type_desc_stream
;
316 m_result_type
.DumpTypeDescription(&type_desc_stream
);
318 LLDB_LOG(log
, "Result decl type: \"{0}\"", type_desc_stream
.GetData());
321 m_result_name
= lldb_private::ConstString("$RESULT_NAME");
323 LLDB_LOG(log
, "Creating a new result global: \"{0}\" with size {1}",
325 m_result_type
.GetByteSize(target_sp
.get()).value_or(0));
327 // Construct a new result global and set up its metadata
329 GlobalVariable
*new_result_global
= new GlobalVariable(
330 (*m_module
), result_global
->getValueType(), false, /* not constant */
331 GlobalValue::ExternalLinkage
, nullptr, /* no initializer */
332 m_result_name
.GetCString());
334 // It's too late in compilation to create a new VarDecl for this, but we
335 // don't need to. We point the metadata at the old VarDecl. This creates an
336 // odd anomaly: a variable with a Value whose name is something like $0 and a
337 // Decl whose name is $__lldb_expr_result. This condition is handled in
338 // ClangExpressionDeclMap::DoMaterialize, and the name of the variable is
341 ConstantInt
*new_constant_int
=
342 ConstantInt::get(llvm::Type::getInt64Ty(m_module
->getContext()),
343 reinterpret_cast<uintptr_t>(result_decl
), false);
345 llvm::Metadata
*values
[2];
346 values
[0] = ConstantAsMetadata::get(new_result_global
);
347 values
[1] = ConstantAsMetadata::get(new_constant_int
);
349 ArrayRef
<Metadata
*> value_ref(values
, 2);
351 MDNode
*persistent_global_md
= MDNode::get(m_module
->getContext(), value_ref
);
352 NamedMDNode
*named_metadata
=
353 m_module
->getNamedMetadata("clang.global.decl.ptrs");
354 named_metadata
->addOperand(persistent_global_md
);
356 LLDB_LOG(log
, "Replacing \"{0}\" with \"{1}\"", PrintValue(result_global
),
357 PrintValue(new_result_global
));
359 if (result_global
->use_empty()) {
360 // We need to synthesize a store for this variable, because otherwise
361 // there's nothing to put into its equivalent persistent variable.
363 BasicBlock
&entry_block(llvm_function
.getEntryBlock());
364 Instruction
*first_entry_instruction(entry_block
.getFirstNonPHIOrDbg());
366 if (!first_entry_instruction
)
369 if (!result_global
->hasInitializer()) {
370 LLDB_LOG(log
, "Couldn't find initializer for unused variable");
372 m_error_stream
.Format("Internal error [IRForTarget]: Result variable "
373 "({0}) has no writes and no initializer\n",
379 Constant
*initializer
= result_global
->getInitializer();
381 StoreInst
*synthesized_store
= new StoreInst(
382 initializer
, new_result_global
, first_entry_instruction
->getIterator());
384 LLDB_LOG(log
, "Synthesized result store \"{0}\"\n",
385 PrintValue(synthesized_store
));
387 result_global
->replaceAllUsesWith(new_result_global
);
390 if (!m_decl_map
->AddPersistentVariable(
391 result_decl
, m_result_name
, m_result_type
, true, m_result_is_pointer
))
394 result_global
->eraseFromParent();
399 bool IRForTarget::RewriteObjCConstString(llvm::GlobalVariable
*ns_str
,
400 llvm::GlobalVariable
*cstr
) {
401 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
403 Type
*ns_str_ty
= ns_str
->getType();
405 Type
*i8_ptr_ty
= PointerType::getUnqual(m_module
->getContext());
406 Type
*i32_ty
= Type::getInt32Ty(m_module
->getContext());
407 Type
*i8_ty
= Type::getInt8Ty(m_module
->getContext());
409 if (!m_CFStringCreateWithBytes
) {
410 lldb::addr_t CFStringCreateWithBytes_addr
;
412 static lldb_private::ConstString
g_CFStringCreateWithBytes_str(
413 "CFStringCreateWithBytes");
415 bool missing_weak
= false;
416 CFStringCreateWithBytes_addr
= m_execution_unit
.FindSymbol(
417 g_CFStringCreateWithBytes_str
, missing_weak
);
418 if (CFStringCreateWithBytes_addr
== LLDB_INVALID_ADDRESS
|| missing_weak
) {
419 LLDB_LOG(log
, "Couldn't find CFStringCreateWithBytes in the target");
421 m_error_stream
.Printf("Error [IRForTarget]: Rewriting an Objective-C "
422 "constant string requires "
423 "CFStringCreateWithBytes\n");
428 LLDB_LOG(log
, "Found CFStringCreateWithBytes at {0}",
429 CFStringCreateWithBytes_addr
);
431 // Build the function type:
433 // CFStringRef CFStringCreateWithBytes (
434 // CFAllocatorRef alloc,
435 // const UInt8 *bytes,
437 // CFStringEncoding encoding,
438 // Boolean isExternalRepresentation
441 // We make the following substitutions:
443 // CFStringRef -> i8*
444 // CFAllocatorRef -> i8*
446 // CFIndex -> long (i32 or i64, as appropriate; we ask the module for its
447 // pointer size for now) CFStringEncoding -> i32 Boolean -> i8
449 Type
*arg_type_array
[5];
451 arg_type_array
[0] = i8_ptr_ty
;
452 arg_type_array
[1] = i8_ptr_ty
;
453 arg_type_array
[2] = m_intptr_ty
;
454 arg_type_array
[3] = i32_ty
;
455 arg_type_array
[4] = i8_ty
;
457 ArrayRef
<Type
*> CFSCWB_arg_types(arg_type_array
, 5);
459 llvm::FunctionType
*CFSCWB_ty
=
460 FunctionType::get(ns_str_ty
, CFSCWB_arg_types
, false);
462 // Build the constant containing the pointer to the function
463 PointerType
*CFSCWB_ptr_ty
= PointerType::getUnqual(CFSCWB_ty
);
464 Constant
*CFSCWB_addr_int
=
465 ConstantInt::get(m_intptr_ty
, CFStringCreateWithBytes_addr
, false);
466 m_CFStringCreateWithBytes
= {
467 CFSCWB_ty
, ConstantExpr::getIntToPtr(CFSCWB_addr_int
, CFSCWB_ptr_ty
)};
470 ConstantDataSequential
*string_array
= nullptr;
473 string_array
= dyn_cast
<ConstantDataSequential
>(cstr
->getInitializer());
475 Constant
*alloc_arg
= Constant::getNullValue(i8_ptr_ty
);
476 Constant
*bytes_arg
= cstr
? cstr
: Constant::getNullValue(i8_ptr_ty
);
477 Constant
*numBytes_arg
= ConstantInt::get(
478 m_intptr_ty
, cstr
? (string_array
->getNumElements() - 1) * string_array
->getElementByteSize() : 0, false);
479 int encoding_flags
= 0;
480 switch (cstr
? string_array
->getElementByteSize() : 1) {
482 encoding_flags
= 0x08000100; /* 0x08000100 is kCFStringEncodingUTF8 */
485 encoding_flags
= 0x0100; /* 0x0100 is kCFStringEncodingUTF16 */
488 encoding_flags
= 0x0c000100; /* 0x0c000100 is kCFStringEncodingUTF32 */
491 encoding_flags
= 0x0600; /* fall back to 0x0600, kCFStringEncodingASCII */
492 LLDB_LOG(log
, "Encountered an Objective-C constant string with unusual "
494 string_array
->getElementByteSize());
496 Constant
*encoding_arg
= ConstantInt::get(i32_ty
, encoding_flags
, false);
497 Constant
*isExternal_arg
=
498 ConstantInt::get(i8_ty
, 0x0, false); /* 0x0 is false */
500 Value
*argument_array
[5];
502 argument_array
[0] = alloc_arg
;
503 argument_array
[1] = bytes_arg
;
504 argument_array
[2] = numBytes_arg
;
505 argument_array
[3] = encoding_arg
;
506 argument_array
[4] = isExternal_arg
;
508 ArrayRef
<Value
*> CFSCWB_arguments(argument_array
, 5);
510 FunctionValueCache
CFSCWB_Caller(
511 [this, &CFSCWB_arguments
](llvm::Function
*function
) -> llvm::Value
* {
512 return CallInst::Create(
513 m_CFStringCreateWithBytes
, CFSCWB_arguments
,
514 "CFStringCreateWithBytes",
515 llvm::cast
<Instruction
>(
516 m_entry_instruction_finder
.GetValue(function
))
520 if (!UnfoldConstant(ns_str
, nullptr, CFSCWB_Caller
, m_entry_instruction_finder
,
522 LLDB_LOG(log
, "Couldn't replace the NSString with the result of the call");
524 m_error_stream
.Printf("error [IRForTarget internal]: Couldn't replace an "
525 "Objective-C constant string with a dynamic "
531 ns_str
->eraseFromParent();
536 bool IRForTarget::RewriteObjCConstStrings() {
537 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
539 ValueSymbolTable
&value_symbol_table
= m_module
->getValueSymbolTable();
541 for (StringMapEntry
<llvm::Value
*> &value_symbol
: value_symbol_table
) {
542 llvm::StringRef value_name
= value_symbol
.first();
544 if (value_name
.contains("_unnamed_cfstring_")) {
545 Value
*nsstring_value
= value_symbol
.second
;
547 GlobalVariable
*nsstring_global
=
548 dyn_cast
<GlobalVariable
>(nsstring_value
);
550 if (!nsstring_global
) {
551 LLDB_LOG(log
, "NSString variable is not a GlobalVariable");
553 m_error_stream
.Printf("Internal error [IRForTarget]: An Objective-C "
554 "constant string is not a global variable\n");
559 if (!nsstring_global
->hasInitializer()) {
560 LLDB_LOG(log
, "NSString variable does not have an initializer");
562 m_error_stream
.Printf("Internal error [IRForTarget]: An Objective-C "
563 "constant string does not have an initializer\n");
568 ConstantStruct
*nsstring_struct
=
569 dyn_cast
<ConstantStruct
>(nsstring_global
->getInitializer());
571 if (!nsstring_struct
) {
573 "NSString variable's initializer is not a ConstantStruct");
575 m_error_stream
.Printf("Internal error [IRForTarget]: An Objective-C "
576 "constant string is not a structure constant\n");
581 // We expect the following structure:
590 if (nsstring_struct
->getNumOperands() != 4) {
593 "NSString variable's initializer structure has an "
594 "unexpected number of members. Should be 4, is {0}",
595 nsstring_struct
->getNumOperands());
597 m_error_stream
.Printf("Internal error [IRForTarget]: The struct for an "
598 "Objective-C constant string is not as "
604 Constant
*nsstring_member
= nsstring_struct
->getOperand(2);
606 if (!nsstring_member
) {
607 LLDB_LOG(log
, "NSString initializer's str element was empty");
609 m_error_stream
.Printf("Internal error [IRForTarget]: An Objective-C "
610 "constant string does not have a string "
616 auto *cstr_global
= dyn_cast
<GlobalVariable
>(nsstring_member
);
619 "NSString initializer's str element is not a GlobalVariable");
621 m_error_stream
.Printf("Internal error [IRForTarget]: Unhandled"
622 "constant string initializer\n");
627 if (!cstr_global
->hasInitializer()) {
628 LLDB_LOG(log
, "NSString initializer's str element does not have an "
631 m_error_stream
.Printf("Internal error [IRForTarget]: An Objective-C "
632 "constant string's string initializer doesn't "
633 "point to initialized data\n");
642 log->PutCString("NSString initializer's str element is not a
646 m_error_stream.Printf("Internal error [IRForTarget]: An
647 Objective-C constant string's string initializer doesn't point to an
653 if (!cstr_array->isCString())
656 log->PutCString("NSString initializer's str element is not a C
660 m_error_stream.Printf("Internal error [IRForTarget]: An
661 Objective-C constant string's string initializer doesn't point to a C
668 ConstantDataArray
*cstr_array
=
669 dyn_cast
<ConstantDataArray
>(cstr_global
->getInitializer());
672 LLDB_LOG(log
, "Found NSString constant {0}, which contains \"{1}\"",
673 value_name
, cstr_array
->getAsString());
675 LLDB_LOG(log
, "Found NSString constant {0}, which contains \"\"",
679 cstr_global
= nullptr;
681 if (!RewriteObjCConstString(nsstring_global
, cstr_global
)) {
682 LLDB_LOG(log
, "Error rewriting the constant string");
684 // We don't print an error message here because RewriteObjCConstString
685 // has done so for us.
692 for (StringMapEntry
<llvm::Value
*> &value_symbol
: value_symbol_table
) {
693 llvm::StringRef value_name
= value_symbol
.first();
695 if (value_name
== "__CFConstantStringClassReference") {
696 GlobalVariable
*gv
= dyn_cast
<GlobalVariable
>(value_symbol
.second
);
700 "__CFConstantStringClassReference is not a global variable");
702 m_error_stream
.Printf("Internal error [IRForTarget]: Found a "
703 "CFConstantStringClassReference, but it is not a "
709 gv
->eraseFromParent();
718 static bool IsObjCSelectorRef(Value
*value
) {
719 GlobalVariable
*global_variable
= dyn_cast
<GlobalVariable
>(value
);
722 !global_variable
|| !global_variable
->hasName() ||
723 !global_variable
->getName().starts_with("OBJC_SELECTOR_REFERENCES_"));
726 // This function does not report errors; its callers are responsible.
727 bool IRForTarget::RewriteObjCSelector(Instruction
*selector_load
) {
728 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
730 LoadInst
*load
= dyn_cast
<LoadInst
>(selector_load
);
735 // Unpack the message name from the selector. In LLVM IR, an objc_msgSend
736 // gets represented as
738 // %sel = load ptr, ptr @OBJC_SELECTOR_REFERENCES_, align 8
739 // call i8 @objc_msgSend(ptr %obj, ptr %sel, ...)
741 // where %obj is the object pointer and %sel is the selector.
743 // @"OBJC_SELECTOR_REFERENCES_" is a pointer to a character array called
744 // @"\01L_OBJC_METH_VAR_NAME_".
745 // @"\01L_OBJC_METH_VAR_NAME_" contains the string.
747 // Find the pointer's initializer and get the string from its target.
749 GlobalVariable
*_objc_selector_references_
=
750 dyn_cast
<GlobalVariable
>(load
->getPointerOperand());
752 if (!_objc_selector_references_
||
753 !_objc_selector_references_
->hasInitializer())
756 Constant
*osr_initializer
= _objc_selector_references_
->getInitializer();
757 if (!osr_initializer
)
760 // Find the string's initializer (a ConstantArray) and get the string from it
762 GlobalVariable
*_objc_meth_var_name_
=
763 dyn_cast
<GlobalVariable
>(osr_initializer
);
765 if (!_objc_meth_var_name_
|| !_objc_meth_var_name_
->hasInitializer())
768 Constant
*omvn_initializer
= _objc_meth_var_name_
->getInitializer();
770 ConstantDataArray
*omvn_initializer_array
=
771 dyn_cast
<ConstantDataArray
>(omvn_initializer
);
773 if (!omvn_initializer_array
->isString())
776 std::string omvn_initializer_string
=
777 std::string(omvn_initializer_array
->getAsString());
779 LLDB_LOG(log
, "Found Objective-C selector reference \"{0}\"",
780 omvn_initializer_string
);
782 // Construct a call to sel_registerName
784 if (!m_sel_registerName
) {
785 lldb::addr_t sel_registerName_addr
;
787 bool missing_weak
= false;
788 static lldb_private::ConstString
g_sel_registerName_str("sel_registerName");
789 sel_registerName_addr
= m_execution_unit
.FindSymbol(g_sel_registerName_str
,
791 if (sel_registerName_addr
== LLDB_INVALID_ADDRESS
|| missing_weak
)
794 LLDB_LOG(log
, "Found sel_registerName at {0}", sel_registerName_addr
);
796 // Build the function type: struct objc_selector
797 // *sel_registerName(uint8_t*)
799 // The below code would be "more correct," but in actuality what's required
801 // Type *sel_type = StructType::get(m_module->getContext());
802 // Type *sel_ptr_type = PointerType::getUnqual(sel_type);
803 Type
*sel_ptr_type
= PointerType::getUnqual(m_module
->getContext());
807 type_array
[0] = llvm::PointerType::getUnqual(m_module
->getContext());
809 ArrayRef
<Type
*> srN_arg_types(type_array
, 1);
811 llvm::FunctionType
*srN_type
=
812 FunctionType::get(sel_ptr_type
, srN_arg_types
, false);
814 // Build the constant containing the pointer to the function
815 PointerType
*srN_ptr_ty
= PointerType::getUnqual(srN_type
);
816 Constant
*srN_addr_int
=
817 ConstantInt::get(m_intptr_ty
, sel_registerName_addr
, false);
818 m_sel_registerName
= {srN_type
,
819 ConstantExpr::getIntToPtr(srN_addr_int
, srN_ptr_ty
)};
823 CallInst::Create(m_sel_registerName
, _objc_meth_var_name_
,
824 "sel_registerName", selector_load
->getIterator());
826 // Replace the load with the call in all users
828 selector_load
->replaceAllUsesWith(srN_call
);
830 selector_load
->eraseFromParent();
835 bool IRForTarget::RewriteObjCSelectors(BasicBlock
&basic_block
) {
836 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
838 InstrList selector_loads
;
840 for (Instruction
&inst
: basic_block
) {
841 if (LoadInst
*load
= dyn_cast
<LoadInst
>(&inst
))
842 if (IsObjCSelectorRef(load
->getPointerOperand()))
843 selector_loads
.push_back(&inst
);
846 for (Instruction
*inst
: selector_loads
) {
847 if (!RewriteObjCSelector(inst
)) {
848 m_error_stream
.Printf("Internal error [IRForTarget]: Couldn't change a "
849 "static reference to an Objective-C selector to a "
850 "dynamic reference\n");
852 LLDB_LOG(log
, "Couldn't rewrite a reference to an Objective-C selector");
861 // This function does not report errors; its callers are responsible.
862 bool IRForTarget::RewritePersistentAlloc(llvm::Instruction
*persistent_alloc
) {
863 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
865 AllocaInst
*alloc
= dyn_cast
<AllocaInst
>(persistent_alloc
);
867 MDNode
*alloc_md
= alloc
->getMetadata("clang.decl.ptr");
869 if (!alloc_md
|| !alloc_md
->getNumOperands())
872 ConstantInt
*constant_int
=
873 mdconst::dyn_extract
<ConstantInt
>(alloc_md
->getOperand(0));
878 // We attempt to register this as a new persistent variable with the DeclMap.
880 uintptr_t ptr
= constant_int
->getZExtValue();
882 clang::VarDecl
*decl
= reinterpret_cast<clang::VarDecl
*>(ptr
);
884 lldb_private::TypeFromParser
result_decl_type(
885 m_decl_map
->GetTypeSystem()->GetType(decl
->getType()));
887 StringRef
decl_name(decl
->getName());
888 lldb_private::ConstString
persistent_variable_name(decl_name
.data(),
890 if (!m_decl_map
->AddPersistentVariable(decl
, persistent_variable_name
,
891 result_decl_type
, false, false))
894 GlobalVariable
*persistent_global
= new GlobalVariable(
895 (*m_module
), alloc
->getType(), false, /* not constant */
896 GlobalValue::ExternalLinkage
, nullptr, /* no initializer */
897 alloc
->getName().str());
899 // What we're going to do here is make believe this was a regular old
900 // external variable. That means we need to make the metadata valid.
902 NamedMDNode
*named_metadata
=
903 m_module
->getOrInsertNamedMetadata("clang.global.decl.ptrs");
905 llvm::Metadata
*values
[2];
906 values
[0] = ConstantAsMetadata::get(persistent_global
);
907 values
[1] = ConstantAsMetadata::get(constant_int
);
909 ArrayRef
<llvm::Metadata
*> value_ref(values
, 2);
911 MDNode
*persistent_global_md
= MDNode::get(m_module
->getContext(), value_ref
);
912 named_metadata
->addOperand(persistent_global_md
);
914 // Now, since the variable is a pointer variable, we will drop in a load of
915 // that pointer variable.
917 LoadInst
*persistent_load
=
918 new LoadInst(persistent_global
->getValueType(), persistent_global
, "",
919 alloc
->getIterator());
921 LLDB_LOG(log
, "Replacing \"{0}\" with \"{1}\"", PrintValue(alloc
),
922 PrintValue(persistent_load
));
924 alloc
->replaceAllUsesWith(persistent_load
);
925 alloc
->eraseFromParent();
930 bool IRForTarget::RewritePersistentAllocs(llvm::BasicBlock
&basic_block
) {
934 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
936 InstrList pvar_allocs
;
938 for (Instruction
&inst
: basic_block
) {
940 if (AllocaInst
*alloc
= dyn_cast
<AllocaInst
>(&inst
)) {
941 llvm::StringRef alloc_name
= alloc
->getName();
943 if (alloc_name
.starts_with("$") && !alloc_name
.starts_with("$__lldb")) {
944 if (alloc_name
.find_first_of("0123456789") == 1) {
945 LLDB_LOG(log
, "Rejecting a numeric persistent variable.");
947 m_error_stream
.Printf("Error [IRForTarget]: Names starting with $0, "
948 "$1, ... are reserved for use as result "
954 pvar_allocs
.push_back(alloc
);
959 for (Instruction
*inst
: pvar_allocs
) {
960 if (!RewritePersistentAlloc(inst
)) {
961 m_error_stream
.Printf("Internal error [IRForTarget]: Couldn't rewrite "
962 "the creation of a persistent variable\n");
964 LLDB_LOG(log
, "Couldn't rewrite the creation of a persistent variable");
973 // This function does not report errors; its callers are responsible.
974 bool IRForTarget::MaybeHandleVariable(Value
*llvm_value_ptr
) {
975 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
977 LLDB_LOG(log
, "MaybeHandleVariable ({0})", PrintValue(llvm_value_ptr
));
979 if (ConstantExpr
*constant_expr
= dyn_cast
<ConstantExpr
>(llvm_value_ptr
)) {
980 switch (constant_expr
->getOpcode()) {
983 case Instruction::GetElementPtr
:
984 case Instruction::BitCast
:
985 Value
*s
= constant_expr
->getOperand(0);
986 if (!MaybeHandleVariable(s
))
989 } else if (GlobalVariable
*global_variable
=
990 dyn_cast
<GlobalVariable
>(llvm_value_ptr
)) {
991 if (!GlobalValue::isExternalLinkage(global_variable
->getLinkage()))
994 clang::NamedDecl
*named_decl
= DeclForGlobal(global_variable
);
997 if (IsObjCSelectorRef(llvm_value_ptr
))
1000 if (!global_variable
->hasExternalLinkage())
1003 LLDB_LOG(log
, "Found global variable \"{0}\" without metadata",
1004 global_variable
->getName());
1009 llvm::StringRef
name(named_decl
->getName());
1011 clang::ValueDecl
*value_decl
= dyn_cast
<clang::ValueDecl
>(named_decl
);
1012 if (value_decl
== nullptr)
1015 lldb_private::CompilerType compiler_type
=
1016 m_decl_map
->GetTypeSystem()->GetType(value_decl
->getType());
1018 const Type
*value_type
= nullptr;
1020 if (name
.starts_with("$")) {
1021 // The $__lldb_expr_result name indicates the return value has allocated
1022 // as a static variable. Per the comment at
1023 // ASTResultSynthesizer::SynthesizeBodyResult, accesses to this static
1024 // variable need to be redirected to the result of dereferencing a
1025 // pointer that is passed in as one of the arguments.
1027 // Consequently, when reporting the size of the type, we report a pointer
1028 // type pointing to the type of $__lldb_expr_result, not the type itself.
1030 // We also do this for any user-declared persistent variables.
1031 compiler_type
= compiler_type
.GetPointerType();
1032 value_type
= PointerType::get(global_variable
->getType(), 0);
1034 value_type
= global_variable
->getType();
1037 auto *target
= m_execution_unit
.GetTarget().get();
1038 std::optional
<uint64_t> value_size
= compiler_type
.GetByteSize(target
);
1041 std::optional
<size_t> opt_alignment
= compiler_type
.GetTypeBitAlign(target
);
1044 lldb::offset_t value_alignment
= (*opt_alignment
+ 7ull) / 8ull;
1047 "Type of \"{0}\" is [clang \"{1}\", llvm \"{2}\"] [size {3}, "
1050 lldb_private::ClangUtil::GetQualType(compiler_type
).getAsString(),
1051 PrintType(value_type
), *value_size
, value_alignment
);
1054 m_decl_map
->AddValueToStruct(named_decl
, lldb_private::ConstString(name
),
1055 llvm_value_ptr
, *value_size
,
1057 } else if (isa
<llvm::Function
>(llvm_value_ptr
)) {
1058 LLDB_LOG(log
, "Function pointers aren't handled right now");
1066 // This function does not report errors; its callers are responsible.
1067 bool IRForTarget::HandleSymbol(Value
*symbol
) {
1068 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1070 lldb_private::ConstString
name(symbol
->getName().str().c_str());
1072 lldb::addr_t symbol_addr
=
1073 m_decl_map
->GetSymbolAddress(name
, lldb::eSymbolTypeAny
);
1075 if (symbol_addr
== LLDB_INVALID_ADDRESS
) {
1076 LLDB_LOG(log
, "Symbol \"{0}\" had no address", name
);
1081 LLDB_LOG(log
, "Found \"{0}\" at {1}", name
, symbol_addr
);
1083 Type
*symbol_type
= symbol
->getType();
1085 Constant
*symbol_addr_int
= ConstantInt::get(m_intptr_ty
, symbol_addr
, false);
1087 Value
*symbol_addr_ptr
=
1088 ConstantExpr::getIntToPtr(symbol_addr_int
, symbol_type
);
1090 LLDB_LOG(log
, "Replacing {0} with {1}", PrintValue(symbol
),
1091 PrintValue(symbol_addr_ptr
));
1093 symbol
->replaceAllUsesWith(symbol_addr_ptr
);
1098 bool IRForTarget::MaybeHandleCallArguments(CallInst
*Old
) {
1099 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1101 LLDB_LOG(log
, "MaybeHandleCallArguments({0})", PrintValue(Old
));
1103 for (unsigned op_index
= 0, num_ops
= Old
->arg_size();
1104 op_index
< num_ops
; ++op_index
)
1105 // conservatively believe that this is a store
1106 if (!MaybeHandleVariable(Old
->getArgOperand(op_index
))) {
1107 m_error_stream
.Printf("Internal error [IRForTarget]: Couldn't rewrite "
1108 "one of the arguments of a function call.\n");
1116 bool IRForTarget::HandleObjCClass(Value
*classlist_reference
) {
1117 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1119 GlobalVariable
*global_variable
=
1120 dyn_cast
<GlobalVariable
>(classlist_reference
);
1122 if (!global_variable
)
1125 Constant
*initializer
= global_variable
->getInitializer();
1130 if (!initializer
->hasName())
1133 StringRef
name(initializer
->getName());
1134 lldb_private::ConstString
name_cstr(name
.str().c_str());
1135 lldb::addr_t class_ptr
=
1136 m_decl_map
->GetSymbolAddress(name_cstr
, lldb::eSymbolTypeObjCClass
);
1138 LLDB_LOG(log
, "Found reference to Objective-C class {0} ({1})", name
,
1139 (unsigned long long)class_ptr
);
1141 if (class_ptr
== LLDB_INVALID_ADDRESS
)
1144 if (global_variable
->use_empty())
1147 SmallVector
<LoadInst
*, 2> load_instructions
;
1149 for (llvm::User
*u
: global_variable
->users()) {
1150 if (LoadInst
*load_instruction
= dyn_cast
<LoadInst
>(u
))
1151 load_instructions
.push_back(load_instruction
);
1154 if (load_instructions
.empty())
1157 Constant
*class_addr
= ConstantInt::get(m_intptr_ty
, (uint64_t)class_ptr
);
1159 for (LoadInst
*load_instruction
: load_instructions
) {
1160 Constant
*class_bitcast
=
1161 ConstantExpr::getIntToPtr(class_addr
, load_instruction
->getType());
1163 load_instruction
->replaceAllUsesWith(class_bitcast
);
1165 load_instruction
->eraseFromParent();
1171 bool IRForTarget::RemoveCXAAtExit(BasicBlock
&basic_block
) {
1172 std::vector
<CallInst
*> calls_to_remove
;
1174 for (Instruction
&inst
: basic_block
) {
1175 CallInst
*call
= dyn_cast
<CallInst
>(&inst
);
1177 // MaybeHandleCallArguments handles error reporting; we are silent here
1181 bool remove
= false;
1183 llvm::Function
*func
= call
->getCalledFunction();
1185 if (func
&& func
->getName() == "__cxa_atexit")
1188 llvm::Value
*val
= call
->getCalledOperand();
1190 if (val
&& val
->getName() == "__cxa_atexit")
1194 calls_to_remove
.push_back(call
);
1197 for (CallInst
*ci
: calls_to_remove
)
1198 ci
->eraseFromParent();
1203 bool IRForTarget::ResolveCalls(BasicBlock
&basic_block
) {
1204 // Prepare the current basic block for execution in the remote process
1206 for (Instruction
&inst
: basic_block
) {
1207 CallInst
*call
= dyn_cast
<CallInst
>(&inst
);
1209 // MaybeHandleCallArguments handles error reporting; we are silent here
1210 if (call
&& !MaybeHandleCallArguments(call
))
1217 bool IRForTarget::ResolveExternals(Function
&llvm_function
) {
1218 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1220 for (GlobalVariable
&global_var
: m_module
->globals()) {
1221 llvm::StringRef global_name
= global_var
.getName();
1223 LLDB_LOG(log
, "Examining {0}, DeclForGlobalValue returns {1}", global_name
,
1224 static_cast<void *>(DeclForGlobal(&global_var
)));
1226 if (global_name
.starts_with("OBJC_IVAR")) {
1227 if (!HandleSymbol(&global_var
)) {
1228 m_error_stream
.Format("Error [IRForTarget]: Couldn't find Objective-C "
1229 "indirect ivar symbol {0}\n",
1234 } else if (global_name
.contains("OBJC_CLASSLIST_REFERENCES_$")) {
1235 if (!HandleObjCClass(&global_var
)) {
1236 m_error_stream
.Printf("Error [IRForTarget]: Couldn't resolve the class "
1237 "for an Objective-C static method call\n");
1241 } else if (global_name
.contains("OBJC_CLASSLIST_SUP_REFS_$")) {
1242 if (!HandleObjCClass(&global_var
)) {
1243 m_error_stream
.Printf("Error [IRForTarget]: Couldn't resolve the class "
1244 "for an Objective-C static method call\n");
1248 } else if (DeclForGlobal(&global_var
)) {
1249 if (!MaybeHandleVariable(&global_var
)) {
1250 m_error_stream
.Format("Internal error [IRForTarget]: Couldn't rewrite "
1251 "external variable {0}\n",
1262 static bool isGuardVariableRef(Value
*V
) {
1263 GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(V
);
1265 if (!GV
|| !GV
->hasName() || !isGuardVariableSymbol(GV
->getName()))
1271 void IRForTarget::TurnGuardLoadIntoZero(llvm::Instruction
*guard_load
) {
1272 Constant
*zero(Constant::getNullValue(guard_load
->getType()));
1273 guard_load
->replaceAllUsesWith(zero
);
1274 guard_load
->eraseFromParent();
1277 static void ExciseGuardStore(Instruction
*guard_store
) {
1278 guard_store
->eraseFromParent();
1281 bool IRForTarget::RemoveGuards(BasicBlock
&basic_block
) {
1282 // Eliminate any reference to guard variables found.
1284 InstrList guard_loads
;
1285 InstrList guard_stores
;
1287 for (Instruction
&inst
: basic_block
) {
1289 if (LoadInst
*load
= dyn_cast
<LoadInst
>(&inst
))
1290 if (isGuardVariableRef(load
->getPointerOperand()))
1291 guard_loads
.push_back(&inst
);
1293 if (StoreInst
*store
= dyn_cast
<StoreInst
>(&inst
))
1294 if (isGuardVariableRef(store
->getPointerOperand()))
1295 guard_stores
.push_back(&inst
);
1298 for (Instruction
*inst
: guard_loads
)
1299 TurnGuardLoadIntoZero(inst
);
1301 for (Instruction
*inst
: guard_stores
)
1302 ExciseGuardStore(inst
);
1307 // This function does not report errors; its callers are responsible.
1308 bool IRForTarget::UnfoldConstant(Constant
*old_constant
,
1309 llvm::Function
*llvm_function
,
1310 FunctionValueCache
&value_maker
,
1311 FunctionValueCache
&entry_instruction_finder
,
1312 lldb_private::Stream
&error_stream
) {
1313 SmallVector
<User
*, 16> users
;
1315 // We do this because the use list might change, invalidating our iterator.
1316 // Much better to keep a work list ourselves.
1317 for (llvm::User
*u
: old_constant
->users())
1320 for (size_t i
= 0; i
< users
.size(); ++i
) {
1321 User
*user
= users
[i
];
1323 if (Constant
*constant
= dyn_cast
<Constant
>(user
)) {
1324 // synthesize a new non-constant equivalent of the constant
1326 if (ConstantExpr
*constant_expr
= dyn_cast
<ConstantExpr
>(constant
)) {
1327 switch (constant_expr
->getOpcode()) {
1329 error_stream
.Printf("error [IRForTarget internal]: Unhandled "
1330 "constant expression type: \"%s\"",
1331 PrintValue(constant_expr
).c_str());
1333 case Instruction::BitCast
: {
1334 FunctionValueCache
bit_cast_maker(
1335 [&value_maker
, &entry_instruction_finder
, old_constant
,
1336 constant_expr
](llvm::Function
*function
) -> llvm::Value
* {
1338 // OperandList[0] is value
1340 if (constant_expr
->getOperand(0) != old_constant
)
1341 return constant_expr
;
1343 return new BitCastInst(
1344 value_maker
.GetValue(function
), constant_expr
->getType(),
1346 llvm::cast
<Instruction
>(
1347 entry_instruction_finder
.GetValue(function
))
1351 if (!UnfoldConstant(constant_expr
, llvm_function
, bit_cast_maker
,
1352 entry_instruction_finder
, error_stream
))
1355 case Instruction::GetElementPtr
: {
1356 // GetElementPtrConstantExpr
1357 // OperandList[0] is base
1358 // OperandList[1]... are indices
1360 FunctionValueCache
get_element_pointer_maker(
1361 [&value_maker
, &entry_instruction_finder
, old_constant
,
1362 constant_expr
](llvm::Function
*function
) -> llvm::Value
* {
1363 auto *gep
= cast
<llvm::GEPOperator
>(constant_expr
);
1364 Value
*ptr
= gep
->getPointerOperand();
1366 if (ptr
== old_constant
)
1367 ptr
= value_maker
.GetValue(function
);
1369 std::vector
<Value
*> index_vector
;
1370 for (Value
*operand
: gep
->indices()) {
1371 if (operand
== old_constant
)
1372 operand
= value_maker
.GetValue(function
);
1374 index_vector
.push_back(operand
);
1377 ArrayRef
<Value
*> indices(index_vector
);
1379 return GetElementPtrInst::Create(
1380 gep
->getSourceElementType(), ptr
, indices
, "",
1381 llvm::cast
<Instruction
>(
1382 entry_instruction_finder
.GetValue(function
))
1386 if (!UnfoldConstant(constant_expr
, llvm_function
,
1387 get_element_pointer_maker
,
1388 entry_instruction_finder
, error_stream
))
1393 error_stream
.Printf(
1394 "error [IRForTarget internal]: Unhandled constant type: \"%s\"",
1395 PrintValue(constant
).c_str());
1399 if (Instruction
*inst
= llvm::dyn_cast
<Instruction
>(user
)) {
1400 if (llvm_function
&& inst
->getParent()->getParent() != llvm_function
) {
1401 error_stream
.PutCString("error: Capturing non-local variables in "
1402 "expressions is unsupported.\n");
1405 inst
->replaceUsesOfWith(
1406 old_constant
, value_maker
.GetValue(inst
->getParent()->getParent()));
1408 error_stream
.Printf(
1409 "error [IRForTarget internal]: Unhandled non-constant type: \"%s\"",
1410 PrintValue(user
).c_str());
1416 if (!isa
<GlobalValue
>(old_constant
)) {
1417 old_constant
->destroyConstant();
1423 bool IRForTarget::ReplaceVariables(Function
&llvm_function
) {
1424 if (!m_resolve_vars
)
1427 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1429 m_decl_map
->DoStructLayout();
1431 LLDB_LOG(log
, "Element arrangement:");
1433 uint32_t num_elements
;
1434 uint32_t element_index
;
1437 lldb::offset_t alignment
;
1439 if (!m_decl_map
->GetStructInfo(num_elements
, size
, alignment
))
1442 Function::arg_iterator
iter(llvm_function
.arg_begin());
1444 if (iter
== llvm_function
.arg_end()) {
1445 m_error_stream
.Printf("Internal error [IRForTarget]: Wrapper takes no "
1446 "arguments (should take at least a struct pointer)");
1451 Argument
*argument
= &*iter
;
1453 if (argument
->getName() == "this") {
1456 if (iter
== llvm_function
.arg_end()) {
1457 m_error_stream
.Printf("Internal error [IRForTarget]: Wrapper takes only "
1458 "'this' argument (should take a struct pointer "
1465 } else if (argument
->getName() == "self") {
1468 if (iter
== llvm_function
.arg_end()) {
1469 m_error_stream
.Printf("Internal error [IRForTarget]: Wrapper takes only "
1470 "'self' argument (should take '_cmd' and a struct "
1476 if (iter
->getName() != "_cmd") {
1477 m_error_stream
.Format("Internal error [IRForTarget]: Wrapper takes '{0}' "
1478 "after 'self' argument (should take '_cmd')",
1486 if (iter
== llvm_function
.arg_end()) {
1487 m_error_stream
.Printf("Internal error [IRForTarget]: Wrapper takes only "
1488 "'self' and '_cmd' arguments (should take a struct "
1497 if (argument
->getName() != "$__lldb_arg") {
1498 m_error_stream
.Format("Internal error [IRForTarget]: Wrapper takes an "
1499 "argument named '{0}' instead of the struct pointer",
1500 argument
->getName());
1505 LLDB_LOG(log
, "Arg: \"{0}\"", PrintValue(argument
));
1507 BasicBlock
&entry_block(llvm_function
.getEntryBlock());
1508 Instruction
*FirstEntryInstruction(entry_block
.getFirstNonPHIOrDbg());
1510 if (!FirstEntryInstruction
) {
1511 m_error_stream
.Printf("Internal error [IRForTarget]: Couldn't find the "
1512 "first instruction in the wrapper for use in "
1518 LLVMContext
&context(m_module
->getContext());
1519 IntegerType
*offset_type(Type::getInt32Ty(context
));
1522 m_error_stream
.Printf(
1523 "Internal error [IRForTarget]: Couldn't produce an offset type");
1528 for (element_index
= 0; element_index
< num_elements
; ++element_index
) {
1529 const clang::NamedDecl
*decl
= nullptr;
1530 Value
*value
= nullptr;
1531 lldb::offset_t offset
;
1532 lldb_private::ConstString name
;
1534 if (!m_decl_map
->GetStructElement(decl
, value
, offset
, name
,
1536 m_error_stream
.Printf(
1537 "Internal error [IRForTarget]: Structure information is incomplete");
1542 LLDB_LOG(log
, " \"{0}\" (\"{1}\") placed at {2}", name
,
1543 decl
->getNameAsString(), offset
);
1546 LLDB_LOG(log
, " Replacing [{0}]", PrintValue(value
));
1548 FunctionValueCache
body_result_maker(
1549 [this, name
, offset_type
, offset
, argument
,
1550 value
](llvm::Function
*function
) -> llvm::Value
* {
1551 // Per the comment at ASTResultSynthesizer::SynthesizeBodyResult,
1552 // in cases where the result variable is an rvalue, we have to
1553 // synthesize a dereference of the appropriate structure entry in
1554 // order to produce the static variable that the AST thinks it is
1557 llvm::Instruction
*entry_instruction
= llvm::cast
<Instruction
>(
1558 m_entry_instruction_finder
.GetValue(function
));
1560 Type
*int8Ty
= Type::getInt8Ty(function
->getContext());
1561 ConstantInt
*offset_int(
1562 ConstantInt::get(offset_type
, offset
, true));
1563 GetElementPtrInst
*get_element_ptr
=
1564 GetElementPtrInst::Create(int8Ty
, argument
, offset_int
, "",
1565 entry_instruction
->getIterator());
1567 if (name
== m_result_name
&& !m_result_is_pointer
) {
1569 new LoadInst(value
->getType(), get_element_ptr
, "",
1570 entry_instruction
->getIterator());
1574 return get_element_ptr
;
1578 if (Constant
*constant
= dyn_cast
<Constant
>(value
)) {
1579 if (!UnfoldConstant(constant
, &llvm_function
, body_result_maker
,
1580 m_entry_instruction_finder
, m_error_stream
)) {
1583 } else if (Instruction
*instruction
= dyn_cast
<Instruction
>(value
)) {
1584 if (instruction
->getParent()->getParent() != &llvm_function
) {
1585 m_error_stream
.PutCString("error: Capturing non-local variables in "
1586 "expressions is unsupported.\n");
1589 value
->replaceAllUsesWith(
1590 body_result_maker
.GetValue(instruction
->getParent()->getParent()));
1592 LLDB_LOG(log
, "Unhandled non-constant type: \"{0}\"",
1597 if (GlobalVariable
*var
= dyn_cast
<GlobalVariable
>(value
))
1598 var
->eraseFromParent();
1602 LLDB_LOG(log
, "Total structure [align {0}, size {1}]", (int64_t)alignment
,
1608 bool IRForTarget::runOnModule(Module
&llvm_module
) {
1609 lldb_private::Log
*log(GetLog(LLDBLog::Expressions
));
1611 m_module
= &llvm_module
;
1612 m_target_data
= &m_module
->getDataLayout();
1613 m_intptr_ty
= llvm::Type::getIntNTy(m_module
->getContext(),
1614 m_target_data
->getPointerSizeInBits());
1618 raw_string_ostream
oss(s
);
1620 m_module
->print(oss
, nullptr);
1622 LLDB_LOG(log
, "Module as passed in to IRForTarget: \n\"{0}\"", s
);
1625 Function
*const main_function
=
1626 m_func_name
.IsEmpty() ? nullptr
1627 : m_module
->getFunction(m_func_name
.GetStringRef());
1629 if (!m_func_name
.IsEmpty() && !main_function
) {
1630 LLDB_LOG(log
, "Couldn't find \"{0}()\" in the module", m_func_name
);
1632 m_error_stream
.Format("Internal error [IRForTarget]: Couldn't find wrapper "
1633 "'{0}' in the module",
1639 if (main_function
) {
1640 if (!FixFunctionLinkage(*main_function
)) {
1641 LLDB_LOG(log
, "Couldn't fix the linkage for the function");
1647 ////////////////////////////////////////////////////////////
1648 // Replace $__lldb_expr_result with a persistent variable
1651 if (main_function
) {
1652 if (!CreateResultVariable(*main_function
)) {
1653 LLDB_LOG(log
, "CreateResultVariable() failed");
1655 // CreateResultVariable() reports its own errors, so we don't do so here
1661 if (log
&& log
->GetVerbose()) {
1663 raw_string_ostream
oss(s
);
1665 m_module
->print(oss
, nullptr);
1667 LLDB_LOG(log
, "Module after creating the result variable: \n\"{0}\"", s
);
1670 for (llvm::Function
&function
: *m_module
) {
1671 for (BasicBlock
&bb
: function
) {
1672 if (!RemoveGuards(bb
)) {
1673 LLDB_LOG(log
, "RemoveGuards() failed");
1675 // RemoveGuards() reports its own errors, so we don't do so here
1680 if (!RewritePersistentAllocs(bb
)) {
1681 LLDB_LOG(log
, "RewritePersistentAllocs() failed");
1683 // RewritePersistentAllocs() reports its own errors, so we don't do so
1689 if (!RemoveCXAAtExit(bb
)) {
1690 LLDB_LOG(log
, "RemoveCXAAtExit() failed");
1692 // RemoveCXAAtExit() reports its own errors, so we don't do so here
1699 ///////////////////////////////////////////////////////////////////////////////
1700 // Fix all Objective-C constant strings to use NSStringWithCString:encoding:
1703 if (!RewriteObjCConstStrings()) {
1704 LLDB_LOG(log
, "RewriteObjCConstStrings() failed");
1706 // RewriteObjCConstStrings() reports its own errors, so we don't do so here
1711 for (llvm::Function
&function
: *m_module
) {
1712 for (llvm::BasicBlock
&bb
: function
) {
1713 if (!RewriteObjCSelectors(bb
)) {
1714 LLDB_LOG(log
, "RewriteObjCSelectors() failed");
1716 // RewriteObjCSelectors() reports its own errors, so we don't do so
1724 for (llvm::Function
&function
: *m_module
) {
1725 for (BasicBlock
&bb
: function
) {
1726 if (!ResolveCalls(bb
)) {
1727 LLDB_LOG(log
, "ResolveCalls() failed");
1729 // ResolveCalls() reports its own errors, so we don't do so here
1736 ////////////////////////////////////////////////////////////////////////
1737 // Run function-level passes that only make sense on the main function
1740 if (main_function
) {
1741 if (!ResolveExternals(*main_function
)) {
1742 LLDB_LOG(log
, "ResolveExternals() failed");
1744 // ResolveExternals() reports its own errors, so we don't do so here
1749 if (!ReplaceVariables(*main_function
)) {
1750 LLDB_LOG(log
, "ReplaceVariables() failed");
1752 // ReplaceVariables() reports its own errors, so we don't do so here
1758 if (log
&& log
->GetVerbose()) {
1760 raw_string_ostream
oss(s
);
1762 m_module
->print(oss
, nullptr);
1764 LLDB_LOG(log
, "Module after preparing for execution: \n\"{0}\"", s
);