<div dir="ltr"><div><div>Hello Willy,<br></div>Here is the dump from one of my bitcode files:<br>
<br>0000000 42 43 c0 de 21 0c 00 00 25 05 00 00 0b 82 20 00<br><br></div><div>As expected, 0x42 (= B), 0x43 (= C), xc0 and 0xde are in correct order. In your case, the first byte is read as 37 (= 0x25). I wonder why? When you check the bytes yourself, you get expected results. When the same bytes are read from Stream object, you get a different result (maybe garbage). I would suggest that you put a watchpoint on mbjit->getBufferStart() and single step your program to make sure it is not freed, over written somewhere.<br>

<br>thx<br>Vikas.<br>=======<br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 20, 2014 at 7:50 AM, Willy WOLFF <span dir="ltr"><<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.unistra.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The stack trace is:<br>
(gdb) bt<br>
#0  0x00000000004fa8c8 in llvm::BitstreamCursor::Read(<u></u>unsigned int) ()<br>
#1  0x00000000004fa1d2 in llvm::BitcodeReader::<u></u>ParseBitcodeInto(llvm::Module*<u></u>) ()<br>
#2  0x0000000000503ae9 in llvm::getLazyBitcodeModule(<u></u>llvm::MemoryBuffer*, llvm::LLVMContext&) ()<br>
#3  0x0000000000503eb6 in llvm::parseBitcodeFile(llvm::<u></u>MemoryBuffer*, llvm::LLVMContext&) ()<br>
#4  0x00000000004ec195 in jitter (skeletons=<optimized out>, params=0x7fffffffdf40, phi_state=0x11adbc0, lower=0, upper=250, inst_outer=8, inst_inner=<optimized out>)<br>
    at /home/willy/hello_stuff/with_<u></u>apollo/simple_loop/runtime.<u></u>cpp:263<br>
#5  0x00000000004ec8fa in apollo_runtime_hook (info=<optimized out>, skeletons=0xc8b1f0, skeleton_size=<optimized out>, params=0x7fffffffdf40, phi_state_size=<optimized out>)<br>
    at /home/willy/hello_stuff/with_<u></u>apollo/simple_loop/runtime.<u></u>cpp:438<br>
#6  0x00000000004ee753 in ?? ()<br>
#7  0x00000000004ecbf1 in main (argc=<optimized out>, argv=<optimized out>) at /home/willy/hello_stuff/with_<u></u>apollo/simple_loop/simple_<u></u>scev_dynamic_array.c:84<div><div class="h5"><br>
<br>
<br>
<br>
On 03/20/2014 10:10 AM, Willy WOLFF wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
This segfault occuring only under valgrind,<br>
in shell way, and in gdb way i have<br>
<br>
Invalid bitcode signature<br>
simple_scev_dynamic_array:<br>
/home/willy/apollo/llvm/<u></u>include/llvm/Support/ErrorOr.<u></u>h:258: storage_type<br>
*llvm::ErrorOr<llvm::Module *>::getStorage() [T = llvm::Module *]:<br>
Assertion `!HasError && "Cannot get value when an error exists!"' failed.<br>
Command terminated by signal 6<br>
<br>
<br>
this is the code I use:<br>
<br>
<br>
long jitter(void* info, skeleton_pair *skeletons, long skeleton_size,<br>
param_t params, long phi_state_size) {<br>
InitializeNativeTarget();<br>
InitializeNativeTargetAsmPrint<u></u>er();<br>
<br>
llvm::StringRef sr (skeletons[idx].jit_bytecode,<br>
                                  skeletons[idx].jit_bytecode_<u></u>length);<br>
<br>
                                if (sr.str()[0] == 'B')<br>
                                         std::cout << "B ok\n";<br>
                                 if (sr.str()[1] == 'C')<br>
                                         std::cout << "C ok\n";<br>
                                 if (sr.str()[2] == (char) 0xc0)<br>
                                         std::cout << "0xc0 ok\n";<br>
                                 if (sr.str()[3] == (char) 0xde)<br>
                                         std::cout << "0xde ok\n";<br>
llvm::MemoryBuffer* mbjit = llvm::MemoryBuffer::<u></u>getMemBufferCopy (sr);<br>
<br>
llvm::ErrorOr<llvm::Module*> ModuleOrErr = llvm::parseBitcodeFile<br>
(mbjit, context);<br>
if (llvm::error_code EC = ModuleOrErr.getError()) {<br>
std::cout << ModuleOrErr.getError().<u></u>message() << "\n";<br>
}<br>
<br>
Module* Mjit = ModuleOrErr.get();<br>
<br>
std::string eeError;<br>
ExecutionEngine* nee =<br>
EngineBuilder(Mjit).<u></u>setEngineKind(EngineKind::JIT)<u></u>.setUseMCJIT(true).<u></u>setErrorStr(&eeError).create()<u></u>;<br>
if (!nee) {<br>
fprintf(stderr, "Could not create ExecutionEngine: %s\n", eeError.c_str());<br>
assert(false);<br>
}<br>
<br>
Function f = ret_fct(Mjit);   // Function* ret_fct (Module*);    return<br>
the function we want to jit.<br>
uint64_t f_ptr = nee->getFunctionAddress(f-><u></u>getName());<br>
<br>
long (*fjited)(param_t, phi_state_t, long, long, long, long)<br>
= (long (*)(param_t, phi_state_t, long, long, long, long)) (intptr_t)f_ptr;<br>
<br></div></div>
returnfjited (params, phi_state, lower, upper, inst_outer, inst_inner);<br>
}<br>
<br>
<br>
Thanks,<br>
*--*<br>
*Willy WOLFF*<div class=""><br>
<br>
On 20 Mar 2014, at 00:37, Vikas Bhargava wrote:<br>
<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
segmentation fault indicates memory corruption and it's hard to tell<br>
without seeing the exact use of the APIs. If possible, please post a<br>
complete program and gdb stack trace from the core file. If there are<br>
multiple threads using the global variables, please let us know.<br>
<br>
FWIW, I have some tests to write llvm::Module to bitcode files and<br>
read them back into llvm::Module and they work just fine with 3.4<br>
(never tried with tip).<br>
<br>
thx<br>
vikas.<br>
========<br>
<br>
<br>
On Wed, Mar 19, 2014 at 2:58 PM, Willy WOLFF<br></div><div><div class="h5">
<<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.unistra.fr</a> <mailto:<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.<u></u>unistra.fr</a>>> wrote:<br>

<br>
    all of:<br>
    ----<br>
                                    // cout << "lsr: " << lsr << "\n";<br>
                                    llvm::MemoryBuffer* mbjit =<br>
<br>
    llvm::MemoryBuffer::<u></u>getMemBufferCopy (sr);<br>
    ------<br>
    string lsr = sr.str();<br>
                                    // cout << "lsr: " << lsr << "\n";<br>
                                    llvm::MemoryBuffer* mbjit =<br>
<br>
    llvm::MemoryBuffer::<u></u>getMemBuffer (lsr);<br>
    -------<br>
    string lsr = sr.str();<br>
                                    // cout << "lsr: " << lsr << "\n";<br>
                                    llvm::MemoryBuffer* mbjit =<br>
<br>
    llvm::MemoryBuffer::<u></u>getMemBufferCopy (lsr);<br>
<br>
<br>
    have same result as invalid bit code.<br>
    The result of valgrind, effectively, i have invalid reads in the<br>
    parseBitcodeFile:<br>
<br>
    ==536== Conditional jump or move depends on uninitialised value(s)<br>
    ==536==    at 0x501FE3: llvm::BitstreamCursor::Read(<u></u>unsigned int)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x501A19:<br>
    llvm::BitcodeReader::<u></u>ParseBitcodeInto(llvm::Module*<u></u>) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50AEC8:<br>
    llvm::getLazyBitcodeModule(<u></u>llvm::MemoryBuffer*,<br>
    llvm::LLVMContext&) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50B295:<br>
    llvm::parseBitcodeFile(llvm::<u></u>MemoryBuffer*, llvm::LLVMContext&)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F1231: blah_runtime_hook (runtime.cpp:348)<br>
    ==536==    by 0x4F46C2: ??? (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F2B60: main (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==<br>
    ==536== Invalid read of size 8<br>
    ==536==    at 0x501FE8: llvm::BitstreamCursor::Read(<u></u>unsigned int)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x501A19:<br>
    llvm::BitcodeReader::<u></u>ParseBitcodeInto(llvm::Module*<u></u>) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50AEC8:<br>
    llvm::getLazyBitcodeModule(<u></u>llvm::MemoryBuffer*,<br>
    llvm::LLVMContext&) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50B295:<br>
    llvm::parseBitcodeFile(llvm::<u></u>MemoryBuffer*, llvm::LLVMContext&)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F1231: blah_runtime_hook (runtime.cpp:348)<br>
    ==536==    by 0x4F46C2: ??? (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F2B60: main (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==  Address 0x0 is not stack'd, malloc'd or (recently) free'd<br>
    ==536==<br>
    ==536==<br>
    ==536== Process terminating with default action of signal 11 (SIGSEGV)<br>
    ==536==  Access not within mapped region at address 0x0<br>
    ==536==    at 0x501FE8: llvm::BitstreamCursor::Read(<u></u>unsigned int)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x501A19:<br>
    llvm::BitcodeReader::<u></u>ParseBitcodeInto(llvm::Module*<u></u>) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50AEC8:<br>
    llvm::getLazyBitcodeModule(<u></u>llvm::MemoryBuffer*,<br>
    llvm::LLVMContext&) (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x50B295:<br>
    llvm::parseBitcodeFile(llvm::<u></u>MemoryBuffer*, llvm::LLVMContext&)<br>
    (in /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F1231: blah_runtime_hook (runtime.cpp:348)<br>
    ==536==    by 0x4F46C2: ??? (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
    ==536==    by 0x4F2B60: main (in<br>
    /home/willy/blah_test_script/<u></u>new_blah/simple_scev_dynamic_<u></u>array)<br>
<br>
<br>
<br></div></div>
    *--*<br>
    *Willy WOLFF*<div class=""><br>
<br>
    On 19 Mar 2014, at 22:11, Vikas Bhargava wrote:<br>
<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
    Hi Willy,<br>
    If the disassembly of the module works fine, then there is<br>
    nothing wrong with the module.<br>
<br>
    Stream uses the memorybuffer that you pass in parseBitcodeFile.<br>
    If what Will is saying is true, there is something wrong with<br>
    your code in "3:", i.e.:<br>
<br>
    MemoryBuffer* mbjit = MemoryBuffer::getMemBuffer (sr.str());<br>
      LLVMContext& context = getGlobalContext();<br>
      ErrorOr<Module*> ModuleOrErr = parseBitcodeFile (mbjit, context);<br>
      if (error_code EC = ModuleOrErr.getError())<br>
      {<br>
        std::cout << ModuleOrErr.getError().<br>
    message() << "\n";<br>
        assert(false);<br>
      }<br>
<br>
    Can you post how you modified it in your second reply? For<br>
    debugging purpose, you can simply use<br>
    MemoryBuffer::<u></u>getMemBufferCopy() and not worry about validity of<br>
    stringref or null-termination. Also, you can run your program<br>
    through valgrind and check for any invalid reads.<br>
<br>
    HTH<br>
    Vikas.<br>
    =======<br>
<br>
<br>
<br>
    On Wed, Mar 19, 2014 at 10:32 AM, Willy WOLFF<br></div>
    <<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.unistra.fr</a> <mailto:<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.<u></u>unistra.fr</a>>><div class="">
<br>
    wrote:<br>
<br>
        I mad the change, and still have the problem.<br>
<br>
        I investigate more the source code of llvm.<br>
<br>
        First, I change isRawBitcode function to print the content of<br>
        the parameter like this:<br>
        original:<br></div>
        <a href="http://llvm.org/docs/doxygen/__html/ReaderWriter_8h_source.__html#l00081" target="_blank">http://llvm.org/docs/doxygen/_<u></u>_html/ReaderWriter_8h_source._<u></u>_html#l00081</a><div><div class="h5"><br>

        <<a href="http://llvm.org/docs/doxygen/html/ReaderWriter_8h_source.html#l00081" target="_blank">http://llvm.org/docs/doxygen/<u></u>html/ReaderWriter_8h_source.<u></u>html#l00081</a>><br>
<br>
          inline bool isRawBitcode(const unsigned char *BufPtr,<br>
                                   const unsigned char *BufEnd) {<br>
            // These bytes sort of have a hidden message, but it's not in<br>
            // little-endian this time, and it's a little redundant.<br>
                  errs()<< "isRawBitcode output:\n";<br>
                  for (int i = 0; i < 4; i++)<br>
                          errs() << BufPtr[i] << "\n";<br>
                  if (BufPtr != BufEnd )<br>
                        errs() << "BP != BE ok\n";<br>
                  if (BufPtr[0] == 'B')<br>
                        errs() << "B ok\n";<br>
                  if (BufPtr[1] == 'C')<br>
                        errs() << "C ok\n";<br>
                  if (BufPtr[2] ==  0xc0)<br>
                        errs() << "0xc0 ok\n";<br>
                  if (BufPtr[3] ==  0xde)<br>
                        errs() << "0xde ok\n";<br>
<br>
            return BufPtr != BufEnd &&<br>
                   BufPtr[0] == 'B' &&<br>
                   BufPtr[1] == 'C' &&<br>
                   BufPtr[2] == 0xc0 &&<br>
                   BufPtr[3] == 0xde;<br>
          }<br>
<br>
<br>
        Second, I change ParseBitcodeInto as this:<br>
        original:<br></div></div>
        <a href="http://llvm.org/docs/doxygen/__html/BitcodeReader_8cpp___source.html#l01971" target="_blank">http://llvm.org/docs/doxygen/_<u></u>_html/BitcodeReader_8cpp___<u></u>source.html#l01971</a><div class=""><br>

        <<a href="http://llvm.org/docs/doxygen/html/BitcodeReader_8cpp_source.html#l01971" target="_blank">http://llvm.org/docs/doxygen/<u></u>html/BitcodeReader_8cpp_<u></u>source.html#l01971</a>><br>
        ...<br>
                errs() << "parsebitcodeinto sniff the signature\n";<br>
                uint32_t bvar = Stream.Read(8);<br>
                                errs() << "B :" << bvar << "\n";<br>
                if (bvar != 'B') {<br>
                        errs() << "B :" << bvar << "\n";<br></div>
                        return Error(InvalidBitcodeSignature)<u></u>__;<div class=""><br>
                }<br>
<br>
                if (Stream.Read(8) != 'C') {<br>
                        errs() << "C\n";<br></div>
                        return Error(InvalidBitcodeSignature)<u></u>__;<div class=""><br>
                }<br>
                if (  Stream.Read(8) != 0xc0 ) {<br>
                        errs() << "0xc0\n";<br></div>
                        return Error(InvalidBitcodeSignature)<u></u>__;<div class=""><br>
                }<br>
                if (  Stream.Read(8) != 0xde ) {<br>
                        errs() << "0xde\n";<br></div>
                        return Error(InvalidBitcodeSignature)<u></u>__;<div class=""><br>
                }<br>
                // if (Stream.Read(8) != 'B' ||<br>
                //     Stream.Read(8) != 'C' ||<br>
                //     Stream.Read(4) != 0x0 ||<br>
                //     Stream.Read(4) != 0xC ||<br>
                //     Stream.Read(4) != 0xE ||<br>
                //     Stream.Read(4) != 0xD<br>
                //      ) {<br>
        ...<br>
<br>
<br>
<br>
        The output of the code is :<br>
<br>
<br>
        isRawBitcode output:<br>
        B<br>
        C<br>
<br>
<br>
        BP != BE ok<br>
<br>
        B ok<br>
        C ok<br>
        0xc0 ok<br>
        0xde ok<br>
<br>
        parsebitcodeinto sniff the signature<br>
        B :37<br>
        B :37<br>
<br>
<br>
<br>
<br>
        It's possible that Stream object is not correctly initialized?<br>
<br>
<br>
        On 03/13/2014 06:37 PM, Will Dietz wrote:<br>
<br>
            On Thu, Mar 13, 2014 at 9:02 AM, Willy WOLFF<br>
            <<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.unistra.fr</a><br></div><div class="">
            <mailto:<a href="mailto:willy.wolff@etu.unistra.fr" target="_blank">willy.wolff@etu.<u></u>unistra.fr</a>>> wrote:<br>
<br>
                Hello,<br>
<br>
                I having a weird problem while writing a bytecode<br>
                module to a string,<br>
                and after read/parse it for unsing on a jit.<br>
<br>
                I write a pass to export function to module, and put<br>
                this module inside<br>
                a global variable.<br>
                I use WriteBitcodeToFile for this.<br>
                For debuging, after this write, I try to load the<br>
                exported module with<br>
                parseBitcodeFile.<br>
                This two step works.<br>
<br>
<br>
<br>
                After, while the compiled program is running, I try<br>
                to read and parse<br>
                this global variable for jiting the function.<br>
<br>
                1) I read the global variable with<br>
                   StringRef sr (gv, gv_length);<br>
<br>
                2) I manually test this bytecode by<br>
                (inspired by  inline bool isRawBitcode(const unsigned<br>
                char *BufPtr,<br>
                const unsigned char *BufEnd) at<br></div>
                <a href="http://llvm.org/docs/doxygen/__html/ReaderWriter_8h_source.__html#l00067" target="_blank">http://llvm.org/docs/doxygen/_<u></u>_html/ReaderWriter_8h_source._<u></u>_html#l00067</a><br>
                <<a href="http://llvm.org/docs/doxygen/html/ReaderWriter_8h_source.html#l00067" target="_blank">http://llvm.org/docs/doxygen/<u></u>html/ReaderWriter_8h_source.<u></u>html#l00067</a>>)<div><div class="h5">
<br>
                   if (sr.str()[0] == 'B')<br>
                     std::cout << "B ok\n";<br>
                   if (sr.str()[1] == 'C')<br>
                     std::cout << "C ok\n";<br>
                   if (sr.str()[2] == (char) 0xc0)<br>
                     std::cout << "0xc0 ok\n";<br>
                   if (sr.str()[3] == (char) 0xde)<br>
                     std::cout << "0xde ok\n";<br>
<br>
                3) I try to parse the gv by<br>
                   MemoryBuffer* mbjit = MemoryBuffer::getMemBuffer<br>
                (sr.str());<br>
<br>
<br>
            Not sure if this is your issue, but should be fixed anyway:<br>
<br>
            The std::string created by "sr.str()" ends its lifetime<br>
            in this<br>
            statement, and MemoryBuffer for efficiency reasons<br>
            avoids copying data it doesn't have to (like StringRef)<br>
            so will be<br>
            referencing the freed memory.<br>
<br>
            To resolve this:<br>
            * Pass MemoryBuffer your StringRef directly<br>
            * Use getMemBufferCopy()<br>
            * Preserve the result of sr.str() into a stack variable<br>
            and pass that<br>
            to getMemoryBuffer() instead.<br>
<br>
            As a final note, check if your bitcode buffer "string" is<br>
            null-terminated or not.  If not, be sure to be careful and<br>
            do things like informing MemoryBuffer that this is the case.<br>
<br>
            Hope this helps,<br>
            ~Will<br>
<br>
                   LLVMContext& context = getGlobalContext();<br>
                   ErrorOr<Module*> ModuleOrErr = parseBitcodeFile<br>
                (mbjit, context);<br>
                   if (error_code EC = ModuleOrErr.getError())<br>
                   {<br></div></div>
                     std::cout << ModuleOrErr.getError().__<u></u>message()<div class=""><br>
                << "\n";<br>
                     assert(false);<br>
                   }<br>
<br>
<br>
<br>
<br>
                This is the execution result:<br>
                B ok<br>
                C ok<br>
                0xc0 ok<br>
                0xde ok<br>
                Invalid bitcode signature<br>
<br>
<br>
<br>
                Ok is not working :/<br>
                But why ???<br>
<br>
<br>
<br>
                For debuging, between 2) and 3), I export the readed<br>
                module and write to<br>
                a file on my hard drive,<br>
                and try llvm-dis, and the dissasembly of the module<br>
                works.<br>
<br>
                Wath's wrong? Any idea for solve this problem?<br>
<br>
                Thanks you very much.<br>
<br>
                Regards,<br>
                Willy<br></div>
                ______________________________<u></u>___________________<br>
                LLVM Developers mailing list<br>
                <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><br>
                <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a> <<a href="http://llvm.cs.uiuc.edu/" target="_blank">http://llvm.cs.uiuc.edu/</a>><br>
                <a href="http://lists.cs.uiuc.edu/__mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/__<u></u>mailman/listinfo/llvmdev</a><br>
                <<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a>><br>
<br>
        ______________________________<u></u>___________________<br>
        LLVM Developers mailing list<br>
        <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <mailto:<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>><br>
        <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a> <<a href="http://llvm.cs.uiuc.edu/" target="_blank">http://llvm.cs.uiuc.edu/</a>><br>
        <a href="http://lists.cs.uiuc.edu/__mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/__<u></u>mailman/listinfo/llvmdev</a><br>
        <<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a>><br>
<br>
<br>
</blockquote>
<br>
<br>
</blockquote><div class="">
<br>
<br>
<br>
______________________________<u></u>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a><br>
<br>
</div></blockquote>
</blockquote></div><br></div>