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

#include "DataReader.h"
#include "Types.h"


class LineNumberProgram {
public:
        struct State;

public:
                                                                LineNumberProgram(uint8 addressSize, bool isBigEndian);
                                                                ~LineNumberProgram();

                        status_t                        Init(const void* program, size_t programSize,
                                                                        uint8 minInstructionLength,
                                                                        bool defaultIsStatement, int8 lineBase,
                                                                        uint8 lineRange, uint8 opcodeBase,
                                                                        const uint8* standardOpcodeLengths);

                        bool                            IsValid() const { return fProgram != NULL; }
                        void                            GetInitialState(State& state) const;
                        bool                            GetNextRow(State& state) const;

private:
                        void                            _SetToInitial(State& state) const;

private:
                        const void*                     fProgram;
                        size_t                          fProgramSize;
                        uint8                           fMinInstructionLength;
                        bool                            fDefaultIsStatement;
                        int8                            fLineBase;
                        uint8                           fLineRange;
                        uint8                           fOpcodeBase;
                        uint8                           fAddressSize;
                        bool                            fIsBigEndian;
                        const uint8*            fStandardOpcodeLengths;
};


struct LineNumberProgram::State {
        target_addr_t   address;
        int32                   file;
        int32                   line;
        int32                   column;
        bool                    isStatement;
        bool                    isBasicBlock;
        bool                    isSequenceEnd;
        bool                    isPrologueEnd;
        bool                    isEpilogueBegin;
        uint32                  instructionSet;
        uint32                  discriminator;

        // when file is set to -1
        const char*             explicitFile;
        uint32                  explicitFileDirIndex;

        DataReader              dataReader;
};


#endif  // LINE_NUMBER_PROGRAM_H