diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-02-25 14:40:42 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-02-25 14:40:42 +0000 | 
| commit | 2344cbce571b60627653ec3015125737e5f8c68d (patch) | |
| tree | 978eae48e869bcf6e7f04f92efa77d9a1fd4a7b8 /lib/Frontend/InitPreprocessor.cpp | |
| parent | 47c4f8f1661f7cab0cf1ade9824cf0f5f1762403 (diff) | |
Notes
Diffstat (limited to 'lib/Frontend/InitPreprocessor.cpp')
| -rw-r--r-- | lib/Frontend/InitPreprocessor.cpp | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 4502c92499a7..17603ada11d1 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -286,12 +286,12 @@ static void DefineFastIntType(unsigned TypeWidth, bool IsSigned,  /// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with  /// the specified properties. -static const char *getLockFreeValue(unsigned TypeWidth, unsigned InlineWidth) { +static const char *getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign, +                                    unsigned InlineWidth) {    // Fully-aligned, power-of-2 sizes no larger than the inline    // width will be inlined as lock-free operations. -  // Note: we do not need to check alignment since _Atomic(T) is always -  // appropriately-aligned in clang. -  if ((TypeWidth & (TypeWidth - 1)) == 0 && TypeWidth <= InlineWidth) +  if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 && +      TypeWidth <= InlineWidth)      return "2"; // "always lock free"    // We cannot be certain what operations the lib calls might be    // able to implement as lock-free on future processors. @@ -881,6 +881,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,  #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \      Builder.defineMacro("__GCC_ATOMIC_" #TYPE "_LOCK_FREE", \                          getLockFreeValue(TI.get##Type##Width(), \ +                                         TI.get##Type##Align(), \                                           InlineWidthBits));      DEFINE_LOCK_FREE_MACRO(BOOL, Bool);      DEFINE_LOCK_FREE_MACRO(CHAR, Char); @@ -893,6 +894,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,      DEFINE_LOCK_FREE_MACRO(LLONG, LongLong);      Builder.defineMacro("__GCC_ATOMIC_POINTER_LOCK_FREE",                          getLockFreeValue(TI.getPointerWidth(0), +                                         TI.getPointerAlign(0),                                           InlineWidthBits));  #undef DEFINE_LOCK_FREE_MACRO    }  | 
