blob: 1e6ddefa06ba4cde251113a9139a24ec1fd3c562 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Intel, Vyacheslav P. Shakin, Mikhail Y. Fursov
*/
#ifndef _IA32_CFG_H_
#define _IA32_CFG_H_
#include "ControlFlowGraph.h"
#include "MemoryManager.h"
#include "Stl.h"
#include "BitSet.h"
#include "open/types.h"
namespace Jitrino
{
namespace Ia32{
class IRManager;
//=========================================================================================================
// edge with the exception information
//=========================================================================================================
/** class CatchEdge is specialization of Edge representing an edge
from a dispatch node to a handler block
*/
class CatchEdge : public Edge {
friend class IRManager;
public:
/** Returns the caught exception type associated with the edge */
Type * getType()const {return type;}
void setType(Type* _type) {type = _type;}
/** Returns the priority of the edges during exception handling
If the same exception can be handled by several
exception handlers, the handler with the highest priority handles it.
The smaller the priority number the hight is the priority.
*/
U_32 getPriority()const {return priority;}
void setPriority(U_32 p) {priority = p;}
//---------------------------------------------------------------------------------------------
protected:
CatchEdge()
: type(NULL), priority(0) { }
//---------------------------------------------------------------------------------------------
protected:
/** The type of a caught exception */
Type * type;
/** Priority of the edge. If the same exception can be handled by several
exception handlers, the handler with the highest priority handles it.
The smaller the priority number the hight is the priority.
*/
U_32 priority;
//---------------------------------------------------------------------------------------------
};
//=========================================================================================================
// node
//=========================================================================================================
/** class Node is a base class for all nodes in the CFG.*/
class CGNode : public Node {
public:
enum OrderType {
OrderType_Arbitrary=0,
OrderType_Layout,
OrderType_Postorder,
OrderType_Topological,
OrderType_ReversePostorder = OrderType_Topological
};
/** Returns the persistent id of the node (HIR CFG node id resulting to this node) */
U_32 getPersistentId()const {return persistentId; }
/** Sets the persistent id of the node (HIR CFG node id resulting to this node) */
void setPersistentId(U_32 persId) { persistentId = persId; }
IRManager & getIRManager() { return irm; }
virtual void verify();
//---------------------------------------------------------------------------------------------
protected:
CGNode(MemoryManager& mm, IRManager& _irm, Node::Kind kind)
: Node(mm, kind), irm(_irm), liveAtEntry(new (mm) BitSet(mm, 0)), persistentId(0) {}
BitSet* getLiveAtEntry() const {return liveAtEntry;}
IRManager& irm;
BitSet* liveAtEntry;
U_32 persistentId;
friend class IRManager;
};
//=========================================================================================================
// Basic block
//=========================================================================================================
/** class BasicBlock represents basic blocks of a CFG: nodes which can contain intructions */
class BasicBlock : public CGNode {
friend class IRManager;
public:
/** Returns the basic block which is the layout successor of this one
The returned value must be set using setLayoutSucc by a code layout algorithm
*/
BasicBlock * getLayoutSucc()const {return layoutSucc;}
/** Sets the basic block which is the layout successor of this one */
void setLayoutSucc(BasicBlock *bb) {assert(bb!=this); layoutSucc = bb;}
/** sets the offset of native code for this basic block */
void setCodeOffset(U_32 offset) {codeOffset = offset;}
/** returns the offset of native code for this basic block */
U_32 getCodeOffset()const { return codeOffset; }
/** sets the size of native code for this basic block */
void setCodeSize(U_32 size) {codeSize = size;}
/** returns the size of native code for this basic block */
U_32 getCodeSize()const { return codeSize; }
/** returns the pointer to the native code for this basic block */
void* getCodeStartAddr() const;
void verify();
//---------------------------------------------------------------------------------------------
protected:
BasicBlock(MemoryManager& mm, IRManager& irm)
: CGNode(mm, irm, Node::Kind_Block), layoutSucc(NULL), codeOffset(0), codeSize(0), codeAddr(0){}
protected:
BasicBlock * layoutSucc;
U_32 codeOffset;
U_32 codeSize;
void* codeAddr;
};
}; //namespace Ia32
}
#endif // _IA32_FLOWGRAPH_H