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 //===----------------------------------------------------------------------===// 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 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LLVMCONTEXT_H 16 #define LLVM_LLVMCONTEXT_H 17 18 namespace llvm { 19 20 class LLVMContextImpl; 21 class StringRef; 22 class Instruction; 23 class Module; 24 class SMDiagnostic; 25 template <typename T> class SmallVectorImpl; 26 27 /// This is an important class for using LLVM in a threaded context. It 28 /// (opaquely) owns and manages the core "global" data of LLVM's core 29 /// infrastructure, including the type and constant uniquing tables. 30 /// LLVMContext itself provides no locking guarantees, so you should be careful 31 /// to have one context per thread. 32 class LLVMContext { 33 public: 34 LLVMContextImpl *const pImpl; 35 LLVMContext(); 36 ~LLVMContext(); 37 38 // Pinned metadata names, which always have the same value. This is a 39 // compile-time performance optimization, not a correctness optimization. 40 enum { 41 MD_dbg = 0, // "dbg" 42 MD_tbaa = 1, // "tbaa" 43 MD_prof = 2 // "prof" 44 }; 45 46 /// getMDKindID - Return a unique non-zero ID for the specified metadata kind. 47 /// This ID is uniqued across modules in the current LLVMContext. 48 unsigned getMDKindID(StringRef Name) const; 49 50 /// getMDKindNames - Populate client supplied SmallVector with the name for 51 /// custom metadata IDs registered in this LLVMContext. 52 void getMDKindNames(SmallVectorImpl<StringRef> &Result) const; 53 54 55 typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context, 56 unsigned LocCookie); 57 58 /// setInlineAsmDiagnosticHandler - This method sets a handler that is invoked 59 /// when problems with inline asm are detected by the backend. The first 60 /// argument is a function pointer and the second is a context pointer that 61 /// gets passed into the DiagHandler. 62 /// 63 /// LLVMContext doesn't take ownership or interpret either of these 64 /// pointers. 65 void setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler, 66 void *DiagContext = 0); 67 68 /// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by 69 /// setInlineAsmDiagnosticHandler. 70 InlineAsmDiagHandlerTy getInlineAsmDiagnosticHandler() const; 71 72 /// getInlineAsmDiagnosticContext - Return the diagnostic context set by 73 /// setInlineAsmDiagnosticHandler. 74 void *getInlineAsmDiagnosticContext() const; 75 76 77 /// emitError - Emit an error message to the currently installed error handler 78 /// with optional location information. This function returns, so code should 79 /// be prepared to drop the erroneous construct on the floor and "not crash". 80 /// The generated code need not be correct. The error message will be 81 /// implicitly prefixed with "error: " and should not end with a ".". 82 void emitError(unsigned LocCookie, StringRef ErrorStr); 83 void emitError(const Instruction *I, StringRef ErrorStr); 84 void emitError(StringRef ErrorStr); 85 86 private: 87 // DO NOT IMPLEMENT 88 LLVMContext(LLVMContext&); 89 void operator=(LLVMContext&); 90 91 /// addModule - Register a module as being instantiated in this context. If 92 /// the context is deleted, the module will be deleted as well. 93 void addModule(Module*); 94 95 /// removeModule - Unregister a module from this context. 96 void removeModule(Module*); 97 98 // Module needs access to the add/removeModule methods. 99 friend class Module; 100 }; 101 102 /// getGlobalContext - Returns a global context. This is for LLVM clients that 103 /// only care about operating on a single thread. 104 extern LLVMContext &getGlobalContext(); 105 106 } 107 108 #endif 109