From 0d40f125967df7971eaff0a23cc78372edd4a904 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 20 Mar 2018 20:42:55 +0000 Subject: [PATCH] Set dso_local on string literals. llvm-svn: 328040 --- clang/lib/CodeGen/CodeGenModule.cpp | 1 + clang/test/CodeGen/c-strings.c | 2 +- clang/test/CodeGen/string-literal-short-wstring.c | 4 ++-- clang/test/CodeGen/wchar-const.c | 2 +- clang/test/CodeGenCXX/funcsig.cpp | 14 +++++++------- clang/test/CodeGenCXX/ms_wide_predefined_expr.cpp | 2 +- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 13b11b5..9558615 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4016,6 +4016,7 @@ GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT, assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals"); GV->setComdat(M.getOrInsertComdat(GV->getName())); } + CGM.setDSOLocal(GV); return GV; } diff --git a/clang/test/CodeGen/c-strings.c b/clang/test/CodeGen/c-strings.c index bb0c2cc..a94cd892 100644 --- a/clang/test/CodeGen/c-strings.c +++ b/clang/test/CodeGen/c-strings.c @@ -6,7 +6,7 @@ // CHECK: @align = {{(dso_local )?}}global i8 [[ALIGN:[0-9]+]] // ITANIUM: @.str = private unnamed_addr constant [6 x i8] c"hello\00" -// MSABI: @"??_C@_05CJBACGMB@hello?$AA@" = linkonce_odr unnamed_addr constant [6 x i8] c"hello\00", comdat, align 1 +// MSABI: @"??_C@_05CJBACGMB@hello?$AA@" = linkonce_odr dso_local unnamed_addr constant [6 x i8] c"hello\00", comdat, align 1 // ITANIUM: @f1.x = internal global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0) // MSABI: @f1.x = internal global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"??_C@_05CJBACGMB@hello?$AA@", i32 0, i32 0) // CHECK: @f2.x = internal global [6 x i8] c"hello\00", align [[ALIGN]] diff --git a/clang/test/CodeGen/string-literal-short-wstring.c b/clang/test/CodeGen/string-literal-short-wstring.c index fb1fe0c..8894b88 100644 --- a/clang/test/CodeGen/string-literal-short-wstring.c +++ b/clang/test/CodeGen/string-literal-short-wstring.c @@ -12,12 +12,12 @@ int main() { char b[10] = "\u1120\u0220\U00102030"; // ITANIUM: private unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0] - // MSABI: linkonce_odr unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0] + // MSABI: linkonce_odr dso_local unnamed_addr constant [3 x i16] [i16 65, i16 66, i16 0] const wchar_t *foo = L"AB"; // This should convert to utf16. // ITANIUM: private unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0] - // MSABI: linkonce_odr unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0] + // MSABI: linkonce_odr dso_local unnamed_addr constant [5 x i16] [i16 4384, i16 544, i16 -9272, i16 -9168, i16 0] const wchar_t *bar = L"\u1120\u0220\U00102030"; diff --git a/clang/test/CodeGen/wchar-const.c b/clang/test/CodeGen/wchar-const.c index b461d60..91b14ec 100644 --- a/clang/test/CodeGen/wchar-const.c +++ b/clang/test/CodeGen/wchar-const.c @@ -15,7 +15,7 @@ typedef __WCHAR_TYPE__ wchar_t; // CHECK-DAR: private unnamed_addr constant [18 x i32] [i32 84, -// CHECK-WIN: linkonce_odr unnamed_addr constant [18 x i16] [i16 84, +// CHECK-WIN: linkonce_odr dso_local unnamed_addr constant [18 x i16] [i16 84, extern void foo(const wchar_t* p); int main (int argc, const char * argv[]) { diff --git a/clang/test/CodeGenCXX/funcsig.cpp b/clang/test/CodeGenCXX/funcsig.cpp index 5d89dc7..5328ff9 100644 --- a/clang/test/CodeGenCXX/funcsig.cpp +++ b/clang/test/CodeGenCXX/funcsig.cpp @@ -12,24 +12,24 @@ int printf(const char *, ...); void funcNoProto() { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK-C: @"??_C@_0BL@IHLLLCAO@void?5__cdecl?5funcNoProto?$CI?$CJ?$AA@" = linkonce_odr unnamed_addr constant [27 x i8] c"void __cdecl funcNoProto()\00" -// CHECK-CXX: @"??_C@_0BP@PJOECCJN@void?5__cdecl?5funcNoProto?$CIvoid?$CJ?$AA@" = linkonce_odr unnamed_addr constant [31 x i8] c"void __cdecl funcNoProto(void)\00" +// CHECK-C: @"??_C@_0BL@IHLLLCAO@void?5__cdecl?5funcNoProto?$CI?$CJ?$AA@" = linkonce_odr dso_local unnamed_addr constant [27 x i8] c"void __cdecl funcNoProto()\00" +// CHECK-CXX: @"??_C@_0BP@PJOECCJN@void?5__cdecl?5funcNoProto?$CIvoid?$CJ?$AA@" = linkonce_odr dso_local unnamed_addr constant [31 x i8] c"void __cdecl funcNoProto(void)\00" void funcNoParams(void) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK: @"??_C@_0CA@GBIDFNBN@void?5__cdecl?5funcNoParams?$CIvoid?$CJ?$AA@" = linkonce_odr unnamed_addr constant [32 x i8] c"void __cdecl funcNoParams(void)\00" +// CHECK: @"??_C@_0CA@GBIDFNBN@void?5__cdecl?5funcNoParams?$CIvoid?$CJ?$AA@" = linkonce_odr dso_local unnamed_addr constant [32 x i8] c"void __cdecl funcNoParams(void)\00" void freeFunc(int *p, char c) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK: @"??_C@_0CD@KLGMNNL@void?5__cdecl?5freeFunc?$CIint?5?$CK?0?5cha@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __cdecl freeFunc(int *, char)\00" +// CHECK: @"??_C@_0CD@KLGMNNL@void?5__cdecl?5freeFunc?$CIint?5?$CK?0?5cha@" = linkonce_odr dso_local unnamed_addr constant [{{.*}} x i8] c"void __cdecl freeFunc(int *, char)\00" #ifdef __cplusplus void funcVarargs(...) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK-CXX: @"??_C@_0BO@BOBPLEKP@void?5__cdecl?5funcVarargs?$CI?4?4?4?$CJ?$AA@" = linkonce_odr unnamed_addr constant [30 x i8] c"void __cdecl funcVarargs(...)\00" +// CHECK-CXX: @"??_C@_0BO@BOBPLEKP@void?5__cdecl?5funcVarargs?$CI?4?4?4?$CJ?$AA@" = linkonce_odr dso_local unnamed_addr constant [30 x i8] c"void __cdecl funcVarargs(...)\00" struct TopLevelClass { void topLevelMethod(int *, char); @@ -37,7 +37,7 @@ struct TopLevelClass { void TopLevelClass::topLevelMethod(int *, char) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK-CXX: @"??_C@_0DL@OBHNMDP@void?5__thiscall?5TopLevelClass?3?3t@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall TopLevelClass::topLevelMethod(int *, char)\00" +// CHECK-CXX: @"??_C@_0DL@OBHNMDP@void?5__thiscall?5TopLevelClass?3?3t@" = linkonce_odr dso_local unnamed_addr constant [{{.*}} x i8] c"void __thiscall TopLevelClass::topLevelMethod(int *, char)\00" namespace NS { struct NamespacedClass { @@ -46,6 +46,6 @@ struct NamespacedClass { void NamespacedClass::namespacedMethod(int *, char) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK-CXX: @"??_C@_0ED@PFDKIEBA@void?5__thiscall?5NS?3?3NamespacedCl@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall NS::NamespacedClass::namespacedMethod(int *, char)\00" +// CHECK-CXX: @"??_C@_0ED@PFDKIEBA@void?5__thiscall?5NS?3?3NamespacedCl@" = linkonce_odr dso_local unnamed_addr constant [{{.*}} x i8] c"void __thiscall NS::NamespacedClass::namespacedMethod(int *, char)\00" } #endif diff --git a/clang/test/CodeGenCXX/ms_wide_predefined_expr.cpp b/clang/test/CodeGenCXX/ms_wide_predefined_expr.cpp index 3c12292..bdfd1cd 100644 --- a/clang/test/CodeGenCXX/ms_wide_predefined_expr.cpp +++ b/clang/test/CodeGenCXX/ms_wide_predefined_expr.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 %s -fms-extensions -triple i686-pc-win32 -emit-llvm -o - | FileCheck %s -// CHECK: @"??_C@_19DPFBEKIN@?$AAf?$AAu?$AAn?$AAc?$AA?$AA@" = linkonce_odr unnamed_addr constant [5 x i16] [i16 102, i16 117, i16 110, i16 99, i16 0], comdat, align 2 +// CHECK: @"??_C@_19DPFBEKIN@?$AAf?$AAu?$AAn?$AAc?$AA?$AA@" = linkonce_odr dso_local unnamed_addr constant [5 x i16] [i16 102, i16 117, i16 110, i16 99, i16 0], comdat, align 2 void wprint(const wchar_t*); -- 2.7.4