<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="">Philip,<div class=""><br class=""></div><div class="">Unfortunately there was a week where the admins were not available for creating accounts. We now have a team of 5 people who are set up to create bugzilla accounts so I don’t expect this to be issue going forward.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Tanya</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 20, 2017, at 10:58 AM, Philip Reames via llvm-foundation <<a href="mailto:llvm-foundation@lists.llvm.org" class="">llvm-foundation@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
<meta http-equiv="content-type" content="text/html; charset=utf-8" class="">
<div bgcolor="#FFFFFF" text="#000000" class=""><p class="">FYI: this is the third person I know of who has run into problems
getting a bugzilla account created. This needs addressed ASAP.</p><p class="">Philip<br class="">
</p>
<div class="moz-forward-container"><br class="">
<br class="">
-------- Forwarded Message --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody class="">
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">Subject:
</th>
<td class="">Re: [llvm-dev] Possible stack corruption during call to
JITSymbol::getAddress()</td>
</tr>
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">Date: </th>
<td class="">Thu, 20 Apr 2017 09:42:39 -0700</td>
</tr>
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">From: </th>
<td class="">David Lurton via llvm-dev
<a class="moz-txt-link-rfc2396E" href="mailto:llvm-dev@lists.llvm.org"><llvm-dev@lists.llvm.org></a></td>
</tr>
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">Reply-To:
</th>
<td class="">David Lurton <a class="moz-txt-link-rfc2396E" href="mailto:dlurton@gmail.com"><dlurton@gmail.com></a></td>
</tr>
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">To: </th>
<td class="">Lang Hames <a class="moz-txt-link-rfc2396E" href="mailto:lhames@gmail.com"><lhames@gmail.com></a></td>
</tr>
<tr class="">
<th align="RIGHT" valign="BASELINE" nowrap="nowrap" class="">CC: </th>
<td class="">LLVM Developers Mailing List
<a class="moz-txt-link-rfc2396E" href="mailto:llvm-dev@lists.llvm.org"><llvm-dev@lists.llvm.org></a></td>
</tr>
</tbody>
</table>
<br class="">
<br class="">
<div dir="ltr" class="">Well, 3 days later and so far nobody has responded
to my request for an account on <a moz-do-not-send="true" href="http://bugs.llvm.org/" class="">bugs.llvm.org</a>.. so it doesn't
look like I'm going to be able to create that bug on my own,
unfortunately.</div>
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Wed, Apr 19, 2017 at 6:27 PM, Lang
Hames <span dir="ltr" class=""><<a moz-do-not-send="true" href="mailto:lhames@gmail.com" target="_blank" class="">lhames@gmail.com</a>></span>
wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr" class="">Hi David,
<div class=""><br class="">
</div>
<div class="">Thanks very much for that. I'll continue to dig in as
time permits, and I'll update the bug report with my
progress once it's filed.</div>
<div class=""><br class="">
</div>
<div class="">Cheers,</div>
<div class="">Lang.</div>
</div>
<div class="HOEnZb">
<div class="h5">
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Mon, Apr 17, 2017 at 6:42
PM, David Lurton <span dir="ltr" class=""><<a moz-do-not-send="true" href="mailto:dlurton@gmail.com" target="_blank" class="">dlurton@gmail.com</a>></span>
wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr" class="">Thanks Lang. I think I'll go the
bug creation route. I have an email out to
llvm-admin requesting an account on <a moz-do-not-send="true" href="http://bugs.llvm.org/" target="_blank" class="">bugs.llvm.org</a>.
I'll let you know when I've filed the bug.</div>
<div class="m_-3769178140563680007HOEnZb">
<div class="m_-3769178140563680007h5">
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Sun, Apr 16,
2017 at 9:44 PM, Lang Hames <span dir="ltr" class=""><<a moz-do-not-send="true" href="mailto:lhames@gmail.com" target="_blank" class="">lhames@gmail.com</a>></span>
wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div dir="ltr" class="">Hi David,
<div class=""><br class="">
</div>
<div class="">This looks like bad eh-frame data
due to a failure to fix up the frame
descriptor entries:</div>
<div class=""><br class="">
</div>
<div class=""><font face="monospace, monospace" class=""><debug:
adding frame> EHFrameAddr:
0x7feae5827000, EHFrameLoadAddr:
0x00000000e5827000, EHFrameSize:
60<br class="">
</font></div>
<div class="">
<div class=""><font face="monospace,
monospace" class="">==64588==ERROR:
AddressSanitizer: SEGV on
unknown address 0x7feae5827020
(pc 0x7feae886d970 bp
0x000000000001 sp 0x7ffca10e75f8
T0)</font></div>
</div>
<div class=""><br class="">
</div>
<div class="">Eyeballing the code in
RuntimeDyldELF (vs RuntimeDyldMachO,
which is doing the right thing) I
see it lacks the necessary fixups.
If you're feeling game you can try
to port RuntimeDyldMachO's solution
to RuntimeDyldELF (where MachO uses
a template argument, you'll need to
switch over the RuntimeDyldImpl Arch
member to determine the pointer size
for the fixup). Otherwise you should
file a bug on <a moz-do-not-send="true" href="http://bugs.llvm.org/" target="_blank" class="">bugs.llvm.org</a>
and CC me, and then I can CC some of
the ELF devs and see if anyone has
time.</div>
<div class=""><br class="">
</div>
<div class="">In the mean time, turning off
exception support should fix this,
though I'm not sure whether that's a
viable option for your use case.</div>
<div class=""><br class="">
</div>
<div class="">Cheers,<br class="">
</div>
<div class="">Lang.</div>
</div>
<div class="m_-3769178140563680007m_7081830580728777428HOEnZb">
<div class="m_-3769178140563680007m_7081830580728777428h5">
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Thu,
Apr 13, 2017 at 10:53 AM, Lang
Hames <span dir="ltr" class=""><<a moz-do-not-send="true" href="mailto:lhames@gmail.com" target="_blank" class="">lhames@gmail.com</a>></span>
wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex">
<div dir="ltr" class="">Hi David,
<div class=""><br class="">
</div>
<div class="">This is definitely the
right place to ask.</div>
<div class=""><br class="">
</div>
<div class="">Let me see if I can
reproduce this locally...</div>
<div class=""><br class="">
</div>
<div class="">Cheers,</div>
<div class="">Lang.</div>
<div class=""><br class="">
</div>
</div>
<div class="gmail_extra"><br class="">
<div class="gmail_quote">
<div class="">
<div class="m_-3769178140563680007m_7081830580728777428m_8577966870667922979h5">On
Sun, Apr 9, 2017 at
2:02 PM, David Lurton
via llvm-dev <span dir="ltr" class=""><<a moz-do-not-send="true" href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>></span>
wrote:<br class="">
</div>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div class="">
<div class="m_-3769178140563680007m_7081830580728777428m_8577966870667922979h5">
<div dir="ltr" class="">Firstly,
apologies if this
is not the right
place to be asking
this
question--feel
free to point me
in the correct
direction. I
could be doing
something wrong
here but
stackoverflow
didn't feel like
the correct place
for this since
there's so little
there about LLVM
ORC.
<div class=""><br class="">
</div>
<div class="">
<div class="">
<div class="">Basically,
I have a
reproduction
case (below)
where if I
throw an
exception
before I call
JITSymbol::getAddress() everything works properly but throwing the same
exception
afterward will
result in a
SIGSEGV during
stack
unwinding.
This suggests
to me that
somehow the
stack is
getting
corrupted
during the
JITSymbol::getAddress()
call. </div>
</div>
</div>
<div class=""><br class="">
</div>
<div class="">This problem
was initially
discovered while
working on my
own project.
While
troubleshooting
this I've
discvoered that
when LLVM is<span style="font-family:monospace,monospace" class="">-DLLVM_USE_SANITIZER:STRING=<wbr class="">Address </span><font face="arial,
helvetica,
sans-serif" class="">the
problem
happens at
different
points during
execution,
perhaps having
something to
do with the
padding around
the stack
variables
added by the
sanitizer?
See the note
after the call
to runTest()
in main().</font></div>
<div class=""><br class="">
</div>
<div class="">I'm running
this under an
up-to-date
Antergos Linux,
clang version:
3.9.1 (tried
compiling LLVM
and the example
program below
with gcc 6.3.1
and the result
is the same)
clang set to
default compiler
by setting the
following
environment
variables:</div>
<div class="">
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
CC=/usr/bin/clang</font></div>
<div class=""><font face="monospace,
monospace" class="">
CXX=/usr/bin/clang++</font></div>
<div class=""><br class="">
</div>
<div class="">Commands
used to build
LLVM:</div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
git clone <a moz-do-not-send="true" href="https://github.com/llvm-mirror/llvm.git" target="_blank" class="">https://github.com/llvm-mirror<wbr class="">/llvm.git</a></font></div>
<div class=""><font face="monospace,
monospace" class="">
git checkout
release_40</font></div>
<div class=""><font face="monospace,
monospace" class="">
cd llvm</font></div>
<div class=""><font face="monospace,
monospace" class="">
mkdir build</font></div>
<div class=""><font face="monospace,
monospace" class="">
cd build</font></div>
<div class=""><font face="monospace,
monospace" class="">
cmake ..
-DLLVM_BUILD_LLVM_DYLIB:BOOL=O<wbr class="">N
-DLLVM_ENABLE_RTTI:BOOL=ON -DLLVM_ENABLE_EH:BOOL=ON
-DLLVM_USE_SANITIZER:STRING=Ad<wbr class="">dress
-DLLVM_PARALLEL_COMPILE_JOBS:S<wbr class="">TRING=8
-DLLVM_ENABLE_ASSERTIONS:BOOL=<wbr class="">ON</font></div>
<div class=""><font face="monospace,
monospace" class="">
cmake --build
. -- -j 8</font></div>
<div class=""><font face="monospace,
monospace" class="">
sudo cmake
--build .
--target
install</font></div>
<div class=""><br class="">
</div>
<div class="">Command
used to build
test case
executable:</div>
<div class=""><br class="">
</div>
<div class=""> clang
test.cpp
-std=c++14
-lstdc++
-lLLVM-4.0
-Wall
-pedantic
-Wextra
-fstack-protector-all
-fsanitize=address -fexceptions</div>
<div class=""><br class="">
</div>
<div class="">Then of
course:</div>
<div class=""><br class="">
</div>
<div class=""><font face="monospace,
monospace" class="">
./a.out</font></div>
</div>
<div class=""><br class="">
</div>
<div class="">Output from
the a.out:</div>
<div class=""><br class="">
</div>
<div class="">
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class="">
<div class=""><font face="monospace,
monospace" class="">ASAN:DEADLYSIGNAL</font></div>
<div class=""><font face="monospace,
monospace" class="">==============================<wbr class="">==============================<wbr class="">=====</font></div>
<div class=""><font face="monospace,
monospace" class="">==6582==ERROR:
AddressSanitizer: SEGV on unknown address 0x7f59eeb06020 (pc
0x7f59f1b20930
bp
0x000000000001
sp
0x7ffc5e546218
T0)</font></div>
<div class=""><font face="monospace,
monospace" class="">==6582==The
signal is
caused by a
READ memory
access.</font></div>
</div>
</blockquote>
</div>
<div class="">
<div class=""><font face="arial,
helvetica,
sans-serif" class=""><br class="">
</font></div>
<div class=""><font face="arial,
helvetica,
sans-serif" class="">The
result if
running
`backtrace` in
GDB while
execution is
paused after
the SIGSEGV
occurs:</font></div>
<div class=""><font face="arial,
helvetica,
sans-serif" class=""><br class="">
</font></div>
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class=""><font face="monospace,
monospace" class="">#0
read_encoded_value_with_base (encoding=encoding@entry=28 '\034',
base=base@entry=0,
p=p@entry=0x7fffe8a06020 <error: Cannot access memory at address
0x7fffe8a06020>,
val=val@entry=0x7fffffffd6d8) at /build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-pe.h:252</font></div>
<div class=""><font face="monospace,
monospace" class="">#1
0x00007fffeba05a61 in binary_search_single_encoding_<wbr class="">fdes
(pc=0x7fffeba04426
<_Unwind_Resume+54>, ob=0x0) at /build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2-fde.c:908</font></div>
<div class=""><font face="monospace,
monospace" class="">#2
search_object
(ob=ob@entry=0x60400001d9d0, pc=pc@entry=0x7fffeba04426
<_Unwind_Resume+54>)
at
/build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2-fde.c:977</font></div>
<div class=""><font face="monospace,
monospace" class="">#3
0x00007fffeba05fdd in _Unwind_Find_registered_FDE
(bases=0x7fffffffda78,
pc=0x7fffeba04426 <_Unwind_Resume+54>) at
/build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2-fde.c:1013</font></div>
<div class=""><font face="monospace,
monospace" class="">#4
_Unwind_Find_FDE (pc=0x7fffeba04426 <_Unwind_Resume+54>,
bases=bases@entry=0x7fffffffda<wbr class="">78)
at
/build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2-fde-dip.c:454</font></div>
<div class=""><font face="monospace,
monospace" class="">#5
0x00007fffeba02b23 in uw_frame_state_for (context=context@entry=0x7ffff<wbr class="">fffd9d0,
fs=fs@entry=0x7fffffffd820) at /build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2.c:1241</font></div>
<div class=""><font face="monospace,
monospace" class="">#6
0x00007fffeba03d40 in uw_init_context_1 (context=context@entry=0x7ffff<wbr class="">fffd9d0,
outer_cfa=outer_cfa@entry=0x7f<wbr class="">ffffffdc00, outer_ra=0x5110fc) at
/build/gcc/src/gcc/libgcc/unwi<wbr class="">nd-dw2.c:1562</font></div>
<div class=""><font face="monospace,
monospace" class="">#7
0x00007fffeba04427 in _Unwind_Resume (exc=0x60d00000c7b0) at
/build/gcc/src/gcc/libgcc/unwi<wbr class="">nd.inc:224</font></div>
<div class=""><font face="monospace,
monospace" class="">#8
0x00000000005110fc in runTest () at /home/dave/projects/untitled/t<wbr class="">est.cpp:124</font></div>
<div class=""><font face="monospace,
monospace" class="">#9
0x0000000000511138 in main (argc=1, argv=0x7fffffffe698) at
/home/dave/projects/untitled/t<wbr class="">est.cpp:132</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
</blockquote>
</div>
<div class="">My test-case
is below. In
runTest(), note
the commented
out throw
statement before
symbol.getAddress() and the uncommented one after it. Also note the
comments after
the call to
runTest() in
main().<br class="">
</div>
<div class=""><br class="">
</div>
<div class="">Thanks.</div>
<div class="">
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class=""><br class="">
</div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ADT/STLExtras.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/Executio<wbr class="">nEngine.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/IR/IRBuilder.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/SectionM<wbr class="">emoryManager.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/Orc/Comp<wbr class="">ileUtils.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/Orc/IRCo<wbr class="">mpileLayer.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/Orc/Lamb<wbr class="">daResolver.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/ExecutionEngine/Orc/Obje<wbr class="">ctLinkingLayer.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/IR/Mangler.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/Support/DynamicLibrary.h<wbr class="">"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
"llvm/Support/TargetSelect.h"</font></div>
<div class=""><font face="monospace,
monospace" class="">#include
<iostream></font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">using
namespace
llvm;</font></div>
<div class=""><font face="monospace,
monospace" class="">using
namespace
llvm::orc;</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">/**
This class
taken verbatim
from</font></div>
<div class=""><font face="monospace,
monospace" class=""> *
<a moz-do-not-send="true" href="https://github.com/llvm-mirror/llvm/blob/release_40/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h" target="_blank" class="">https://github.com/llvm-mirror<wbr class="">/llvm/blob/release_40/examples<wbr class="">/Kaleidoscope/BuildingAJIT/Cha<wbr class="">pter1/KaleidoscopeJIT.h</a></font></div>
<div class=""><font face="monospace,
monospace" class=""> *
This is from
the same
revision of
LLVM I am
using (the
release_40
branch as of
4/8/2017)</font></div>
<div class=""><font face="monospace,
monospace" class=""> */</font></div>
<div class=""><font face="monospace,
monospace" class="">class
KaleidoscopeJIT {</font></div>
<div class=""><font face="monospace,
monospace" class="">private:</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::unique_ptr<TargetMachine> TM;</font></div>
<div class=""><font face="monospace,
monospace" class="">
const
DataLayout DL;</font></div>
<div class=""><font face="monospace,
monospace" class="">
ObjectLinkingLayer<> ObjectLayer;</font></div>
<div class=""><font face="monospace,
monospace" class="">
IRCompileLayer<decltype(Object<wbr class="">Layer)> CompileLayer;</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">public:</font></div>
<div class=""><font face="monospace,
monospace" class="">
typedef
decltype(CompileLayer)::Module<wbr class="">SetHandleT
ModuleHandle;</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
KaleidoscopeJIT()</font></div>
<div class=""><font face="monospace,
monospace" class="">
:
TM(EngineBuilder().selectTarge<wbr class="">t()),
DL(TM->createDataLayout()),</font></div>
<div class=""><font face="monospace,
monospace" class="">
CompileLayer(ObjectLayer,
SimpleCompiler(*TM)) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::sys::DynamicLibrary::Loa<wbr class="">dLibraryPermanently(nullptr);</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
TargetMachine
&getTargetMachine() { return *TM; }</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
ModuleHandle
addModule(std::unique_ptr<Modu<wbr class="">le>
M) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
// Build
our symbol
resolver:</font></div>
<div class=""><font face="monospace,
monospace" class="">
// Lambda
1: Look back
into the JIT
itself to find
symbols that
are part of</font></div>
<div class=""><font face="monospace,
monospace" class="">
//
the same
"logical
dylib".</font></div>
<div class=""><font face="monospace,
monospace" class="">
// Lambda
2: Search for
external
symbols in the
host process.</font></div>
<div class=""><font face="monospace,
monospace" class="">
auto
Resolver =
createLambdaResolver(</font></div>
<div class=""><font face="monospace,
monospace" class="">
[&](const
std::string
&Name) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
if (auto Sym
=
CompileLayer.findSymbol(Name,
false))</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
Sym;</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
JITSymbol(nullptr);</font></div>
<div class=""><font face="monospace,
monospace" class="">
},</font></div>
<div class=""><font face="monospace,
monospace" class="">
[](const
std::string
&Name) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
if (auto
SymAddr =</font></div>
<div class=""><font face="monospace,
monospace" class="">
RTDyldMemoryManager::getSymbol<wbr class="">AddressInProcess(Name))</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
JITSymbol(SymAddr,
JITSymbolFlags::Exported);</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
JITSymbol(nullptr);</font></div>
<div class=""><font face="monospace,
monospace" class="">
});</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
// Build a
singleton
module set to
hold our
module.</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::vector<std::unique_ptr<Mo<wbr class="">dule>>
Ms;</font></div>
<div class=""><font face="monospace,
monospace" class="">
Ms.push_back(std::move(M));</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
// Add the
set to the JIT
with the
resolver we
created above
and a newly</font></div>
<div class=""><font face="monospace,
monospace" class="">
// created
SectionMemoryManager.</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
CompileLayer.addModuleSet(std:<wbr class="">:move(Ms),</font></div>
<div class=""><font face="monospace,
monospace" class="">
make_unique<SectionMemoryMana<wbr class="">ger>(),</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::move(Resolver));</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
JITSymbol
findSymbol(const
std::string
Name) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::string
MangledName;</font></div>
<div class=""><font face="monospace,
monospace" class="">
raw_string_ostream
MangledNameStream(MangledName)<wbr class="">;</font></div>
<div class=""><font face="monospace,
monospace" class="">
Mangler::getNameWithPrefix(Man<wbr class="">gledNameStream,
Name, DL);</font></div>
<div class=""><font face="monospace,
monospace" class="">
return
CompileLayer.findSymbol(Mangle<wbr class="">dNameStream.str(),
true);</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
void
removeModule(ModuleHandle
H) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
CompileLayer.removeModuleSet(H<wbr class="">);</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class="">};</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">const
std::string
FUNC_NAME =
"someFunction";</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">void
runTest() {</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::LLVMContext context;</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::IRBuilder<> irBuilder{context};</font></div>
<div class=""><font face="monospace,
monospace" class="">
KaleidoscopeJIT jit;</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
auto module =
std::make_unique<llvm::Module><wbr class="">("help", context);</font></div>
<div class=""><font face="monospace,
monospace" class="">
module->setDataLayout(jit.getT<wbr class="">argetMachine().createDataLayou<wbr class="">t());</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
auto function
=
llvm::cast<llvm::Function>(mod<wbr class="">ule->getOrInsertFunction(FUNC_<wbr class="">NAME,</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::Type::getInt32Ty(contex<wbr class="">t), nullptr));</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
auto block =
llvm::BasicBlock::Create(conte<wbr class="">xt,
"functionBody", function);</font></div>
<div class=""><font face="monospace,
monospace" class="">
irBuilder.SetInsertPoint(block<wbr class="">);</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
irBuilder.CreateRet(llvm::Cons<wbr class="">tantInt::get(context, llvm::APInt(32,
1, true)));</font></div>
<div class=""><font face="monospace,
monospace" class="">
jit.addModule(std::move(module<wbr class="">));</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::JITSymbol symbol = jit.findSymbol(FUNC_NAME);</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
//Just to
ensure that
the symbol is
in fact valid
(symbol
evaluates to
true during
execution)</font></div>
<div class=""><font face="monospace,
monospace" class="">
if(!symbol) {</font></div>
<div class=""><font face="monospace,
monospace" class="">
throw
std::runtime_error("Symbol
not found");</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
//when
uncommented,
the throw
statement does
NOT cause a
SIGSEGV.</font></div>
<div class=""><font face="monospace,
monospace" class="">
//throw
std::runtime_error("This
should not
crash.");</font></div>
<div class=""><font face="monospace,
monospace" class="">
uint64_t ptr =
symbol.getAddress();</font></div>
<div class=""><font face="monospace,
monospace" class="">
//HOWEVER... a
SIGSEGV occurs
during
stack-unwinding
while throwing
the exception
below.</font></div>
<div class=""><font face="monospace,
monospace" class="">
//Hence, the
call to
symbol.getAddress()
must be
causing some
kind of memory
corruption.</font></div>
<div class=""><font face="monospace,
monospace" class="">
//My guess is
that it's
clobbering the
stack.</font></div>
<div class=""><font face="monospace,
monospace" class="">
throw
std::runtime_error("This
should not
crash but does
anyway.");</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::cout
<< "Ptr
is " <<
ptr <<
"\n";</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
int
(*someFuncPtr)()
=
reinterpret_cast<int
(*)()>(ptr);</font></div>
<div class=""><font face="monospace,
monospace" class="">
//int
(*someFuncPtr)()
= (int
(*)())ptr;</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
int
returnValue =
someFuncPtr();</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
std::cout
<<
"Return value
is: " <<
returnValue
<< "\n";</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">int
main(int argc,
char **argv) {</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::InitializeNativeTarget()<wbr class="">;</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::InitializeAllAsmPrinters<wbr class="">();</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
try {</font></div>
<div class=""><font face="monospace,
monospace" class="">
runTest();</font></div>
</blockquote>
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class=""><font face="monospace,
monospace" class="">
//NOTE:
if LLVM is
compiled
without </font><span style="font-family:monospace,monospace" class="">-DLLVM_USE_SANITIZER:S<wbr class="">TRING=Address,
the last throw
in runTest()
does not cause</span></div>
</blockquote>
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class=""><font face="monospace,
monospace" class="">
//a
SIGSEGV,
however this
throw will.</font></div>
</blockquote>
<blockquote style="margin:0px
0px 0px
40px;border:none;padding:0px" class="">
<div class="">
<div class=""><font face="monospace,
monospace" class="">
//throw
std::runtime_error("This
should not
crash but does
anyway.");</font></div>
</div>
<div class=""><span style="font-family:monospace,monospace" class="">
}
catch(std::runtime_error
&e) {</span><br class="">
</div>
<div class=""><font face="monospace,
monospace" class="">
std::cout
<<
"Exception
caught: "
<<
e.what()
<< "\n";</font></div>
<div class=""><font face="monospace,
monospace" class="">
}</font></div>
<div class=""><font face="monospace,
monospace" class=""><br class="">
</font></div>
<div class=""><font face="monospace,
monospace" class="">
llvm::llvm_shutdown();</font></div>
<div class=""><font face="monospace,
monospace" class="">
return 0;</font></div>
<div class=""><font face="monospace,
monospace" class="">}<br class="">
<br class="">
<br class="">
</font></div>
</blockquote>
</div>
<div class=""><font face="arial,
helvetica,
sans-serif" class=""><br class="">
</font></div>
</div>
<br class="">
</div>
</div>
______________________________<wbr class="">_________________<br class="">
LLVM Developers mailing
list<br class="">
<a moz-do-not-send="true" href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a><br class="">
<a moz-do-not-send="true" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-dev</a><br class="">
<br class="">
</blockquote>
</div>
<br class="">
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
<span id="cid:1BA77B45-F4A2-4E0D-8E9D-05930F85B8E9@wp.comcast.net"><Attached Message Part.txt></span>_______________________________________________<br class="">llvm-foundation mailing list<br class=""><a href="mailto:llvm-foundation@lists.llvm.org" class="">llvm-foundation@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-foundation<br class=""></div></blockquote></div><br class=""></div></body></html>