Put static local variables of inline functions in the function comdat.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Dec 2014 21:00:30 +0000 (21:00 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Dec 2014 21:00:30 +0000 (21:00 +0000)
commitce4757b8e7df547f269b90e5d500714952e8f0b2
tree65e2b17d9834e76c91b24ff4db17237e822ff7fe
parent75594b6142c1e7b6d284cf5420c9a06df7723245
Put static local variables of inline functions in the function comdat.

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
clang/lib/CodeGen/ItaniumCXXABI.cpp
clang/test/CodeGenCXX/static-init.cpp