[C++17] Support __GCC_[CON|DE]STRUCTIVE_SIZE (#89446)
These macros are used by STL implementations to support implementation of std::hardware_destructive_interference_size and std::hardware_constructive_interference_size Fixes #60174 --------- Co-authored-by: Louis Dionne <ldionne.2@gmail.com>
This commit is contained in:
@@ -21,6 +21,12 @@ void foo() {
|
||||
|
||||
// CHECK: ---
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDiagnosticPush
|
||||
|
||||
@@ -18,6 +18,12 @@
|
||||
|
||||
// CHECK: ---
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaComment
|
||||
@@ -67,7 +73,7 @@
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaMessage
|
||||
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:13:9"
|
||||
// CHECK-NEXT: Namespace:
|
||||
// CHECK-NEXT: Namespace:
|
||||
// CHECK-NEXT: Kind: PMK_Message
|
||||
// CHECK-NEXT: Str: message argument
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
|
||||
@@ -6,6 +6,12 @@
|
||||
|
||||
// CHECK: ---
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "<built-in>:{{.+}}:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaDirective
|
||||
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
|
||||
// CHECK-NEXT: Introducer: PIK_HashPragma
|
||||
// CHECK-NEXT: - Callback: PragmaOpenCLExtension
|
||||
|
||||
@@ -5572,3 +5572,25 @@ but the expression has no runtime effects.
|
||||
Type- and value-dependent expressions are not supported yet.
|
||||
|
||||
This facility is designed to aid with testing name lookup machinery.
|
||||
|
||||
Predefined Macros
|
||||
=================
|
||||
|
||||
`__GCC_DESTRUCTIVE_SIZE` and `__GCC_CONSTRUCTIVE_SIZE`
|
||||
------------------------------------------------------
|
||||
Specify the mimum offset between two objects to avoid false sharing and the
|
||||
maximum size of contiguous memory to promote true sharing, respectively. These
|
||||
macros are predefined in all C and C++ language modes, but can be redefined on
|
||||
the command line with ``-D`` to specify different values as needed or can be
|
||||
undefined on the command line with ``-U`` to disable support for the feature.
|
||||
|
||||
**Note: the values the macros expand to are not guaranteed to be stable. They
|
||||
are are affected by architectures and CPU tuning flags, can change between
|
||||
releases of Clang and will not match the values defined by other compilers such
|
||||
as GCC.**
|
||||
|
||||
Compiling different TUs depending on these flags (including use of
|
||||
``std::hardware_constructive_interference`` or
|
||||
``std::hardware_destructive_interference``) with different compilers, macro
|
||||
definitions, or architecture flags will lead to ODR violations and should be
|
||||
avoided.
|
||||
@@ -95,6 +95,18 @@ C++14 Feature Support
|
||||
- Sized deallocation is enabled by default in C++14 onwards. The user may specify
|
||||
``-fno-sized-deallocation`` to disable it if there are some regressions.
|
||||
|
||||
C++17 Feature Support
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
- Clang now exposes ``__GCC_DESTRUCTIVE_SIZE`` and ``__GCC_CONSTRUCTIVE_SIZE``
|
||||
predefined macros to support standard library implementations of
|
||||
``std::hardware_destructive_interference_size`` and
|
||||
``std::hardware_constructive_interference_size``, respectively. These macros
|
||||
are predefined in all C and C++ language modes. The values the macros
|
||||
expand to are not stable between releases of Clang and do not need to match
|
||||
the values produced by GCC, so these macros should not be used from header
|
||||
files because they may not be stable across multiple TUs (the values may vary
|
||||
based on compiler version as well as CPU tuning). #GH60174
|
||||
|
||||
C++20 Feature Support
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <cassert>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
@@ -1792,6 +1793,15 @@ public:
|
||||
/// Whether to support HIP image/texture API's.
|
||||
virtual bool hasHIPImageSupport() const { return true; }
|
||||
|
||||
/// The first value in the pair is the minimum offset between two objects to
|
||||
/// avoid false sharing (destructive interference). The second value in the
|
||||
/// pair is maximum size of contiguous memory to promote true sharing
|
||||
/// (constructive interference). Neither of these values are considered part
|
||||
/// of the ABI and can be changed by targets at any time.
|
||||
virtual std::pair<unsigned, unsigned> hardwareInterferenceSizes() const {
|
||||
return std::make_pair(64, 64);
|
||||
}
|
||||
|
||||
protected:
|
||||
/// Copy type and layout related info.
|
||||
void copyAuxTarget(const TargetInfo *Aux);
|
||||
|
||||
@@ -225,6 +225,10 @@ public:
|
||||
bool hasBitIntType() const override { return true; }
|
||||
|
||||
const char *getBFloat16Mangling() const override { return "u6__bf16"; };
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(getTriple().isArch64Bit() ? 256 : 64, 64);
|
||||
}
|
||||
};
|
||||
|
||||
class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo {
|
||||
|
||||
@@ -175,6 +175,10 @@ public:
|
||||
std::optional<std::string> handleAsmEscapedChar(char EscChar) const override;
|
||||
StringRef getABI() const override { return ABI; }
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
|
||||
protected:
|
||||
std::string CPU;
|
||||
StringRef ABI;
|
||||
|
||||
@@ -113,6 +113,10 @@ public:
|
||||
StringRef CPUName(Name);
|
||||
return isValidCPUName(CPUName);
|
||||
}
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
} // namespace targets
|
||||
} // namespace clang
|
||||
|
||||
@@ -56,6 +56,10 @@ public:
|
||||
BuiltinVaListKind getBuiltinVaListKind() const override;
|
||||
bool setCPU(const std::string &Name) override;
|
||||
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace targets
|
||||
|
||||
@@ -431,6 +431,10 @@ public:
|
||||
|
||||
bool validateTarget(DiagnosticsEngine &Diags) const override;
|
||||
bool hasBitIntType() const override { return true; }
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
} // namespace targets
|
||||
} // namespace clang
|
||||
|
||||
@@ -423,6 +423,10 @@ public:
|
||||
// This is the ELF definition
|
||||
return TargetInfo::PowerABIBuiltinVaList;
|
||||
}
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
|
||||
// Note: ABI differences may eventually require us to have a separate
|
||||
@@ -503,6 +507,10 @@ public:
|
||||
return CCCR_Warning;
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(128, 128);
|
||||
}
|
||||
};
|
||||
|
||||
class LLVM_LIBRARY_VISIBILITY AIXPPC32TargetInfo :
|
||||
|
||||
@@ -122,6 +122,10 @@ public:
|
||||
void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) const override;
|
||||
bool supportsTargetAttributeTune() const override { return true; }
|
||||
ParsedTargetAttr parseTargetAttr(StringRef Str) const override;
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo {
|
||||
public:
|
||||
|
||||
@@ -140,6 +140,10 @@ public:
|
||||
CPU = getCPUKind(Name);
|
||||
return CPU != CK_GENERIC;
|
||||
}
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(32, 32);
|
||||
}
|
||||
};
|
||||
|
||||
// SPARC v8 is the 32-bit mode selected by Triple::sparc.
|
||||
|
||||
@@ -220,6 +220,10 @@ public:
|
||||
int getEHDataRegisterNumber(unsigned RegNo) const override {
|
||||
return RegNo < 4 ? 6 + RegNo : -1;
|
||||
}
|
||||
|
||||
std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
|
||||
return std::make_pair(256, 256);
|
||||
}
|
||||
};
|
||||
} // namespace targets
|
||||
} // namespace clang
|
||||
|
||||
@@ -1308,6 +1308,16 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
|
||||
Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1");
|
||||
}
|
||||
|
||||
// GCC defines these macros in both C and C++ modes despite them being needed
|
||||
// mostly for STL implementations in C++.
|
||||
auto [Destructive, Constructive] = TI.hardwareInterferenceSizes();
|
||||
Builder.defineMacro("__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
|
||||
Builder.defineMacro("__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
|
||||
// We need to use push_macro to allow users to redefine these macros from the
|
||||
// command line with -D and not issue a -Wmacro-redefined warning.
|
||||
Builder.append("#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
|
||||
Builder.append("#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
|
||||
|
||||
auto addLockFreeMacros = [&](const llvm::Twine &Prefix) {
|
||||
// Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE.
|
||||
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
|
||||
|
||||
@@ -132,7 +132,7 @@ void BLAP(foo, __COUNTER__)(void);
|
||||
// CHECK-NEXT: "spellingLoc": {
|
||||
// CHECK-NEXT: "offset": {{[0-9]+}},
|
||||
// CHECK-NEXT: "file": "<scratch space>",
|
||||
// CHECK-NEXT: "line": 3,
|
||||
// CHECK-NEXT: "line": 5,
|
||||
// CHECK-NEXT: "col": 1,
|
||||
// CHECK-NEXT: "tokLen": 4
|
||||
// CHECK-NEXT: },
|
||||
@@ -169,7 +169,7 @@ void BLAP(foo, __COUNTER__)(void);
|
||||
// CHECK-NEXT: "spellingLoc": {
|
||||
// CHECK-NEXT: "offset": {{[0-9]+}},
|
||||
// CHECK-NEXT: "file": "<scratch space>",
|
||||
// CHECK-NEXT: "line": 5,
|
||||
// CHECK-NEXT: "line": 7,
|
||||
// CHECK-NEXT: "col": 1,
|
||||
// CHECK-NEXT: "tokLen": 4
|
||||
// CHECK-NEXT: },
|
||||
|
||||
@@ -11,4 +11,4 @@ int f(int coin) {
|
||||
// RUN: rm -rf %t.output
|
||||
// RUN: %clang_analyze_cc1 -analyze -analyzer-checker=core -analyzer-output html -o %t.output %s
|
||||
// RUN: cat %t.output/* | FileCheck %s --match-full-lines
|
||||
// CHECK: var relevant_lines = {"1": {"3": 1, "4": 1, "5": 1, "6": 1}, "3": {"3": 1, "4": 1, "5": 1, "6": 1, "7": 1}};
|
||||
// CHECK: var relevant_lines = {"1": {"3": 1, "4": 1, "5": 1, "6": 1}, "4": {"3": 1, "4": 1, "5": 1, "6": 1, "7": 1}};
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
// RUN: %clang -cc1 -print-stats %s 2>&1 | FileCheck %s
|
||||
// CHECK: 6 local SLocEntries allocated
|
||||
// CHECK: 7 local SLocEntries allocated
|
||||
//
|
||||
// Verify that the macro arg expansion is split to two file ids, we have 6 file
|
||||
// ids rather than 5:
|
||||
// Verify that the macro arg expansion is split to two file ids, we have 7 file
|
||||
// ids rather than 6:
|
||||
// 0: invalid file id
|
||||
// 1: main file
|
||||
// 2: builtin file
|
||||
// 3: macro expansion for X
|
||||
// 4: macro arg expansions for 1
|
||||
// 5: macro arg expansions for == 2
|
||||
// 3: scratch space for __GCC_[CON|DE]STRUCTIVE_SIZE macros
|
||||
// 4: macro expansion for X
|
||||
// 5: macro arg expansions for 1
|
||||
// 6: macro arg expansions for == 2
|
||||
#define X(x) (int)(x);
|
||||
void func() {
|
||||
X(1
|
||||
|
||||
17
clang/test/Preprocessor/hardware_interference.cpp
Normal file
17
clang/test/Preprocessor/hardware_interference.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
// RUN: %clang_cc1 -E -dM -D__GCC_CONSTRUCTIVE_SIZE=1000 -D__GCC_DESTRUCTIVE_SIZE=1001 %s -verify -Weverything | FileCheck %s
|
||||
// RUN: %clang_cc1 -D__GCC_CONSTRUCTIVE_SIZE=1000 -D__GCC_DESTRUCTIVE_SIZE=1001 %s -verify -Weverything
|
||||
// RUN: %clang_cc1 -E -dM -U__GCC_CONSTRUCTIVE_SIZE -U__GCC_DESTRUCTIVE_SIZE %s -verify -Weverything | FileCheck --check-prefix DISABLED %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
// Validate that we can set a new value on the command line without issuing any
|
||||
// diagnostics and that we can disabled the macro on the command line without
|
||||
// issuing any diagnostics.
|
||||
|
||||
// CHECK: #define __GCC_CONSTRUCTIVE_SIZE 1000
|
||||
// CHECK: #define __GCC_DESTRUCTIVE_SIZE 1001
|
||||
// DISABLED-NOT: __GCC_CONSTRUCTIVE_SIZE
|
||||
// DISABLED-NOT: __GCC_DESTRUCTIVE_SIZE
|
||||
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
@@ -119,6 +119,8 @@
|
||||
// AARCH64-NEXT: #define __FP_FAST_FMA 1
|
||||
// AARCH64-NEXT: #define __FP_FAST_FMAF 1
|
||||
// AARCH64-NEXT: #define __GCC_ASM_FLAG_OUTPUTS__ 1
|
||||
// AARCH64-NEXT: #define __GCC_CONSTRUCTIVE_SIZE {{.+}}
|
||||
// AARCH64-NEXT: #define __GCC_DESTRUCTIVE_SIZE {{.+}}
|
||||
// AARCH64-NEXT: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
|
||||
// AARCH64-NEXT: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1
|
||||
// AARCH64-NEXT: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
|
||||
@@ -220,11 +222,11 @@
|
||||
// AARCH64-NEXT: #define __LONG_MAX__ 9223372036854775807L
|
||||
// AARCH64-NEXT: #define __LONG_WIDTH__ 64
|
||||
// AARCH64-NEXT: #define __LP64__ 1
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// AARCH64-NEXT: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// AARCH64-NEXT: #define __NO_INLINE__ 1
|
||||
// AARCH64-NEXT: #define __NO_MATH_ERRNO__ 1
|
||||
// AARCH64-NEXT: #define __OBJC_BOOL_IS_BOOL 0
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
// RUN: %clang_cc1 -E -dM < /dev/null | FileCheck -match-full-lines -check-prefix INTERFERENCE %s
|
||||
//
|
||||
// We purposefully do not test the values produced, only that the macros are
|
||||
// predefined to some value.
|
||||
// INTERFERENCE:#define __GCC_CONSTRUCTIVE_SIZE {{.+}}
|
||||
// INTERFERENCE:#define __GCC_DESTRUCTIVE_SIZE {{.+}}
|
||||
|
||||
// RUN: %clang_cc1 -E -dM -x assembler-with-cpp < /dev/null | FileCheck -match-full-lines -check-prefix ASM %s
|
||||
//
|
||||
// ASM:#define __ASSEMBLER__ 1
|
||||
@@ -1697,6 +1704,8 @@
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_CONSTRUCTIVE_SIZE {{.+}}
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_DESTRUCTIVE_SIZE {{.+}}
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
|
||||
// WEBASSEMBLY-NEXT:#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
|
||||
@@ -1806,11 +1815,11 @@
|
||||
// WEBASSEMBLY64-NEXT:#define __LONG_MAX__ 9223372036854775807L
|
||||
// WEBASSEMBLY64-NEXT:#define __LONG_WIDTH__ 64
|
||||
// WEBASSEMBLY64-NEXT:#define __LP64__ 1
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_DEVICE 1
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_SINGLE 4
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_SYSTEM 0
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_WRKGRP 2
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_WVFRNT 3
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_DEVICE 1
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_SINGLE 4
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_SYSTEM 0
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_WRKGRP 2
|
||||
// WEBASSEMBLY-NEXT:#define __MEMORY_SCOPE_WVFRNT 3
|
||||
// WEBASSEMBLY-NEXT:#define __NO_INLINE__ 1
|
||||
// WEBASSEMBLY-NEXT:#define __NO_MATH_ERRNO__ 1
|
||||
// WEBASSEMBLY-NEXT:#define __OBJC_BOOL_IS_BOOL 0
|
||||
@@ -2126,11 +2135,11 @@
|
||||
// AVR:#define __LDBL_MIN__ 1.17549435e-38L
|
||||
// AVR:#define __LONG_LONG_MAX__ 9223372036854775807LL
|
||||
// AVR:#define __LONG_MAX__ 2147483647L
|
||||
// AVR:#define __MEMORY_SCOPE_DEVICE 1
|
||||
// AVR:#define __MEMORY_SCOPE_SINGLE 4
|
||||
// AVR:#define __MEMORY_SCOPE_SYSTEM 0
|
||||
// AVR:#define __MEMORY_SCOPE_WRKGRP 2
|
||||
// AVR:#define __MEMORY_SCOPE_WVFRNT 3
|
||||
// AVR:#define __MEMORY_SCOPE_DEVICE 1
|
||||
// AVR:#define __MEMORY_SCOPE_SINGLE 4
|
||||
// AVR:#define __MEMORY_SCOPE_SYSTEM 0
|
||||
// AVR:#define __MEMORY_SCOPE_WRKGRP 2
|
||||
// AVR:#define __MEMORY_SCOPE_WVFRNT 3
|
||||
// AVR:#define __NO_INLINE__ 1
|
||||
// AVR:#define __ORDER_BIG_ENDIAN__ 4321
|
||||
// AVR:#define __ORDER_LITTLE_ENDIAN__ 1234
|
||||
@@ -2422,11 +2431,11 @@
|
||||
// RISCV32: #define __LITTLE_ENDIAN__ 1
|
||||
// RISCV32: #define __LONG_LONG_MAX__ 9223372036854775807LL
|
||||
// RISCV32: #define __LONG_MAX__ 2147483647L
|
||||
// RISCV32: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// RISCV32: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// RISCV32: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// RISCV32: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// RISCV32: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// RISCV32: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// RISCV32: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// RISCV32: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// RISCV32: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// RISCV32: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// RISCV32: #define __NO_INLINE__ 1
|
||||
// RISCV32: #define __POINTER_WIDTH__ 32
|
||||
// RISCV32: #define __PRAGMA_REDEFINE_EXTNAME 1
|
||||
@@ -2634,11 +2643,11 @@
|
||||
// RISCV64: #define __LONG_LONG_MAX__ 9223372036854775807LL
|
||||
// RISCV64: #define __LONG_MAX__ 9223372036854775807L
|
||||
// RISCV64: #define __LP64__ 1
|
||||
// RISCV64: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// RISCV64: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// RISCV64: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// RISCV64: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// RISCV64: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// RISCV64: #define __MEMORY_SCOPE_DEVICE 1
|
||||
// RISCV64: #define __MEMORY_SCOPE_SINGLE 4
|
||||
// RISCV64: #define __MEMORY_SCOPE_SYSTEM 0
|
||||
// RISCV64: #define __MEMORY_SCOPE_WRKGRP 2
|
||||
// RISCV64: #define __MEMORY_SCOPE_WVFRNT 3
|
||||
// RISCV64: #define __NO_INLINE__ 1
|
||||
// RISCV64: #define __POINTER_WIDTH__ 64
|
||||
// RISCV64: #define __PRAGMA_REDEFINE_EXTNAME 1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// RUN: %clang_cc1 %s -x c++ -E -dM -triple x86_64-pc-win32 -fms-extensions -fms-compatibility \
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++14 -o - | FileCheck -match-full-lines %s --check-prefix=CHECK-MS64
|
||||
// RUN: %clang_cc1 %s -x c++ -E -dM -triple x86_64-pc-win32 -fms-extensions -fms-compatibility \
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++14 -o - | grep GCC | count 5
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++14 -o - | grep GCC | count 7
|
||||
// CHECK-MS64: #define _INTEGRAL_MAX_BITS 64
|
||||
// CHECK-MS64: #define _ISO_VOLATILE 1
|
||||
// CHECK-MS64: #define _MSC_EXTENSIONS 1
|
||||
@@ -26,7 +26,7 @@
|
||||
// RUN: %clang_cc1 %s -x c++ -E -dM -triple i686-pc-win32 -fms-extensions -fms-compatibility \
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++17 -o - | FileCheck -match-full-lines %s --check-prefix=CHECK-MS
|
||||
// RUN: %clang_cc1 %s -x c++ -E -dM -triple i686-pc-win32 -fms-extensions -fms-compatibility \
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++17 -o - | grep GCC | count 5
|
||||
// RUN: -fms-compatibility-version=19.00 -std=c++17 -o - | grep GCC | count 7
|
||||
// CHECK-MS: #define _INTEGRAL_MAX_BITS 64
|
||||
// CHECK-MS: #define _ISO_VOLATILE 1
|
||||
// CHECK-MS: #define _MSC_EXTENSIONS 1
|
||||
@@ -39,6 +39,8 @@
|
||||
// CHECK-MS-NOT: GNU
|
||||
// CHECK-MS-NOT: GXX
|
||||
// CHECK-MS: #define __GCC_ASM_FLAG_OUTPUTS__ 1
|
||||
// CHECK-MS: #define __GCC_CONSTRUCTIVE_SIZE {{.+}}
|
||||
// CHECK-MS: #define __GCC_DESTRUCTIVE_SIZE {{.+}}
|
||||
// CHECK-MS: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
|
||||
// CHECK-MS: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
|
||||
// CHECK-MS: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: c++03, c++11, c++14
|
||||
// XFAIL: (clang || apple-clang) && stdlib=libc++
|
||||
// UNSUPPORTED: (clang || apple-clang) && stdlib=libc++
|
||||
|
||||
#include <new>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user