summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenFunction.h
Commit message (Collapse)AuthorAgeFilesLines
* finally get around to doing a significant cleanup to irgen:Chris Lattner2010-06-271-1/+2
| | | | | | | | have CGF create and make accessible standard int32,int64 and intptr types. This fixes a ton of 80 column violations introduced by LLVMContextification and cleans up stuff a lot. llvm-svn: 106977
* Change IR generation for return (in the simple case) to avoid doing sillyChris Lattner2010-06-271-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | load/store nonsense in the epilog. For example, for: int foo(int X) { int A[100]; return A[X]; } we used to generate: %arrayidx = getelementptr inbounds [100 x i32]* %A, i32 0, i64 %idxprom ; <i32*> [#uses=1] %tmp1 = load i32* %arrayidx ; <i32> [#uses=1] store i32 %tmp1, i32* %retval %0 = load i32* %retval ; <i32> [#uses=1] ret i32 %0 } which codegen'd to this code: _foo: ## @foo ## BB#0: ## %entry subq $408, %rsp ## imm = 0x198 movl %edi, 400(%rsp) movl 400(%rsp), %edi movslq %edi, %rax movl (%rsp,%rax,4), %edi movl %edi, 404(%rsp) movl 404(%rsp), %eax addq $408, %rsp ## imm = 0x198 ret Now we generate: %arrayidx = getelementptr inbounds [100 x i32]* %A, i32 0, i64 %idxprom ; <i32*> [#uses=1] %tmp1 = load i32* %arrayidx ; <i32> [#uses=1] ret i32 %tmp1 } and: _foo: ## @foo ## BB#0: ## %entry subq $408, %rsp ## imm = 0x198 movl %edi, 404(%rsp) movl 404(%rsp), %edi movslq %edi, %rax movl (%rsp,%rax,4), %eax addq $408, %rsp ## imm = 0x198 ret This actually does matter, cutting out 2000 lines of IR from CGStmt.ll for example. Another interesting effect is that altivec.h functions which are dead now get dce'd by the inliner. Hence all the changes to builtins-ppc-altivec.c to ensure the calls aren't dead. llvm-svn: 106970
* Change EmitReferenceBindingToExpr to take a decl instead of a boolean.Anders Carlsson2010-06-261-1/+2
| | | | llvm-svn: 106949
* IRGen for trivial initialization of dynamiccaly allocatedFariborz Jahanian2010-06-251-0/+3
| | | | | | array of other done c++ objects. Fixes PR7490. llvm-svn: 106869
* Patch to correctly mangle block helper functionsFariborz Jahanian2010-06-241-1/+2
| | | | | | | when block literal is declared inside a ctor/dtor. Fixes radr 8096995. llvm-svn: 106700
* implement support for -finstrument-functions, patch by NelsonChris Lattner2010-06-221-0/+9
| | | | | | Elhage! llvm-svn: 106507
* Fix PR7097, a bad interaction between -fno-use-cxa-atexit andChris Lattner2010-06-191-1/+1
| | | | | | -mconstructor-aliases by using a WeakVH instead of a raw pointer. llvm-svn: 106384
* Objective-c++ IRGen. Support for @selector expression asFariborz Jahanian2010-06-171-0/+1
| | | | | | an lvalue. Fixes PR7390. llvm-svn: 106235
* Add some missing shiftsNate Begeman2010-06-141-2/+3
| | | | | | | | Fix multiplies by scalar Add SemaChecking code for all immediates Add SemaChecking-gen support to arm_neon.td llvm-svn: 105930
* Most of remaining builtins, 2 generics, vld, and rounding shfits remain.Nate Begeman2010-06-111-0/+2
| | | | llvm-svn: 105848
* support _lane ops, and multiplies by scalar.Nate Begeman2010-06-101-1/+2
| | | | llvm-svn: 105770
* Rename __tcf_ to __cxx_global_array_dtor. Remove the ↵Anders Carlsson2010-06-081-1/+0
| | | | | | UniqueAggreDestructorCount from CodeGenFunction and let LLVM handle uniquing the internal functions instead. llvm-svn: 105648
* Simplify GenerateCXXAggrDestructorHelper.Anders Carlsson2010-06-081-3/+3
| | | | llvm-svn: 105646
* Fix NEON intrinsic argument passing, support vext. Most now successfully ↵Nate Begeman2010-06-081-0/+4
| | | | | | make it through codegen to the .s file llvm-svn: 105599
* Correctly pass aggregates by reference when emitting thunks.John McCall2010-05-261-0/+5
| | | | llvm-svn: 104778
* Re-land the fix for PR7139.Anders Carlsson2010-05-221-2/+4
| | | | llvm-svn: 104446
* Push a return-value slot throughout ObjC message-send codegen. Will beJohn McCall2010-05-221-3/+6
| | | | | | | critical for ObjC++ correctness; hard to test independently of various required Sema changes, though. llvm-svn: 104422
* Unbreak self-host.Anders Carlsson2010-05-211-4/+2
| | | | llvm-svn: 104390
* Rename CodeGenFunction::EmitMemSetToZero to EmitNullInitialization. Handle ↵Anders Carlsson2010-05-211-2/+4
| | | | | | setting null data member pointers correctly. Fixes PR7139. llvm-svn: 104387
* Allocate space in a block record for implicit references to the Objective CJohn McCall2010-05-211-7/+7
| | | | | | | | | | 'self' variable arising from uses of the 'super' keyword. Also reorganize some code so that BlockInfo (now CGBlockInfo) can be opaque outside of CGBlocks.cpp. Fixes rdar://problem/8010633. llvm-svn: 104312
* When emitting an lvalue for an anonymous struct or union member duringJohn McCall2010-05-211-0/+3
| | | | | | | class initialization, drill down through an arbitrary number of anonymous records. llvm-svn: 104310
* Support implicitly closing on 'this' in a block. Fixed PR7165.John McCall2010-05-201-2/+3
| | | | | | (the codegen works here, too, but that's annoying to test without execution) llvm-svn: 104202
* Ensure that destructors are called for NRVO'd objects when theDouglas Gregor2010-05-171-0/+5
| | | | | | | function does not return. Thanks to Eli for pointing out this corner case. llvm-svn: 103941
* When initializing thread-safe statics, put the call toDouglas Gregor2010-05-161-0/+1
| | | | | | | | | | | | | __cxa_guard_abort along the exceptional edge into (in effect) a nested "try" that rethrows after aborting. Fixes PR7144 and the remaining Boost.ProgramOptions failures, along with the regressions that r103880 caused. The crucial difference between this and r103880 is that we now follow LLVM's little dance with the llvm.eh.exception and llvm.eh.selector calls, then use _Unwind_Resume_or_Rethrow to rethrow. llvm-svn: 103892
* Revert r103880 (thread-safe static initialization w/ exceptions),Douglas Gregor2010-05-161-2/+1
| | | | | | because it's causing strange linker errors. Unfixes PR7144. llvm-svn: 103890
* When initializing thread-safe statics, put the call toDouglas Gregor2010-05-151-1/+2
| | | | | | | | __cxa_guard_abort along the exceptional edge into (in effect) a nested "try" that rethrows after aborting. Fixes PR7144 and the remaining Boost.ProgramOptions failures. llvm-svn: 103880
* Remove an unused function.Anders Carlsson2010-05-141-2/+0
| | | | llvm-svn: 103793
* Reimplement code generation for copying fields in theDouglas Gregor2010-05-051-11/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | implicitly-generated copy constructor. Previously, Sema would perform some checking and instantiation to determine which copy constructors, etc., would be called, then CodeGen would attempt to figure out which copy constructor to call... but would get it wrong, or poke at an uninstantiated default argument, or fail in other ways. The new scheme is similar to what we now do for the implicit copy-assignment operator, where Sema performs all of the semantic analysis and builds specific ASTs that look similar to the ASTs we'd get from explicitly writing the copy constructor, so that CodeGen need only do a direct translation. However, it's not quite that simple because one cannot explicit write elementwise copy-construction of an array. So, I've extended CXXBaseOrMemberInitializer to contain a list of indexing variables used to copy-construct the elements. For example, if we have: struct A { A(const A&); }; struct B { A array[2][3]; }; then we generate an implicit copy assignment operator for B that looks something like this: B::B(const B &other) : array[i0][i1](other.array[i0][i1]) { } CodeGen will loop over the invented variables i0 and i1 to visit all elements in the array, so that each element in the destination array will be copy-constructed from the corresponding element in the source array. Of course, if we're dealing with arrays of scalars or class types with trivial copy-assignment operators, we just generate a memcpy rather than a loop. Fixes PR6928, PR5989, and PR6887. Boost.Regex now compiles and passes all of its regression tests. Conspicuously missing from this patch is handling for the exceptional case, where we need to destruct those objects that we have constructed. I'll address that case separately. llvm-svn: 103079
* Remove OldGetAddressOfBaseClass - bye bye ambiguities.Anders Carlsson2010-05-031-4/+0
| | | | llvm-svn: 102889
* More work towards getting rid of OldGetAddressOfBaseClass.Anders Carlsson2010-05-031-0/+2
| | | | llvm-svn: 102887
* Add the same 'ForVirtualBase' parameter to EmitCXXDestructorCall.Anders Carlsson2010-05-021-1/+1
| | | | llvm-svn: 102882
* Revert my last change and add a 'ForVirtualBase' parameter to ↵Anders Carlsson2010-05-021-3/+2
| | | | | | EmitCXXConstructorCall instead. llvm-svn: 102881
* Pass the construction kind down to EmitCXXConstructorCall.Anders Carlsson2010-05-021-1/+2
| | | | llvm-svn: 102880
* Remove another unused function.Anders Carlsson2010-05-021-3/+0
| | | | llvm-svn: 102871
* Remove an unused function.Anders Carlsson2010-05-021-6/+0
| | | | llvm-svn: 102870
* As per Chris' request, return the Instruction from EmitCall and add the ↵David Chisnall2010-05-021-2/+1
| | | | | | metadata in the caller. llvm-svn: 102862
* Complete reimplementation of the synthesis for implicitly-defined copyDouglas Gregor2010-05-011-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | assignment operators. Previously, Sema provided type-checking and template instantiation for copy assignment operators, then CodeGen would synthesize the actual body of the copy constructor. Unfortunately, the two were not in sync, and CodeGen might pick a copy-assignment operator that is different from what Sema chose, leading to strange failures, e.g., link-time failures when CodeGen called a copy-assignment operator that was not instantiation, run-time failures when copy-assignment operators were overloaded for const/non-const references and the wrong one was picked, and run-time failures when by-value copy-assignment operators did not have their arguments properly copy-initialized. This implementation synthesizes the implicitly-defined copy assignment operator bodies in Sema, so that the resulting ASTs encode exactly what CodeGen needs to do; there is no longer any special code in CodeGen to synthesize copy-assignment operators. The synthesis of the body is relatively simple, and we generate one of three different kinds of copy statements for each base or member: - For a class subobject, call the appropriate copy-assignment operator, after overload resolution has determined what that is. - For an array of scalar types or an array of class types that have trivial copy assignment operators, construct a call to __builtin_memcpy. - For an array of class types with non-trivial copy assignment operators, synthesize a (possibly nested!) for loop whose inner statement calls the copy constructor. - For a scalar type, use built-in assignment. This patch fixes at least a few tests cases in Boost.Spirit that were failing because CodeGen picked the wrong copy-assignment operator (leading to link-time failures), and I suspect a number of undiagnosed problems will also go away with this change. Some of the diagnostics we had previously have gotten worse with this change, since we're going through generic code for our type-checking. I will improve this in a subsequent patch. llvm-svn: 102853
* Simplify EmitClassAggrMemberwiseCopy.Anders Carlsson2010-05-011-3/+2
| | | | llvm-svn: 102848
* Clean up EmitClassMemberwiseCopy further.Anders Carlsson2010-05-011-2/+1
| | | | llvm-svn: 102846
* Get rid of a parameter from EmitClassMemberwiseCopy.Anders Carlsson2010-05-011-2/+1
| | | | llvm-svn: 102845
* Tweaked EmitCall() to permit the caller to provide some metadata to attach ↵David Chisnall2010-05-011-1/+4
| | | | | | | | to the call site. Used this in CGObjCGNU to attach metadata about message sends to permit speculative inlining. llvm-svn: 102833
* Remove an unnecessary parameter from EmitClassCopyAssignment.Anders Carlsson2010-04-301-2/+1
| | | | llvm-svn: 102747
* Remove an unnecessary argument to EmitClassCopyAssignment.Anders Carlsson2010-04-291-2/+1
| | | | llvm-svn: 102674
* IRGen for initialization/destruction ofFariborz Jahanian2010-04-281-0/+2
| | | | | | | ivar class objects (NeXt runtime). (radar 7900343). llvm-svn: 102533
* Revert enough of my patches to fix self-host again :(Anders Carlsson2010-04-251-4/+7
| | | | llvm-svn: 102289
* RenameGetAddressOfBaseOfCompleteClass to ↵Anders Carlsson2010-04-241-7/+8
| | | | | | GetAddressOfDirectBaseInCompleteClass to reflect that it only handles direct bases. llvm-svn: 102284
* More cleanup.Anders Carlsson2010-04-241-4/+3
| | | | llvm-svn: 102282
* Simplify EmitClassMemberwiseCopy now that it's only used for fields.Anders Carlsson2010-04-241-3/+1
| | | | llvm-svn: 102281
* Rename GetAddressOfBaseClass to OldGetAddressOfBaseClass.Anders Carlsson2010-04-241-5/+5
| | | | llvm-svn: 102275
* Change CodeGenFunction::GetAddressOfDerivedClass to take a BasePath.Anders Carlsson2010-04-241-1/+1
| | | | llvm-svn: 102273
OpenPOWER on IntegriCloud