aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGException.cpp
AgeCommit message (Collapse)AuthorFilesLines
2017-06-09[DebugInfo] Add kind of ImplicitParamDecl for emission of FlagObjectPointer.Alexey Bataev1-6/+7
Summary: If the first parameter of the function is the ImplicitParamDecl, codegen automatically marks it as an implicit argument with `this` or `self` pointer. Added internal kind of the ImplicitParamDecl to separate 'this', 'self', 'vtt' and other implicit parameters from other kind of parameters. Reviewers: rjmccall, aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D33735 llvm-svn: 305075
2017-05-09Suppress all uses of LLVM_END_WITH_NULL. NFC.Serge Guelton1-7/+6
Use variadic templates instead of relying on <cstdarg> + sentinel. This enforces better type checking and makes code more readable. Differential revision: https://reviews.llvm.org/D32550 llvm-svn: 302572
2017-04-01[ObjC++] Use the correct EH personality in GNU modeBenjamin Kramer1-2/+2
Previously, it would just always use the ObjC DWARF personality, even with SjLj or SEH exceptions. Patch by Jonathan Schleifer, test case by me. llvm-svn: 299306
2017-03-21Update Clang for LLVM rename AttributeSet -> AttributeListReid Kleckner1-1/+1
llvm-svn: 298394
2017-02-22stop using associative comdats for SEH filter functionsBob Haarman1-11/+0
Summary: We implement structured exception handling (SEH) by generating filter functions for functions that use exceptions. Currently, we use associative comdats to ensure that the filter functions are preserved if and only if the functions we generated them for are preserved. This can lead to problems when generating COFF objects - LLVM may decide to inline a function that uses SEH and remove its body, at which point we will end up with a comdat that COFF cannot represent. To avoid running into that situation, this change makes us not use associative comdats for SEH filter functions. We can still get the benefits we used the associative comdats for: we will always preserve filter functions we use, and dead stripping can eliminate the ones we don't use. Reviewers: rnk, pcc, ruiu Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D30117 llvm-svn: 295872
2017-01-08Use the correct ObjC EH personalityBenjamin Kramer1-0/+8
This fixes ObjC exceptions on Win64 (which uses SEH), among others. Patch by Jonathan Schleifer! llvm-svn: 291408
2016-12-15CodeGen: fix runtime function dll storageSaleem Abdulrasool1-4/+3
Properly attribute DLL storage to runtime functions. When generating the runtime function, scan for an existing declaration which may provide an explicit declaration (local storage) or a DLL import or export storage from the user. Honour that if available. Otherwise, if building with a local visibility of the public or standard namespaces (-flto-visibility-public-std), give the symbols local storage (it indicates a /MT[d] link, so static runtime). Otherwise, assume that the link is dynamic, and give the runtime function dllimport storage. This allows for implementations to get the correct storage as long as they are properly declared, the user to override the import storage, and in case no explicit storage is given, use of the import storage. llvm-svn: 289776
2016-10-26Refactor call emission to package the function pointer together withJohn McCall1-1/+2
abstract information about the callee. NFC. The goal here is to make it easier to recognize indirect calls and trigger additional logic in certain cases. That logic will come in a later patch; in the meantime, I felt that this was a significant improvement to the code. llvm-svn: 285258
2016-10-04[CUDA] Mark device functions as nounwind.Justin Lebar1-0/+4
Summary: This prevents clang from emitting 'invoke's and catch statements. Things previously mostly worked thanks to TryToMarkNoThrow() in CodeGenFunction. But this is not a proper IPO, and it doesn't properly handle cases like mutual recursion. Fixes bug 30593. Reviewers: tra Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25166 llvm-svn: 283272
2016-03-11[SEH] Remove nounwind/noinline from outlined finally funcletsReid Kleckner1-6/+0
With the new EH representation this is no longer necessary. llvm-svn: 263269
2016-03-11Preserve ExtParameterInfos into CGFunctionInfo.John McCall1-7/+3
As part of this, make the function-arrangement interfaces a little simpler and more semantic. NFC. llvm-svn: 263191
2016-03-01Reword a misleading comment discussing landingpads and SEHReid Kleckner1-2/+4
SEH doesn't use landingpads anymore. llvm-svn: 262382
2016-03-01[MSVC Compat] Correctly handle finallys nested within finallysDavid Majnemer1-5/+5
We'd lose track of the parent CodeGenFunction, leading us to get confused with regard to which function a nested finally belonged to. Differential Revision: http://reviews.llvm.org/D17752 llvm-svn: 262379
2016-02-24[WinEH] Make sure terminate handlers have funclet operandsDavid Majnemer1-1/+3
Calls to the terminate handler must be annotated within the exception region they are within. llvm-svn: 261751
2015-12-16Reland "[SEH] Use llvm.x86.seh.recoverfp for SEH filters on x64 as well as ↵Reid Kleckner1-19/+25
32bit" I forgot to initialize RecoverFP. llvm-svn: 255731
2015-12-16Revert "[SEH] Use llvm.x86.seh.recoverfp for SEH filters on x64 as well as ↵Reid Kleckner1-20/+15
32bit" This reverts commit r255710. llvm-svn: 255728
2015-12-15[SEH] Use llvm.x86.seh.recoverfp for SEH filters on x64 as well as 32bitReid Kleckner1-15/+20
llvm-svn: 255710
2015-12-14[MS ABI] Don't rely on terminatepadDavid Majnemer1-7/+6
We'd like to remove support for terminatepad from LLVM. To do this, we need to move Clang off of it first. The intent behind terminatepad was to carefully model exception specifications for the MSVC personality. However, we don't support exception specifications for the MSVC personality and neither does MSVC. Instead, MSVC supports all-or-nothing exception specifications. We can model this limited usage using cleanuppads which call std::terminate. Differential Revision: http://reviews.llvm.org/D15478 llvm-svn: 255521
2015-12-12Update clang to use the updated LLVM EH instructionsDavid Majnemer1-42/+32
Depends on D15139. Reviewers: rnk Differential Revision: http://reviews.llvm.org/D15140 llvm-svn: 255423
2015-11-06CodeGen: Remove implicit ilist iterator conversions, NFCDuncan P. N. Exon Smith1-3/+2
Make ilist iterator conversions explicit in clangCodeGen. Eventually I'll remove them everywhere. llvm-svn: 252358
2015-10-30Watch and TV OS: wire up basic ABI choicesTim Northover1-0/+2
This sets the mostly expected Darwin default ABI options for these two platforms. Active changes from these defaults for watchOS are in a later patch. llvm-svn: 251708
2015-10-08[WinEH] Push cleanupendpad scopes around exceptional cleanupsReid Kleckner1-27/+3
We were only doing this for SEH as a special case. Generalize it to all cleanups. llvm-svn: 249748
2015-10-08[WinEH] Remove NewMSEH and enable its behavior by defaultReid Kleckner1-38/+26
Testing has shown that it is at least as reliable as the old landingpad pattern matching code. llvm-svn: 249647
2015-10-07[SEH] Fix x64 __exception_code in __except blocksReid Kleckner1-8/+15
Use llvm.eh.exceptioncode to get the code out of EAX for x64. For 32-bit, the filter is responsible for storing it to memory for us. llvm-svn: 249497
2015-10-06Fix Clang-tidy modernize-use-nullptr warnings in source directories; other ↵Hans Wennborg1-7/+7
minor cleanups Patch by Eugene Zelenko! Differential Revision: http://reviews.llvm.org/D13406 llvm-svn: 249484
2015-09-17Use the MSVC SEH personalities on MingwReid Kleckner1-2/+4
Mingw generally wraps an old copy of msvcrt.dll which has these personalities, so things should work out, or so I hear. I haven't tested it. llvm-svn: 247902
2015-09-16[WinEH] Fix a build issue in CGException.cppReid Kleckner1-2/+1
I was constructing an object without filling in all the fields. llvm-svn: 247851
2015-09-16[WinEH] Pass the catch adjectives to catchpad directlyReid Kleckner1-18/+23
This avoids building a fake LLVM IR global variable just to ferry an i32 down into LLVM codegen. It also puts a nail in the coffin of using MS ABI C++ EH with landingpads, since now we'll assert in the lpad code when flags are present. llvm-svn: 247843
2015-09-11[CodeGen] Teach SimplifyPersonality about the updated LandingPadInstVedant Kumar1-28/+38
When uses of personality functions were moved from LandingPadInst to Function, we forgot to update SimplifyPersonality(). This patch corrects that. Note: SimplifyPersonality() is an optimization which replaces personality functions with the default C++ personality when possible. Without this update, some ObjC++ projects fail to link against C++ libraries (seeing as the exception ABI had effectively changed). rdar://problem/22155434 llvm-svn: 247421
2015-09-10[SEH] Use cleanupendpad so that WinEHPrepare gets the coloring rightReid Kleckner1-14/+38
Cleanupendpad is a lot like catchendpad, so we can reuse the same EHScopeStack type. llvm-svn: 247349
2015-09-10[SEH] Use catchret in the new EH IR like we do for C++Reid Kleckner1-1/+13
Also add tests for SEH with the new IRGen. llvm-svn: 247318
2015-09-08Collect SEH captures in a set instead of a vector to avoidJohn McCall1-4/+4
doing redundant work if a variable is used multiple times. Fixes PR24751. llvm-svn: 247075
2015-09-08Compute and preserve alignment more faithfully in IR-generation.John McCall1-36/+37
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-08-23[WinEH] Update to new EH pad/ret signatures (with tokens required)Joseph Tremoulet1-4/+3
Summary: The signatures of the methods in LLVM for creating EH pads/rets are changing to require token arguments on rets and assume token return type on pads. Update creation code accordingly. Reviewers: majnemer, rnk Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D12109 llvm-svn: 245798
2015-08-18Devirtualize EHScopeStack::Cleanup's dtor because it's never destroyed ↵David Blaikie1-4/+4
polymorphically llvm-svn: 245378
2015-08-15[MS ABI] Switch catchpad/cleanuppad to use tokensDavid Majnemer1-4/+4
llvm-svn: 245153
2015-08-04[CodeGen] Fold memcpy into SmallVector initializer. No functionality change.Benjamin Kramer1-3/+2
llvm-svn: 243992
2015-07-31[MS ABI] Hook clang up to the new EH instructionsDavid Majnemer1-19/+146
The new EH instructions make it possible for LLVM to generate .xdata tables that the MSVC personality routines will be happy about. Because this is experimental, hide it behind a -cc1 flag (-fnew-ms-eh). Differential Revision: http://reviews.llvm.org/D11405 llvm-svn: 243767
2015-07-22Move EHPersonality to CGCleanupDavid Majnemer1-32/+4
This makes it possible to use EHPersonality in other parts of CodeGen. Differential Revision: http://reviews.llvm.org/D11440 llvm-svn: 242971
2015-07-14Rely on default zero-arg value for IRBuilder::CreateCall calls to zero-arg ↵David Blaikie1-1/+1
functions Patch by servuswiegehtz at yahoo.de llvm-svn: 242168
2015-07-10Re-enable 32-bit SEH after the alignment fixReid Kleckner1-4/+0
llvm-svn: 241878
2015-07-08Disable 32-bit SEH, againReid Kleckner1-0/+4
Move the diagnostic back to codegen so that we can compile ATL on the self-host bot. We don't actually end up emitting code for the __try, so the diagnostic won't be hit. llvm-svn: 241761
2015-07-07[SEH] Switch from frameaddress(0) to localaddressReid Kleckner1-3/+2
This should do the right thing for stack realignment prologues. llvm-svn: 241644
2015-07-07Update clang for intrinsic rename of framerecover to localrecoverReid Kleckner1-7/+7
llvm-svn: 241634
2015-07-07Revert "Revert 241171, 241187, 241199 (32-bit SEH)."Reid Kleckner1-139/+218
This reverts commit r241244, but restricts SEH support to Win64. This way, Chromium builds will still fall back on TUs with SEH, and Clang developers can work on this incrementally upstream while patching this small predicate locally. It'll also make it easier to review small fixes. llvm-svn: 241533
2015-07-02Revert 241171, 241187, 241199 (32-bit SEH).Nico Weber1-218/+139
It still doesn't produce quite the right code, test binaries built with this enabled fail some tests. llvm-svn: 241244
2015-07-01[SEH] Update EmitCapturedLocals to match r241187Reid Kleckner1-14/+11
It was still using frameaddress(1) to get the parent FP, even though it had the value it wanted as a parameter. llvm-svn: 241199
2015-07-01[SEH] Delete the 32-bit IR lowering for __finally blocks and use x64Reid Kleckner1-57/+23
32-bit finally funclets are intended to be called both directly from the parent function and indirectly from the EH runtime. Because we aren't contorting LLVM's X86 prologue to match MSVC's, calling the finally block directly passes in a different value of EBP than the one that the runtime provides. We need an adapter thunk to adjust EBP to the expected value. However, WinEHPrepare already has to solve this problem when cleanups are not pre-outlined, so we can go ahead and rely on it rather than duplicating work. Now we only do the llvm.x86.seh.recoverfp dance for 32-bit SEH filter functions. llvm-svn: 241187
2015-07-01[SEH] Add 32-bit lowering for SEH __tryReid Kleckner1-144/+260
This re-lands r236052 and adds support for __exception_code(). In 32-bit SEH, the exception code is not available in eax. It is only available in the filter function, and now we arrange to load it and store it into an escaped variable in the parent frame. As a consequence, we have to disable the "catch i8* null" optimization on 32-bit and always generate a filter function. We can re-enable the optimization if we detect an __except block that doesn't use the exception code, but this probably isn't worth optimizing. Reviewers: majnemer Differential Revision: http://reviews.llvm.org/D10852 llvm-svn: 241171
2015-06-22Revert r240270 ("Fixed/added namespace ending comments using clang-tidy").Alexander Kornienko1-5/+5
llvm-svn: 240353