summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2012-09-24 22:25:51 +0000
committerSean Callanan <scallanan@apple.com>2012-09-24 22:25:51 +0000
commit3d654b30449e2dedd6e5d3f4961a724cf93860bf (patch)
tree4634b19442525870a967bd217330e64da44f884b /lldb/source/Expression
parent9f4729d3317f8f04b2e7a1e7ac36418722dc492e (diff)
downloadbcm5719-llvm-3d654b30449e2dedd6e5d3f4961a724cf93860bf.tar.gz
bcm5719-llvm-3d654b30449e2dedd6e5d3f4961a724cf93860bf.zip
Brought LLDB top-of-tree into sync with LLVM/Clang
top-of-tree. Removed all local patches and llvm.zip. The intent is that fron now on top-of-tree will always build against LLVM/Clang top-of-tree, and that problems building will be resolved as they occur. Stable release branches of LLDB can be constructed as needed and linked to specific release branches of LLVM/Clang. llvm-svn: 164563
Diffstat (limited to 'lldb/source/Expression')
-rw-r--r--lldb/source/Expression/ASTStructExtractor.cpp39
-rw-r--r--lldb/source/Expression/ClangASTSource.cpp4
-rw-r--r--lldb/source/Expression/ClangExpressionDeclMap.cpp1
-rw-r--r--lldb/source/Expression/ClangExpressionParser.cpp131
-rw-r--r--lldb/source/Expression/IRForTarget.cpp61
5 files changed, 171 insertions, 65 deletions
diff --git a/lldb/source/Expression/ASTStructExtractor.cpp b/lldb/source/Expression/ASTStructExtractor.cpp
index 7bc31a5d815..d1f21923deb 100644
--- a/lldb/source/Expression/ASTStructExtractor.cpp
+++ b/lldb/source/Expression/ASTStructExtractor.cpp
@@ -59,13 +59,42 @@ ASTStructExtractor::Initialize(ASTContext &Context)
void
ASTStructExtractor::ExtractFromFunctionDecl(FunctionDecl *F)
{
- DeclarationName struct_name(&m_ast_context->Idents.get(m_struct_name.c_str()));
- RecordDecl::lookup_result struct_lookup = F->lookup(struct_name);
-
- if (struct_lookup.first == struct_lookup.second)
+ if (!F->hasBody())
return;
- RecordDecl *struct_decl = dyn_cast<RecordDecl>(*(struct_lookup.first));
+ Stmt *body_stmt = F->getBody();
+ CompoundStmt *body_compound_stmt = dyn_cast<CompoundStmt>(body_stmt);
+
+ if (!body_compound_stmt)
+ return; // do we have to handle this?
+
+ RecordDecl *struct_decl = NULL;
+
+ StringRef desired_name(m_struct_name.c_str());
+
+ for (CompoundStmt::const_body_iterator bi = body_compound_stmt->body_begin(), be = body_compound_stmt->body_end();
+ bi != be;
+ ++bi)
+ {
+ Stmt *curr_stmt = *bi;
+ DeclStmt *curr_decl_stmt = dyn_cast<DeclStmt>(curr_stmt);
+ if (!curr_decl_stmt)
+ continue;
+ DeclGroupRef decl_group = curr_decl_stmt->getDeclGroup();
+ for (Decl *candidate_decl : decl_group)
+ {
+ RecordDecl *candidate_record_decl = dyn_cast<RecordDecl>(candidate_decl);
+ if (!candidate_record_decl)
+ continue;
+ if (candidate_record_decl->getName() == desired_name)
+ {
+ struct_decl = candidate_record_decl;
+ break;
+ }
+ }
+ if (struct_decl)
+ break;
+ }
if (!struct_decl)
return;
diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp
index 3d3a6f61ca7..ef84b5033f4 100644
--- a/lldb/source/Expression/ClangASTSource.cpp
+++ b/lldb/source/Expression/ClangASTSource.cpp
@@ -439,9 +439,9 @@ ClangASTSource::FindExternalLexicalDecls (const DeclContext *decl_context,
{
ASTDumper ast_dumper(decl);
if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
- log->Printf(" FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), ast_dumper.GetCString());
+ log->Printf(" FELD[%d] Adding [to %sDecl %s] lexical %sDecl %s", current_id, context_named_decl->getDeclKindName(), context_named_decl->getNameAsString().c_str(), decl->getDeclKindName(), ast_dumper.GetCString());
else
- log->Printf(" FELD[%d] Adding lexical decl %s", current_id, ast_dumper.GetCString());
+ log->Printf(" FELD[%d] Adding lexical %sDecl %s", current_id, decl->getDeclKindName(), ast_dumper.GetCString());
}
Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, original_ctx, decl);
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp
index 33910279bc7..f4bdfc04549 100644
--- a/lldb/source/Expression/ClangExpressionDeclMap.cpp
+++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp
@@ -13,6 +13,7 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
+#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclarationName.h"
#include "clang/AST/Decl.h"
#include "lldb/lldb-private.h"
diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp
index 5dd2ce2eb51..ea03defbc5e 100644
--- a/lldb/source/Expression/ClangExpressionParser.cpp
+++ b/lldb/source/Expression/ClangExpressionParser.cpp
@@ -43,12 +43,13 @@
#include "clang/Frontend/TextDiagnosticPrinter.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Parse/ParseAST.h"
-#include "clang/Rewrite/FrontendActions.h"
+#include "clang/Rewrite/Frontend/FrontendActions.h"
#include "clang/Sema/SemaConsumer.h"
#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/Support/Debug.h"
#include "llvm/Support/TargetSelect.h"
#if !defined(__APPLE__)
@@ -199,11 +200,59 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope,
llvm::DisablePrettyStackTrace = true;
}
} InitializeLLVM;
-
+
+ llvm::setCurrentDebugType("internalize");
+ llvm::DebugFlag = true;
+
// 1. Create a new compiler instance.
m_compiler.reset(new CompilerInstance());
- // 2. Set options.
+ // 2. Install the target.
+
+ lldb::TargetSP target_sp;
+ if (exe_scope)
+ target_sp = exe_scope->CalculateTarget();
+
+ // TODO: figure out what to really do when we don't have a valid target.
+ // Sometimes this will be ok to just use the host target triple (when we
+ // evaluate say "2+3", but other expressions like breakpoint conditions
+ // and other things that _are_ target specific really shouldn't just be
+ // using the host triple. This needs to be fixed in a better way.
+ if (target_sp && target_sp->GetArchitecture().IsValid())
+ {
+ std::string triple = target_sp->GetArchitecture().GetTriple().str();
+
+ int dash_count = 0;
+ for (size_t i = 0; i < triple.size(); ++i)
+ {
+ if (triple[i] == '-')
+ dash_count++;
+ if (dash_count == 3)
+ {
+ triple.resize(i);
+ break;
+ }
+ }
+
+ m_compiler->getTargetOpts().Triple = triple;
+ }
+ else
+ {
+ m_compiler->getTargetOpts().Triple = llvm::sys::getDefaultTargetTriple();
+ }
+
+ if (m_compiler->getTargetOpts().Triple.find("ios") != std::string::npos)
+ m_compiler->getTargetOpts().ABI = "apcs-gnu";
+
+ m_compiler->createDiagnostics(0, 0);
+
+ // Create the target instance.
+ m_compiler->setTarget(TargetInfo::CreateTargetInfo(m_compiler->getDiagnostics(),
+ m_compiler->getTargetOpts()));
+
+ assert (m_compiler->hasTarget());
+
+ // 3. Set options.
lldb::LanguageType language = expr.Language();
@@ -247,15 +296,12 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope,
if (process_sp->GetObjCLanguageRuntime())
{
if (process_sp->GetObjCLanguageRuntime()->GetRuntimeVersion() == eAppleObjC_V2)
- {
- m_compiler->getLangOpts().ObjCNonFragileABI = true; // NOT i386
- m_compiler->getLangOpts().ObjCNonFragileABI2 = true; // NOT i386
- }
+ m_compiler->getLangOpts().ObjCRuntime.set(ObjCRuntime::MacOSX, VersionTuple(10, 7));
+ else
+ m_compiler->getLangOpts().ObjCRuntime.set(ObjCRuntime::FragileMacOSX, VersionTuple(10, 7));
if (process_sp->GetObjCLanguageRuntime()->HasNewLiteralsAndIndexing())
- {
m_compiler->getLangOpts().DebuggerObjCLiteral = true;
- }
}
}
@@ -270,51 +316,6 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope,
// Disable some warnings.
m_compiler->getDiagnosticOpts().Warnings.push_back("no-unused-value");
- // Set the target triple.
- lldb::TargetSP target_sp;
- if (exe_scope)
- target_sp = exe_scope->CalculateTarget();
-
- // TODO: figure out what to really do when we don't have a valid target.
- // Sometimes this will be ok to just use the host target triple (when we
- // evaluate say "2+3", but other expressions like breakpoint conditions
- // and other things that _are_ target specific really shouldn't just be
- // using the host triple. This needs to be fixed in a better way.
- if (target_sp && target_sp->GetArchitecture().IsValid())
- {
- std::string triple = target_sp->GetArchitecture().GetTriple().str();
-
- int dash_count = 0;
- for (size_t i = 0; i < triple.size(); ++i)
- {
- if (triple[i] == '-')
- dash_count++;
- if (dash_count == 3)
- {
- triple.resize(i);
- break;
- }
- }
-
- m_compiler->getTargetOpts().Triple = triple;
- }
- else
- {
- m_compiler->getTargetOpts().Triple = llvm::sys::getDefaultTargetTriple();
- }
-
- if (m_compiler->getTargetOpts().Triple.find("ios") != std::string::npos)
- m_compiler->getTargetOpts().ABI = "apcs-gnu";
-
- // 3. Set up various important bits of infrastructure.
- m_compiler->createDiagnostics(0, 0);
-
- // Create the target instance.
- m_compiler->setTarget(TargetInfo::CreateTargetInfo(m_compiler->getDiagnostics(),
- m_compiler->getTargetOpts()));
-
- assert (m_compiler->hasTarget());
-
// Inform the target of the language options
//
// FIXME: We shouldn't need to do this, the target should be immutable once
@@ -509,7 +510,7 @@ ClangExpressionParser::PrepareForExecution (lldb::addr_t &func_allocation_addr,
error_stream,
function_name.c_str());
- ir_for_target.runOnModule(*module);
+ bool ir_can_run = ir_for_target.runOnModule(*module);
Error &interpreter_error(ir_for_target.getInterpreterError());
@@ -534,6 +535,13 @@ ClangExpressionParser::PrepareForExecution (lldb::addr_t &func_allocation_addr,
return err;
}
+ else if (!ir_can_run)
+ {
+ err.SetErrorToGenericError();
+ err.SetErrorString("The expression could not be prepared to run in the target");
+
+ return err;
+ }
if (execution_policy != eExecutionPolicyNever &&
m_expr.NeedsValidation() &&
@@ -599,7 +607,18 @@ ClangExpressionParser::PrepareForExecution (lldb::addr_t &func_allocation_addr,
.setAllocateGVsWithCode(true)
.setCodeModel(CodeModel::Small)
.setUseMCJIT(true);
- execution_engine.reset(builder.create());
+
+ llvm::Triple triple(module->getTargetTriple());
+ StringRef mArch;
+ StringRef mCPU;
+ SmallVector<std::string, 0> mAttrs;
+
+ TargetMachine *target_machine = builder.selectTarget(triple,
+ mArch,
+ mCPU,
+ mAttrs);
+
+ execution_engine.reset(builder.create(target_machine));
if (!execution_engine.get())
{
diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp
index 544c4bcaf19..b74e9f97aa7 100644
--- a/lldb/source/Expression/IRForTarget.cpp
+++ b/lldb/source/Expression/IRForTarget.cpp
@@ -15,7 +15,9 @@
#include "llvm/Instructions.h"
#include "llvm/Intrinsics.h"
#include "llvm/Module.h"
+#include "llvm/PassManager.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Transforms/IPO.h"
#include "llvm/ValueSymbolTable.h"
#include "clang/AST/ASTContext.h"
@@ -2630,6 +2632,55 @@ IRForTarget::CompleteDataAllocation ()
}
bool
+IRForTarget::StripAllGVs (Module &llvm_module)
+{
+ lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+ std::vector<GlobalVariable *> global_vars;
+ std::set<GlobalVariable *>erased_vars;
+
+ bool erased = true;
+
+ while (erased)
+ {
+ erased = false;
+
+ for (Module::global_iterator gi = llvm_module.global_begin(), ge = llvm_module.global_end();
+ gi != ge;
+ ++gi)
+ {
+ GlobalVariable *global_var = dyn_cast<GlobalVariable>(gi);
+
+ global_var->removeDeadConstantUsers();
+
+ if (global_var->use_empty())
+ {
+ if (log)
+ log->Printf("Did remove %s",
+ PrintValue(global_var).c_str());
+ global_var->eraseFromParent();
+ erased = true;
+ break;
+ }
+ }
+ }
+
+ for (Module::global_iterator gi = llvm_module.global_begin(), ge = llvm_module.global_end();
+ gi != ge;
+ ++gi)
+ {
+ GlobalVariable *global_var = dyn_cast<GlobalVariable>(gi);
+
+ GlobalValue::use_iterator ui = global_var->use_begin();
+
+ log->Printf("Couldn't remove %s because of %s",
+ PrintValue(global_var).c_str(),
+ PrintValue(*ui).c_str());
+ }
+
+ return true;
+}
+
+bool
IRForTarget::runOnModule (Module &llvm_module)
{
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
@@ -2674,12 +2725,12 @@ IRForTarget::runOnModule (Module &llvm_module)
m_reloc_placeholder = new llvm::GlobalVariable((*m_module),
intptr_ty,
- false /* isConstant */,
+ false /* IsConstant */,
GlobalVariable::InternalLinkage,
Constant::getNullValue(intptr_ty),
"reloc_placeholder",
NULL /* InsertBefore */,
- false /* ThreadLocal */,
+ GlobalVariable::NotThreadLocal /* ThreadLocal */,
0 /* AddressSpace */);
Function::iterator bbi;
@@ -2876,6 +2927,12 @@ IRForTarget::runOnModule (Module &llvm_module)
return false;
}
+ if (!StripAllGVs(llvm_module))
+ {
+ if (log)
+ log->Printf("StripAllGVs() failed");
+ }
+
if (log && log->GetVerbose())
{
std::string s;
OpenPOWER on IntegriCloud