<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Kai told this only works with the statically linked runtime. Since Clang can also work with the DLL version of the runtime (and it's the most usual runtime option used), how should we handle it in LLVM?</span><div class="yj6qo ajU" style="outline:none;padding:10px 0px;width:22px;margin:2px 0px 0px;color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br class="Apple-interchange-newline"></div><br><div class="gmail_quote">On Sun, Sep 23, 2012 at 4:53 PM, Anton Korobeynikov <span dir="ltr"><<a href="mailto:asl@math.spbu.ru" target="_blank">asl@math.spbu.ru</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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-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/global_ctors_dtors.ll<br>
Removed:<br>
    llvm/trunk/test/MC/COFF/global_ctors.ll<br>
Modified:<br>
    llvm/trunk/lib/MC/MCObjectFileInfo.cpp<br>
<br>
Modified: llvm/trunk/lib/MC/MCObjectFileInfo.cpp<br>
URL: <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-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=164476&r1=164475&r2=164476&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/MC/MCObjectFileInfo.cpp (original)<br>
+++ llvm/trunk/lib/MC/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_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",<br>
+                          COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |<br>
+                          COFF::IMAGE_SCN_MEM_READ,<br>
+                          SectionKind::getReadOnly());<br>
+  } else {<br>
+    StaticDtorSection =<br>
+      Ctx->getCOFFSection(".dtors",<br>
+                          COFF::IMAGE_SCN_CNT_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 COFF, even<br>
   // though it contains relocatable pointers.  In PIC mode, this is probably a<br>
<br>
Removed: llvm/trunk/test/MC/COFF/global_ctors.ll<br>
URL: <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-project/llvm/trunk/test/MC/COFF/global_ctors.ll?rev=164475&view=auto</a><br>


==============================================================================<br>
--- llvm/trunk/test/MC/COFF/global_ctors.ll (original)<br>
+++ llvm/trunk/test/MC/COFF/global_ctors.ll (removed)<br>
@@ -1,28 +0,0 @@<br>
-; Test that global ctors are emitted into the proper COFF section for the<br>
-; target. Mingw uses .ctors, whereas MSVC uses .CRT$XC*.<br>
-; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32<br>
-; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN32<br>
-; RUN: llc < %s -mtriple i686-pc-mingw32 | FileCheck %s --check-prefix MINGW32<br>
-; RUN: llc < %s -mtriple x86_64-pc-mingw32 | FileCheck %s --check-prefix MINGW32<br>
-<br>
-@.str = private unnamed_addr constant [13 x i8] c"constructing\00", 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 ()* }] [{ 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, 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, 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/global_ctors_dtors.ll<br>
URL: <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-project/llvm/trunk/test/MC/COFF/global_ctors_dtors.ll?rev=164476&view=auto</a><br>


==============================================================================<br>
--- llvm/trunk/test/MC/COFF/global_ctors_dtors.ll (added)<br>
+++ llvm/trunk/test/MC/COFF/global_ctors_dtors.ll Sun Sep 23 10:53:47 2012<br>
@@ -0,0 +1,39 @@<br>
+; Test that global ctors are emitted into the proper COFF section for the<br>
+; target. Mingw uses .ctors, whereas MSVC uses .CRT$XC*.<br>
+; RUN: llc < %s -mtriple i686-pc-win32 | FileCheck %s --check-prefix WIN32<br>
+; RUN: llc < %s -mtriple x86_64-pc-win32 | FileCheck %s --check-prefix WIN32<br>
+; RUN: llc < %s -mtriple i686-pc-mingw32 | FileCheck %s --check-prefix MINGW32<br>
+; RUN: llc < %s -mtriple x86_64-pc-mingw32 | FileCheck %s --check-prefix MINGW32<br>
+<br>
+@.str = private unnamed_addr constant [13 x i8] c"constructing\00", align 1<br>
+@.str2 = private unnamed_addr constant [12 x i8] c"destructing\00", 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 ()* }] [{ i32, void ()* } { i32 65535, void ()* @a_global_ctor }]<br>
+@llvm.global_dtors = appending global [1 x { i32, void ()* }] [{ 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, 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]* @.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, 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>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Joćo Matos<br>