⛏️ index : haiku.git

/*
 * 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