forked from OSchip/llvm-project
[clang-cl] Expose the /volatile:{iso,ms} choice via _ISO_VOLATILE
MSVC allows interpreting volatile loads and stores, when combined with /volatile:iso, as having acquire/release semantics. MSVC also exposes a define, _ISO_VOLATILE, which allows users to enquire if this feature is enabled or disabled.
This commit is contained in:
parent
b75a3c9f31
commit
2c923b8863
|
@ -173,7 +173,6 @@ CODEGENOPT(IncrementalLinkerCompatible, 1, 0) ///< Emit an object file which can
|
|||
///< linker.
|
||||
CODEGENOPT(MergeAllConstants , 1, 1) ///< Merge identical constants.
|
||||
CODEGENOPT(MergeFunctions , 1, 0) ///< Set when -fmerge-functions is enabled.
|
||||
CODEGENOPT(MSVolatile , 1, 0) ///< Set when /volatile:ms is enabled.
|
||||
CODEGENOPT(NoCommon , 1, 0) ///< Set when -fno-common or C++ is enabled.
|
||||
CODEGENOPT(NoDwarfDirectoryAsm , 1, 0) ///< Set when -fno-dwarf-directory-asm is
|
||||
///< enabled.
|
||||
|
|
|
@ -148,6 +148,7 @@ LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation")
|
|||
LANGOPT(RTTI , 1, 1, "run-time type information")
|
||||
LANGOPT(RTTIData , 1, 1, "emit run-time type information data")
|
||||
LANGOPT(MSBitfields , 1, 0, "Microsoft-compatible structure layout")
|
||||
LANGOPT(MSVolatile , 1, 0, "Microsoft-compatible volatile loads and stores")
|
||||
LANGOPT(Freestanding, 1, 0, "freestanding implementation")
|
||||
LANGOPT(NoBuiltin , 1, 0, "disable builtin functions")
|
||||
LANGOPT(NoMathBuiltin , 1, 0, "disable math builtin functions")
|
||||
|
|
|
@ -2204,7 +2204,7 @@ defm asm_blocks : BoolFOption<"asm-blocks",
|
|||
LangOpts<"AsmBlocks">, Default<fms_extensions.KeyPath>,
|
||||
PosFlag<SetTrue, [CC1Option]>, NegFlag<SetFalse>>;
|
||||
def fms_volatile : Flag<["-"], "fms-volatile">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
MarshallingInfoFlag<CodeGenOpts<"MSVolatile">>;
|
||||
MarshallingInfoFlag<LangOpts<"MSVolatile">>;
|
||||
def fmsc_version : Joined<["-"], "fmsc-version=">, Group<f_Group>, Flags<[NoXarchOption, CoreOption]>,
|
||||
HelpText<"Microsoft compiler version number to report in _MSC_VER (0 = don't define it (default))">;
|
||||
def fms_compatibility_version
|
||||
|
|
|
@ -263,6 +263,9 @@ static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder) {
|
|||
}
|
||||
}
|
||||
|
||||
if (!Opts.MSVolatile)
|
||||
Builder.defineMacro("_ISO_VOLATILE");
|
||||
|
||||
if (Opts.Kernel)
|
||||
Builder.defineMacro("_KERNEL_MODE");
|
||||
|
||||
|
|
|
@ -1594,7 +1594,7 @@ llvm::Value *AtomicInfo::EmitAtomicLoadOp(llvm::AtomicOrdering AO,
|
|||
/// we are operating under /volatile:ms *and* the LValue itself is volatile and
|
||||
/// performing such an operation can be performed without a libcall.
|
||||
bool CodeGenFunction::LValueIsSuitableForInlineAtomic(LValue LV) {
|
||||
if (!CGM.getCodeGenOpts().MSVolatile) return false;
|
||||
if (!CGM.getLangOpts().MSVolatile) return false;
|
||||
AtomicInfo AI(*this, LV);
|
||||
bool IsVolatile = LV.isVolatile() || hasVolatileMember(LV.getType());
|
||||
// An atomic is inline if we don't need to use a libcall.
|
||||
|
|
|
@ -5,6 +5,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 - | grep GCC | count 5
|
||||
// CHECK-MS64: #define _INTEGRAL_MAX_BITS 64
|
||||
// CHECK-MS64: #define _ISO_VOLATILE 1
|
||||
// CHECK-MS64: #define _MSC_EXTENSIONS 1
|
||||
// CHECK-MS64: #define _MSC_VER 1900
|
||||
// CHECK-MS64: #define _MSVC_LANG 201402L
|
||||
|
@ -27,6 +28,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 - | grep GCC | count 5
|
||||
// CHECK-MS: #define _INTEGRAL_MAX_BITS 64
|
||||
// CHECK-MS: #define _ISO_VOLATILE 1
|
||||
// CHECK-MS: #define _MSC_EXTENSIONS 1
|
||||
// CHECK-MS: #define _MSC_VER 1900
|
||||
// CHECK-MS: #define _MSVC_LANG 201703L
|
||||
|
|
Loading…
Reference in New Issue