root/src/kits/debugger/dwarf/CfaContext.h
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef CFA_CONTEXT_H
#define CFA_CONTEXT_H


#include <ObjectList.h>

#include "CfaRuleSet.h"
#include "Types.h"


class CfaContext {
public:
                                                                CfaContext();
                                                                ~CfaContext();

                        void                            SetLocation(target_addr_t targetLocation,
                                                                        target_addr_t initialLocation);

                        status_t                        Init(uint32 registerCount);
                        status_t                        SaveInitialRuleSet();

                        status_t                        PushRuleSet();
                        status_t                        PopRuleSet();

                        target_addr_t           TargetLocation() const
                                                                        { return fTargetLocation; }

                        target_addr_t           Location() const
                                                                        { return fLocation; }
                        void                            SetLocation(target_addr_t location);

                        uint32                          CodeAlignment() const
                                                                        { return fCodeAlignment; }
                        void                            SetCodeAlignment(uint32 alignment);

                        int32                           DataAlignment() const
                                                                        { return fDataAlignment; }
                        void                            SetDataAlignment(int32 alignment);

                        uint32                          ReturnAddressRegister() const
                                                                        { return fReturnAddressRegister; }
                        void                            SetReturnAddressRegister(uint32 reg);

                        CfaCfaRule*                     GetCfaCfaRule() const
                                                                        { return fRuleSet->GetCfaCfaRule(); }
                        CfaRule*                        RegisterRule(uint32 index) const
                                                                        { return fRuleSet->RegisterRule(index); }

                        void                            RestoreRegisterRule(uint32 reg);

private:
                        typedef BObjectList<CfaRuleSet, true> RuleSetList;

private:
                        target_addr_t           fTargetLocation;
                        target_addr_t           fLocation;
                        uint32                          fCodeAlignment;
                        int32                           fDataAlignment;
                        uint32                          fReturnAddressRegister;
                        CfaRuleSet*                     fRuleSet;
                        CfaRuleSet*                     fInitialRuleSet;
                        RuleSetList                     fRuleSetStack;
};



#endif  // CFA_CONTEXT_H