COFF doesn't have mergeable sections so LLVM/clang's normal tactics for string deduplication will not have any effect. To remedy this we place each string inside it's own section and mark the section as IMAGE_COMDAT_SELECT_ANY. However, we can only do this if the string has an external name that we can generate from it's contents. To be compatible with MSVC, we must use their scheme. Otherwise identical strings in translation units from clang may not be deduplicated with translation units in MSVC. This fixes PR18248. N.B. We will not attempt to do anything with a string literal which is not of type 'char' or 'wchar_t' because their compiler does not support unicode string literals as of this date. Further, we avoid doing this if either -fwritable-strings or -fsanitize=address are present. This reverts commit r204596. llvm-svn: 204675
25 lines
929 B
C
25 lines
929 B
C
// RUN: %clang_cc1 -emit-llvm %s -o - -triple i386-pc-win32 | FileCheck %s --check-prefix=CHECK-WIN
|
|
// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-apple-darwin | FileCheck %s --check-prefix=CHECK-DAR
|
|
// This should pass for any endianness combination of host and target.
|
|
|
|
// This bit is taken from Sema/wchar.c so we can avoid the wchar.h include.
|
|
typedef __WCHAR_TYPE__ wchar_t;
|
|
#if defined(_WIN32) || defined(_M_IX86) || defined(__CYGWIN__) \
|
|
|| defined(_M_X64) || defined(SHORT_WCHAR)
|
|
#define WCHAR_T_TYPE unsigned short
|
|
#elif defined(__sun) || defined(__AuroraUX__)
|
|
#define WCHAR_T_TYPE long
|
|
#else /* Solaris or AuroraUX. */
|
|
#define WCHAR_T_TYPE int
|
|
#endif
|
|
|
|
|
|
// CHECK-DAR: private unnamed_addr constant [18 x i32] [i32 84,
|
|
// CHECK-WIN: linkonce_odr unnamed_addr constant [18 x i16] [i16 84,
|
|
extern void foo(const wchar_t* p);
|
|
int main (int argc, const char * argv[])
|
|
{
|
|
foo(L"This is some text");
|
|
return 0;
|
|
}
|