[llvm] r241958 - [IR] Switch static const to an enum to silence MSVC linker warnings

Pete Cooper peter_cooper at apple.com
Fri Jul 10 17:25:08 PDT 2015



Sent from my iPhone

> On Jul 10, 2015, at 4:13 PM, David Majnemer <david.majnemer at gmail.com> wrote:
> 
> 
> 
>> On Fri, Jul 10, 2015 at 4:01 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>> 
>> > On 2015-Jul-10, at 15:46, David Majnemer <david.majnemer at gmail.com> wrote:
>> >
>> > Author: majnemer
>> > Date: Fri Jul 10 17:46:02 2015
>> > New Revision: 241958
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=241958&view=rev
>> > Log:
>> > [IR] Switch static const to an enum to silence MSVC linker warnings
>> >
>> > Integral class statics are handled oddly in MSVC, we don't need them
>> > in this case, use an enum instead.
>> 
>> Oddly, how? 
> 
> say we have foo.h with:
> struct S {
>   static const int x = 3;
> };
> 
> and we have foo.cpp with:
> #include "foo.h"
> const int S::x;
> 
> 
> all files which include foo.h, except for foo.cpp, will get a definition of S::x.  In order for them to coexist, the definition lives in a COMDAT.
> 
> however, foo.cpp will get a definition of S::x which is not in a COMDAT.  Instead, it will get a strong definition.  This will result in link errors because we will have two definitions: one in a COMDAT and one not in a COMDAT.
> 
> This is documented, intentional, behavior of MSVC: https://msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx#sectionToggle0
Thanks for the explanation. That is pretty odd behaviour IMO.

Any thoughts on adding this as a compatibility warning to clang so that it tells us when something isn't going to work on MSVC?

Pete
>  
>> What would the fix be if we "needed" them here?
> 
> We would have to make sure we don't provide a definition for NumUserOperandsBits in Value.cpp if we are compiling with MSVC or we annotate the definition with __declspec(selectany).  I found the enum more appealing.
>  
>> 
>> >
>> > Modified:
>> >    llvm/trunk/include/llvm/IR/Value.h
>> >    llvm/trunk/lib/IR/Value.cpp
>> >
>> > Modified: llvm/trunk/include/llvm/IR/Value.h
>> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Value.h?rev=241958&r1=241957&r2=241958&view=diff
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/IR/Value.h (original)
>> > +++ llvm/trunk/include/llvm/IR/Value.h Fri Jul 10 17:46:02 2015
>> > @@ -104,8 +104,8 @@ protected:
>> >   ///
>> >   /// Note, this should *NOT* be used directly by any class other than User.
>> >   /// User uses this value to find the Use list.
>> > -  static const unsigned NumUserOperandsBits = 29;
>> > -  unsigned NumUserOperands : 29;
>> > +  enum : unsigned { NumUserOperandsBits = 29 };
>> > +  unsigned NumUserOperands : NumUserOperandsBits;
>> >
>> >   bool IsUsedByMD : 1;
>> >   bool HasName : 1;
>> >
>> > Modified: llvm/trunk/lib/IR/Value.cpp
>> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Value.cpp?rev=241958&r1=241957&r2=241958&view=diff
>> > ==============================================================================
>> > --- llvm/trunk/lib/IR/Value.cpp (original)
>> > +++ llvm/trunk/lib/IR/Value.cpp Fri Jul 10 17:46:02 2015
>> > @@ -39,8 +39,6 @@ using namespace llvm;
>> > //===----------------------------------------------------------------------===//
>> > //                                Value Class
>> > //===----------------------------------------------------------------------===//
>> > -const unsigned Value::NumUserOperandsBits;
>> > -
>> > static inline Type *checkType(Type *Ty) {
>> >   assert(Ty && "Value defined with a null type: Error!");
>> >   return Ty;
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150710/d0ac68e7/attachment.html>


More information about the llvm-commits mailing list