aboutsummaryrefslogtreecommitdiff
path: root/clang/test/CodeGenCXX/static-init.cpp
AgeCommit message (Collapse)AuthorFilesLines
2017-02-17[Test] Make Lit tests C++11 compatible - miscCharles Li1-3/+5
Updated 5 tests. Differential Revision: https://reviews.llvm.org/D24812 llvm-svn: 295484
2016-04-07Replace Sema-level implementation of -fassume-sane-operator-new with aRichard Smith1-1/+1
CodeGen-level implementation. Instead of adding an attribute to clang's FunctionDecl, add the IR attribute directly. This means a module built with this flag is now compatible with code built without it and vice versa. This change also results in the 'noalias' attribute no longer being added to calls to operator new in the IR; it's now only added to the declaration. It also fixes a bug where we failed to add the attribute to the 'nothrow' versions (because we didn't implicitly declare them, there was no good time to inject a fake attribute). llvm-svn: 265728
2015-09-08Compute and preserve alignment more faithfully in IR-generation.John McCall1-3/+3
Introduce an Address type to bundle a pointer value with an alignment. Introduce APIs on CGBuilderTy to work with Address values. Change core APIs on CGF/CGM to traffic in Address where appropriate. Require alignments to be non-zero. Update a ton of code to compute and propagate alignment information. As part of this, I've promoted CGBuiltin's EmitPointerWithAlignment helper function to CGF and made use of it in a number of places in the expression emitter. The end result is that we should now be significantly more correct when performing operations on objects that are locally known to be under-aligned. Since alignment is not reliably tracked in the type system, there are inherent limits to this, but at least we are no longer confused by standard operations like derived-to-base conversions and array-to-pointer decay. I've also fixed a large number of bugs where we were applying the complete-object alignment to a pointer instead of the non-virtual alignment, although most of these were hidden by the very conservative approach we took with member alignment. Also, because IRGen now reliably asserts on zero alignments, we should no longer be subject to an absurd but frustrating recurring bug where an incomplete type would report a zero alignment and then we'd naively do a alignmentAtOffset on it and emit code using an alignment equal to the largest power-of-two factor of the offset. We should also now be emitting much more aggressive alignment attributes in the presence of over-alignment. In particular, field access now uses alignmentAtOffset instead of min. Several times in this patch, I had to change the existing code-generation pattern in order to more effectively use the Address APIs. For the most part, this seems to be a strict improvement, like doing pointer arithmetic with GEPs instead of ptrtoint. That said, I've tried very hard to not change semantics, but it is likely that I've failed in a few places, for which I apologize. ABIArgInfo now always carries the assumed alignment of indirect and indirect byval arguments. In order to cut down on what was already a dauntingly large patch, I changed the code to never set align attributes in the IR on non-byval indirect arguments. That is, we still generate code which assumes that indirect arguments have the given alignment, but we don't express this information to the backend except where it's semantically required (i.e. on byvals). This is likely a minor regression for those targets that did provide this information, but it'll be trivial to add it back in a later patch. I partially punted on applying this work to CGBuiltin. Please do not add more uses of the CreateDefaultAligned{Load,Store} APIs; they will be going away eventually. llvm-svn: 246985
2015-07-20Fix a case where we forgot to make a static local variable comdatReid Kleckner1-0/+17
Sometimes we can provide an initializer for static locals, in which case we sometimes might need to change the type. Changing the type requires making a new LLVM GlobalVariable, and in this codepath we were forgetting to transfer the comdat. Fixes PR23838. Patch by Ivan Garramona. llvm-svn: 242704
2015-03-13Test case updates for explicit type parameter to the gep operatorDavid Blaikie1-1/+1
llvm-svn: 232187
2015-02-27Update Clang tests to handle explicitly typed load changes in LLVM.David Blaikie1-4/+4
llvm-svn: 230795
2015-01-22Emit DeferredDeclsToEmit in a DFS order.Rafael Espindola1-1/+1
Currently we emit DeferredDeclsToEmit in reverse order. This patch changes that. The advantages of the change are that * The output order is a bit closer to the source order. The change to test/CodeGenCXX/pod-member-memcpys.cpp is a good example. * If we decide to deffer more, it will not cause as large changes in the estcases as it would without this patch. llvm-svn: 226751
2015-01-12[patch][pr19848] Produce explicit comdats in clang.Rafael Espindola1-6/+3
The llvm IR until recently had no support for comdats. This was a problem when targeting C++ on ELF/COFF as just using weak linkage would cause quite a bit of dead bits to remain on the executable (unless -ffunction-sections, -fdata-sections and --gc-sections were used). To fix the problem, llvm's codegen will just assume that any weak or linkonce that is not in an explicit comdat should be output in one with the same name as the global. This unfortunately breaks cases like pr19848 where a weak symbol is not xpected to be part of any comdat. Now that we have explicit comdats in the IR, we can finally get both cases right. This first patch just makes clang give explicit comdats to GlobalValues where t is allowed to. A followup patch to llvm will then stop implicitly producing comdats. llvm-svn: 225705
2014-12-17Revert "Put static local variables of inline functions in the function comdat."Rafael Espindola1-3/+6
This reverts commit r224369. Thanks to Reid Kleckner for pointing out that we need a bigger gun to fix this case. llvm-svn: 224475
2014-12-16Put static local variables of inline functions in the function comdat.Rafael Espindola1-6/+3
The variable (and the GV) is only ever used if the function is. Putting it in the function's comdat make it easier for the linker to discard them. The motivating example is struct S { static const int x; }; // const int S::x = 42; inline const int *f() { static const int y = S::x; return &y; } const int *g() { return f(); } With S::x commented out, _ZZ1fvE1y is a variable with a guard variable that is initialized by f. With S::x present, _ZZ1fvE1y is a constant. llvm-svn: 224369
2014-09-19In the Itanium ABI, move stuff to the comdat of variables with static init.Rafael Espindola1-1/+6
Clang can already handle ------------------------------------------- struct S { static const int x; }; template<typename T> struct U { static const int k; }; template<typename T> const int U<T>::k = T::x; const int S::x = 42; extern const int *f(); const int *g() { return &U<S>::k; } int main() { return *f() + U<S>::k; } const int *f() { return &U<S>::k; } ------------------------------------------- since r217264 which puts the .inint_array section in the same COMDAT as the variable. This patch allows the linker to more easily delete some dead code and data by putting the guard variable and init function in the same COMDAT. This is a fixed version of r218089. llvm-svn: 218141
2013-12-09Output destructors and constructors in a more natural order.Rafael Espindola1-6/+6
With this patch we output the in the order C2 C1 D2 D1 D0 Which means that a destructor or constructor that call another is output after the callee. This is a bit easier to read IHMO and a tiny bit more efficient as we don't put a decl in DeferredDeclsToEmit. llvm-svn: 196784
2013-08-15CHECK-LABEL-ify some code gen tests to improve diagnostic experience when ↵Stephen Lin1-8/+8
tests fail. llvm-svn: 188447
2012-04-15PR12226: don't generate wrong code if a braced string literal is used toRichard Smith1-0/+2
initialize an array of unsigned char. Outside C++11 mode, this bug was benign, and just resulted in us emitting a constant which was double the required length, padded with 0s. In C++11, it resulted in us generating an array whose first element was something like i8 ptrtoint ([n x i8]* @str to i8). llvm-svn: 154756
2012-04-06Use atexit when __cxa_atexit isn't available instead of adding aJohn McCall1-1/+1
global destructor entry. For some reason this isn't enabled for apple-kexts; it'd be good to have documentation for that. Based on a patch by Nakamura Takumi! llvm-svn: 154191
2012-03-30Make sure we unique static-local decls across multiple emissions ofJohn McCall1-0/+71
the function body, but do so in a way that doesn't make any assumptions about the static local actually having a proper, unique mangling, since apparently we don't do that correctly at all. llvm-svn: 153776
2012-03-30Revert r153723, and its follow-ups r153728 and r153733.Chandler Carruth1-71/+0
These patches cause us to miscompile and/or reject code with static function-local variables in an extern-C context. Previously, we were papering over this as long as the variables are within the same translation unit, and had not seen any failures in the wild. We still need a proper fix, which involves mangling static locals inside of an extern-C block (as GCC already does), but this patch causes pretty widespread regressions. Firefox, and many other applications no longer build. Lots of test cases have been posted to the list in response to this commit, so there should be no problem reproducing the issues. llvm-svn: 153768
2012-03-30Do the static-locals thing properly in the face of unions andJohn McCall1-0/+21
other things which might mess with the variable's type. llvm-svn: 153733
2012-03-30When emitting a static local variable in C++, handleJohn McCall1-0/+50
the case that the variable already exists. Partly this is just protection against people making crazy declarations with custom asm labels or extern "C" names that intentionally collide with the manglings of such variables, but the main reason is that we can actually emit a static local variable twice with the requirement that it match up. There may be other cases with (e.g.) the various nested functions, but the main exemplar is with constructor variants, where we can be forced into double-emitting the function body under certain circumstances like (currently) the presence of virtual bases. llvm-svn: 153723
2012-03-09Make sure we update the static local decl address map when we are forced to ↵Eli Friedman1-0/+16
rebuild a global because of the initializer. <rdar://problem/10957867>. llvm-svn: 152372
2012-03-09Make sure constant emission handles initializer lists with strings ↵Eli Friedman1-0/+4
correctly. Part of <rdar://problem/10957867>. llvm-svn: 152370
2011-09-13Re-commit r139643.Eli Friedman1-3/+1
Make clang use Acquire loads and Release stores where necessary. llvm-svn: 139650
2011-09-13Revert r139643 while I look into it; it's breaking selfhost.Eli Friedman1-1/+3
llvm-svn: 139648
2011-09-13Make clang use Acquire loads and Release stores where necessary.Eli Friedman1-3/+1
llvm-svn: 139643
2011-06-17Perform an acquire memory barrier on the fast path of a thread-safeJohn McCall1-0/+3
static initializer check, as required by the Itanium ABI. llvm-svn: 133250
2011-03-22Fix a test case and teach ClearLinkageCache() to clear the linkage ofJohn McCall1-2/+2
a function template decl's pattern, which was suddenly exposed by my last patch. llvm-svn: 128073
2010-09-08Implement ARM static local initialization guards, which are more compact thanJohn McCall1-1/+1
Itanium guards and use a slightly different compiled-in API. llvm-svn: 113330
2010-06-04Correctly align large arrays in x86-64. This fixes PR5599.Rafael Espindola1-1/+1
llvm-svn: 105500
2010-05-25If a function definition has any sort of weak linkage, its static localJohn McCall1-2/+13
variables should have that linkage. Otherwise, its static local variables should have internal linkage. To avoid computing this excessively, set a function's linkage before we emit code for it. Previously we were assigning weak linkage to the static variables of static inline functions in C++, with predictably terrible results. This fixes that and also gives better linkage than 'weak' when merging is required. llvm-svn: 104581
2010-05-05For thread-safe static initialization of local statics withDouglas Gregor1-1/+3
destructors, place the __cxa_atexit call after the __cxa_guard_release call, mimicking GCC/LLVM-GCC behavior. Noticed while debugging something related. llvm-svn: 103088
2010-05-03Just bail out immediately when emitting an unreachable function-local staticJohn McCall1-0/+11
variable. Surprisingly, this does seem to be the right way to solve this. llvm-svn: 102961
2010-02-07Use the right linkage for static variables inside C++ inline functions.Anders Carlsson1-0/+12
llvm-svn: 95512
2010-01-26Make sure to always mark a global variable as not being constant if it has a ↵Anders Carlsson1-0/+7
C++ initializer. llvm-svn: 94504
2009-12-16implement PR5654: add -fassume-sane-operator-new, which is enabled by ↵Nuno Lopes1-1/+1
default, and adds the malloc attribute to the global function new() and to the overloaded new operators. feel free to chage the name to this lengthy argument llvm-svn: 91543
2009-12-15Update tests to use %clang_cc1 instead of 'clang-cc' or 'clang -cc1'.Daniel Dunbar1-1/+1
- This is designed to make it obvious that %clang_cc1 is a "test variable" which is substituted. It is '%clang_cc1' instead of '%clang -cc1' because it can be useful to redefine what gets run as 'clang -cc1' (for example, to set a default target). llvm-svn: 91446
2009-12-10Handle emitting static variables that have reference type.Anders Carlsson1-4/+8
llvm-svn: 91027
2009-11-08Eliminate &&s in tests.Daniel Dunbar1-2/+2
- 'for i in $(find . -type f); do sed -e 's#\(RUN:.*[^ ]\) *&& *$#\1#g' $i | FileUpdate $i; done', for the curious. llvm-svn: 86430
2009-08-12Use the inbounds variant of getelementptr for common pointer arithmetic.Dan Gohman1-1/+1
llvm-svn: 78756
2009-08-08Refactor some code and implement support for global destructors for static ↵Anders Carlsson1-0/+13
variables. llvm-svn: 78507