Commit Graph

290 Commits

Author SHA1 Message Date
Duncan P. N. Exon Smith 2ceddccf8f CodeGen: Remove implicit ilist iterator conversions, NFC
Make ilist iterator conversions explicit in clangCodeGen.  Eventually
I'll remove them everywhere.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@252358 91177308-0d34-0410-b5e6-96231b3b80d8
2015-11-06 23:00:41 +00:00
Tim Northover 9605ec4bd7 Watch and TV OS: wire up basic ABI choices
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@251708 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-30 16:30:36 +00:00
Reid Kleckner 5e9628e28d [WinEH] Push cleanupendpad scopes around exceptional cleanups
We were only doing this for SEH as a special case. Generalize it to all
cleanups.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@249748 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-08 21:14:56 +00:00
Reid Kleckner af74df2b28 [WinEH] Remove NewMSEH and enable its behavior by default
Testing has shown that it is at least as reliable as the old landingpad
pattern matching code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@249647 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-08 01:13:52 +00:00
Reid Kleckner 8fcec56c0b [SEH] Fix x64 __exception_code in __except blocks
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@249497 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-07 01:07:13 +00:00
Hans Wennborg 94faed6137 Fix Clang-tidy modernize-use-nullptr warnings in source directories; other minor cleanups
Patch by Eugene Zelenko!

Differential Revision: http://reviews.llvm.org/D13406

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@249484 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-06 23:40:43 +00:00
Reid Kleckner 5b33399542 Use the MSVC SEH personalities on Mingw
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247902 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-17 17:04:13 +00:00
Reid Kleckner f1436e60d8 [WinEH] Fix a build issue in CGException.cpp
I was constructing an object without filling in all the fields.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247851 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-16 21:06:09 +00:00
Reid Kleckner 837f189b75 [WinEH] Pass the catch adjectives to catchpad directly
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247843 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-16 20:15:55 +00:00
Vedant Kumar 3c02b7312f [CodeGen] Teach SimplifyPersonality about the updated LandingPadInst
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247421 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-11 15:40:05 +00:00
Reid Kleckner 5e1234dd84 [SEH] Use cleanupendpad so that WinEHPrepare gets the coloring right
Cleanupendpad is a lot like catchendpad, so we can reuse the same
EHScopeStack type.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247349 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-10 22:11:13 +00:00
Reid Kleckner c0e1672f1e [SEH] Use catchret in the new EH IR like we do for C++
Also add tests for SEH with the new IRGen.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247318 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-10 18:39:41 +00:00
John McCall b6defdfa47 Collect SEH captures in a set instead of a vector to avoid
doing redundant work if a variable is used multiple times.

Fixes PR24751.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247075 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-08 21:15:22 +00:00
John McCall f4ddf94ecb Compute and preserve alignment more faithfully in IR-generation.
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@246985 91177308-0d34-0410-b5e6-96231b3b80d8
2015-09-08 08:05:57 +00:00
Joseph Tremoulet 2b06a033d1 [WinEH] Update to new EH pad/ret signatures (with tokens required)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245798 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-23 00:26:48 +00:00
David Blaikie 673861a3c6 Devirtualize EHScopeStack::Cleanup's dtor because it's never destroyed polymorphically
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245378 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-18 22:40:54 +00:00
David Majnemer a1b1ae0aca [MS ABI] Switch catchpad/cleanuppad to use tokens
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245153 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-15 03:21:08 +00:00
Benjamin Kramer e770ba628e [CodeGen] Fold memcpy into SmallVector initializer. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243992 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-04 15:38:49 +00:00
David Majnemer 3b33f744e9 [MS ABI] Hook clang up to the new EH instructions
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243767 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-31 17:58:45 +00:00
David Majnemer facdf730d7 Move EHPersonality to CGCleanup
This makes it possible to use EHPersonality in other parts of CodeGen.

Differential Revision: http://reviews.llvm.org/D11440

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242971 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-22 23:46:21 +00:00
David Blaikie c0feed0bb1 Rely on default zero-arg value for IRBuilder::CreateCall calls to zero-arg functions
Patch by servuswiegehtz at yahoo.de

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242168 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-14 17:27:39 +00:00
Reid Kleckner 8b1bc0abb2 Re-enable 32-bit SEH after the alignment fix
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241878 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-10 00:16:25 +00:00
Reid Kleckner 0a79d0e495 Disable 32-bit SEH, again
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241761 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-08 23:57:03 +00:00
Reid Kleckner 309647a473 [SEH] Switch from frameaddress(0) to localaddress
This should do the right thing for stack realignment prologues.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241644 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 23:23:31 +00:00
Reid Kleckner 55c7cc771e Update clang for intrinsic rename of framerecover to localrecover
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241634 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 22:26:07 +00:00
Reid Kleckner a4bd538963 Revert "Revert 241171, 241187, 241199 (32-bit SEH)."
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241533 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-07 00:36:30 +00:00
Nico Weber 6c5a911bba Revert 241171, 241187, 241199 (32-bit SEH).
It still doesn't produce quite the right code, test binaries built with this
enabled fail some tests.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241244 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-02 06:10:53 +00:00
Reid Kleckner 3cc214289f [SEH] Update EmitCapturedLocals to match r241187
It was still using frameaddress(1) to get the parent FP, even though it
had the value it wanted as a parameter.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241199 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-01 22:33:45 +00:00
Reid Kleckner 184ac2d8e0 [SEH] Delete the 32-bit IR lowering for __finally blocks and use x64
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241187 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-01 21:00:00 +00:00
Reid Kleckner 0e2d47b82f [SEH] Add 32-bit lowering for SEH __try
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241171 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-01 17:10:10 +00:00
Alexander Kornienko 8ca7705aa3 Revert r240270 ("Fixed/added namespace ending comments using clang-tidy").
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240353 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 23:07:51 +00:00
Alexander Kornienko ac58acc7f2 Fixed/added namespace ending comments using clang-tidy. NFC
The patch is generated using this command:

  $ tools/extra/clang-tidy/tool/run-clang-tidy.py -fix \
      -checks=-*,llvm-namespace-comment -header-filter='llvm/.*|clang/.*' \
      work/llvm/tools/clang

To reduce churn, not touching namespaces spanning less than 10 lines.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240270 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 09:47:44 +00:00
David Majnemer fa3804032d Update clang to take into account the changes to personality fns
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239941 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-17 20:53:19 +00:00
Reid Kleckner a81d8fe06e Revert "Re-land r236052, "[SEH] Add 32-bit lowering code for __try""
This reverts commit r239415. This was committed accidentally, LLVM isn't
ready for this.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239417 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-09 17:49:42 +00:00
Reid Kleckner b2c611a18b Re-land r236052, "[SEH] Add 32-bit lowering code for __try"
This reverts r236167.

LLVM should be ready for this now.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239415 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-09 17:47:50 +00:00
David Blaikie 34ef52a5d1 API update for streamlining of IRBuilder::CreateCall to just use ArrayRef/initializer_list+braced init
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237625 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-18 22:14:03 +00:00
David Majnemer 35ec179e2b Give isCompatibleWithMSVC a better interface
We now use an enum which maps the marketing name (almost always a year)
to the major version number.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236967 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-11 03:57:49 +00:00
David Majnemer 99d6ac1bc6 [MS ABI] Update EH emission for MSVC 2015 compatibility
MSVC 2015 renamed the symbol found by name lookup for 'std::terminate'
so we cannot rely on using '?terminate@@YAXXZ'.  Furthermore, it seems
that 2015 will be the first release of MSVC which permits inlining a
function which is noexcept into a function which isn't.  This is
implemented by creating a cleanup for the invoker which jumps to
__std_terminate.  Clang's implementation of this aspect of the MSVC
scheme is slightly less efficient in this respect because we use a
catch handler configured as a catch-all handler instead.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236961 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-10 21:38:26 +00:00
Reid Kleckner 45d60479b5 Revert most of r236271, leaving only the datalayout change in lib/Basic/Targets.cpp
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236274 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-30 22:29:25 +00:00
Reid Kleckner e2aa55a551 Use 4 byte preferred aggregate alignment in datalayout on x86 Win32
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236271 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-30 22:13:05 +00:00
Reid Kleckner ad68d1bbcf Revert r236128, LLVM isn't falling back in the right way
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236167 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-29 21:55:21 +00:00
Reid Kleckner b7183ef952 Re-land r236052, the linker errors were fixed by LLVM r236123
Basic __finally blocks don't cause linker errors anymore (although they
are miscompiled).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236128 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-29 17:17:17 +00:00
Nico Weber 50d6060ac8 Revert r236052, it caused linker errors when building 32-bit applications.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236082 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-29 03:08:32 +00:00
Reid Kleckner 24fca8241f [SEH] Add 32-bit lowering code for __try
This is just the clang-side of 32-bit SEH. LLVM still needs work, and it
will determinstically fail to compile until it's feature complete.

On x86, all outlined handlers have no parameters, but they do implicitly
take the EBP value passed in and use it to address locals of the parent
frame. We model this with llvm.frameaddress(1).

This works (mostly), but __finally block inlining can break it. For now,
we apply the 'noinline' attribute. If we really want to inline __finally
blocks on 32-bit x86, we should teach the inliner how to untangle
frameescape and framerecover.

Promote the error diagnostic from codegen to sema. It now rejects SEH on
non-Windows platforms. LLVM doesn't implement SEH on non-x86 Windows
platforms, but there's nothing preventing it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236052 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-28 22:19:32 +00:00
Justin Bogner aa53a4f2ee InstrProf: Stop using RegionCounter outside of CodeGenPGO (NFC)
The RegionCounter type does a lot of legwork, but most of it is only
meaningful within the implementation of CodeGenPGO. The uses elsewhere
in CodeGen generally just want to increment or read counters, so do
that directly.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235664 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-23 23:06:47 +00:00
David Majnemer e1907cb197 [MS ABI] Use the right types for filter and finally blocks
The type for abnormal_termination can't be an i1, it an i8.
Filter functions return 'LONG', not 'int'.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235161 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-17 06:57:25 +00:00
Reid Kleckner eec5f41a53 Reland r234613 (and follow-ups 234614, 234616, 234618)
The frameescape intrinsic cannot be inlined, so I fixed the inliner in
r234937. This should address PR23216.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234942 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-14 20:59:00 +00:00
Nico Weber 804f40bf60 Revert r234613 (and follow-ups 234614, 234616, 234618), it caused PR23216.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234789 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-13 20:04:22 +00:00
Nico Weber a5b191aa79 Revert r234786, it contained a bunch of stuff I did not mean to commit.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234787 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-13 20:03:03 +00:00
Nico Weber 5aaa165ebe Revert r234613 (and follow-ups 234614, 234616, 234618), it caused PR23216.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234786 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-13 20:01:20 +00:00