[llvm] [llvm-c] Deprecate functions working on the global context (PR #163979)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 17 08:37:18 PDT 2025


https://github.com/nikic created https://github.com/llvm/llvm-project/pull/163979

One of the most common mistakes when working with the LLVM C API is to mix functions that work on the global context and those that work on an explicit context. This often results in seemingly nonsensical errors because types from different contexts are mixed.

We have considered the APIs working on the global context to be obsolete for a long time already, and do not add any new functions of that kind. However, the fact that these still exist (and have shorter names) continues to cause issues.

This PR proposes to deprecate these APIs, with intent of future removal.

>From 3ee60c5b08198be2188285dbfc71a5b4976c5094 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Fri, 17 Oct 2025 16:20:02 +0200
Subject: [PATCH] [llvm-c] Deprecate functions working on the global context

One of the most common mistakes when working with the LLVM C API
is to mix functions that work on the global context and those that
work on an explicit context. This often results in seemingly
nonsensical errors because types from different contexts are mixed.

We have considered the APIs working on the global context to be
obsolete for a long time already, and do not add any new functions
of that kind. However, the fact that these still exist (and have
shorter names) continues to cause issues.

This PR proposes to deprecate these APIs, with intent of future
removal.
---
 llvm/docs/ReleaseNotes.md                     |  34 +++++
 .../OrcV2CBindingsAddObjectFile.c             |   9 +-
 .../OrcV2CBindingsBasicUsage.c                |   9 +-
 .../OrcV2CBindingsDumpObjects.c               |   9 +-
 .../OrcV2CBindingsIRTransforms.c              |   9 +-
 .../OrcV2CBindingsMCJITLikeMemoryManager.c    |   9 +-
 .../OrcV2CBindingsRemovableCode.c             |   9 +-
 llvm/include/llvm-c/BitReader.h               |  33 ++--
 llvm/include/llvm-c/Core.h                    | 143 ++++++++++++++----
 llvm/include/llvm-c/Target.h                  |  11 +-
 llvm/tools/llvm-c-test/calc.c                 |  17 ++-
 llvm/tools/llvm-c-test/debuginfo.c            |  72 +++++----
 llvm/tools/llvm-c-test/diagnostic.c           |   2 +-
 llvm/tools/llvm-c-test/echo.cpp               |   8 +-
 llvm/tools/llvm-c-test/metadata.c             |  34 +++--
 .../ExecutionEngine/MCJIT/MCJITCAPITest.cpp   | 122 ++++++++-------
 16 files changed, 352 insertions(+), 178 deletions(-)

diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 9cdd98390d061..3766052af0c0e 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -153,6 +153,40 @@ Changes to the C API
 
 * Add `LLVMGetOrInsertFunction` to get or insert a function, replacing the combination of `LLVMGetNamedFunction` and `LLVMAddFunction`.
 * Allow `LLVMGetVolatile` to work with any kind of Instruction.
+* Functions working on the global context have been deprecated. Use the
+  functions that work on a specific context instead.
+
+  * `LLVMGetGlobalContext` -> use `LLVMContextCreate` context instead
+  * `LLVMInt1Type` -> `LLVMInt1TypeInContext`
+  * `LLVMInt8Type` -> `LLVMInt8TypeInContext`
+  * `LLVMInt16Type` -> `LLVMInt16TypeInContext`
+  * `LLVMInt32Type` -> `LLVMInt32TypeInContext`
+  * `LLVMInt64Type` -> `LLVMInt64TypeInContext`
+  * `LLVMInt128Type` -> `LLVMInt128TypeInContext`
+  * `LLVMIntType` -> `LLVMIntTypeInContext`
+  * `LLVMHalfType` -> `LLVMHalfTypeInContext`
+  * `LLVMBFloatType` -> `LLVMBFloatTypeInContext`
+  * `LLVMFloatType` -> `LLVMFloatTypeInContext`
+  * `LLVMDoubleType` -> `LLVMDoubleTypeInContext`
+  * `LLVMX86FP80Type` -> `LLVMX86FP80TypeInContext`
+  * `LLVMFP128Type` -> `LLVMFP128TypeInContext`
+  * `LLVMPPCFP128Type` -> `LLVMPPCFP128TypeInContext`
+  * `LLVMStructType` -> `LLVMStructTypeInContext`
+  * `LLVMVoidType` -> `LLVMVoidTypeInContext`
+  * `LLVMLabelType` -> `LLVMLabelTypeInContext`
+  * `LLVMX86AMXType` -> `LLVMX86AMXTypeInContext`
+  * `LLVMConstString` -> `LLVMConstStringInContext2`
+  * `LLVMConstStruct` -> `LLVMConstStructInContext`
+  * `LLVMMDString` -> `LLVMMDStringInContext2`
+  * `LLVMMDNode` -> `LLVMMDNodeInContext2`
+  * `LLVMAppendBasicBlock` -> `LLVMAppendBasicBlockInContext`
+  * `LLVMInsertBasicBlock` -> `LLVMInsertBasicBlockInContext`
+  * `LLVMIntPtrType` -> `LLVMIntPtrTypeInContext`
+  * `LLVMIntPtrTypeForAS` -> `LLVMIntPtrTypeForASInContext`
+  * `LLVMParseBitcode` -> `LLVMParseBitcodeInContext2`
+  * `LLVMParseBitcode2` -> `LLVMParseBitcodeInContext2`
+  * `LLVMGetBitcodeModule` -> `LLVMGetBitcodeModuleInContext2`
+  * `LLVMGetBitcodeModule2` -> `LLVMGetBitcodeModuleInContext2`
 
 Changes to the CodeGen infrastructure
 -------------------------------------
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsAddObjectFile/OrcV2CBindingsAddObjectFile.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsAddObjectFile/OrcV2CBindingsAddObjectFile.c
index b51fc930c4318..a70abab6af691 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsAddObjectFile/OrcV2CBindingsAddObjectFile.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsAddObjectFile/OrcV2CBindingsAddObjectFile.c
@@ -28,13 +28,14 @@ LLVMModuleRef createDemoModule(LLVMContextRef Ctx) {
 
   // Add a "sum" function":
   //  - Create the function type and function instance.
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
 
   //  - Add a basic block to the function.
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
 
   //  - Add an IR builder and point it at the end of the basic block.
   LLVMBuilderRef Builder = LLVMCreateBuilder();
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsBasicUsage/OrcV2CBindingsBasicUsage.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsBasicUsage/OrcV2CBindingsBasicUsage.c
index 30806dc8d29e8..fc593c079ea9f 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsBasicUsage/OrcV2CBindingsBasicUsage.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsBasicUsage/OrcV2CBindingsBasicUsage.c
@@ -30,13 +30,14 @@ LLVMOrcThreadSafeModuleRef createDemoModule(void) {
 
   // Add a "sum" function":
   //  - Create the function type and function instance.
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
 
   //  - Add a basic block to the function.
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
 
   //  - Add an IR builder and point it at the end of the basic block.
   LLVMBuilderRef Builder = LLVMCreateBuilder();
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsDumpObjects/OrcV2CBindingsDumpObjects.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsDumpObjects/OrcV2CBindingsDumpObjects.c
index 42a27c7054d47..16fb3590fa7b2 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsDumpObjects/OrcV2CBindingsDumpObjects.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsDumpObjects/OrcV2CBindingsDumpObjects.c
@@ -33,11 +33,12 @@ int handleError(LLVMErrorRef Err) {
 LLVMOrcThreadSafeModuleRef createDemoModule(void) {
   LLVMContextRef Ctx = LLVMContextCreate();
   LLVMModuleRef M = LLVMModuleCreateWithNameInContext("demo", Ctx);
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
   LLVMBuilderRef Builder = LLVMCreateBuilder();
   LLVMPositionBuilderAtEnd(Builder, EntryBB);
   LLVMValueRef SumArg0 = LLVMGetParam(SumFunction, 0);
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsIRTransforms/OrcV2CBindingsIRTransforms.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsIRTransforms/OrcV2CBindingsIRTransforms.c
index 7e4d2387cb14e..5b08ab783f21a 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsIRTransforms/OrcV2CBindingsIRTransforms.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsIRTransforms/OrcV2CBindingsIRTransforms.c
@@ -34,11 +34,12 @@ int handleError(LLVMErrorRef Err) {
 LLVMOrcThreadSafeModuleRef createDemoModule(void) {
   LLVMContextRef Ctx = LLVMContextCreate();
   LLVMModuleRef M = LLVMModuleCreateWithNameInContext("demo", Ctx);
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
   LLVMBuilderRef Builder = LLVMCreateBuilder();
   LLVMPositionBuilderAtEnd(Builder, EntryBB);
   LLVMValueRef SumArg0 = LLVMGetParam(SumFunction, 0);
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsMCJITLikeMemoryManager/OrcV2CBindingsMCJITLikeMemoryManager.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsMCJITLikeMemoryManager/OrcV2CBindingsMCJITLikeMemoryManager.c
index 6962c6980e787..28a6fbdcc547c 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsMCJITLikeMemoryManager/OrcV2CBindingsMCJITLikeMemoryManager.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsMCJITLikeMemoryManager/OrcV2CBindingsMCJITLikeMemoryManager.c
@@ -158,13 +158,14 @@ LLVMOrcThreadSafeModuleRef createDemoModule(void) {
 
   // Add a "sum" function":
   //  - Create the function type and function instance.
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
 
   //  - Add a basic block to the function.
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
 
   //  - Add an IR builder and point it at the end of the basic block.
   LLVMBuilderRef Builder = LLVMCreateBuilder();
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsRemovableCode/OrcV2CBindingsRemovableCode.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsRemovableCode/OrcV2CBindingsRemovableCode.c
index 7f8a9cd334c6b..b6f07e5550537 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsRemovableCode/OrcV2CBindingsRemovableCode.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsRemovableCode/OrcV2CBindingsRemovableCode.c
@@ -30,13 +30,14 @@ LLVMOrcThreadSafeModuleRef createDemoModule(void) {
 
   // Add a "sum" function":
   //  - Create the function type and function instance.
-  LLVMTypeRef ParamTypes[] = {LLVMInt32Type(), LLVMInt32Type()};
-  LLVMTypeRef SumFunctionType =
-      LLVMFunctionType(LLVMInt32Type(), ParamTypes, 2, 0);
+  LLVMTypeRef Int32Type = LLVMInt32TypeInContext(Ctx);
+  LLVMTypeRef ParamTypes[] = {Int32Type, Int32Type};
+  LLVMTypeRef SumFunctionType = LLVMFunctionType(Int32Type, ParamTypes, 2, 0);
   LLVMValueRef SumFunction = LLVMAddFunction(M, "sum", SumFunctionType);
 
   //  - Add a basic block to the function.
-  LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(SumFunction, "entry");
+  LLVMBasicBlockRef EntryBB =
+      LLVMAppendBasicBlockInContext(Ctx, SumFunction, "entry");
 
   //  - Add an IR builder and point it at the end of the basic block.
   LLVMBuilderRef Builder = LLVMCreateBuilder();
diff --git a/llvm/include/llvm-c/BitReader.h b/llvm/include/llvm-c/BitReader.h
index 9dcdbf436454f..c38c3ce3e01b2 100644
--- a/llvm/include/llvm-c/BitReader.h
+++ b/llvm/include/llvm-c/BitReader.h
@@ -19,6 +19,7 @@
 #ifndef LLVM_C_BITREADER_H
 #define LLVM_C_BITREADER_H
 
+#include "llvm-c/Deprecated.h"
 #include "llvm-c/ExternC.h"
 #include "llvm-c/Types.h"
 #include "llvm-c/Visibility.h"
@@ -37,14 +38,19 @@ LLVM_C_EXTERN_C_BEGIN
    Optionally returns a human-readable error message via OutMessage.
 
    This is deprecated. Use LLVMParseBitcode2. */
-LLVM_C_ABI LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
-                                     LLVMModuleRef *OutModule,
-                                     char **OutMessage);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
+                              LLVMModuleRef *OutModule, char **OutMessage),
+    "Use of the global context is deprecated, use LLVMParseBitcodeInContext2 "
+    "instead");
 
 /* Builds a module from the bitcode in the specified memory buffer, returning a
    reference to the module via the OutModule parameter. Returns 0 on success. */
-LLVM_C_ABI LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
-                                      LLVMModuleRef *OutModule);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
+                               LLVMModuleRef *OutModule),
+    "Use of the global context is deprecated, use LLVMParseBitcodeInContext2 "
+    "instead");
 
 /* This is deprecated. Use LLVMParseBitcodeInContext2. */
 LLVM_C_ABI LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
@@ -77,12 +83,17 @@ LLVM_C_ABI LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef,
                                                    LLVMModuleRef *OutM);
 
 /* This is deprecated. Use LLVMGetBitcodeModule2. */
-LLVM_C_ABI LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf,
-                                         LLVMModuleRef *OutM,
-                                         char **OutMessage);
-
-LLVM_C_ABI LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf,
-                                          LLVMModuleRef *OutM);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf,
+                                  LLVMModuleRef *OutM, char **OutMessage),
+    "Use of the global context is deprecated, use "
+    "LLVMGetBitcodeModuleInContext2 instead");
+
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf,
+                                   LLVMModuleRef *OutM),
+    "Use of the global context is deprecated, use "
+    "LLVMGetBitcodeModuleInContext2 instead");
 
 /**
  * @}
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 4e380d9bd5969..c11c107b1992b 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -581,6 +581,9 @@ LLVM_C_ABI LLVMContextRef LLVMContextCreate(void);
 
 /**
  * Obtain the global context instance.
+ *
+ * Use of the global context is deprecated. Use LLVMContextCreate() and
+ * context-aware functions instead.
  */
 LLVM_C_ABI LLVMContextRef LLVMGetGlobalContext(void);
 
@@ -655,7 +658,10 @@ LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI);
 
 LLVM_C_ABI unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name,
                                              unsigned SLen);
-LLVM_C_ABI unsigned LLVMGetMDKindID(const char *Name, unsigned SLen);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    unsigned LLVMGetMDKindID(const char *Name, unsigned SLen),
+    "Use of the global context is deprecated, use LLVMGetMDKindIDInContext "
+    "instead");
 
 /**
  * Maps a synchronization scope name to a ID unique within this context.
@@ -774,7 +780,10 @@ LLVM_C_ABI LLVMTypeRef LLVMGetTypeByName2(LLVMContextRef C, const char *Name);
  * Every invocation should be paired with LLVMDisposeModule() or memory
  * will be leaked.
  */
-LLVM_C_ABI LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID),
+    "Use of the global context is deprecated, use "
+    "LLVMModuleCreateWithNameInContext instead");
 
 /**
  * Create a new, empty module in a specific context.
@@ -1369,13 +1378,35 @@ LLVM_C_ABI LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
  * Obtain an integer type from the global context with a specified bit
  * width.
  */
-LLVM_C_ABI LLVMTypeRef LLVMInt1Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMInt8Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMInt16Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMInt32Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMInt64Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMInt128Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMIntType(unsigned NumBits);
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt1Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt1TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt8Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt8TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt16Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt16TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt32Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt32TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt64Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt64TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMInt128Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMInt128TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMIntType(unsigned NumBits),
+                            "Use of the global context is deprecated, use "
+                            "LLVMIntTypeInContext instead");
+
 LLVM_C_ABI unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
 
 /**
@@ -1429,13 +1460,34 @@ LLVM_C_ABI LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
  *
  * These map to the functions in this group of the same name.
  */
-LLVM_C_ABI LLVMTypeRef LLVMHalfType(void);
-LLVM_C_ABI LLVMTypeRef LLVMBFloatType(void);
-LLVM_C_ABI LLVMTypeRef LLVMFloatType(void);
-LLVM_C_ABI LLVMTypeRef LLVMDoubleType(void);
-LLVM_C_ABI LLVMTypeRef LLVMX86FP80Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMFP128Type(void);
-LLVM_C_ABI LLVMTypeRef LLVMPPCFP128Type(void);
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMHalfType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMHalfTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMBFloatType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMBFloatTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMFloatType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMFloatTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMDoubleType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMDoubleTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMX86FP80Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMX86FP80TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMFP128Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMFP128TypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMPPCFP128Type(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMPPCFP128TypeInContext instead");
 
 /**
  * @}
@@ -1517,8 +1569,11 @@ LLVM_C_ABI LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C,
  *
  * @see llvm::StructType::create()
  */
-LLVM_C_ABI LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
-                                      unsigned ElementCount, LLVMBool Packed);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
+                               LLVMBool Packed),
+    "Use of the global context is deprecated, use LLVMStructTypeInContext "
+    "instead");
 
 /**
  * Create an empty structure in a context having a specified name.
@@ -1811,9 +1866,18 @@ LLVM_C_ABI LLVMTypeRef LLVMMetadataTypeInContext(LLVMContextRef C);
  * These are similar to the above functions except they operate on the
  * global context.
  */
-LLVM_C_ABI LLVMTypeRef LLVMVoidType(void);
-LLVM_C_ABI LLVMTypeRef LLVMLabelType(void);
-LLVM_C_ABI LLVMTypeRef LLVMX86AMXType(void);
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMVoidType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMVoidTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMLabelType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMLabelTypeInContext instead");
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMX86AMXType(void),
+                            "Use of the global context is deprecated, use "
+                            "LLVMX86AMXTypeInContext instead");
 
 /**
  * Create a target extension type in LLVM context.
@@ -2406,8 +2470,11 @@ LLVM_C_ABI LLVMValueRef LLVMConstStringInContext2(LLVMContextRef C,
  * @see LLVMConstStringInContext()
  * @see llvm::ConstantDataArray::getString()
  */
-LLVM_C_ABI LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
-                                        LLVMBool DontNullTerminate);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
+                                 LLVMBool DontNullTerminate),
+    "Use of the global context is deprecated, use LLVMConstStringInContext2 "
+    "instead");
 
 /**
  * Returns true if the specified constant is an array of i8.
@@ -2452,8 +2519,11 @@ LLVM_C_ABI LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
  *
  * @see LLVMConstStructInContext()
  */
-LLVM_C_ABI LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals,
-                                        unsigned Count, LLVMBool Packed);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
+                                 LLVMBool Packed),
+    "Use of the global context is deprecated, use LLVMConstStructInContext "
+    "instead");
 
 /**
  * Create a ConstantArray from values.
@@ -3390,12 +3460,18 @@ LLVM_C_ABI void LLVMReplaceMDNodeOperandWith(LLVMValueRef V, unsigned Index,
 LLVM_C_ABI LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
                                               unsigned SLen);
 /** Deprecated: Use LLVMMDStringInContext2 instead. */
-LLVM_C_ABI LLVMValueRef LLVMMDString(const char *Str, unsigned SLen);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMValueRef LLVMMDString(const char *Str, unsigned SLen),
+    "Use of the global context is deprecated, use LLVMMDStringInContext2 "
+    "instead");
 /** Deprecated: Use LLVMMDNodeInContext2 instead. */
 LLVM_C_ABI LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C,
                                             LLVMValueRef *Vals, unsigned Count);
 /** Deprecated: Use LLVMMDNodeInContext2 instead. */
-LLVM_C_ABI LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count),
+    "Use of the global context is deprecated, use LLVMMDNodeInContext2 "
+    "instead");
 
 /**
  * @}
@@ -3622,8 +3698,10 @@ LLVM_C_ABI LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
  *
  * @see llvm::BasicBlock::Create()
  */
-LLVM_C_ABI LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn,
-                                                  const char *Name);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name),
+    "Use of the global context is deprecated, use "
+    "LLVMAppendBasicBlockInContext instead");
 
 /**
  * Insert a basic block in a function before another basic block.
@@ -3642,8 +3720,11 @@ LLVM_C_ABI LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
  *
  * @see llvm::BasicBlock::Create()
  */
-LLVM_C_ABI LLVMBasicBlockRef
-LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB, const char *Name);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
+                                           const char *Name),
+    "Use of the global context is deprecated, use "
+    "LLVMInsertBasicBlockInContext instead");
 
 /**
  * Remove a basic block from a function and delete it.
diff --git a/llvm/include/llvm-c/Target.h b/llvm/include/llvm-c/Target.h
index 03a3b563a6392..12bc1ac438729 100644
--- a/llvm/include/llvm-c/Target.h
+++ b/llvm/include/llvm-c/Target.h
@@ -19,6 +19,7 @@
 #ifndef LLVM_C_TARGET_H
 #define LLVM_C_TARGET_H
 
+#include "llvm-c/Deprecated.h"
 #include "llvm-c/ExternC.h"
 #include "llvm-c/Types.h"
 #include "llvm-c/Visibility.h"
@@ -229,12 +230,18 @@ LLVM_C_ABI unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS);
 
 /** Returns the integer type that is the same size as a pointer on a target.
     See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD);
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD),
+                            "Use of the global context is deprecated, use "
+                            "LLVMIntPtrTypeInContext instead");
 
 /** Returns the integer type that is the same size as a pointer on a target.
     This version allows the address space to be specified.
     See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS);
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS),
+    "Use of the global context is deprecated, use LLVMIntPtrTypeForASInContext "
+    "instead");
 
 /** Returns the integer type that is the same size as a pointer on a target.
     See the method llvm::DataLayout::getIntPtrType. */
diff --git a/llvm/tools/llvm-c-test/calc.c b/llvm/tools/llvm-c-test/calc.c
index 267397a373fbd..2fc0caedac6ad 100644
--- a/llvm/tools/llvm-c-test/calc.c
+++ b/llvm/tools/llvm-c-test/calc.c
@@ -45,6 +45,8 @@ static LLVMValueRef build_from_tokens(char **tokens, int ntokens,
   int depth = 0;
   int i;
 
+  LLVMContextRef C = LLVMGetBuilderContext(builder);
+
   for (i = 0; i < ntokens; i++) {
     char tok = tokens[i][0];
     switch (tok) {
@@ -74,7 +76,7 @@ static LLVMValueRef build_from_tokens(char **tokens, int ntokens,
         return NULL;
       }
 
-      LLVMTypeRef ty = LLVMInt64Type();
+      LLVMTypeRef ty = LLVMInt64TypeInContext(C);
       off = LLVMBuildGEP2(builder, ty, param, &stack[depth - 1], 1, "");
       stack[depth - 1] = LLVMBuildLoad2(builder, ty, off, "");
 
@@ -94,7 +96,7 @@ static LLVMValueRef build_from_tokens(char **tokens, int ntokens,
         return NULL;
       }
 
-      stack[depth++] = LLVMConstInt(LLVMInt64Type(), val, 1);
+      stack[depth++] = LLVMConstInt(LLVMInt64TypeInContext(C), val, 1);
       break;
     }
     }
@@ -115,15 +117,17 @@ static void handle_line(char **tokens, int ntokens) {
   LLVMValueRef param;
   LLVMValueRef res;
 
-  LLVMModuleRef M = LLVMModuleCreateWithName(name);
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext(name, C);
 
-  LLVMTypeRef I64ty = LLVMInt64Type();
+  LLVMTypeRef I64ty = LLVMInt64TypeInContext(C);
   LLVMTypeRef I64Ptrty = LLVMPointerType(I64ty, 0);
   LLVMTypeRef Fty = LLVMFunctionType(I64ty, &I64Ptrty, 1, 0);
 
   LLVMValueRef F = LLVMAddFunction(M, name, Fty);
-  LLVMBuilderRef builder = LLVMCreateBuilder();
-  LLVMPositionBuilderAtEnd(builder, LLVMAppendBasicBlock(F, "entry"));
+  LLVMBuilderRef builder = LLVMCreateBuilderInContext(C);
+  LLVMPositionBuilderAtEnd(builder,
+                           LLVMAppendBasicBlockInContext(C, F, "entry"));
 
   LLVMGetParams(F, &param);
   LLVMSetValueName(param, "in");
@@ -138,6 +142,7 @@ static void handle_line(char **tokens, int ntokens) {
   LLVMDisposeBuilder(builder);
 
   LLVMDisposeModule(M);
+  LLVMContextDispose(C);
 }
 
 int llvm_calc(void) {
diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c
index 9db7aa0929aab..c88ceeabf3be4 100644
--- a/llvm/tools/llvm-c-test/debuginfo.c
+++ b/llvm/tools/llvm-c-test/debuginfo.c
@@ -33,7 +33,8 @@ declare_objc_class(LLVMDIBuilderRef DIB, LLVMMetadataRef File) {
 
 int llvm_test_dibuilder(void) {
   const char *Filename = "debuginfo.c";
-  LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext(Filename, C);
 
   LLVMSetIsNewDbgInfoFormat(M, true);
   assert(LLVMIsNewDbgInfoFormat(M));
@@ -101,15 +102,16 @@ int llvm_test_dibuilder(void) {
   LLVMAddNamedMetadataOperand(M, "FooType",
     LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy));
 
-
+  LLVMTypeRef I64Ty = LLVMInt64TypeInContext(C);
   LLVMTypeRef FooParamTys[] = {
-    LLVMInt64Type(),
-    LLVMInt64Type(),
-    LLVMVectorType(LLVMInt64Type(), 10),
+      I64Ty,
+      I64Ty,
+      LLVMVectorType(I64Ty, 10),
   };
-  LLVMTypeRef FooFuncTy = LLVMFunctionType(LLVMInt64Type(), FooParamTys, 3, 0);
+  LLVMTypeRef FooFuncTy = LLVMFunctionType(I64Ty, FooParamTys, 3, 0);
   LLVMValueRef FooFunction = LLVMAddFunction(M, "foo", FooFuncTy);
-  LLVMBasicBlockRef FooEntryBlock = LLVMAppendBasicBlock(FooFunction, "entry");
+  LLVMBasicBlockRef FooEntryBlock =
+      LLVMAppendBasicBlockInContext(C, FooFunction, "entry");
 
   LLVMMetadataRef Subscripts[] = {
     LLVMDIBuilderGetOrCreateSubrange(DIB, 0, 10),
@@ -130,9 +132,8 @@ int llvm_test_dibuilder(void) {
                                                 LLVMDIFlagFwdDecl,
                                                 "", 0);
 
-  LLVMMetadataRef FooParamLocation =
-    LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
-                                     ReplaceableFunctionMetadata, NULL);
+  LLVMMetadataRef FooParamLocation = LLVMDIBuilderCreateDebugLocation(
+      C, 42, 0, ReplaceableFunctionMetadata, NULL);
   LLVMMetadataRef FunctionMetadata = LLVMDIBuilderCreateFunction(
       DIB, File, "foo", 3, "foo", 3, File, 42, NULL, true, true, 42, 0, false);
   LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata);
@@ -145,24 +146,24 @@ int llvm_test_dibuilder(void) {
     LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "a", 1, 1, File,
                                          42, Int64Ty, true, 0);
 
-  LLVMDIBuilderInsertDeclareRecordAtEnd(
-      DIB, LLVMConstInt(LLVMInt64Type(), 0, false), FooParamVar1,
-      FooParamExpression, FooParamLocation, FooEntryBlock);
+  LLVMDIBuilderInsertDeclareRecordAtEnd(DIB, LLVMConstInt(I64Ty, 0, false),
+                                        FooParamVar1, FooParamExpression,
+                                        FooParamLocation, FooEntryBlock);
 
   LLVMMetadataRef FooParamVar2 =
     LLVMDIBuilderCreateParameterVariable(DIB, FunctionMetadata, "b", 1, 2, File,
                                          42, Int64Ty, true, 0);
 
-  LLVMDIBuilderInsertDeclareRecordAtEnd(
-      DIB, LLVMConstInt(LLVMInt64Type(), 0, false), FooParamVar2,
-      FooParamExpression, FooParamLocation, FooEntryBlock);
+  LLVMDIBuilderInsertDeclareRecordAtEnd(DIB, LLVMConstInt(I64Ty, 0, false),
+                                        FooParamVar2, FooParamExpression,
+                                        FooParamLocation, FooEntryBlock);
 
   LLVMMetadataRef FooParamVar3 = LLVMDIBuilderCreateParameterVariable(
       DIB, FunctionMetadata, "c", 1, 3, File, 42, VectorTy, true, 0);
 
-  LLVMDIBuilderInsertDeclareRecordAtEnd(
-      DIB, LLVMConstInt(LLVMInt64Type(), 0, false), FooParamVar3,
-      FooParamExpression, FooParamLocation, FooEntryBlock);
+  LLVMDIBuilderInsertDeclareRecordAtEnd(DIB, LLVMConstInt(I64Ty, 0, false),
+                                        FooParamVar3, FooParamExpression,
+                                        FooParamLocation, FooEntryBlock);
 
   LLVMSetSubprogram(FooFunction, FunctionMetadata);
 
@@ -174,14 +175,14 @@ int llvm_test_dibuilder(void) {
   LLVMMetadataRef FooLexicalBlock =
     LLVMDIBuilderCreateLexicalBlock(DIB, FunctionMetadata, File, 42, 0);
 
-  LLVMBasicBlockRef FooVarBlock = LLVMAppendBasicBlock(FooFunction, "vars");
+  LLVMBasicBlockRef FooVarBlock =
+      LLVMAppendBasicBlockInContext(C, FooFunction, "vars");
   LLVMMetadataRef FooVarsLocation =
-    LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 43, 0,
-                                     FunctionMetadata, NULL);
+      LLVMDIBuilderCreateDebugLocation(C, 43, 0, FunctionMetadata, NULL);
   LLVMMetadataRef FooVar1 =
     LLVMDIBuilderCreateAutoVariable(DIB, FooLexicalBlock, "d", 1, File,
                                     43, Int64Ty, true, 0, 0);
-  LLVMValueRef FooVal1 = LLVMConstInt(LLVMInt64Type(), 0, false);
+  LLVMValueRef FooVal1 = LLVMConstInt(I64Ty, 0, false);
   LLVMMetadataRef FooVarValueExpr1 =
       LLVMDIBuilderCreateConstantValueExpression(DIB, 0);
 
@@ -190,7 +191,7 @@ int llvm_test_dibuilder(void) {
 
   LLVMMetadataRef FooVar2 = LLVMDIBuilderCreateAutoVariable(
       DIB, FooLexicalBlock, "e", 1, File, 44, Int64Ty, true, 0, 0);
-  LLVMValueRef FooVal2 = LLVMConstInt(LLVMInt64Type(), 1, false);
+  LLVMValueRef FooVal2 = LLVMConstInt(I64Ty, 1, false);
   LLVMMetadataRef FooVarValueExpr2 =
       LLVMDIBuilderCreateConstantValueExpression(DIB, 1);
 
@@ -238,8 +239,8 @@ int llvm_test_dibuilder(void) {
       M, "LargeEnumTest",
       LLVMMetadataAsValue(LLVMGetModuleContext(M), LargeEnumTest));
 
-  LLVMValueRef FooVal3 = LLVMConstInt(LLVMInt64Type(), 8, false);
-  LLVMValueRef FooVal4 = LLVMConstInt(LLVMInt64Type(), 4, false);
+  LLVMValueRef FooVal3 = LLVMConstInt(I64Ty, 8, false);
+  LLVMValueRef FooVal4 = LLVMConstInt(I64Ty, 4, false);
   LLVMMetadataRef lo = LLVMValueAsMetadata(FooVal1);
   LLVMMetadataRef hi = LLVMValueAsMetadata(FooVal2);
   LLVMMetadataRef strd = LLVMValueAsMetadata(FooVal3);
@@ -371,13 +372,14 @@ int llvm_test_dibuilder(void) {
   LLVMDisposeBuilder(Builder);
   LLVMDisposeDIBuilder(DIB);
   LLVMDisposeModule(M);
+  LLVMContextDispose(C);
 
   return 0;
 }
 
 int llvm_get_di_tag(void) {
-  LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
-  LLVMContextRef Context = LLVMGetModuleContext(M);
+  LLVMContextRef Context = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("Mod", Context);
 
   const char String[] = "foo";
   LLVMMetadataRef StringMD =
@@ -400,12 +402,14 @@ int llvm_get_di_tag(void) {
 
   LLVMDisposeDIBuilder(Builder);
   LLVMDisposeModule(M);
+  LLVMContextDispose(Context);
 
   return 0;
 }
 
 int llvm_di_type_get_name(void) {
-  LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("Mod", C);
 
   LLVMDIBuilderRef Builder = LLVMCreateDIBuilder(M);
   const char Filename[] = "metadata.c";
@@ -425,13 +429,15 @@ int llvm_di_type_get_name(void) {
 
   LLVMDisposeDIBuilder(Builder);
   LLVMDisposeModule(M);
+  LLVMContextDispose(C);
 
   return 0;
 }
 
 int llvm_add_globaldebuginfo(void) {
   const char *Filename = "debuginfo.c";
-  LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext(Filename, C);
   LLVMDIBuilderRef Builder = LLVMCreateDIBuilder(M);
   LLVMMetadataRef File =
       LLVMDIBuilderCreateFile(Builder, Filename, strlen(Filename), ".", 1);
@@ -447,13 +453,12 @@ int llvm_add_globaldebuginfo(void) {
       Builder, File, "global", 6, "", 0, File, 1, Int64TypeDef, true,
       GlobalVarValueExpr, NULL, 0);
 
-  LLVMTypeRef RecType =
-      LLVMStructCreateNamed(LLVMGetModuleContext(M), "struct");
+  LLVMTypeRef RecType = LLVMStructCreateNamed(C, "struct");
   LLVMValueRef Global = LLVMAddGlobal(M, RecType, "global");
 
   LLVMGlobalAddDebugInfo(Global, GVE);
   // use AddMetadata to add twice
-  int kindId = LLVMGetMDKindID("dbg", 3);
+  int kindId = LLVMGetMDKindIDInContext(C, "dbg", 3);
   LLVMGlobalAddMetadata(Global, kindId, GVE);
   size_t numEntries;
   LLVMValueMetadataEntry *ME = LLVMGlobalCopyAllMetadata(Global, &numEntries);
@@ -463,6 +468,7 @@ int llvm_add_globaldebuginfo(void) {
   LLVMDisposeValueMetadataEntries(ME);
   LLVMDisposeDIBuilder(Builder);
   LLVMDisposeModule(M);
+  LLVMContextDispose(C);
 
   return 0;
 }
diff --git a/llvm/tools/llvm-c-test/diagnostic.c b/llvm/tools/llvm-c-test/diagnostic.c
index 0f9b48b2aa551..fbb0bc585fcfb 100644
--- a/llvm/tools/llvm-c-test/diagnostic.c
+++ b/llvm/tools/llvm-c-test/diagnostic.c
@@ -69,7 +69,7 @@ int llvm_test_diagnostic_handler(void) {
 
 
   LLVMModuleRef M;
-  int Ret = LLVMGetBitcodeModule2(MB, &M);
+  int Ret = LLVMGetBitcodeModuleInContext2(C, MB, &M);
   if (Ret)
     LLVMDisposeMemoryBuffer(MB);
 
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 026d815b43da7..bd640cd8d85ec 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -986,9 +986,10 @@ struct FunCloner {
         for (unsigned i = 0; i < NumMaskElts; i++) {
           int Val = LLVMGetMaskValue(Src, i);
           if (Val == LLVMGetUndefMaskElem()) {
-            MaskElts.push_back(LLVMGetUndef(LLVMInt64Type()));
+            MaskElts.push_back(LLVMGetUndef(LLVMInt64TypeInContext(Ctx)));
           } else {
-            MaskElts.push_back(LLVMConstInt(LLVMInt64Type(), Val, true));
+            MaskElts.push_back(
+                LLVMConstInt(LLVMInt64TypeInContext(Ctx), Val, true));
           }
         }
         LLVMValueRef Mask = LLVMConstVector(MaskElts.data(), NumMaskElts);
@@ -1115,7 +1116,8 @@ struct FunCloner {
     if (Name != VName)
       report_fatal_error("Basic block name mismatch");
 
-    LLVMBasicBlockRef BB = LLVMAppendBasicBlock(Fun, Name);
+    LLVMContextRef Ctx = LLVMGetModuleContext(M);
+    LLVMBasicBlockRef BB = LLVMAppendBasicBlockInContext(Ctx, Fun, Name);
     return BBMap[Src] = BB;
   }
 
diff --git a/llvm/tools/llvm-c-test/metadata.c b/llvm/tools/llvm-c-test/metadata.c
index 4fe8c00c57481..6dd18d1e5e881 100644
--- a/llvm/tools/llvm-c-test/metadata.c
+++ b/llvm/tools/llvm-c-test/metadata.c
@@ -19,37 +19,41 @@
 #include <string.h>
 
 int llvm_add_named_metadata_operand(void) {
-  LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
-  LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0);
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("Mod", C);
+  LLVMValueRef Int = LLVMConstInt(LLVMInt32TypeInContext(C), 0, 0);
 
   // This used to trigger an assertion
-  LLVMAddNamedMetadataOperand(M, "name", LLVMMDNode(&Int, 1));
+  LLVMAddNamedMetadataOperand(M, "name", LLVMMDNodeInContext(C, &Int, 1));
 
   LLVMDisposeModule(M);
+  LLVMContextDispose(C);
 
   return 0;
 }
 
 int llvm_set_metadata(void) {
-  LLVMBuilderRef Builder = LLVMCreateBuilder();
+  LLVMContextRef C = LLVMContextCreate();
+  LLVMBuilderRef Builder = LLVMCreateBuilderInContext(C);
 
   // This used to trigger an assertion
   LLVMValueRef Return = LLVMBuildRetVoid(Builder);
 
   const char Name[] = "kind";
-  LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0);
-  LLVMSetMetadata(Return, LLVMGetMDKindID(Name, strlen(Name)),
-                  LLVMMDNode(&Int, 1));
+  LLVMValueRef Int = LLVMConstInt(LLVMInt32TypeInContext(C), 0, 0);
+  LLVMSetMetadata(Return, LLVMGetMDKindIDInContext(C, Name, strlen(Name)),
+                  LLVMMDNodeInContext(C, &Int, 1));
 
   LLVMDisposeBuilder(Builder);
   LLVMDeleteInstruction(Return);
+  LLVMContextDispose(C);
 
   return 0;
 }
 
 int llvm_replace_md_operand(void) {
-  LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
-  LLVMContextRef Context = LLVMGetModuleContext(M);
+  LLVMContextRef Context = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("Mod", Context);
 
   const char String1[] = "foo";
   LLVMMetadataRef String1MD =
@@ -71,17 +75,18 @@ int llvm_replace_md_operand(void) {
   (void)String;
 
   LLVMDisposeModule(M);
+  LLVMContextDispose(Context);
 
   return 0;
 }
 
 int llvm_is_a_value_as_metadata(void) {
-  LLVMModuleRef M = LLVMModuleCreateWithName("Mod");
-  LLVMContextRef Context = LLVMGetModuleContext(M);
+  LLVMContextRef Context = LLVMContextCreate();
+  LLVMModuleRef M = LLVMModuleCreateWithNameInContext("Mod", Context);
 
   {
-    LLVMValueRef Int = LLVMConstInt(LLVMInt32Type(), 0, 0);
-    LLVMValueRef NodeMD = LLVMMDNode(&Int, 1);
+    LLVMValueRef Int = LLVMConstInt(LLVMInt32TypeInContext(Context), 0, 0);
+    LLVMValueRef NodeMD = LLVMMDNodeInContext(Context, &Int, 1);
     assert(LLVMIsAValueAsMetadata(NodeMD) == NodeMD);
     (void)NodeMD;
   }
@@ -96,5 +101,8 @@ int llvm_is_a_value_as_metadata(void) {
     (void)Value;
   }
 
+  LLVMDisposeModule(M);
+  LLVMContextDispose(Context);
+
   return 0;
 }
diff --git a/llvm/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp b/llvm/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
index bc43515b3b1d2..f84ef04087c15 100644
--- a/llvm/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
+++ b/llvm/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
@@ -147,6 +147,7 @@ class MCJITCAPITest : public testing::Test, public MCJITTestAPICommon {
     didCallAllocateCodeSection = false;
     didAllocateCompactUnwindSection = false;
     didCallYield = false;
+    Context = LLVMContextCreate();
     Module = nullptr;
     Function = nullptr;
     Engine = nullptr;
@@ -158,21 +159,24 @@ class MCJITCAPITest : public testing::Test, public MCJITTestAPICommon {
       LLVMDisposeExecutionEngine(Engine);
     else if (Module)
       LLVMDisposeModule(Module);
+    LLVMContextDispose(Context);
   }
 
   void buildSimpleFunction() {
-    Module = LLVMModuleCreateWithName("simple_module");
+    Module = LLVMModuleCreateWithNameInContext("simple_module", Context);
 
     LLVMSetTarget(Module, HostTripleName.c_str());
 
+    LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Context);
     Function = LLVMAddFunction(Module, "simple_function",
-                               LLVMFunctionType(LLVMInt32Type(), nullptr,0, 0));
+                               LLVMFunctionType(Int32Ty, nullptr, 0, 0));
     LLVMSetFunctionCallConv(Function, LLVMCCallConv);
 
-    LLVMBasicBlockRef entry = LLVMAppendBasicBlock(Function, "entry");
-    LLVMBuilderRef builder = LLVMCreateBuilder();
+    LLVMBasicBlockRef entry =
+        LLVMAppendBasicBlockInContext(Context, Function, "entry");
+    LLVMBuilderRef builder = LLVMCreateBuilderInContext(Context);
     LLVMPositionBuilderAtEnd(builder, entry);
-    LLVMBuildRet(builder, LLVMConstInt(LLVMInt32Type(), 42, 0));
+    LLVMBuildRet(builder, LLVMConstInt(Int32Ty, 42, 0));
 
     LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
     LLVMDisposeMessage(Error);
@@ -181,29 +185,31 @@ class MCJITCAPITest : public testing::Test, public MCJITTestAPICommon {
   }
 
   void buildFunctionThatUsesStackmap() {
-    Module = LLVMModuleCreateWithName("simple_module");
+    Module = LLVMModuleCreateWithNameInContext("simple_module", Context);
 
     LLVMSetTarget(Module, HostTripleName.c_str());
 
-    LLVMTypeRef stackmapParamTypes[] = { LLVMInt64Type(), LLVMInt32Type() };
-    LLVMTypeRef stackmapTy =
-        LLVMFunctionType(LLVMVoidType(), stackmapParamTypes, 2, 1);
+    LLVMTypeRef Int64Ty = LLVMInt64TypeInContext(Context);
+    LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Context);
+    LLVMTypeRef VoidTy = LLVMVoidTypeInContext(Context);
+    LLVMTypeRef stackmapParamTypes[] = {Int64Ty, Int32Ty};
+    LLVMTypeRef stackmapTy = LLVMFunctionType(VoidTy, stackmapParamTypes, 2, 1);
     LLVMValueRef stackmap = LLVMAddFunction(
       Module, "llvm.experimental.stackmap", stackmapTy);
     LLVMSetLinkage(stackmap, LLVMExternalLinkage);
 
     Function = LLVMAddFunction(Module, "simple_function",
-                              LLVMFunctionType(LLVMInt32Type(), nullptr, 0, 0));
+                               LLVMFunctionType(Int32Ty, nullptr, 0, 0));
 
-    LLVMBasicBlockRef entry = LLVMAppendBasicBlock(Function, "entry");
-    LLVMBuilderRef builder = LLVMCreateBuilder();
+    LLVMBasicBlockRef entry =
+        LLVMAppendBasicBlockInContext(Context, Function, "entry");
+    LLVMBuilderRef builder = LLVMCreateBuilderInContext(Context);
     LLVMPositionBuilderAtEnd(builder, entry);
-    LLVMValueRef stackmapArgs[] = {
-      LLVMConstInt(LLVMInt64Type(), 0, 0), LLVMConstInt(LLVMInt32Type(), 5, 0),
-      LLVMConstInt(LLVMInt32Type(), 42, 0)
-    };
+    LLVMValueRef stackmapArgs[] = {LLVMConstInt(Int64Ty, 0, 0),
+                                   LLVMConstInt(Int32Ty, 5, 0),
+                                   LLVMConstInt(Int32Ty, 42, 0)};
     LLVMBuildCall2(builder, stackmapTy, stackmap, stackmapArgs, 3, "");
-    LLVMBuildRet(builder, LLVMConstInt(LLVMInt32Type(), 42, 0));
+    LLVMBuildRet(builder, LLVMConstInt(Int32Ty, 42, 0));
 
     LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
     LLVMDisposeMessage(Error);
@@ -212,51 +218,56 @@ class MCJITCAPITest : public testing::Test, public MCJITTestAPICommon {
   }
 
   void buildModuleWithCodeAndData() {
-    Module = LLVMModuleCreateWithName("simple_module");
+    Module = LLVMModuleCreateWithNameInContext("simple_module", Context);
 
     LLVMSetTarget(Module, HostTripleName.c_str());
 
+    LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Context);
+    LLVMTypeRef VoidTy = LLVMVoidTypeInContext(Context);
+
     // build a global int32 variable initialized to 42.
-    LLVMValueRef GlobalVar = LLVMAddGlobal(Module, LLVMInt32Type(), "intVal");
-    LLVMSetInitializer(GlobalVar, LLVMConstInt(LLVMInt32Type(), 42, 0));
+    LLVMValueRef GlobalVar = LLVMAddGlobal(Module, Int32Ty, "intVal");
+    LLVMSetInitializer(GlobalVar, LLVMConstInt(Int32Ty, 42, 0));
 
     {
-        Function = LLVMAddFunction(Module, "getGlobal",
-                              LLVMFunctionType(LLVMInt32Type(), nullptr, 0, 0));
-        LLVMSetFunctionCallConv(Function, LLVMCCallConv);
+      Function = LLVMAddFunction(Module, "getGlobal",
+                                 LLVMFunctionType(Int32Ty, nullptr, 0, 0));
+      LLVMSetFunctionCallConv(Function, LLVMCCallConv);
 
-        LLVMBasicBlockRef Entry = LLVMAppendBasicBlock(Function, "entry");
-        LLVMBuilderRef Builder = LLVMCreateBuilder();
-        LLVMPositionBuilderAtEnd(Builder, Entry);
+      LLVMBasicBlockRef Entry =
+          LLVMAppendBasicBlockInContext(Context, Function, "entry");
+      LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Context);
+      LLVMPositionBuilderAtEnd(Builder, Entry);
 
-        LLVMValueRef IntVal =
-            LLVMBuildLoad2(Builder, LLVMInt32Type(), GlobalVar, "intVal");
-        LLVMBuildRet(Builder, IntVal);
+      LLVMValueRef IntVal =
+          LLVMBuildLoad2(Builder, Int32Ty, GlobalVar, "intVal");
+      LLVMBuildRet(Builder, IntVal);
 
-        LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
-        LLVMDisposeMessage(Error);
+      LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
+      LLVMDisposeMessage(Error);
 
-        LLVMDisposeBuilder(Builder);
+      LLVMDisposeBuilder(Builder);
     }
 
     {
-        LLVMTypeRef ParamTypes[] = { LLVMInt32Type() };
-        Function2 = LLVMAddFunction(
-          Module, "setGlobal", LLVMFunctionType(LLVMVoidType(), ParamTypes, 1, 0));
-        LLVMSetFunctionCallConv(Function2, LLVMCCallConv);
+      LLVMTypeRef ParamTypes[] = {Int32Ty};
+      Function2 = LLVMAddFunction(Module, "setGlobal",
+                                  LLVMFunctionType(VoidTy, ParamTypes, 1, 0));
+      LLVMSetFunctionCallConv(Function2, LLVMCCallConv);
 
-        LLVMBasicBlockRef Entry = LLVMAppendBasicBlock(Function2, "entry");
-        LLVMBuilderRef Builder = LLVMCreateBuilder();
-        LLVMPositionBuilderAtEnd(Builder, Entry);
+      LLVMBasicBlockRef Entry =
+          LLVMAppendBasicBlockInContext(Context, Function2, "entry");
+      LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Context);
+      LLVMPositionBuilderAtEnd(Builder, Entry);
 
-        LLVMValueRef Arg = LLVMGetParam(Function2, 0);
-        LLVMBuildStore(Builder, Arg, GlobalVar);
-        LLVMBuildRetVoid(Builder);
+      LLVMValueRef Arg = LLVMGetParam(Function2, 0);
+      LLVMBuildStore(Builder, Arg, GlobalVar);
+      LLVMBuildRetVoid(Builder);
 
-        LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
-        LLVMDisposeMessage(Error);
+      LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
+      LLVMDisposeMessage(Error);
 
-        LLVMDisposeBuilder(Builder);
+      LLVMDisposeBuilder(Builder);
     }
   }
 
@@ -309,6 +320,7 @@ class MCJITCAPITest : public testing::Test, public MCJITTestAPICommon {
     LLVMDisposePassBuilderOptions(Options);
   }
 
+  LLVMContextRef Context;
   LLVMModuleRef Module;
   LLVMValueRef Function;
   LLVMValueRef Function2;
@@ -335,10 +347,11 @@ TEST_F(MCJITCAPITest, simple_function) {
 TEST_F(MCJITCAPITest, gva) {
   SKIP_UNSUPPORTED_PLATFORM;
 
-  Module = LLVMModuleCreateWithName("simple_module");
+  Module = LLVMModuleCreateWithNameInContext("simple_module", Context);
   LLVMSetTarget(Module, HostTripleName.c_str());
-  LLVMValueRef GlobalVar = LLVMAddGlobal(Module, LLVMInt32Type(), "simple_value");
-  LLVMSetInitializer(GlobalVar, LLVMConstInt(LLVMInt32Type(), 42, 0));
+  LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Context);
+  LLVMValueRef GlobalVar = LLVMAddGlobal(Module, Int32Ty, "simple_value");
+  LLVMSetInitializer(GlobalVar, LLVMConstInt(Int32Ty, 42, 0));
 
   buildMCJITOptions();
   buildMCJITEngine();
@@ -451,8 +464,7 @@ TEST_F(MCJITCAPITest, yield) {
   buildSimpleFunction();
   buildMCJITOptions();
   buildMCJITEngine();
-  LLVMContextRef C = LLVMGetGlobalContext();
-  LLVMContextSetYieldCallback(C, yield, nullptr);
+  LLVMContextSetYieldCallback(Context, yield, nullptr);
   buildAndRunPasses();
 
   auto *functionPointer = reinterpret_cast<int (*)()>(
@@ -469,14 +481,16 @@ static int localTestFunc() {
 TEST_F(MCJITCAPITest, addGlobalMapping) {
   SKIP_UNSUPPORTED_PLATFORM;
 
-  Module = LLVMModuleCreateWithName("testModule");
+  Module = LLVMModuleCreateWithNameInContext("testModule", Context);
   LLVMSetTarget(Module, HostTripleName.c_str());
-  LLVMTypeRef FunctionType = LLVMFunctionType(LLVMInt32Type(), nullptr, 0, 0);
+  LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Context);
+  LLVMTypeRef FunctionType = LLVMFunctionType(Int32Ty, nullptr, 0, 0);
   LLVMValueRef MappedFn = LLVMAddFunction(Module, "mapped_fn", FunctionType);
 
   Function = LLVMAddFunction(Module, "test_fn", FunctionType);
-  LLVMBasicBlockRef Entry = LLVMAppendBasicBlock(Function, "");
-  LLVMBuilderRef Builder = LLVMCreateBuilder();
+  LLVMBasicBlockRef Entry =
+      LLVMAppendBasicBlockInContext(Context, Function, "");
+  LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Context);
   LLVMPositionBuilderAtEnd(Builder, Entry);
   LLVMValueRef RetVal =
       LLVMBuildCall2(Builder, FunctionType, MappedFn, nullptr, 0, "");



More information about the llvm-commits mailing list