| Owen Anderson | 2bc29dc | 2009-06-30 00:48:55 +0000 | [diff] [blame] | 1 | //===-- llvm/LLVMContext.h - Class for managing "global" state --*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| Owen Anderson | 5217007 | 2009-06-30 17:06:46 +0000 | [diff] [blame] | 9 | // |
| 10 | // This file declares LLVMContext, a container of "global" state in LLVM, such |
| 11 | // as the global type and constant uniquing tables. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| Owen Anderson | 2bc29dc | 2009-06-30 00:48:55 +0000 | [diff] [blame] | 14 | |
| 15 | #ifndef LLVM_LLVMCONTEXT_H |
| 16 | #define LLVM_LLVMCONTEXT_H |
| 17 | |
| Craig Topper | 9f9ce61 | 2012-09-17 07:16:40 +0000 | [diff] [blame^] | 18 | #include "llvm/Support/Compiler.h" |
| 19 | |
| Owen Anderson | 2bc29dc | 2009-06-30 00:48:55 +0000 | [diff] [blame] | 20 | namespace llvm { |
| 21 | |
| Benjamin Kramer | 12ddd40 | 2009-08-11 17:45:13 +0000 | [diff] [blame] | 22 | class LLVMContextImpl; |
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 23 | class StringRef; |
| Chris Lattner | 3a4c60c | 2012-01-03 23:47:05 +0000 | [diff] [blame] | 24 | class Twine; |
| Chris Lattner | 38686bd | 2010-04-07 23:40:44 +0000 | [diff] [blame] | 25 | class Instruction; |
| Owen Anderson | 30268be | 2010-09-08 18:03:32 +0000 | [diff] [blame] | 26 | class Module; |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 27 | class SMDiagnostic; |
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 28 | template <typename T> class SmallVectorImpl; |
| Dan Gohman | 82a47e9 | 2009-10-06 17:43:57 +0000 | [diff] [blame] | 29 | |
| Owen Anderson | 5217007 | 2009-06-30 17:06:46 +0000 | [diff] [blame] | 30 | /// This is an important class for using LLVM in a threaded context. It |
| 31 | /// (opaquely) owns and manages the core "global" data of LLVM's core |
| 32 | /// infrastructure, including the type and constant uniquing tables. |
| 33 | /// LLVMContext itself provides no locking guarantees, so you should be careful |
| 34 | /// to have one context per thread. |
| Benjamin Kramer | 12ddd40 | 2009-08-11 17:45:13 +0000 | [diff] [blame] | 35 | class LLVMContext { |
| Owen Anderson | 1e8d5d2 | 2010-09-08 18:22:11 +0000 | [diff] [blame] | 36 | public: |
| 37 | LLVMContextImpl *const pImpl; |
| 38 | LLVMContext(); |
| 39 | ~LLVMContext(); |
| 40 | |
| Chris Lattner | ec39f09 | 2010-03-30 23:03:27 +0000 | [diff] [blame] | 41 | // Pinned metadata names, which always have the same value. This is a |
| 42 | // compile-time performance optimization, not a correctness optimization. |
| 43 | enum { |
| Dan Gohman | b2143b6 | 2010-09-14 21:25:10 +0000 | [diff] [blame] | 44 | MD_dbg = 0, // "dbg" |
| Jakub Staszak | 9da9934 | 2011-07-06 18:22:43 +0000 | [diff] [blame] | 45 | MD_tbaa = 1, // "tbaa" |
| Peter Collingbourne | 999f90b | 2011-10-27 19:19:14 +0000 | [diff] [blame] | 46 | MD_prof = 2, // "prof" |
| Duncan Sands | 5e5c5f8 | 2012-04-14 12:36:06 +0000 | [diff] [blame] | 47 | MD_fpmath = 3, // "fpmath" |
| Dan Gohman | b54834b | 2012-09-13 17:56:17 +0000 | [diff] [blame] | 48 | MD_range = 4, // "range" |
| 49 | MD_tbaa_struct = 5 // "tbaa.struct" |
| Chris Lattner | ec39f09 | 2010-03-30 23:03:27 +0000 | [diff] [blame] | 50 | }; |
| 51 | |
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 52 | /// getMDKindID - Return a unique non-zero ID for the specified metadata kind. |
| 53 | /// This ID is uniqued across modules in the current LLVMContext. |
| 54 | unsigned getMDKindID(StringRef Name) const; |
| 55 | |
| 56 | /// getMDKindNames - Populate client supplied SmallVector with the name for |
| Dan Gohman | 5d80911 | 2010-07-20 21:45:17 +0000 | [diff] [blame] | 57 | /// custom metadata IDs registered in this LLVMContext. |
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 58 | void getMDKindNames(SmallVectorImpl<StringRef> &Result) const; |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 59 | |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 60 | |
| 61 | typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context, |
| 62 | unsigned LocCookie); |
| 63 | |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 64 | /// setInlineAsmDiagnosticHandler - This method sets a handler that is invoked |
| 65 | /// when problems with inline asm are detected by the backend. The first |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 66 | /// argument is a function pointer and the second is a context pointer that |
| 67 | /// gets passed into the DiagHandler. |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 68 | /// |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 69 | /// LLVMContext doesn't take ownership or interpret either of these |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 70 | /// pointers. |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 71 | void setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler, |
| 72 | void *DiagContext = 0); |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 73 | |
| 74 | /// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by |
| 75 | /// setInlineAsmDiagnosticHandler. |
| Chris Lattner | 4afa128 | 2010-11-17 08:13:01 +0000 | [diff] [blame] | 76 | InlineAsmDiagHandlerTy getInlineAsmDiagnosticHandler() const; |
| Chris Lattner | 42a4ee0 | 2010-04-06 00:44:45 +0000 | [diff] [blame] | 77 | |
| 78 | /// getInlineAsmDiagnosticContext - Return the diagnostic context set by |
| 79 | /// setInlineAsmDiagnosticHandler. |
| 80 | void *getInlineAsmDiagnosticContext() const; |
| 81 | |
| Chris Lattner | 38686bd | 2010-04-07 23:40:44 +0000 | [diff] [blame] | 82 | |
| 83 | /// emitError - Emit an error message to the currently installed error handler |
| 84 | /// with optional location information. This function returns, so code should |
| 85 | /// be prepared to drop the erroneous construct on the floor and "not crash". |
| 86 | /// The generated code need not be correct. The error message will be |
| 87 | /// implicitly prefixed with "error: " and should not end with a ".". |
| Chris Lattner | 3a4c60c | 2012-01-03 23:47:05 +0000 | [diff] [blame] | 88 | void emitError(unsigned LocCookie, const Twine &ErrorStr); |
| 89 | void emitError(const Instruction *I, const Twine &ErrorStr); |
| 90 | void emitError(const Twine &ErrorStr); |
| Owen Anderson | eb92330 | 2010-09-08 18:41:07 +0000 | [diff] [blame] | 91 | |
| 92 | private: |
| Craig Topper | 9f9ce61 | 2012-09-17 07:16:40 +0000 | [diff] [blame^] | 93 | LLVMContext(LLVMContext&) LLVM_DELETED_FUNCTION; |
| 94 | void operator=(LLVMContext&) LLVM_DELETED_FUNCTION; |
| Owen Anderson | eb92330 | 2010-09-08 18:41:07 +0000 | [diff] [blame] | 95 | |
| 96 | /// addModule - Register a module as being instantiated in this context. If |
| 97 | /// the context is deleted, the module will be deleted as well. |
| 98 | void addModule(Module*); |
| 99 | |
| 100 | /// removeModule - Unregister a module from this context. |
| 101 | void removeModule(Module*); |
| 102 | |
| 103 | // Module needs access to the add/removeModule methods. |
| 104 | friend class Module; |
| Owen Anderson | 2bc29dc | 2009-06-30 00:48:55 +0000 | [diff] [blame] | 105 | }; |
| 106 | |
| Chris Lattner | 0811347 | 2009-12-29 09:01:33 +0000 | [diff] [blame] | 107 | /// getGlobalContext - Returns a global context. This is for LLVM clients that |
| 108 | /// only care about operating on a single thread. |
| 109 | extern LLVMContext &getGlobalContext(); |
| Owen Anderson | db47ed0 | 2009-06-30 23:39:59 +0000 | [diff] [blame] | 110 | |
| Owen Anderson | 2bc29dc | 2009-06-30 00:48:55 +0000 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | #endif |