<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class="">Thanks for this comprehensive answer!</div>
<div class="">I’m slowly but surely to understand better about all this.</div>
<div class=""><br class="">
</div>
<div class="">
<blockquote type="cite" class="">That may sound scary,</blockquote>
<br class="">
</div>
<div class="">Yes it does! That said, I’m not sure need to care that much about the C++ ABI, as I don’t plan on linking my IR with C++ directly. It is very interesting to see how it works though, as I’ll probably need to solve the same kind of problems for
 my own frontend language.</div>
<div class=""><br class="">
</div>
<div class="">
<blockquote type="cite" class="">
<div class="">The result of an alloca is a pointer to the stack frame of the current function, so returning it doesn't make sense (like returning the address of a local variable in C). Again, this problem isn't really related to LLVM per se and the easiest
 way to think about it is in terms of how to lower to C.</div>
<div class="">Decisions about object destruction are up to the frontend. At the C or LLVM level they just turn into function calls or whatever you use to implement the semantics that the frontend requires. In other words, if you want an object to be destroyed,
 it's up to your frontend to emit code to perform the destruction wherever the destruction is expected to occur.</div>
</blockquote>
</div>
<div class=""><br class="">
</div>
<div class="">I understand my second question was probably very unclear. When I said “destroyed”, I wasn’t talking about calls to C++ (or any other frontend language) destructors, but more about what is happening to the memory that was stack allocated. Let’s
 consider the following IR:</div>
<div class=""><br class="">
</div>
<div class="">
<div class=""><font face="Menlo" class="">define i32 @f() {</font></div>
<div class=""><font face="Menlo" class="">entry:</font></div>
<div class=""><font face="Menlo" class="">  %0 = alloca i32</font></div>
<div class=""><font face="Menlo" class="">  store i32 123, i32* %0</font></div>
<div class=""><font face="Menlo" class="">  %1 = load i32, i32* %0</font></div>
<div class=""><font face="Menlo" class="">  ret i32 %1</font></div>
<div class=""><font face="Menlo" class="">}</font></div>
<div class=""><font face="Menlo" class=""><br class="">
</font></div>
<div class=""><font face="Menlo" class="">define i32 @main() {</font></div>
<div class=""><font face="Menlo" class="">entry:</font></div>
<div class=""><font face="Menlo" class="">  %0 = alloca i32</font></div>
<div class=""><font face="Menlo" class="">  %1 = call i32 @f()</font></div>
<div class=""><font face="Menlo" class="">  store i32 %1, i32* %0</font></div>
<div class=""><font face="Menlo" class="">  %2 = load i32, i32* %0</font></div>
<div class=""><font face="Menlo" class="">  ret i32 %2</font></div>
<div class=""><font face="Menlo" class="">}</font></div>
</div>
<div class=""><br class="">
</div>
<div class="">As I understand it, f will allocate a new 32 bit memory space on its stack frame, and stores the value 123 in it. But what I’m not sure about is what’s happening to that alloca when f returns. If the alloca is in the frame of f, then the value
 stored at that location should be deallocated (which is what I meant by "destroyed") when f returns, and so I don’t understand what makes the `<span style="font-family: Menlo;" class="">store i32 %1, i32* %0</span>` successfully storing 123 in the alloca of
 the main function. If I had to make a guess, I would say the value pointed by %0 in f is copied to the alloca pointed by %0 in main (which is what I meant by “copy from the runtime of the callee to that of the caller”). With primitive types such as i32, this
 probably doesn't matter, since they would fit in a CPU register, but what if %0 was an alloca for a very large struct? I guess that’s what RVO is all about optimising, but I’d like to confirm that assumption.</div>
<div class=""><br class="">
</div>
<div class="">Once again, I apologise for my poor knowledge of these kind of low-level semantics.</div>
<div class=""><br class="">
</div>
<div class="">Best,</div>
<br class="">
<div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
Dimitri Racordon<br class="">
CUI, Université de Genève<br class="">
7, route de Drize, CH-1227 Carouge - Switzerland<br class="">
Phone: +41 22 379 01 24
<div class=""><br class="">
</div>
</div>
</div>
</body>
</html>