Basic Block

原创
2013/11/14 13:58
阅读数 129

WIKI里面对BB的解释:

http://en.wikipedia.org/wiki/Basic_block

GCC文档对BB的解释:

http://gcc.gnu.org/onlinedocs/gccint/Basic-Blocks.html

看着还是GCC的容易理解一点:

A basic block is a straight-line sequence of code with only one entry point and only one exit. In GCC, basic blocks are represented using the basic_block data type. Special basic blocks represent possible entry and exit points of a function. These blocks are called ENTRY_BLOCK_PTR and EXIT_BLOCK_PTR. These blocks do not contain any code.
BB是一个线性的代码序列,有且仅有一个入口和出口。在函数中用于表示入口和出口的BB,不包含任何代码(实际上是一个指针),在GG里面叫 ENTRY_BLOCK_PTR和 EXIT_BLOCK_PTR。

dalvik里面用于描述BB的结构体是这样的:

typedef struct BasicBlock {
    int id;
    bool visited;
    bool hidden;
    unsigned int startOffset;
    const Method *containingMethod;     // For blocks from the callee
    BBType blockType;
    bool needFallThroughBranch;         // For blocks ended due to length limit
    bool isFallThroughFromInvoke;       // True means the block needs alignment
    MIR *firstMIRInsn;
    MIR *lastMIRInsn;
    struct BasicBlock *fallThrough;
    struct BasicBlock *taken;
    struct BasicBlock *iDom;            // Immediate dominator
    struct BasicBlockDataFlow *dataFlowInfo;
    BitVector *predecessors;
    BitVector *dominators;
    BitVector *iDominated;              // Set nodes being immediately dominated
    BitVector *domFrontier;             // Dominance frontier
    struct {                            // For one-to-many successors like
        BlockListType blockListType;    // switch and exception handling
        GrowableList blocks;
    } successorBlockList;
} BasicBlock;

如果我没有猜错,MIR *firstMIRInsn 和 MIR *lastMIRInsn;就是出口和入口地址。

为何这里是MIR类型,而不是汇编,或者是机器码?

因为这是后仅仅是从java->dex->bytecode,dalvik是要先分析完MIR才会去做MIR2LIR。

从Dalvik的代码结果也可以看到,Dataflow.cpp里面的函数都是对BB进行分析的。
到了CodegenDriver(),才进行dvmCompilerMIR2LIR()。(本来这才就是人家google的设计思路)

在进行Frontend.cpp里面的三个大动作dvmCompileMethod(),compileLoop(),dvmCompileTrace()都会进行MIR2LIR的编译。但不一定都会调用dvmCompilerMIR2LIR(),例如method的编译调用的就是dvmCompilerMethodMIR2LIR() 。

但是Dalvik现在只支持trace based的编译,对于method based 的编译方式,是不支持的:-(。

google可能认为method based的方式效能不高?还是实现起来复杂度过高?又或者是由于专利等其它法律原因?

void dvmCompilerMethodMIR2LIR(CompilationUnit *cUnit) {
    // Method-based JIT not supported for ARM.
}
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部