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