//===-- ExceptionInfoWriter.h - Generate C++ exception info------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef TRANSFORMS_NACL_EXCEPTIONINFOWRITER_H #define TRANSFORMS_NACL_EXCEPTIONINFOWRITER_H #include "llvm/ADT/DenseMap.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" namespace llvm { // The ExceptionInfoWriter class converts the clauses of a // "landingpad" instruction into data tables stored in global // variables, which are interpreted by PNaCl's C++ runtime library. // See ExceptionInfoWriter.cpp for a full description. class ExceptionInfoWriter { LLVMContext *Context; StructType *ActionTableEntryTy; // Data for populating __pnacl_eh_type_table[], which is an array of // std::type_info* pointers. Each of these pointers represents a // C++ exception type. SmallVector TypeTableData; // Mapping from std::type_info* pointer to type ID (index in // TypeTableData). typedef DenseMap TypeTableIDMapType; TypeTableIDMapType TypeTableIDMap; // Data for populating __pnacl_eh_action_table[], which is an array // of pairs. SmallVector ActionTableData; // Pair of (clause_id, clause_list_id). typedef std::pair ActionTableEntry; // Mapping from (clause_id, clause_list_id) to clause_id (index in // ActionTableData). typedef DenseMap ActionTableIDMapType; ActionTableIDMapType ActionTableIDMap; // Data for populating __pnacl_eh_filter_table[], which is an array // of integers. SmallVector FilterTableData; // Get the interned ID for an action. unsigned getIDForClauseListNode(unsigned ClauseID, unsigned NextClauseListID); // Get the clause ID for a "filter" clause. unsigned getIDForFilterClause(Value *Filter); public: explicit ExceptionInfoWriter(LLVMContext *Context); // Get the interned type ID (a small integer) for a C++ exception type. unsigned getIDForExceptionType(Value *Ty); // Get the clause list ID for a landingpad's clause list. unsigned getIDForLandingPadClauseList(LandingPadInst *LP); // Add the exception info tables to the module. void defineGlobalVariables(Module *M); }; } #endif