mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-19 01:34:32 +00:00
ef9b9a7939
This patch replaces the SymbolTable class with ValueSymbolTable which does not support types planes. This means that all symbol names in LLVM must now be unique. The patch addresses the necessary changes to deal with this and removes code no longer needed as a result. This completes the bulk of the changes for this PR. Some cleanup patches will follow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33918 91177308-0d34-0410-b5e6-96231b3b80d8
326 lines
12 KiB
C++
326 lines
12 KiB
C++
//===-- BytecodeHandler.h - Handle Bytecode Parsing Events ------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by Reid Spencer and is distributed under the
|
|
// University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This header file defines the interface to the Bytecode Handler. The handler
|
|
// is called by the Bytecode Reader to obtain out-of-band parsing events for
|
|
// tasks other then LLVM IR construction.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_BYTECODE_BYTECODEHANDLER_H
|
|
#define LLVM_BYTECODE_BYTECODEHANDLER_H
|
|
|
|
#include "llvm/Module.h"
|
|
|
|
namespace llvm {
|
|
|
|
class ArrayType;
|
|
class StructType;
|
|
class PointerType;
|
|
class PackedType;
|
|
class ConstantArray;
|
|
class Module;
|
|
|
|
/// This class provides the interface for handling bytecode events during
|
|
/// reading of bytecode. The methods on this interface are invoked by the
|
|
/// BytecodeReader as it discovers the content of a bytecode stream.
|
|
/// This class provides a a clear separation of concerns between recognizing
|
|
/// the semantic units of a bytecode file (the Reader) and deciding what to do
|
|
/// with them (the Handler).
|
|
///
|
|
/// The BytecodeReader recognizes the content of the bytecode file and
|
|
/// calls the BytecodeHandler methods to let it perform additional tasks. This
|
|
/// arrangement allows Bytecode files to be read and handled for a number of
|
|
/// purposes simply by creating a subclass of BytecodeHandler. None of the
|
|
/// parsing details need to be understood, only the meaning of the calls
|
|
/// made on this interface.
|
|
///
|
|
/// @see BytecodeHandler
|
|
/// @brief Handle Bytecode Parsing Events
|
|
class BytecodeHandler {
|
|
|
|
/// @name Constructors And Operators
|
|
/// @{
|
|
public:
|
|
/// @brief Default constructor (empty)
|
|
BytecodeHandler() {}
|
|
/// @brief Virtual destructor (empty)
|
|
virtual ~BytecodeHandler();
|
|
|
|
private:
|
|
BytecodeHandler(const BytecodeHandler &); // DO NOT IMPLEMENT
|
|
void operator=(const BytecodeHandler &); // DO NOT IMPLEMENT
|
|
|
|
/// @}
|
|
/// @name Handler Methods
|
|
/// @{
|
|
public:
|
|
|
|
/// This method is called whenever the parser detects an error in the
|
|
/// bytecode formatting. It gives the handler a chance to do something
|
|
/// with the error message before the parser throws an exception to
|
|
/// terminate the parsing.
|
|
/// @brief Handle parsing errors.
|
|
virtual void handleError(const std::string& str ) {}
|
|
|
|
/// This method is called at the beginning of a parse before anything is
|
|
/// read in order to give the handler a chance to initialize.
|
|
/// @brief Handle the start of a bytecode parse
|
|
virtual void handleStart( Module* Mod, unsigned byteSize ) {}
|
|
|
|
/// This method is called at the end of a parse after everything has been
|
|
/// read in order to give the handler a chance to terminate.
|
|
/// @brief Handle the end of a bytecode parse
|
|
virtual void handleFinish() {}
|
|
|
|
/// This method is called at the start of a module to indicate that a
|
|
/// module is being parsed.
|
|
/// @brief Handle the start of a module.
|
|
virtual void handleModuleBegin(const std::string& moduleId) {}
|
|
|
|
/// This method is called at the end of a module to indicate that the module
|
|
/// previously being parsed has concluded.
|
|
/// @brief Handle the end of a module.
|
|
virtual void handleModuleEnd(
|
|
const std::string& moduleId ///< An identifier for the module
|
|
) {}
|
|
|
|
/// This method is called once the version information has been parsed. It
|
|
/// provides the information about the version of the bytecode file being
|
|
/// read.
|
|
/// @brief Handle the bytecode prolog
|
|
virtual void handleVersionInfo(
|
|
unsigned char RevisionNum ///< Byte code revision number
|
|
) {}
|
|
|
|
/// This method is called at the start of a module globals block which
|
|
/// contains the global variables and the function placeholders
|
|
virtual void handleModuleGlobalsBegin() {}
|
|
|
|
/// This method is called when a non-initialized global variable is
|
|
/// recognized. Its type, constness, and linkage type are provided.
|
|
/// @brief Handle a non-initialized global variable
|
|
virtual void handleGlobalVariable(
|
|
const Type* ElemType, ///< The type of the global variable
|
|
bool isConstant, ///< Whether the GV is constant or not
|
|
GlobalValue::LinkageTypes,///< The linkage type of the GV
|
|
GlobalValue::VisibilityTypes,///< The visibility style of the GV
|
|
unsigned SlotNum, ///< Slot number of GV
|
|
unsigned initSlot ///< Slot number of GV's initializer (0 if none)
|
|
) {}
|
|
|
|
/// This method is called when a type list is recognized. It simply
|
|
/// provides the number of types that the list contains. The handler
|
|
/// should expect that number of calls to handleType.
|
|
/// @brief Handle a type
|
|
virtual void handleTypeList(
|
|
unsigned numEntries ///< The number of entries in the type list
|
|
) {}
|
|
|
|
/// This method is called when a new type is recognized. The type is
|
|
/// converted from the bytecode and passed to this method.
|
|
/// @brief Handle a type
|
|
virtual void handleType(
|
|
const Type* Ty ///< The type that was just recognized
|
|
) {}
|
|
|
|
/// This method is called when the function prototype for a function is
|
|
/// encountered in the module globals block.
|
|
virtual void handleFunctionDeclaration(
|
|
Function* Func ///< The function being declared
|
|
) {}
|
|
|
|
/// This method is called when a global variable is initialized with
|
|
/// its constant value. Because of forward referencing, etc. this is
|
|
/// done towards the end of the module globals block
|
|
virtual void handleGlobalInitializer(GlobalVariable*, Constant* ) {}
|
|
|
|
/// This method is called for each dependent library name found
|
|
/// in the module globals block.
|
|
virtual void handleDependentLibrary(const std::string& libName) {}
|
|
|
|
/// This method is called if the module globals has a non-empty target
|
|
/// triple
|
|
virtual void handleTargetTriple(const std::string& triple) {}
|
|
|
|
/// This method is called at the end of the module globals block.
|
|
/// @brief Handle end of module globals block.
|
|
virtual void handleModuleGlobalsEnd() {}
|
|
|
|
/// This method is called at the beginning of a compaction table.
|
|
/// @brief Handle start of compaction table.
|
|
virtual void handleCompactionTableBegin() {}
|
|
|
|
/// @brief Handle start of a compaction table plane
|
|
virtual void handleCompactionTablePlane(
|
|
unsigned Ty, ///< The type of the plane (slot number)
|
|
unsigned NumEntries ///< The number of entries in the plane
|
|
) {}
|
|
|
|
/// @brief Handle a type entry in the compaction table
|
|
virtual void handleCompactionTableType(
|
|
unsigned i, ///< Index in the plane of this type
|
|
unsigned TypSlot, ///< Slot number for this type
|
|
const Type* ///< The type referenced by this slot
|
|
) {}
|
|
|
|
/// @brief Handle a value entry in the compaction table
|
|
virtual void handleCompactionTableValue(
|
|
unsigned i, ///< Index in the compaction table's type plane
|
|
unsigned TypSlot, ///< The slot (plane) of the type of this value
|
|
unsigned ValSlot ///< The global value slot of the value
|
|
) {}
|
|
|
|
/// @brief Handle end of a compaction table
|
|
virtual void handleCompactionTableEnd() {}
|
|
|
|
/// @brief Handle start of a symbol table
|
|
virtual void handleTypeSymbolTableBegin(
|
|
TypeSymbolTable* ST ///< The symbol table being filled
|
|
) {}
|
|
|
|
/// @brief Handle start of a symbol table
|
|
virtual void handleValueSymbolTableBegin(
|
|
Function* Func, ///< The function to which the ST belongs or 0 for Mod
|
|
ValueSymbolTable* ST ///< The symbol table being filled
|
|
) {}
|
|
|
|
/// @brief Handle a named type in the symbol table
|
|
virtual void handleSymbolTableType(
|
|
unsigned i, ///< The index of the type in this plane
|
|
unsigned slot, ///< Slot number of the named type
|
|
const std::string& name ///< Name of the type
|
|
) {}
|
|
|
|
/// @brief Handle a named value in the symbol table
|
|
virtual void handleSymbolTableValue(
|
|
unsigned i, ///< The index of the value in this plane
|
|
unsigned slot, ///< Slot number of the named value
|
|
const std::string& name ///< Name of the value.
|
|
) {}
|
|
|
|
/// @brief Handle the end of a value symbol table
|
|
virtual void handleTypeSymbolTableEnd() {}
|
|
|
|
/// @brief Handle the end of a type symbol table
|
|
virtual void handleValueSymbolTableEnd() {}
|
|
|
|
/// @brief Handle the beginning of a function body
|
|
virtual void handleFunctionBegin(
|
|
Function* Func, ///< The function being defined
|
|
unsigned Size ///< The size (in bytes) of the function's bytecode
|
|
) {}
|
|
|
|
/// @brief Handle the end of a function body
|
|
virtual void handleFunctionEnd(
|
|
Function* Func ///< The function whose definition has just finished.
|
|
) {}
|
|
|
|
/// @brief Handle the beginning of a basic block
|
|
virtual void handleBasicBlockBegin(
|
|
unsigned blocknum ///< The block number of the block
|
|
) {}
|
|
|
|
/// This method is called for each instruction that is parsed.
|
|
/// @returns true if the instruction is a block terminating instruction
|
|
/// @brief Handle an instruction
|
|
virtual bool handleInstruction(
|
|
unsigned Opcode, ///< Opcode of the instruction
|
|
const Type* iType, ///< Instruction type
|
|
std::vector<unsigned>& Operands, ///< Vector of slot # operands
|
|
Instruction *Inst, ///< The resulting instruction
|
|
unsigned Length ///< Length of instruction in bc bytes
|
|
) { return false; }
|
|
|
|
/// @brief Handle the end of a basic block
|
|
virtual void handleBasicBlockEnd(
|
|
unsigned blocknum ///< The block number of the block just finished
|
|
) {}
|
|
|
|
/// @brief Handle start of global constants block.
|
|
virtual void handleGlobalConstantsBegin() {}
|
|
|
|
/// @brief Handle a constant expression
|
|
virtual void handleConstantExpression(
|
|
unsigned Opcode, ///< Opcode of primary expression operator
|
|
std::vector<Constant*> ArgVec, ///< expression args
|
|
Constant* C ///< The constant value
|
|
) {}
|
|
|
|
/// @brief Handle a constant array
|
|
virtual void handleConstantArray(
|
|
const ArrayType* AT, ///< Type of the array
|
|
std::vector<Constant*>& ElementSlots,///< Slot nums for array values
|
|
unsigned TypeSlot, ///< Slot # of type
|
|
Constant* Val ///< The constant value
|
|
) {}
|
|
|
|
/// @brief Handle a constant structure
|
|
virtual void handleConstantStruct(
|
|
const StructType* ST, ///< Type of the struct
|
|
std::vector<Constant*>& ElementSlots,///< Slot nums for struct values
|
|
Constant* Val ///< The constant value
|
|
) {}
|
|
|
|
/// @brief Handle a constant packed
|
|
virtual void handleConstantPacked(
|
|
const PackedType* PT, ///< Type of the array
|
|
std::vector<Constant*>& ElementSlots,///< Slot nums for packed values
|
|
unsigned TypeSlot, ///< Slot # of type
|
|
Constant* Val ///< The constant value
|
|
) {}
|
|
|
|
/// @brief Handle a constant pointer
|
|
virtual void handleConstantPointer(
|
|
const PointerType* PT, ///< Type of the pointer
|
|
unsigned Slot, ///< Slot num of initializer value
|
|
GlobalValue* GV ///< Referenced global value
|
|
) {}
|
|
|
|
/// @brief Handle a constant strings (array special case)
|
|
virtual void handleConstantString(
|
|
const ConstantArray* CA ///< Type of the string array
|
|
) {}
|
|
|
|
/// @brief Handle a primitive constant value
|
|
virtual void handleConstantValue(
|
|
Constant * c ///< The constant just defined
|
|
) {}
|
|
|
|
/// @brief Handle the end of the global constants
|
|
virtual void handleGlobalConstantsEnd() {}
|
|
|
|
/// @brief Handle an alignment event
|
|
virtual void handleAlignment(
|
|
unsigned numBytes ///< The number of bytes added for alignment
|
|
) {}
|
|
|
|
/// @brief Handle a bytecode block
|
|
virtual void handleBlock(
|
|
unsigned BType, ///< The type of block
|
|
const unsigned char* StartPtr, ///< The start of the block
|
|
unsigned Size ///< The size of the block
|
|
) {}
|
|
|
|
/// @brief Handle a variable bit rate 32 bit unsigned
|
|
virtual void handleVBR32(
|
|
unsigned Size ///< Number of bytes the vbr_uint took up
|
|
) {}
|
|
|
|
/// @brief Handle a variable bit rate 64 bit unsigned
|
|
virtual void handleVBR64(
|
|
unsigned Size ///< Number of byte sthe vbr_uint64 took up
|
|
) {}
|
|
/// @}
|
|
|
|
};
|
|
|
|
}
|
|
#endif
|