From 09948f1af6304cfab8bfd6949236ca79d8d01a0a Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 15 Feb 2011 18:54:46 +0000 Subject: [PATCH] In -fapple-kext mode, global object construction code ends up in the text segment. // rdar://8825235. llvm-svn: 125585 --- clang/lib/CodeGen/CGDeclCXX.cpp | 11 +++++----- .../apple-kext-no-staticinit-section.C | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 clang/test/CodeGenCXX/apple-kext-no-staticinit-section.C diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index db72080372a7..8b37e9af3c6d 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -159,11 +159,12 @@ CreateGlobalInitOrDestructFunction(CodeGenModule &CGM, llvm::Function *Fn = llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage, Name, &CGM.getModule()); - - // Set the section if needed. - if (const char *Section = - CGM.getContext().Target.getStaticInitSectionSpecifier()) - Fn->setSection(Section); + if (!CGM.getContext().getLangOptions().AppleKext) { + // Set the section if needed. + if (const char *Section = + CGM.getContext().Target.getStaticInitSectionSpecifier()) + Fn->setSection(Section); + } if (!CGM.getLangOptions().Exceptions) Fn->setDoesNotThrow(); diff --git a/clang/test/CodeGenCXX/apple-kext-no-staticinit-section.C b/clang/test/CodeGenCXX/apple-kext-no-staticinit-section.C new file mode 100644 index 000000000000..0401d4917902 --- /dev/null +++ b/clang/test/CodeGenCXX/apple-kext-no-staticinit-section.C @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fapple-kext -fno-rtti -emit-llvm -o - %s | FileCheck %s +// rdar://8825235 +/** +1) Normally, global object construction code ends up in __StaticInit segment of text section + .section __TEXT,__StaticInit,regular,pure_instructions + In kext mode, they end up in the __text segment. +*/ + +class foo { +public: + foo(); + virtual ~foo(); +}; + +foo a; +foo b; +foo c; +foo::~foo() {} + +// CHECK-NOT: __TEXT,__StaticInit,regular,pure_instructions