<div dir="ltr">Thank you very much for your helpful answer.<div><br></div><div>I'm using LLVM 3.8 in C++. I appreciate that you told me that`getGlobalContext()` had been removed.</div><div><br></div><div>> Context is owning a Module.<br></div><div>I missunderstood that a module has a context, becase a module is created by such as the following code</div><div>{</div><div>   <span style="font-family:menlo;font-size:9pt;background-color:rgb(228,228,255)">std</span><span style="font-family:menlo;font-size:9pt">::</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">unique_ptr</span><span style="font-family:menlo;font-size:9pt"><</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">llvm</span><span style="font-family:menlo;font-size:9pt">::</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">Module</span><span style="font-family:menlo;font-size:9pt">> module = </span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">llvm</span><span style="font-family:menlo;font-size:9pt">::make_unique<</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">llvm</span><span style="font-family:menlo;font-size:9pt">::</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,128)">Module</span><span style="font-family:menlo;font-size:9pt">>(</span><span style="font-family:menlo;font-size:9pt;color:rgb(0,128,0);font-weight:bold">"my-module"</span><span style="font-family:menlo;font-size:9pt">, context);</span></div><div>}</div><div><br></div><div>> If you work with multiple modules and you intend to link them together, they need to be in the same context.<br></div><div>I'll create a common context to link modules together.</div><div><br></div><div><br></div><div>Sincerely,<br></div><div>Ryo</div></div><br><div class="gmail_quote"><div dir="ltr">2017年2月22日(水) 14:19 Mehdi Amini <<a href="mailto:mehdi.amini@apple.com">mehdi.amini@apple.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
> On Feb 21, 2017, at 6:15 AM, via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="gmail_msg" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> Hi, I'm Ryo Ota. I have two questions about `llvm::LLVMContext`.<br class="gmail_msg">
><br class="gmail_msg">
> Q1) What is the difference between the following (A)`my_context` and (B)`global_context`?<br class="gmail_msg">
> Do I have to create a LLVMContext by myself? Or use `getGlobalContext()`?<br class="gmail_msg">
> Could you tell me what situation needs a LLVMContext which is created by myself such as (A)?<br class="gmail_msg">
><br class="gmail_msg">
> (A)<br class="gmail_msg">
> {<br class="gmail_msg">
>       llvm::LLVMContext my_context;<br class="gmail_msg">
>       // codes using only my_context (get Int32ty() or StructType::create or etc...)<br class="gmail_msg">
> }<br class="gmail_msg">
<br class="gmail_msg">
This is fine.<br class="gmail_msg">
<br class="gmail_msg">
><br class="gmail_msg">
> (B)<br class="gmail_msg">
> {<br class="gmail_msg">
>       llvm::LLVMContext &globa_context = llvm::getGlobalContext();<br class="gmail_msg">
>       // codes using only globa_context (get Int32ty() or StructType::create or etc...)<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
<br class="gmail_msg">
This does not exist anymore, getGlobalContext() was removed in 3.9: <a href="https://reviews.llvm.org/rL266379" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/rL266379</a><br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
><br class="gmail_msg">
> Q2) What situation do I need to create multiple `LLVMContext`s?<br class="gmail_msg">
> I don't know the situation used multiple `LLVMContext`s.<br class="gmail_msg">
><br class="gmail_msg">
> For example,<br class="gmail_msg">
> {<br class="gmail_msg">
>       {<br class="gmail_msg">
>               llvm::LLVMContext ctx1;<br class="gmail_msg">
>               // some code<br class="gmail_msg">
>       }<br class="gmail_msg">
><br class="gmail_msg">
>       {<br class="gmail_msg">
>               llvm::LLVMContext ctx2;<br class="gmail_msg">
>               // some code<br class="gmail_msg">
>       }<br class="gmail_msg">
><br class="gmail_msg">
>       {<br class="gmail_msg">
>               llvm::LLVMContext ctx3;<br class="gmail_msg">
>               // some code<br class="gmail_msg">
>       }<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> or<br class="gmail_msg">
><br class="gmail_msg">
> {<br class="gmail_msg">
>       llvm::LLVMContext ctxs[] = {....}<br class="gmail_msg">
>       // some code<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> I'd like to know the appropriate usage of LLVMContext. Thak you very much for reading.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Context is owning a Module. If you work with multiple modules and you intend to link them together, they need to be in the same context. Otherwise you can use a new context for every module.<br class="gmail_msg">
<br class="gmail_msg">
As David mentioned: LLVM is thread-safe at the context level, which means that you cannot have multiple threads processing two modules that are in the same context.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Hope this helps.<br class="gmail_msg">
<br class="gmail_msg">
—<br class="gmail_msg">
Mehdi<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div>