12bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//===-- llvm/LLVMContext.h - Class for managing "global" state --*- C++ -*-===// 22bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 32bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// The LLVM Compiler Infrastructure 42bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 52bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// This file is distributed under the University of Illinois Open Source 62bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// License. See LICENSE.TXT for details. 72bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 82bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//===----------------------------------------------------------------------===// 95217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 105217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// This file declares LLVMContext, a container of "global" state in LLVM, such 115217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// as the global type and constant uniquing tables. 125217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 135217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//===----------------------------------------------------------------------===// 142bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_LLVMCONTEXT_H 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_LLVMCONTEXT_H 172bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 1840be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/Support/CBindingWrapping.h" 199f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper#include "llvm/Support/Compiler.h" 2040be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm-c/Core.h" 219f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper 222bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Andersonnamespace llvm { 232bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 2412ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContextImpl; 25081134741b40b342fb2f85722c9cea5d412489a8Chris Lattnerclass StringRef; 263a4c60ca3b8ab835a71a92c02d288b9582e4a643Chris Lattnerclass Twine; 2738686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattnerclass Instruction; 2830268be89df6444f5ffb585439b3fbfec9055197Owen Andersonclass Module; 294afa12890f679034e9741a687a6ce33f2846f129Chris Lattnerclass SMDiagnostic; 30081134741b40b342fb2f85722c9cea5d412489a8Chris Lattnertemplate <typename T> class SmallVectorImpl; 3182a47e9118c95979ea5fd48f53472416295e51efDan Gohman 325217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson/// This is an important class for using LLVM in a threaded context. It 334e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach/// (opaquely) owns and manages the core "global" data of LLVM's core 345217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson/// infrastructure, including the type and constant uniquing tables. 355217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson/// LLVMContext itself provides no locking guarantees, so you should be careful 365217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson/// to have one context per thread. 3712ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext { 381e8d5d2e2216e024293872a102ecf3be2a34e3d2Owen Andersonpublic: 391e8d5d2e2216e024293872a102ecf3be2a34e3d2Owen Anderson LLVMContextImpl *const pImpl; 401e8d5d2e2216e024293872a102ecf3be2a34e3d2Owen Anderson LLVMContext(); 411e8d5d2e2216e024293872a102ecf3be2a34e3d2Owen Anderson ~LLVMContext(); 424e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 43ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner // Pinned metadata names, which always have the same value. This is a 44ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner // compile-time performance optimization, not a correctness optimization. 45ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner enum { 46b2143b6247901ae4eca2192ee134564c4f5f7853Dan Gohman MD_dbg = 0, // "dbg" 479da9934e27dfb48de77b80a3e20ed2d869b52024Jakub Staszak MD_tbaa = 1, // "tbaa" 48999f90bedf94e7d55508f0797802b75064f1de09Peter Collingbourne MD_prof = 2, // "prof" 495e5c5f8259b90ba77c0b30e67cb360165000d1f6Duncan Sands MD_fpmath = 3, // "fpmath" 50b54834b7e67ac04874891f3dcf69226c69582b4bDan Gohman MD_range = 4, // "range" 51985dac65791b9f6f631bdd51c18fe66592a67469Shuxin Yang MD_tbaa_struct = 5, // "tbaa.struct" 52985dac65791b9f6f631bdd51c18fe66592a67469Shuxin Yang MD_invariant_load = 6 // "invariant.load" 53ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner }; 544e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 55081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// getMDKindID - Return a unique non-zero ID for the specified metadata kind. 56081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// This ID is uniqued across modules in the current LLVMContext. 57081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner unsigned getMDKindID(StringRef Name) const; 584e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 59081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner /// getMDKindNames - Populate client supplied SmallVector with the name for 605d809119834a1aa8170e8341ee883e69e5a6bbd1Dan Gohman /// custom metadata IDs registered in this LLVMContext. 61081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner void getMDKindNames(SmallVectorImpl<StringRef> &Result) const; 624e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 634e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 64f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context, 65f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson unsigned LocCookie); 664e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 67f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// setInlineAsmDiagnosticHandler - This method sets a handler that is invoked 68f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// when problems with inline asm are detected by the backend. The first 69f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// argument is a function pointer and the second is a context pointer that 70f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// gets passed into the DiagHandler. 7142a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner /// 724afa12890f679034e9741a687a6ce33f2846f129Chris Lattner /// LLVMContext doesn't take ownership or interpret either of these 7342a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner /// pointers. 74f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson void setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler, 75f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson void *DiagContext = 0); 7642a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner 77f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by 78f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// setInlineAsmDiagnosticHandler. 79f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson InlineAsmDiagHandlerTy getInlineAsmDiagnosticHandler() const; 8042a4ee0a35b4672311c1b988bd883167de9f88cdChris Lattner 81f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// getInlineAsmDiagnosticContext - Return the diagnostic context set by 82f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson /// setInlineAsmDiagnosticHandler. 83f64c889cc94417322b0ff8ad1c61939183bf3c38Bob Wilson void *getInlineAsmDiagnosticContext() const; 844e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 854e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 8638686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattner /// emitError - Emit an error message to the currently installed error handler 8738686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattner /// with optional location information. This function returns, so code should 8838686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattner /// be prepared to drop the erroneous construct on the floor and "not crash". 8938686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattner /// The generated code need not be correct. The error message will be 9038686bdffdebc09aa6fe6b8b54b34ac32c753f59Chris Lattner /// implicitly prefixed with "error: " and should not end with a ".". 913a4c60ca3b8ab835a71a92c02d288b9582e4a643Chris Lattner void emitError(unsigned LocCookie, const Twine &ErrorStr); 923a4c60ca3b8ab835a71a92c02d288b9582e4a643Chris Lattner void emitError(const Instruction *I, const Twine &ErrorStr); 933a4c60ca3b8ab835a71a92c02d288b9582e4a643Chris Lattner void emitError(const Twine &ErrorStr); 94eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson 95eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Andersonprivate: 969f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper LLVMContext(LLVMContext&) LLVM_DELETED_FUNCTION; 979f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper void operator=(LLVMContext&) LLVM_DELETED_FUNCTION; 98eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson 99eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson /// addModule - Register a module as being instantiated in this context. If 100eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson /// the context is deleted, the module will be deleted as well. 101eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson void addModule(Module*); 1024e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 103eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson /// removeModule - Unregister a module from this context. 104eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson void removeModule(Module*); 1054e505a47c76967ded5ec91acc25e7d0f9ac997c1Jim Grosbach 106eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson // Module needs access to the add/removeModule methods. 107eb92330c1d431a7ecbc31609b926a49c89be1d04Owen Anderson friend class Module; 1082bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson}; 1092bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 110081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// getGlobalContext - Returns a global context. This is for LLVM clients that 111081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// only care about operating on a single thread. 112081134741b40b342fb2f85722c9cea5d412489a8Chris Lattnerextern LLVMContext &getGlobalContext(); 113db47ed0925ce97f3134189c96ebc35b2cdae1ce3Owen Anderson 11440be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo// Create wrappers for C Binding types (see CBindingWrapping.h). 11540be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMContext, LLVMContextRef) 11640be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo 11740be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo/* Specialized opaque context conversions. 11840be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo */ 11940be1e85665d10f5444186f0e7106e368dd735b8Filip Pizloinline LLVMContext **unwrap(LLVMContextRef* Tys) { 12040be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo return reinterpret_cast<LLVMContext**>(Tys); 12140be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo} 12240be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo 12340be1e85665d10f5444186f0e7106e368dd735b8Filip Pizloinline LLVMContextRef *wrap(const LLVMContext **Tys) { 12440be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo return reinterpret_cast<LLVMContextRef*>(const_cast<LLVMContext**>(Tys)); 12540be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo} 12640be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo 1272bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson} 1282bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson 1292bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#endif 130