[Lldb-commits] [lldb] r107515 - in /lldb/trunk: include/lldb/Expression/IRToDWARF.h lldb.xcodeproj/project.pbxproj source/Expression/ClangExpression.cpp source/Expression/IRToDWARF.cpp

Sean Callanan scallanan at apple.com
Fri Jul 2 14:09:36 PDT 2010


Author: spyffe
Date: Fri Jul  2 16:09:36 2010
New Revision: 107515

URL: http://llvm.org/viewvc/llvm-project?rev=107515&view=rev
Log:
Added the skeleton of a transformation pass to
convert IR to DWARF.  So far, this pass only
performs a depth-first traversal of the IR,
logging each basic block as it finds it.

Added:
    lldb/trunk/include/lldb/Expression/IRToDWARF.h
    lldb/trunk/source/Expression/IRToDWARF.cpp
Modified:
    lldb/trunk/lldb.xcodeproj/project.pbxproj
    lldb/trunk/source/Expression/ClangExpression.cpp

Added: lldb/trunk/include/lldb/Expression/IRToDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/IRToDWARF.h?rev=107515&view=auto
==============================================================================
--- lldb/trunk/include/lldb/Expression/IRToDWARF.h (added)
+++ lldb/trunk/include/lldb/Expression/IRToDWARF.h Fri Jul  2 16:09:36 2010
@@ -0,0 +1,49 @@
+//===-- IRToDWARF.h ---------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_IRToDWARF_h_
+#define liblldb_IRToDWARF_h_
+
+#include "llvm/Pass.h"
+#include "llvm/PassManager.h"
+
+namespace llvm {
+    class BasicBlock;
+    class Module;
+}
+
+namespace lldb_private {
+    class ClangExpressionVariableList;
+    class ClangExpressionDeclMap;
+    class StreamString;
+}
+
+class Relocator;
+
+class IRToDWARF : public llvm::ModulePass
+{
+public:
+    IRToDWARF(const void *pid,
+              lldb_private::ClangExpressionVariableList &variable_list, 
+              lldb_private::ClangExpressionDeclMap *decl_map,
+              lldb_private::StreamString &strm);
+    ~IRToDWARF();
+    bool runOnModule(llvm::Module &M);
+    void assignPassManager(llvm::PMStack &PMS,
+                           llvm::PassManagerType T = llvm::PMT_ModulePassManager);
+    llvm::PassManagerType getPotentialPassManagerType() const;
+private:
+    bool runOnBasicBlock(llvm::BasicBlock &BB, Relocator &Relocator);
+    
+    lldb_private::ClangExpressionVariableList &m_variable_list;
+    lldb_private::ClangExpressionDeclMap *m_decl_map;
+    lldb_private::StreamString &m_strm;
+};
+
+#endif
\ No newline at end of file

Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=107515&r1=107514&r2=107515&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Fri Jul  2 16:09:36 2010
@@ -332,6 +332,8 @@
 		49A8A3A411D568BF00AD3B68 /* ClangResultSynthesizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 49A8A3A311D568BF00AD3B68 /* ClangResultSynthesizer.h */; };
 		49D7072711B5AD03001AD875 /* ClangASTSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 49D7072611B5AD03001AD875 /* ClangASTSource.h */; };
 		49D7072911B5AD11001AD875 /* ClangASTSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49D7072811B5AD11001AD875 /* ClangASTSource.cpp */; settings = {COMPILER_FLAGS = "-fno-rtti"; }; };
+		49DA743011DE6A5A006AEF7E /* IRToDWARF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA742F11DE6A5A006AEF7E /* IRToDWARF.cpp */; };
+		49DA743511DE6BB2006AEF7E /* IRToDWARF.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DA743411DE6BB2006AEF7E /* IRToDWARF.h */; };
 		49F1A74611B3388F003ED505 /* ClangExpressionDeclMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49F1A74511B3388F003ED505 /* ClangExpressionDeclMap.cpp */; };
 		49F1A74A11B338AE003ED505 /* ClangExpressionDeclMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F1A74911B338AE003ED505 /* ClangExpressionDeclMap.h */; };
 		4C08CDE811C81EF8001610A8 /* ThreadSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C08CDE711C81EF8001610A8 /* ThreadSpec.cpp */; };
@@ -904,6 +906,8 @@
 		49BF48E011ADF37D008863BD /* ObjCObjectPrinter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ObjCObjectPrinter.h; path = include/lldb/Target/ObjCObjectPrinter.h; sourceTree = "<group>"; };
 		49D7072611B5AD03001AD875 /* ClangASTSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClangASTSource.h; path = include/lldb/Expression/ClangASTSource.h; sourceTree = "<group>"; };
 		49D7072811B5AD11001AD875 /* ClangASTSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangASTSource.cpp; path = source/Expression/ClangASTSource.cpp; sourceTree = "<group>"; };
+		49DA742F11DE6A5A006AEF7E /* IRToDWARF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = IRToDWARF.cpp; path = source/Expression/IRToDWARF.cpp; sourceTree = "<group>"; };
+		49DA743411DE6BB2006AEF7E /* IRToDWARF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IRToDWARF.h; path = include/lldb/Expression/IRToDWARF.h; sourceTree = "<group>"; };
 		49EC3E98118F90AC00B1265E /* ThreadPlanCallFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadPlanCallFunction.cpp; path = source/Target/ThreadPlanCallFunction.cpp; sourceTree = "<group>"; };
 		49EC3E9C118F90D400B1265E /* ThreadPlanCallFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadPlanCallFunction.h; path = include/lldb/Target/ThreadPlanCallFunction.h; sourceTree = "<group>"; };
 		49F1A74511B3388F003ED505 /* ClangExpressionDeclMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangExpressionDeclMap.cpp; path = source/Expression/ClangExpressionDeclMap.cpp; sourceTree = "<group>"; };
@@ -1832,6 +1836,8 @@
 				26BC7ED710F1B86700F91463 /* ClangStmtVisitor.cpp */,
 				26BC7DC310F1B79500F91463 /* DWARFExpression.h */,
 				26BC7ED810F1B86700F91463 /* DWARFExpression.cpp */,
+				49DA743411DE6BB2006AEF7E /* IRToDWARF.h */,
+				49DA742F11DE6A5A006AEF7E /* IRToDWARF.cpp */,
 				4C98D3E1118FB98F00E575D0 /* RecordingMemoryManager.h */,
 				4C98D3DB118FB96F00E575D0 /* RecordingMemoryManager.cpp */,
 			);
@@ -2184,6 +2190,7 @@
 				261B5A5511C3F2AD00AABD0A /* SharingPtr.h in Headers */,
 				4C08CDEC11C81F1E001610A8 /* ThreadSpec.h in Headers */,
 				49A8A3A411D568BF00AD3B68 /* ClangResultSynthesizer.h in Headers */,
+				49DA743511DE6BB2006AEF7E /* IRToDWARF.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2633,6 +2640,7 @@
 				261B5A5411C3F2AD00AABD0A /* SharingPtr.cpp in Sources */,
 				4C08CDE811C81EF8001610A8 /* ThreadSpec.cpp in Sources */,
 				49A8A3A011D568A300AD3B68 /* ClangResultSynthesizer.cpp in Sources */,
+				49DA743011DE6A5A006AEF7E /* IRToDWARF.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: lldb/trunk/source/Expression/ClangExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpression.cpp?rev=107515&r1=107514&r2=107515&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangExpression.cpp (original)
+++ lldb/trunk/source/Expression/ClangExpression.cpp Fri Jul  2 16:09:36 2010
@@ -58,6 +58,7 @@
 #include "lldb/Expression/ClangASTSource.h"
 #include "lldb/Expression/ClangResultSynthesizer.h"
 #include "lldb/Expression/ClangStmtVisitor.h"
+#include "lldb/Expression/IRToDWARF.h"
 #include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Expression/RecordingMemoryManager.h"
 #include "lldb/Target/ExecutionContext.h"
@@ -473,7 +474,7 @@
 }
 
 unsigned
-ClangExpression::ConvertIRToDWARF (ClangExpressionVariableList &excpr_local_variable_list,
+ClangExpression::ConvertIRToDWARF (ClangExpressionVariableList &expr_local_variable_list,
                                    StreamString &dwarf_opcode_strm)
 {
     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
@@ -488,46 +489,9 @@
         return 1;
     }
     
-    llvm::Function* function = module->getFunction(StringRef("___clang_expr"));
+    IRToDWARF ir_to_dwarf("IR to DWARF", expr_local_variable_list, m_decl_map, dwarf_opcode_strm);
     
-    if (!function)
-    {
-        if (log)
-            log->Printf("Couldn't find ___clang_expr() in the module");
-        
-        return 1;
-    }
-            
-    if (log)
-        log->Printf("IR for %s:", function->getName().str().c_str());
-            
-    llvm::Function::iterator bbi;
-            
-    for (bbi = function->begin();
-         bbi != function->end();
-         ++bbi)
-    {
-        llvm::BasicBlock &bb = *bbi;
-                
-        llvm::BasicBlock::iterator ii;
-                
-        for (ii = bb.begin();
-             ii != bb.end();
-             ++ii)
-        {
-            llvm::Instruction &inst = *ii;
-            
-            std::string s;
-            llvm::raw_string_ostream os(s);
-            
-            inst.print(os);
-            
-            if (log)
-                log->Printf("  %s", s.c_str());
-        }
-    }
-    
-    return 0;
+    return ir_to_dwarf.runOnModule(*module);
 }
 
 bool

Added: lldb/trunk/source/Expression/IRToDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRToDWARF.cpp?rev=107515&view=auto
==============================================================================
--- lldb/trunk/source/Expression/IRToDWARF.cpp (added)
+++ lldb/trunk/source/Expression/IRToDWARF.cpp Fri Jul  2 16:09:36 2010
@@ -0,0 +1,222 @@
+//===-- IRToDWARF.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/IRToDWARF.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 "lldb/Expression/ClangExpressionVariable.h"
+
+#include <map>
+
+using namespace llvm;
+
+IRToDWARF::IRToDWARF(const void *pid,
+                     lldb_private::ClangExpressionVariableList &variable_list, 
+                     lldb_private::ClangExpressionDeclMap *decl_map,
+                     lldb_private::StreamString &strm) :
+    ModulePass(pid),
+    m_variable_list(variable_list),
+    m_decl_map(decl_map),
+    m_strm(strm)
+{
+}
+
+IRToDWARF::~IRToDWARF()
+{
+}
+
+class Relocator
+{
+public:
+    Relocator()
+    {
+    }
+    
+    ~Relocator()
+    {
+    }
+    
+    void MarkBasicBlock(BasicBlock *bb, uint16_t offset)
+    {
+        m_basic_blocks[bb] = offset;
+    }
+    
+    bool BasicBlockIsMarked(BasicBlock *bb)
+    {
+        return m_basic_blocks.find(bb) != m_basic_blocks.end();
+    }
+    
+    void MarkRelocation(BasicBlock *bb, uint16_t offset)
+    {
+        m_relocations[offset] = bb;
+    }
+    
+    bool ResolveRelocations(lldb_private::StreamString &strm)
+    {
+        std::map<uint16_t, BasicBlock*>::const_iterator iter;
+        
+        lldb_private::StreamString swapper(0, 32, strm.GetByteOrder());
+        
+        // This array must be delete [] d at every exit
+        size_t temporary_bufsize = strm.GetSize();
+        uint8_t *temporary_buffer(new uint8_t[temporary_bufsize]);
+        
+        memcpy(temporary_buffer, strm.GetData(), temporary_bufsize);
+                
+        for (iter = m_relocations.begin();
+             iter != m_relocations.end();
+             ++iter)
+        {
+            const std::pair<uint16_t, BasicBlock*> &pair = *iter;
+            
+            uint16_t off = pair.first;
+            BasicBlock *bb = pair.second;
+            
+            if (m_basic_blocks.find(bb) == m_basic_blocks.end())
+            {
+                delete [] temporary_buffer;
+                return false;
+            }
+                
+            uint16_t target_off = m_basic_blocks[bb];
+            
+            int16_t relative = (int16_t)target_off - (int16_t)off;
+            
+            swapper.Clear();
+            swapper << target_off;
+            
+            memcpy(temporary_buffer + off, swapper.GetData(), sizeof(uint16_t));
+        }
+        
+        strm.Clear();
+        strm.Write(temporary_buffer, temporary_bufsize);
+        
+        delete [] temporary_buffer;
+        return true;
+    }
+private:
+    std::map<BasicBlock*, uint16_t> m_basic_blocks;
+    std::map<uint16_t, BasicBlock*> m_relocations;
+};
+
+bool
+IRToDWARF::runOnBasicBlock(BasicBlock &BB, Relocator &R)
+{
+    lldb_private::Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
+    
+    ///////////////////////////////////////
+    // Mark the current block as visited
+    //
+    
+    size_t stream_size = m_strm.GetSize();
+    
+    if (stream_size > 0xffff)
+        return false;
+    
+    uint16_t offset = stream_size & 0xffff;
+    
+    R.MarkBasicBlock(&BB, offset);
+    
+    ////////////////////////////////////////////////
+    // Translate the current basic block to DWARF
+    //
+    
+    if (log)
+    {
+        log->Printf("Translating a basic block:");
+    
+        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());
+        }
+    }
+    
+    /////////////////////////////////////////////////
+    // Visit all successors we haven't visited yet
+    //
+    
+    TerminatorInst *arnold = BB.getTerminator();
+    
+    if (!arnold)
+        return false;
+    
+    unsigned successor_index;
+    unsigned num_successors = arnold->getNumSuccessors();
+    
+    for (successor_index = 0;
+         successor_index < num_successors;
+         ++successor_index)
+    {
+        BasicBlock *successor = arnold->getSuccessor(successor_index);
+        
+        if (!R.BasicBlockIsMarked(successor))
+        {
+            if (!runOnBasicBlock(*successor, R))
+                return false;
+        }
+    }
+    
+    return true;
+}
+
+bool
+IRToDWARF::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 1;
+    }
+    
+    Relocator relocator;
+    
+    llvm::BasicBlock &currentBB = function->getEntryBlock();
+    
+    runOnBasicBlock(currentBB, relocator);
+    
+    return relocator.ResolveRelocations(m_strm);    
+}
+
+void
+IRToDWARF::assignPassManager(PMStack &PMS,
+                                 PassManagerType T)
+{
+}
+
+PassManagerType
+IRToDWARF::getPotentialPassManagerType() const
+{
+    return PMT_ModulePassManager;
+}





More information about the lldb-commits mailing list