Alright, then there should be no problem. Thanks for clarifying.<br><br><div class="gmail_quote">On Mon, Sep 24, 2012 at 6:00 AM, Kai <span dir="ltr"><<a href="mailto:kai@redstar.de" target="_blank">kai@redstar.de</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi João!<div class="im"><br>
> Kai told this only works with the statically linked runtime. Since Clang<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
can also work with the DLL version of the runtime (and it's the most<br>
usual runtime option used), how should we handle it in LLVM?<br>
</blockquote>
<br></div>
The point here is: clang does not use a global dtor. Instead the static global constructor uses atexit() to install the call to the destructor. That's also the way MSVC handles this case.<br>
So there is no issue...<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<br>
<br>
On Sun, Sep 23, 2012 at 4:53 PM, Anton Korobeynikov<br>
<<a href="mailto:asl@math.spbu.ru" target="_blank">asl@math.spbu.ru</a><br></div><div><div class="h5">
<mailto:<a href="mailto:asl@math.spbu.ru" target="_blank">asl@math.spbu.ru</a>>> wrote:<br>
<br>
    Author: asl<br>
    Date: Sun Sep 23 10:53:47 2012<br>
    New Revision: 164476<br>
<br>
    URL: <a href="http://llvm.org/viewvc/llvm-project?rev=164476&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=164476&view=rev</a><br>
    Log:<br>
    Emit dtors into proper section while compiling in vcpp-compatible mode.<br>
    Patch by Kai!<br>
<br>
    Added:<br>
         llvm/trunk/test/MC/COFF/<u></u>global_ctors_dtors.ll<br>
    Removed:<br>
         llvm/trunk/test/MC/COFF/<u></u>global_ctors.ll<br>
    Modified:<br>
         llvm/trunk/lib/MC/<u></u>MCObjectFileInfo.cpp<br>
<br>
    Modified: llvm/trunk/lib/MC/<u></u>MCObjectFileInfo.cpp<br>
    URL:<br>
    <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=164476&r1=164475&r2=164476&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/MC/<u></u>MCObjectFileInfo.cpp?rev=<u></u>164476&r1=164475&r2=164476&<u></u>view=diff</a><br>


    ==============================<u></u>==============================<u></u>==================<br>
    --- llvm/trunk/lib/MC/<u></u>MCObjectFileInfo.cpp (original)<br>
    +++ llvm/trunk/lib/MC/<u></u>MCObjectFileInfo.cpp Sun Sep 23 10:53:47 2012<br>
    @@ -430,12 +430,20 @@<br>
        }<br>
<br>
<br>
    -  StaticDtorSection =<br>
    -    Ctx->getCOFFSection(".dtors",<br>
    -                        COFF::IMAGE_SCN_CNT_<u></u>INITIALIZED_DATA |<br>
    -                        COFF::IMAGE_SCN_MEM_READ |<br>
    -                        COFF::IMAGE_SCN_MEM_WRITE,<br>
    -                        SectionKind::getDataRel());<br>
    +  if (T.getOS() == Triple::Win32) {<br>
    +    StaticDtorSection =<br>
    +      Ctx->getCOFFSection(".CRT$XTX"<u></u>,<br>
    +                          COFF::IMAGE_SCN_CNT_<u></u>INITIALIZED_DATA |<br>
    +                          COFF::IMAGE_SCN_MEM_READ,<br>
    +                          SectionKind::getReadOnly());<br>
    +  } else {<br>
    +    StaticDtorSection =<br>
    +      Ctx->getCOFFSection(".dtors",<br>
    +                          COFF::IMAGE_SCN_CNT_<u></u>INITIALIZED_DATA |<br>
    +                          COFF::IMAGE_SCN_MEM_READ |<br>
    +                          COFF::IMAGE_SCN_MEM_WRITE,<br>
    +                          SectionKind::getDataRel());<br>
    +  }<br>
<br>
        // FIXME: We're emitting LSDA info into a readonly section on<br>
    COFF, even<br>
        // though it contains relocatable pointers.  In PIC mode, this<br>
    is probably a<br>
<br>
    Removed: llvm/trunk/test/MC/COFF/<u></u>global_ctors.ll<br>
    URL:<br>
    <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/global_ctors.ll?rev=164475&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/MC/<u></u>COFF/global_ctors.ll?rev=<u></u>164475&view=auto</a><br>


    ==============================<u></u>==============================<u></u>==================<br>
    --- llvm/trunk/test/MC/COFF/<u></u>global_ctors.ll (original)<br>
    +++ llvm/trunk/test/MC/COFF/<u></u>global_ctors.ll (removed)<br>
    @@ -1,28 +0,0 @@<br>
    -; Test that global ctors are emitted into the proper COFF section<br>
    for the<br>
    -; target. Mingw uses .ctors, whereas MSVC uses .CRT$XC*.<br>
    -; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s<br>
    --check-prefix WIN32<br>
    -; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s<br>
    --check-prefix WIN32<br>
    -; RUN: llc < %s -mtriple i686-pc-mingw32 | FileCheck %s<br>
    --check-prefix MINGW32<br>
    -; RUN: llc < %s -mtriple x86_64-pc-mingw32 | FileCheck %s<br>
    --check-prefix MINGW32<br>
    -<br>
    -@.str = private unnamed_addr constant [13 x i8] c"constructing\00",<br>
    align 1<br>
    -@.str2 = private unnamed_addr constant [5 x i8] c"main\00", align 1<br>
    -<br>
    -@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{<br>
    i32, void ()* } { i32 65535, void ()* @a_global_ctor }]<br>
    -<br>
    -declare i32 @puts(i8*)<br>
    -<br>
    -define void @a_global_ctor() nounwind {<br>
    -  %1 = call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str,<br>
    i32 0, i32 0))<br>
    -  ret void<br>
    -}<br>
    -<br>
    -define i32 @main() nounwind {<br>
    -  %1 = call i32 @puts(i8* getelementptr inbounds ([5 x i8]* @.str2,<br>
    i32 0, i32 0))<br>
    -  ret i32 0<br>
    -}<br>
    -<br>
    -; WIN32: .section .CRT$XCU,"r"<br>
    -; WIN32: a_global_ctor<br>
    -; MINGW32: .section .ctors,"w"<br>
    -; MINGW32: a_global_ctor<br>
<br>
    Added: llvm/trunk/test/MC/COFF/<u></u>global_ctors_dtors.ll<br>
    URL:<br>
    <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/global_ctors_dtors.ll?rev=164476&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/MC/<u></u>COFF/global_ctors_dtors.ll?<u></u>rev=164476&view=auto</a><br>


    ==============================<u></u>==============================<u></u>==================<br>
    --- llvm/trunk/test/MC/COFF/<u></u>global_ctors_dtors.ll (added)<br>
    +++ llvm/trunk/test/MC/COFF/<u></u>global_ctors_dtors.ll Sun Sep 23<br>
    10:53:47 2012<br>
    @@ -0,0 +1,39 @@<br>
    +; Test that global ctors are emitted into the proper COFF section<br>
    for the<br>
    +; target. Mingw uses .ctors, whereas MSVC uses .CRT$XC*.<br>
    +; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s<br>
    --check-prefix WIN32<br>
    +; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s<br>
    --check-prefix WIN32<br>
    +; RUN: llc < %s -mtriple i686-pc-mingw32 | FileCheck %s<br>
    --check-prefix MINGW32<br>
    +; RUN: llc < %s -mtriple x86_64-pc-mingw32 | FileCheck %s<br>
    --check-prefix MINGW32<br>
    +<br>
    +@.str = private unnamed_addr constant [13 x i8] c"constructing\00",<br>
    align 1<br>
    +@.str2 = private unnamed_addr constant [12 x i8] c"destructing\00",<br>
    align 1<br>
    +@.str3 = private unnamed_addr constant [5 x i8] c"main\00", align 1<br>
    +<br>
    +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{<br>
    i32, void ()* } { i32 65535, void ()* @a_global_ctor }]<br>
    +@llvm.global_dtors = appending global [1 x { i32, void ()* }] [{<br>
    i32, void ()* } { i32 65535, void ()* @a_global_dtor }]<br>
    +<br>
    +declare i32 @puts(i8*)<br>
    +<br>
    +define void @a_global_ctor() nounwind {<br>
    +  %1 = call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str,<br>
    i32 0, i32 0))<br>
    +  ret void<br>
    +}<br>
    +<br>
    +define void @a_global_dtor() nounwind {<br>
    +  %1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]*<br>
    @.str2, i32 0, i32 0))<br>
    +  ret void<br>
    +}<br>
    +<br>
    +define i32 @main() nounwind {<br>
    +  %1 = call i32 @puts(i8* getelementptr inbounds ([5 x i8]* @.str3,<br>
    i32 0, i32 0))<br>
    +  ret i32 0<br>
    +}<br>
    +<br>
    +; WIN32: .section .CRT$XCU,"r"<br>
    +; WIN32: a_global_ctor<br>
    +; WIN32: .section .CRT$XTX,"r"<br>
    +; WIN32: a_global_dtor<br>
    +; MINGW32: .section .ctors,"w"<br>
    +; MINGW32: a_global_ctor<br>
    +; MINGW32: .section .dtors,"w"<br>
    +; MINGW32: a_global_dtor<br>
<br>
<br>
    ______________________________<u></u>_________________<br>
    llvm-commits mailing list<br>
    <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br></div></div>
    <mailto:<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.<u></u>edu</a>><div class="im"><br>
    <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
<br>
<br>
--<br>
João Matos<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
</div></blockquote><div class="HOEnZb"><div class="h5">
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>João Matos<br>