Index: lib/Transforms/NaCl/ExceptionInfoWriter.h |
diff --git a/lib/Transforms/NaCl/ExceptionInfoWriter.h b/lib/Transforms/NaCl/ExceptionInfoWriter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dadaaf76158c5162a0930c434b509fcdbd938f31 |
--- /dev/null |
+++ b/lib/Transforms/NaCl/ExceptionInfoWriter.h |
@@ -0,0 +1,71 @@ |
+//===-- 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<Constant *, 10> TypeTableData; |
+ // Mapping from std::type_info* pointer to type ID (index in |
+ // TypeTableData). |
+ typedef DenseMap<Constant *, unsigned> TypeTableIDMapType; |
+ TypeTableIDMapType TypeTableIDMap; |
+ |
+ // Data for populating __pnacl_eh_action_table[], which is an array |
+ // of pairs. |
+ SmallVector<Constant *, 10> ActionTableData; |
+ // Pair of (clause_id, clause_list_id). |
+ typedef std::pair<unsigned, unsigned> ActionTableEntry; |
+ // Mapping from (clause_id, clause_list_id) to clause_id (index in |
+ // ActionTableData). |
+ typedef DenseMap<ActionTableEntry, unsigned> ActionTableIDMapType; |
+ ActionTableIDMapType ActionTableIDMap; |
+ |
+ // Data for populating __pnacl_eh_filter_table[], which is an array |
+ // of integers. |
+ SmallVector<Constant *, 10> 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 |