]> granicus.if.org Git - clang/commit
[CodeGen] Unique constant CompoundLiterals.
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 28 Dec 2016 07:27:40 +0000 (07:27 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 28 Dec 2016 07:27:40 +0000 (07:27 +0000)
commit754243580d3ebc3e3a709ad8cac16401d7315541
tree840e8bfd2df6f42c9399a2ad56be8ee985b701a3
parentea5d48646d189b630d5deb0c0f4bef782064335a
[CodeGen] Unique constant CompoundLiterals.

Our newly aggressive constant folding logic makes it possible for
CGExprConstant to see the same CompoundLiteralExpr more than once. So,
emitting a new GlobalVariable every time we see a CompoundLiteral is no
longer correct.

We had a similar issue with BlockExprs that was caught while testing
said aggressive folding, so I applied the same style of fix (see D26410)
here. If we find yet another case where this needs to happen, we should
probably refactor this so we don't have a third DenseMap+getter+setter.

As a design note: getAddrOfConstantCompoundLiteralIfEmitted is really
only intended to be called by ConstExprEmitter::EmitLValue. So,
returning a GlobalVariable* instead of a ConstantAddress costs us
effectively nothing, and saves us either a few bytes per entry in our
map or a bit of code duplication.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290661 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CGExprConstant.cpp
lib/CodeGen/CodeGenModule.h
test/CodeGen/compound-literal.c