Files
clang-p2996/lldb/source/Expression/IRForTarget.cpp
Sean Callanan 2ab712f212 Added the skeleton of an IR transformer that will
prepare IR for execution in the target.  Wired the
expression command to use this IR transformer when
conversion to DWARF fails, and wired conversion to
DWARF to always fail (well, we don't generate any
DWARF...)

llvm-svn: 107559
2010-07-03 01:35:46 +00:00

110 lines
2.5 KiB
C++

//===-- IRForTarget.cpp -------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Expression/IRForTarget.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/InstrTypes.h"
#include "llvm/Module.h"
#include "lldb/Core/dwarf.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Expression/ClangExpressionDeclMap.h"
#include <map>
using namespace llvm;
IRForTarget::IRForTarget(const void *pid,
lldb_private::ClangExpressionDeclMap *decl_map) :
ModulePass(pid),
m_decl_map(decl_map)
{
}
IRForTarget::~IRForTarget()
{
}
bool
IRForTarget::runOnBasicBlock(BasicBlock &BB)
{
lldb_private::Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
/////////////////////////////////////////////////////////////////////////
// Prepare the current basic block for execution in the remote process
//
if (log)
{
log->Printf("Preparing basic block %s:",
BB.hasName() ? BB.getNameStr().c_str() : "[anonymous]");
llvm::BasicBlock::iterator ii;
for (ii = BB.begin();
ii != BB.end();
++ii)
{
llvm::Instruction &inst = *ii;
std::string s;
raw_string_ostream os(s);
inst.print(os);
if (log)
log->Printf(" %s", s.c_str());
}
}
return true;
}
bool
IRForTarget::runOnModule(Module &M)
{
lldb_private::Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
llvm::Function* function = M.getFunction(StringRef("___clang_expr"));
if (!function)
{
if (log)
log->Printf("Couldn't find ___clang_expr() in the module");
return false;
}
llvm::Function::iterator bbi;
for (bbi = function->begin();
bbi != function->end();
++bbi)
{
runOnBasicBlock(*bbi);
}
return true;
}
void
IRForTarget::assignPassManager(PMStack &PMS,
PassManagerType T)
{
}
PassManagerType
IRForTarget::getPotentialPassManagerType() const
{
return PMT_ModulePassManager;
}