[PATCH] D124836: [AArch64] Add support for -fzero-call-used-regs
void updated this revision to Diff 427909. void added a comment. - Support SVE registers. - Initial feature to gather argument registers from the *CallingConv.td files. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124836/new/ https://reviews.llvm.org/D124836 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp llvm/lib/Target/AArch64/AArch64FrameLowering.cpp llvm/lib/Target/AArch64/AArch64FrameLowering.h llvm/lib/Target/AArch64/AArch64RegisterInfo.td llvm/lib/Target/X86/X86RegisterInfo.cpp llvm/test/CodeGen/AArch64/zero-call-used-regs.ll llvm/utils/TableGen/CallingConvEmitter.cpp llvm/utils/TableGen/RegisterInfoEmitter.cpp Index: llvm/utils/TableGen/RegisterInfoEmitter.cpp === --- llvm/utils/TableGen/RegisterInfoEmitter.cpp +++ llvm/utils/TableGen/RegisterInfoEmitter.cpp @@ -1188,6 +1188,8 @@ << "MCRegister) const override;\n" << " bool isFixedRegister(const MachineFunction &, " << "MCRegister) const override;\n" + << " bool isArgumentRegister(const MachineFunction &, " + << "MCRegister) const override;\n" << " /// Devirtualized TargetFrameLowering.\n" << " static const " << TargetName << "FrameLowering *getFrameLowering(\n" << " const MachineFunction &MF);\n" @@ -1662,6 +1664,20 @@ OS << " false;\n"; OS << "}\n\n"; + OS << "bool " << ClassName << "::\n" + << "isArgumentRegister(const MachineFunction &MF, " + << "MCRegister PhysReg) const {\n" + << " return\n"; + for (const CodeGenRegisterCategory &Category : RegCategories) +if (Category.getName() == "ArgumentRegisters") { + for (const CodeGenRegisterClass *RC : Category.getClasses()) +OS << " " << RC->getQualifiedName() + << "RegClass.contains(PhysReg) ||\n"; + break; +} + OS << " false;\n"; + OS << "}\n\n"; + OS << "ArrayRef " << ClassName << "::getRegMaskNames() const {\n"; if (!CSRSets.empty()) { Index: llvm/utils/TableGen/CallingConvEmitter.cpp === --- llvm/utils/TableGen/CallingConvEmitter.cpp +++ llvm/utils/TableGen/CallingConvEmitter.cpp @@ -20,6 +20,13 @@ namespace { class CallingConvEmitter { RecordKeeper &Records; + unsigned Counter; + std::string CurrentAction; + bool SwiftAction; + + std::map> AssignedRegsMap; + std::map> AssignedSwiftRegsMap; + std::map> DelegateToMap; public: explicit CallingConvEmitter(RecordKeeper &R) : Records(R) {} @@ -28,7 +35,7 @@ private: void EmitCallingConv(Record *CC, raw_ostream &O); void EmitAction(Record *Action, unsigned Indent, raw_ostream &O); - unsigned Counter; + void EmitArgRegisterLists(raw_ostream &O); }; } // End anonymous namespace @@ -58,18 +65,23 @@ // Emit each non-custom calling convention description in full. Records.startTimer("Emit full descriptions"); for (Record *CC : CCs) { -if (!CC->getValueAsBit("Custom")) +if (!CC->getValueAsBit("Custom")) { + // Call upon the creation of a map entry from the void! + CurrentAction = CC->getName().str(); + (void)AssignedRegsMap[CurrentAction]; EmitCallingConv(CC, O); +} } -} + EmitArgRegisterLists(O); +} void CallingConvEmitter::EmitCallingConv(Record *CC, raw_ostream &O) { ListInit *CCActions = CC->getValueAsListInit("Actions"); Counter = 0; O << "\n\n"; - unsigned Pad = CC->getName().size(); + unsigned Pad = CurrentAction.size(); if (CC->getValueAsBit("Entry")) { O << "bool llvm::"; Pad += 12; @@ -77,13 +89,21 @@ O << "static bool "; Pad += 13; } - O << CC->getName() << "(unsigned ValNo, MVT ValVT,\n" + O << CurrentAction << "(unsigned ValNo, MVT ValVT,\n" << std::string(Pad, ' ') << "MVT LocVT, CCValAssign::LocInfo LocInfo,\n" << std::string(Pad, ' ') << "ISD::ArgFlagsTy ArgFlags, CCState &State) {\n"; // Emit all of the actions, in order. for (unsigned i = 0, e = CCActions->size(); i != e; ++i) { +Record *Action = CCActions->getElementAsRecord(i); +SwiftAction = +llvm::any_of(Action->getSuperClasses(), + [](const std::pair &Class) { + std::string Name = Class.first->getNameInitAsString(); + return StringRef(Name).startswith("CCIfSwift"); + }); + O << "\n"; -EmitAction(CCActions->getElementAsRecord(i), 2, O); +EmitAction(Action, 2, O); } O << "\n return true; // CC didn't match.\n"; @@ -93,7 +113,7 @@ void CallingConvEmitter::EmitAction(Record *Action, unsigned Indent, raw_ostream &O) { std::string IndentStr = std::string(Indent, ' '); - + if (Action->isSubClassOf("CCPredicateAction")) { O << IndentStr << "if ("; @@ -121,18 +141,30 @@ O << IndentStr << "if (!" << CC->ge
[PATCH] D124688: [clangd] parse all make_unique-like functions in preamble
upsj updated this revision to Diff 427910. upsj marked 13 inline comments as done. upsj added a comment. review updates: - Pass ParseForwardingFunctions via ParseOptions - Simplify check for forwarding function - Add test checking diagnostics for make_shared Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124688/new/ https://reviews.llvm.org/D124688 Files: clang-tools-extra/clangd/ClangdServer.cpp clang-tools-extra/clangd/ClangdServer.h clang-tools-extra/clangd/Compiler.h clang-tools-extra/clangd/Preamble.cpp clang-tools-extra/clangd/tool/Check.cpp clang-tools-extra/clangd/tool/ClangdMain.cpp clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp clang-tools-extra/clangd/unittests/TestTU.cpp clang-tools-extra/clangd/unittests/TestTU.h Index: clang-tools-extra/clangd/unittests/TestTU.h === --- clang-tools-extra/clangd/unittests/TestTU.h +++ clang-tools-extra/clangd/unittests/TestTU.h @@ -81,7 +81,7 @@ // By default, build() will report Error diagnostics as GTest errors. // Suppress this behavior by adding an 'error-ok' comment to the code. // The result will always have getDiagnostics() populated. - ParsedAST build() const; + ParsedAST build(ParseOptions Opts = {}) const; std::shared_ptr preamble(PreambleParsedCallback PreambleCallback = nullptr) const; ParseInputs inputs(MockFS &FS) const; Index: clang-tools-extra/clangd/unittests/TestTU.cpp === --- clang-tools-extra/clangd/unittests/TestTU.cpp +++ clang-tools-extra/clangd/unittests/TestTU.cpp @@ -104,9 +104,10 @@ /*StoreInMemory=*/true, PreambleCallback); } -ParsedAST TestTU::build() const { +ParsedAST TestTU::build(ParseOptions Opts) const { MockFS FS; auto Inputs = inputs(FS); + Inputs.Opts = Opts; StoreDiags Diags; auto CI = buildCompilerInvocation(Inputs, Diags); assert(CI && "Failed to build compilation invocation."); Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp === --- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -402,6 +402,31 @@ "no matching constructor for initialization of 'S'"))); } +TEST(DiagnosticTest, MakeShared) { + // We usually miss diagnostics from header functions as we don't parse them. + // std::make_shared is an exception. + Annotations Main(R"cpp( +struct S { S(char*); }; +auto x = std::[[make_shared]](42); // error-ok + )cpp"); + TestTU TU = TestTU::withCode(Main.code()); + TU.HeaderCode = R"cpp( +namespace std { +// These mocks aren't quite right - we omit shared_ptr for simplicity. +// forward is included to show its body is not needed to get the diagnostic. +template T&& forward(T& t) { return static_cast(t); } +template T* make_shared(A&&... args) { + return new T(std::forward(args)...); +} +} + )cpp"; + EXPECT_THAT( + *TU.build({/*PreambleParseForwardingFunctions=*/true}).getDiagnostics(), + UnorderedElementsAre(Diag( + Main.range(), "in template: " +"no matching constructor for initialization of 'S'"))); +} + TEST(DiagnosticTest, NoMultipleDiagnosticInFlight) { Annotations Main(R"cpp( template struct Foo { Index: clang-tools-extra/clangd/tool/ClangdMain.cpp === --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -498,6 +498,14 @@ Hidden, init(ClangdServer::Options().UseDirtyHeaders)}; +opt PreambleParseForwardingFunctions{ +"parse-forwarding-functions", +cat(Misc), +desc("Parse all emplace-like functions in included headers"), +Hidden, +init(ParseOptions().PreambleParseForwardingFunctions), +}; + #if defined(__GLIBC__) && CLANGD_MALLOC_TRIM opt EnableMallocTrim{ "malloc-trim", @@ -935,6 +943,7 @@ Opts.ClangTidyProvider = ClangTidyOptProvider; } Opts.UseDirtyHeaders = UseDirtyHeaders; + Opts.PreambleParseForwardingFunctions = PreambleParseForwardingFunctions; Opts.QueryDriverGlobs = std::move(QueryDriverGlobs); Opts.TweakFilter = [&](const Tweak &T) { if (T.hidden() && !HiddenFeatures) Index: clang-tools-extra/clangd/tool/Check.cpp === --- clang-tools-extra/clangd/tool/Check.cpp +++ clang-tools-extra/clangd/tool/Check.cpp @@ -126,6 +126,8 @@ Inputs.CompileCommand = Cmd; Inputs.TFS = &TFS; Inputs.ClangTidyProvider = Opts.ClangTidyProvider; +Inputs.Opts.PreambleParseForwardingFunctions = +Opts.PreambleParseForwardingFunctions; if (Contents.hasValue()) { Input
[PATCH] D124688: [clangd] parse all make_unique-like functions in preamble
upsj updated this revision to Diff 427911. upsj added a comment. update test docs Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124688/new/ https://reviews.llvm.org/D124688 Files: clang-tools-extra/clangd/ClangdServer.cpp clang-tools-extra/clangd/ClangdServer.h clang-tools-extra/clangd/Compiler.h clang-tools-extra/clangd/Preamble.cpp clang-tools-extra/clangd/tool/Check.cpp clang-tools-extra/clangd/tool/ClangdMain.cpp clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp clang-tools-extra/clangd/unittests/TestTU.cpp clang-tools-extra/clangd/unittests/TestTU.h Index: clang-tools-extra/clangd/unittests/TestTU.h === --- clang-tools-extra/clangd/unittests/TestTU.h +++ clang-tools-extra/clangd/unittests/TestTU.h @@ -81,7 +81,7 @@ // By default, build() will report Error diagnostics as GTest errors. // Suppress this behavior by adding an 'error-ok' comment to the code. // The result will always have getDiagnostics() populated. - ParsedAST build() const; + ParsedAST build(ParseOptions Opts = {}) const; std::shared_ptr preamble(PreambleParsedCallback PreambleCallback = nullptr) const; ParseInputs inputs(MockFS &FS) const; Index: clang-tools-extra/clangd/unittests/TestTU.cpp === --- clang-tools-extra/clangd/unittests/TestTU.cpp +++ clang-tools-extra/clangd/unittests/TestTU.cpp @@ -104,9 +104,10 @@ /*StoreInMemory=*/true, PreambleCallback); } -ParsedAST TestTU::build() const { +ParsedAST TestTU::build(ParseOptions Opts) const { MockFS FS; auto Inputs = inputs(FS); + Inputs.Opts = Opts; StoreDiags Diags; auto CI = buildCompilerInvocation(Inputs, Diags); assert(CI && "Failed to build compilation invocation."); Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp === --- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -402,6 +402,31 @@ "no matching constructor for initialization of 'S'"))); } +TEST(DiagnosticTest, MakeShared) { + // We usually miss diagnostics from header functions as we don't parse them. + // std::make_shared is only parsed when --parse-forwarding-functions is set + Annotations Main(R"cpp( +struct S { S(char*); }; +auto x = std::[[make_shared]](42); // error-ok + )cpp"); + TestTU TU = TestTU::withCode(Main.code()); + TU.HeaderCode = R"cpp( +namespace std { +// These mocks aren't quite right - we omit shared_ptr for simplicity. +// forward is included to show its body is not needed to get the diagnostic. +template T&& forward(T& t) { return static_cast(t); } +template T* make_shared(A&&... args) { + return new T(std::forward(args)...); +} +} + )cpp"; + EXPECT_THAT( + *TU.build({/*PreambleParseForwardingFunctions=*/true}).getDiagnostics(), + UnorderedElementsAre(Diag( + Main.range(), "in template: " +"no matching constructor for initialization of 'S'"))); +} + TEST(DiagnosticTest, NoMultipleDiagnosticInFlight) { Annotations Main(R"cpp( template struct Foo { Index: clang-tools-extra/clangd/tool/ClangdMain.cpp === --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -498,6 +498,14 @@ Hidden, init(ClangdServer::Options().UseDirtyHeaders)}; +opt PreambleParseForwardingFunctions{ +"parse-forwarding-functions", +cat(Misc), +desc("Parse all emplace-like functions in included headers"), +Hidden, +init(ParseOptions().PreambleParseForwardingFunctions), +}; + #if defined(__GLIBC__) && CLANGD_MALLOC_TRIM opt EnableMallocTrim{ "malloc-trim", @@ -935,6 +943,7 @@ Opts.ClangTidyProvider = ClangTidyOptProvider; } Opts.UseDirtyHeaders = UseDirtyHeaders; + Opts.PreambleParseForwardingFunctions = PreambleParseForwardingFunctions; Opts.QueryDriverGlobs = std::move(QueryDriverGlobs); Opts.TweakFilter = [&](const Tweak &T) { if (T.hidden() && !HiddenFeatures) Index: clang-tools-extra/clangd/tool/Check.cpp === --- clang-tools-extra/clangd/tool/Check.cpp +++ clang-tools-extra/clangd/tool/Check.cpp @@ -126,6 +126,8 @@ Inputs.CompileCommand = Cmd; Inputs.TFS = &TFS; Inputs.ClangTidyProvider = Opts.ClangTidyProvider; +Inputs.Opts.PreambleParseForwardingFunctions = +Opts.PreambleParseForwardingFunctions; if (Contents.hasValue()) { Inputs.Contents = *Contents; log("Imaginary source file contents:\n{0}", Inputs.Contents); Index: clang-tools-extra/clangd/Preamble.cpp =
[clang] f2b1648 - [X86] Fix some signedness errors in x86 headers
Author: Simon Pilgrim Date: 2022-05-08T09:42:58+01:00 New Revision: f2b16488129ef408e89c900f61dc53b1a6699c45 URL: https://github.com/llvm/llvm-project/commit/f2b16488129ef408e89c900f61dc53b1a6699c45 DIFF: https://github.com/llvm/llvm-project/commit/f2b16488129ef408e89c900f61dc53b1a6699c45.diff LOG: [X86] Fix some signedness errors in x86 headers Another step toward enabling full -Wsystem-headers testing across all x86 headers Fix a number of cases where the arg / return value signedness doesn't match the C/C++ intrinsic. So far I've just added explicit casts as necessary, but we might want to address some of the mismatches directly Differential Revision: https://reviews.llvm.org/D125164 Added: Modified: clang/lib/Headers/avx512bwintrin.h clang/lib/Headers/avx512fintrin.h clang/lib/Headers/avx512vlbf16intrin.h clang/lib/Headers/avx512vlbwintrin.h clang/lib/Headers/avx512vlintrin.h clang/lib/Headers/bmiintrin.h clang/lib/Headers/cetintrin.h clang/lib/Headers/ia32intrin.h clang/lib/Headers/immintrin.h clang/lib/Headers/rdseedintrin.h clang/lib/Headers/rtmintrin.h clang/test/Headers/x86-intrinsics-headers-clean.cpp Removed: diff --git a/clang/lib/Headers/avx512bwintrin.h b/clang/lib/Headers/avx512bwintrin.h index c99ef9e3bd542..aaeb9364801c6 100644 --- a/clang/lib/Headers/avx512bwintrin.h +++ b/clang/lib/Headers/avx512bwintrin.h @@ -1506,7 +1506,7 @@ _mm512_maskz_sll_epi16(__mmask32 __U, __m512i __A, __m128i __B) static __inline__ __m512i __DEFAULT_FN_ATTRS512 _mm512_slli_epi16(__m512i __A, unsigned int __B) { - return (__m512i)__builtin_ia32_psllwi512((__v32hi)__A, __B); + return (__m512i)__builtin_ia32_psllwi512((__v32hi)__A, (int)__B); } static __inline__ __m512i __DEFAULT_FN_ATTRS512 @@ -1598,7 +1598,7 @@ _mm512_maskz_sra_epi16(__mmask32 __U, __m512i __A, __m128i __B) static __inline__ __m512i __DEFAULT_FN_ATTRS512 _mm512_srai_epi16(__m512i __A, unsigned int __B) { - return (__m512i)__builtin_ia32_psrawi512((__v32hi)__A, __B); + return (__m512i)__builtin_ia32_psrawi512((__v32hi)__A, (int)__B); } static __inline__ __m512i __DEFAULT_FN_ATTRS512 @@ -1643,7 +1643,7 @@ _mm512_maskz_srl_epi16(__mmask32 __U, __m512i __A, __m128i __B) static __inline__ __m512i __DEFAULT_FN_ATTRS512 _mm512_srli_epi16(__m512i __A, unsigned int __B) { - return (__m512i)__builtin_ia32_psrlwi512((__v32hi)__A, __B); + return (__m512i)__builtin_ia32_psrlwi512((__v32hi)__A, (int)__B); } static __inline__ __m512i __DEFAULT_FN_ATTRS512 @@ -1659,7 +1659,7 @@ static __inline__ __m512i __DEFAULT_FN_ATTRS512 _mm512_maskz_srli_epi16(__mmask32 __U, __m512i __A, int __B) { return (__m512i)__builtin_ia32_selectw_512((__mmask32)__U, - (__v32hi)_mm512_srli_epi16(__A, __B), + (__v32hi)_mm512_srli_epi16(__A, (unsigned int)__B), (__v32hi)_mm512_setzero_si512()); } diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index c7f3c96106076..dd9e5aa99939d 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -1780,7 +1780,7 @@ _mm512_floor_ps(__m512 __A) { return (__m512) __builtin_ia32_rndscaleps_mask ((__v16sf) __A, _MM_FROUND_FLOOR, - (__v16sf) __A, -1, + (__v16sf) __A, (unsigned short)-1, _MM_FROUND_CUR_DIRECTION); } @@ -1798,7 +1798,7 @@ _mm512_floor_pd(__m512d __A) { return (__m512d) __builtin_ia32_rndscalepd_mask ((__v8df) __A, _MM_FROUND_FLOOR, - (__v8df) __A, -1, + (__v8df) __A, (unsigned char)-1, _MM_FROUND_CUR_DIRECTION); } @@ -1825,7 +1825,7 @@ _mm512_ceil_ps(__m512 __A) { return (__m512) __builtin_ia32_rndscaleps_mask ((__v16sf) __A, _MM_FROUND_CEIL, - (__v16sf) __A, -1, + (__v16sf) __A, (unsigned short)-1, _MM_FROUND_CUR_DIRECTION); } @@ -1834,7 +1834,7 @@ _mm512_ceil_pd(__m512d __A) { return (__m512d) __builtin_ia32_rndscalepd_mask ((__v8df) __A, _MM_FROUND_CEIL, - (__v8df) __A, -1, + (__v8df) __A, (unsigned char)-1, _MM_FROUND_CUR_DIRECTI
[PATCH] D125164: [X86] Fix some signedness errors in x86 headers
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGf2b16488129e: [X86] Fix some signedness errors in x86 headers (authored by RKSimon). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125164/new/ https://reviews.llvm.org/D125164 Files: clang/lib/Headers/avx512bwintrin.h clang/lib/Headers/avx512fintrin.h clang/lib/Headers/avx512vlbf16intrin.h clang/lib/Headers/avx512vlbwintrin.h clang/lib/Headers/avx512vlintrin.h clang/lib/Headers/bmiintrin.h clang/lib/Headers/cetintrin.h clang/lib/Headers/ia32intrin.h clang/lib/Headers/immintrin.h clang/lib/Headers/rdseedintrin.h clang/lib/Headers/rtmintrin.h clang/test/Headers/x86-intrinsics-headers-clean.cpp Index: clang/test/Headers/x86-intrinsics-headers-clean.cpp === --- clang/test/Headers/x86-intrinsics-headers-clean.cpp +++ clang/test/Headers/x86-intrinsics-headers-clean.cpp @@ -1,11 +1,11 @@ // Make sure the intrinsic headers compile cleanly with no warnings or errors. // RUN: %clang_cc1 -ffreestanding -triple i386-unknown-unknown \ -// RUN:-Werror -Wsystem-headers -Wcast-qual \ +// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual \ // RUN:-fsyntax-only -flax-vector-conversions=none -x c++ -verify %s // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown \ -// RUN:-Werror -Wsystem-headers -Wcast-qual \ +// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual \ // RUN:-fsyntax-only -flax-vector-conversions=none -x c++ -verify %s // expected-no-diagnostics Index: clang/lib/Headers/rtmintrin.h === --- clang/lib/Headers/rtmintrin.h +++ clang/lib/Headers/rtmintrin.h @@ -29,7 +29,7 @@ static __inline__ unsigned int __DEFAULT_FN_ATTRS _xbegin(void) { - return __builtin_ia32_xbegin(); + return (unsigned int)__builtin_ia32_xbegin(); } static __inline__ void __DEFAULT_FN_ATTRS Index: clang/lib/Headers/rdseedintrin.h === --- clang/lib/Headers/rdseedintrin.h +++ clang/lib/Headers/rdseedintrin.h @@ -20,20 +20,20 @@ static __inline__ int __DEFAULT_FN_ATTRS _rdseed16_step(unsigned short *__p) { - return __builtin_ia32_rdseed16_step(__p); + return (int) __builtin_ia32_rdseed16_step(__p); } static __inline__ int __DEFAULT_FN_ATTRS _rdseed32_step(unsigned int *__p) { - return __builtin_ia32_rdseed32_step(__p); + return (int) __builtin_ia32_rdseed32_step(__p); } #ifdef __x86_64__ static __inline__ int __DEFAULT_FN_ATTRS _rdseed64_step(unsigned long long *__p) { - return __builtin_ia32_rdseed64_step(__p); + return (int) __builtin_ia32_rdseed64_step(__p); } #endif Index: clang/lib/Headers/immintrin.h === --- clang/lib/Headers/immintrin.h +++ clang/lib/Headers/immintrin.h @@ -276,20 +276,20 @@ static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) _rdrand16_step(unsigned short *__p) { - return __builtin_ia32_rdrand16_step(__p); + return (int)__builtin_ia32_rdrand16_step(__p); } static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) _rdrand32_step(unsigned int *__p) { - return __builtin_ia32_rdrand32_step(__p); + return (int)__builtin_ia32_rdrand32_step(__p); } #ifdef __x86_64__ static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) _rdrand64_step(unsigned long long *__p) { - return __builtin_ia32_rdrand64_step(__p); + return (int)__builtin_ia32_rdrand64_step(__p); } #endif #endif /* __RDRND__ */ @@ -360,50 +360,50 @@ static __inline__ short __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) _loadbe_i16(void const * __P) { struct __loadu_i16 { -short __v; +unsigned short __v; } __attribute__((__packed__, __may_alias__)); - return __builtin_bswap16(((const struct __loadu_i16*)__P)->__v); + return (short)__builtin_bswap16(((const struct __loadu_i16*)__P)->__v); } static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) _storebe_i16(void * __P, short __D) { struct __storeu_i16 { -short __v; +unsigned short __v; } __attribute__((__packed__, __may_alias__)); - ((struct __storeu_i16*)__P)->__v = __builtin_bswap16(__D); + ((struct __storeu_i16*)__P)->__v = __builtin_bswap16((unsigned short)__D); } static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) _loadbe_i32(void const * __P) { struct __loadu_i32 { -int __v; +unsigned int __v; } __attribute__((__packed__, __may_alias__)); - return __builtin_bswap32(((const struct __loadu_i32*)__P)->__v); + return (int)__builtin_bswap32(((const struc
[PATCH] D125170: [Headers][X86] Replace \operation with \verbatim
RKSimon updated this revision to Diff 427913. RKSimon edited the summary of this revision. RKSimon added a comment. Use \code{.operation} ... \endcode Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125170/new/ https://reviews.llvm.org/D125170 Files: clang/lib/Headers/avx512fintrin.h clang/lib/Headers/avx512vlvnniintrin.h clang/lib/Headers/avxvnniintrin.h clang/lib/Headers/hresetintrin.h clang/lib/Headers/keylockerintrin.h clang/lib/Headers/uintrintrin.h Index: clang/lib/Headers/uintrintrin.h === --- clang/lib/Headers/uintrintrin.h +++ clang/lib/Headers/uintrintrin.h @@ -39,9 +39,9 @@ /// /// This intrinsic corresponds to the CLUI instruction. /// -/// \operation +/// \code{.operation} /// UIF := 0 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _clui (void) { @@ -60,9 +60,9 @@ /// /// This intrinsic corresponds to the STUI instruction. /// -/// \operation +/// \code{.operation} /// UIF := 1 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _stui (void) { @@ -81,7 +81,7 @@ /// /// \returns The current value of the user interrupt flag (UIF). /// -/// \operation +/// \code{.operation} /// CF := UIF /// ZF := 0 /// AF := 0 @@ -89,7 +89,7 @@ /// PF := 0 /// SF := 0 /// dst := CF -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _testui (void) { @@ -110,7 +110,7 @@ ///Index of user-interrupt target table entry in user-interrupt target ///table. /// -/// \operation +/// \code{.operation} /// IF __a > UITTSZ /// GP (0) /// FI @@ -143,7 +143,7 @@ /// SendOrdinaryIPI(tempUPID.NV, tempUPID.NDST[15:8]) /// FI /// FI -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _senduipi (unsigned long long __a) { Index: clang/lib/Headers/keylockerintrin.h === --- clang/lib/Headers/keylockerintrin.h +++ clang/lib/Headers/keylockerintrin.h @@ -46,7 +46,7 @@ /// /// This intrinsic corresponds to the LOADIWKEY instructions. /// -/// \operation +/// \code{.operation} /// IF CPL > 0 // LOADKWKEY only allowed at ring 0 (supervisor mode) /// GP (0) /// FI @@ -91,7 +91,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _mm_loadiwkey (unsigned int __ctl, __m128i __intkey, __m128i __enkey_lo, __m128i __enkey_hi) { @@ -106,7 +106,7 @@ /// /// This intrinsic corresponds to the ENCODEKEY128 instructions. /// -/// \operation +/// \code{.operation} /// InputKey[127:0] := __key[127:0] /// KeyMetadata[2:0] := __htype[2:0] /// KeyMetadata[23:3] := 0 // Reserved for future usage @@ -126,7 +126,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned int __DEFAULT_FN_ATTRS _mm_encodekey128_u32(unsigned int __htype, __m128i __key, void *__h) { return __builtin_ia32_encodekey128_u32(__htype, (__v2di)__key, __h); @@ -141,7 +141,7 @@ /// /// This intrinsic corresponds to the ENCODEKEY256 instructions. /// -/// \operation +/// \code{.operation} /// InputKey[127:0] := __key_lo[127:0] /// InputKey[255:128] := __key_hi[255:128] /// KeyMetadata[2:0] := __htype[2:0] @@ -163,7 +163,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned int __DEFAULT_FN_ATTRS _mm_encodekey256_u32(unsigned int __htype, __m128i __key_lo, __m128i __key_hi, void *__h) { @@ -179,7 +179,7 @@ /// /// This intrinsic corresponds to the AESENC128KL instructions. /// -/// \operation +/// \code{.operation} /// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic. /// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) || ///(Handle[127:0] AND (CPL > 0)) || @@ -202,7 +202,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _mm_aesenc128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) { return __builtin_ia32_aesenc128kl_u8((__v2di *)__odata, (__v2di)__idata, __h); @@ -216,7 +216,7 @@ /// /// This intrinsic corresponds to the AESENC256KL instructions. /// -/// \operation +/// \code{.operation} /// Handle[511:0] := MEM[__h+511:__h] // Load is not guaranteed to be atomic. /// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) || ///(Handle[127:0] AND (CPL > 0)) || @@ -241,7 +241,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _mm_aesenc256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) { return __builtin_ia32_aesenc256kl_u8((__v2di *)__odata, (__v2di)__idata, __h); @@ -255,7 +255,7 @@ /// /// This intrinsic corresp
[PATCH] D125142: [clang][auto-init] Remove -enable flag for "zero" mode
kees updated this revision to Diff 427916. kees added a comment. Report flag as "unused" Adjust flags and tests to have the option warn about being unused now. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125142/new/ https://reviews.llvm.org/D125142 Files: clang/docs/ClangCommandLineReference.rst clang/include/clang/Basic/DiagnosticDriverKinds.td clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/cl-options.c clang/test/Driver/clang_f_opts.c Index: clang/test/Driver/clang_f_opts.c === --- clang/test/Driver/clang_f_opts.c +++ clang/test/Driver/clang_f_opts.c @@ -569,18 +569,18 @@ // RUN: %clang -### -S -ftrivial-auto-var-init=uninitialized %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-UNINIT %s // RUN: %clang -### -S -ftrivial-auto-var-init=pattern %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-PATTERN %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-BAD %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-UNUSED %s // CHECK-TRIVIAL-UNINIT-NOT: hasn't been enabled // CHECK-TRIVIAL-PATTERN-NOT: hasn't been enabled -// CHECK-TRIVIAL-ZERO-GOOD-NOT: hasn't been enabled -// CHECK-TRIVIAL-ZERO-BAD: hasn't been enabled +// CHECK-TRIVIAL-ZERO-NOT: hasn't been enabled +// CHECK-TRIVIAL-ZERO-UNUSED: argument unused during compilation // RUN: %clang -### -S -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=1 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-PATTERN-STOP-AFTER %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -ftrivial-auto-var-init-stop-after=1 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-STOP-AFTER %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=1 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-STOP-AFTER %s // RUN: %clang -### -S -ftrivial-auto-var-init-stop-after=0 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-STOP-AFTER-MISSING-DEPENDENCY %s // RUN: %clang -### -S -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=0 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-PATTERN-STOP-AFTER-INVALID-VALUE %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -ftrivial-auto-var-init-stop-after=0 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-STOP-AFTER-INVALID-VALUE %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=0 %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-STOP-AFTER-INVALID-VALUE %s // CHECK-TRIVIAL-PATTERN-STOP-AFTER-NOT: is used without '-ftrivial-auto-var-init' // CHECK-TRIVIAL-PATTERN-STOP-AFTER-NOT: only accepts positive integers // CHECK-TRIVIAL-ZERO-STOP-AFTER-NOT: is used without '-ftrivial-auto-var-init' Index: clang/test/Driver/cl-options.c === --- clang/test/Driver/cl-options.c +++ clang/test/Driver/cl-options.c @@ -734,7 +734,6 @@ // RUN: -fimplicit-modules \ // RUN: -fno-implicit-modules \ // RUN: -ftrivial-auto-var-init=zero \ -// RUN: -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang \ // RUN: --version \ // RUN: -Werror /Zs -- %s 2>&1 Index: clang/lib/Driver/ToolChains/Clang.cpp === --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -3411,8 +3411,6 @@ } if (!TrivialAutoVarInit.empty()) { -if (TrivialAutoVarInit == "zero" && !Args.hasArg(options::OPT_enable_trivial_var_init_zero)) - D.Diag(diag::err_drv_trivial_auto_var_init_zero_disabled); CmdArgs.push_back( Args.MakeArgString("-ftrivial-auto-var-init=" + TrivialAutoVarInit)); } Index: clang/include/clang/Driver/Options.td === --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -2698,8 +2698,7 @@ NormalizedValues<["Uninitialized", "Zero", "Pattern"]>, MarshallingInfoEnum, "Uninitialized">; def enable_trivial_var_init_zero : Flag<["-"], "enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang">, - Flags<[CC1Option, CoreOption, NoArgumentUnused]>, - HelpText<"Trivial automatic variable initialization to zero is o
[PATCH] D125170: [Headers][X86] Replace \operation with \code{.operation}
pengfei accepted this revision. pengfei added a comment. This revision is now accepted and ready to land. LGTM, thanks! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125170/new/ https://reviews.llvm.org/D125170 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 6b3a111 - [Headers][X86] Replace \operation with \code{.operation}
Author: Simon Pilgrim Date: 2022-05-08T10:46:26+01:00 New Revision: 6b3a111a2867ce075e70ff1fa1eac2a9e1a4156a URL: https://github.com/llvm/llvm-project/commit/6b3a111a2867ce075e70ff1fa1eac2a9e1a4156a DIFF: https://github.com/llvm/llvm-project/commit/6b3a111a2867ce075e70ff1fa1eac2a9e1a4156a.diff LOG: [Headers][X86] Replace \operation with \code{.operation} \operation ... \endoperation are not valid doxygen commands and cause issues when -Wdocumentation is enabled (Issue #35297) This patch proposes to replace them with \code{.operation} ... \endcode blocks so that the pseudo-code is correctly retained in any documentation and downstream can use the ".operation" type for its own formatting. Differential Revision: https://reviews.llvm.org/D125170 Added: Modified: clang/lib/Headers/avx512fintrin.h clang/lib/Headers/avx512vlvnniintrin.h clang/lib/Headers/avxvnniintrin.h clang/lib/Headers/hresetintrin.h clang/lib/Headers/keylockerintrin.h clang/lib/Headers/uintrintrin.h Removed: diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h index dd9e5aa99939..3a6b9543fe92 100644 --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -9601,7 +9601,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VGATHERDPD instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 @@ -9609,7 +9609,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// dst[i+63:i] := MEM[addr+63:addr] /// ENDFOR /// dst[MAX:512] := 0 -/// \endoperation +/// \endcode #define _mm512_i32logather_pd(vindex, base_addr, scale) \ _mm512_i32gather_pd(_mm512_castsi512_si256(vindex), (base_addr), (scale)) @@ -9621,7 +9621,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VGATHERDPD instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 @@ -9633,7 +9633,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// FI /// ENDFOR /// dst[MAX:512] := 0 -/// \endoperation +/// \endcode #define _mm512_mask_i32logather_pd(src, mask, vindex, base_addr, scale) \ _mm512_mask_i32gather_pd((src), (mask), _mm512_castsi512_si256(vindex), \ (base_addr), (scale)) @@ -9644,7 +9644,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VPGATHERDQ instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 @@ -9652,7 +9652,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// dst[i+63:i] := MEM[addr+63:addr] /// ENDFOR /// dst[MAX:512] := 0 -/// \endoperation +/// \endcode #define _mm512_i32logather_epi64(vindex, base_addr, scale) \ _mm512_i32gather_epi64(_mm512_castsi512_si256(vindex), (base_addr), (scale)) @@ -9663,7 +9663,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VPGATHERDQ instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 @@ -9675,7 +9675,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// FI /// ENDFOR /// dst[MAX:512] := 0 -/// \endoperation +/// \endcode #define _mm512_mask_i32logather_epi64(src, mask, vindex, base_addr, scale) \ _mm512_mask_i32gather_epi64((src), (mask), _mm512_castsi512_si256(vindex), \ (base_addr), (scale)) @@ -9686,14 +9686,14 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VSCATTERDPD instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 /// addr := base_addr + SignExtend64(vindex[m+31:m]) * ZeroExtend64(scale) * 8 /// MEM[addr+63:addr] := v1[i+63:i] /// ENDFOR -/// \endoperation +/// \endcode #define _mm512_i32loscatter_pd(base_addr, vindex, v1, scale) \ _mm512_i32scatter_pd((base_addr), _mm512_castsi512_si256(vindex), (v1), (scale)) @@ -9705,7 +9705,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VSCATTERDPD instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 /// i := j*64 /// m := j*32 @@ -9714,7 +9714,7 @@ _mm512_cvtsi512_si32(__m512i __A) { /// MEM[addr+63:addr] := a[i+63:i] /// FI /// ENDFOR -/// \endoperation +/// \endcode #define _mm512_mask_i32loscatter_pd(base_addr, mask, vindex, v1, scale) \ _mm512_mask_i32scatter_pd((base_addr), (mask), \ _mm512_castsi512_si256(vindex), (v1), (scale)) @@ -9725,14 +9725,14 @@ _mm512_cvtsi512_si32(__m512i __A) { /// /// This intrinsic corresponds to the VPSCATTERDQ instructions. /// -/// \operation +/// \code{.operation} /// FOR j := 0 to 7 ///
[PATCH] D125170: [Headers][X86] Replace \operation with \code{.operation}
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG6b3a111a2867: [Headers][X86] Replace \operation with \code{.operation} (authored by RKSimon). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125170/new/ https://reviews.llvm.org/D125170 Files: clang/lib/Headers/avx512fintrin.h clang/lib/Headers/avx512vlvnniintrin.h clang/lib/Headers/avxvnniintrin.h clang/lib/Headers/hresetintrin.h clang/lib/Headers/keylockerintrin.h clang/lib/Headers/uintrintrin.h Index: clang/lib/Headers/uintrintrin.h === --- clang/lib/Headers/uintrintrin.h +++ clang/lib/Headers/uintrintrin.h @@ -39,9 +39,9 @@ /// /// This intrinsic corresponds to the CLUI instruction. /// -/// \operation +/// \code{.operation} /// UIF := 0 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _clui (void) { @@ -60,9 +60,9 @@ /// /// This intrinsic corresponds to the STUI instruction. /// -/// \operation +/// \code{.operation} /// UIF := 1 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _stui (void) { @@ -81,7 +81,7 @@ /// /// \returns The current value of the user interrupt flag (UIF). /// -/// \operation +/// \code{.operation} /// CF := UIF /// ZF := 0 /// AF := 0 @@ -89,7 +89,7 @@ /// PF := 0 /// SF := 0 /// dst := CF -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _testui (void) { @@ -110,7 +110,7 @@ ///Index of user-interrupt target table entry in user-interrupt target ///table. /// -/// \operation +/// \code{.operation} /// IF __a > UITTSZ /// GP (0) /// FI @@ -143,7 +143,7 @@ /// SendOrdinaryIPI(tempUPID.NV, tempUPID.NDST[15:8]) /// FI /// FI -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _senduipi (unsigned long long __a) { Index: clang/lib/Headers/keylockerintrin.h === --- clang/lib/Headers/keylockerintrin.h +++ clang/lib/Headers/keylockerintrin.h @@ -46,7 +46,7 @@ /// /// This intrinsic corresponds to the LOADIWKEY instructions. /// -/// \operation +/// \code{.operation} /// IF CPL > 0 // LOADKWKEY only allowed at ring 0 (supervisor mode) /// GP (0) /// FI @@ -91,7 +91,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ void __DEFAULT_FN_ATTRS _mm_loadiwkey (unsigned int __ctl, __m128i __intkey, __m128i __enkey_lo, __m128i __enkey_hi) { @@ -106,7 +106,7 @@ /// /// This intrinsic corresponds to the ENCODEKEY128 instructions. /// -/// \operation +/// \code{.operation} /// InputKey[127:0] := __key[127:0] /// KeyMetadata[2:0] := __htype[2:0] /// KeyMetadata[23:3] := 0 // Reserved for future usage @@ -126,7 +126,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned int __DEFAULT_FN_ATTRS _mm_encodekey128_u32(unsigned int __htype, __m128i __key, void *__h) { return __builtin_ia32_encodekey128_u32(__htype, (__v2di)__key, __h); @@ -141,7 +141,7 @@ /// /// This intrinsic corresponds to the ENCODEKEY256 instructions. /// -/// \operation +/// \code{.operation} /// InputKey[127:0] := __key_lo[127:0] /// InputKey[255:128] := __key_hi[255:128] /// KeyMetadata[2:0] := __htype[2:0] @@ -163,7 +163,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned int __DEFAULT_FN_ATTRS _mm_encodekey256_u32(unsigned int __htype, __m128i __key_lo, __m128i __key_hi, void *__h) { @@ -179,7 +179,7 @@ /// /// This intrinsic corresponds to the AESENC128KL instructions. /// -/// \operation +/// \code{.operation} /// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic. /// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) || ///(Handle[127:0] AND (CPL > 0)) || @@ -202,7 +202,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _mm_aesenc128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) { return __builtin_ia32_aesenc128kl_u8((__v2di *)__odata, (__v2di)__idata, __h); @@ -216,7 +216,7 @@ /// /// This intrinsic corresponds to the AESENC256KL instructions. /// -/// \operation +/// \code{.operation} /// Handle[511:0] := MEM[__h+511:__h] // Load is not guaranteed to be atomic. /// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) || ///(Handle[127:0] AND (CPL > 0)) || @@ -241,7 +241,7 @@ /// AF := 0 /// PF := 0 /// CF := 0 -/// \endoperation +/// \endcode static __inline__ unsigned char __DEFAULT_FN_ATTRS _mm_aesenc256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) { return __builtin_ia32_aesenc256kl_u8((__
[clang] 72eb630 - [Headers][X86] Enable basic Wdocumentation testing on X86 headers
Author: Simon Pilgrim Date: 2022-05-08T10:53:28+01:00 New Revision: 72eb630207b812dced21fb820c6d65ecc2978c0a URL: https://github.com/llvm/llvm-project/commit/72eb630207b812dced21fb820c6d65ecc2978c0a DIFF: https://github.com/llvm/llvm-project/commit/72eb630207b812dced21fb820c6d65ecc2978c0a.diff LOG: [Headers][X86] Enable basic Wdocumentation testing on X86 headers First part of Issue #35297 - we want to enable Wdocumentation-pedantic as well, but need '\n' support first which Issue #55319 is addressing Added: Modified: clang/test/Headers/x86-intrinsics-headers-clean.cpp Removed: diff --git a/clang/test/Headers/x86-intrinsics-headers-clean.cpp b/clang/test/Headers/x86-intrinsics-headers-clean.cpp index b8aaa6f5c3076..9af49657a1d5f 100644 --- a/clang/test/Headers/x86-intrinsics-headers-clean.cpp +++ b/clang/test/Headers/x86-intrinsics-headers-clean.cpp @@ -1,12 +1,12 @@ // Make sure the intrinsic headers compile cleanly with no warnings or errors. // RUN: %clang_cc1 -ffreestanding -triple i386-unknown-unknown \ -// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual \ -// RUN:-fsyntax-only -flax-vector-conversions=none -x c++ -verify %s +// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual -Wdocumentation \ +// RUN:-fsyntax-only -fretain-comments-from-system-headers -flax-vector-conversions=none -x c++ -verify %s // RUN: %clang_cc1 -ffreestanding -triple x86_64-unknown-unknown \ -// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual \ -// RUN:-fsyntax-only -flax-vector-conversions=none -x c++ -verify %s +// RUN:-Wextra -Werror -Wsystem-headers -Wsign-conversion -Wcast-qual -Wdocumentation \ +// RUN:-fsyntax-only -fretain-comments-from-system-headers -flax-vector-conversions=none -x c++ -verify %s // expected-no-diagnostics ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124690: [clangd] add inlay hints for std::forward-ed parameter packs
upsj updated this revision to Diff 427928. upsj added a comment. - add test for emplace-like functions - fix RecursiveASTVisitor early exit - fix handling of skipped parameters Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124690/new/ https://reviews.llvm.org/D124690 Files: clang-tools-extra/clangd/InlayHints.cpp clang-tools-extra/clangd/unittests/InlayHintTests.cpp Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp === --- clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -170,6 +170,43 @@ )cpp"); } +TEST(ParameterHints, NoNameVariadicDeclaration) { + // No hint for anonymous variadic parameter + assertParameterHints(R"cpp( +template +void foo(Args&& ...); +void bar() { + foo(42); +} + )cpp"); +} + +TEST(ParameterHints, NoNameVariadicForwarded) { + // No hint for anonymous variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +void foo(int); +template +void bar(Args&&... args) { return foo(std::forward(args)...); } +void baz() { + bar(42); +} + )cpp"); +} + +TEST(ParameterHints, NoNameVariadicPlain) { + // No hint for anonymous variadic parameter + assertParameterHints(R"cpp( +void foo(int); +template +void bar(Args&&... args) { return foo(args...); } +void baz() { + bar(42); +} + )cpp"); +} + TEST(ParameterHints, NameInDefinition) { // Parameter name picked up from definition if necessary. assertParameterHints(R"cpp( @@ -182,6 +219,19 @@ ExpectedHint{"param: ", "param"}); } +TEST(ParameterHints, NamePartiallyInDefinition) { + // Parameter name picked up from definition if necessary. + assertParameterHints(R"cpp( +void foo(int, int b); +void bar() { + foo($param1[[42]], $param2[[42]]); +} +void foo(int a, int) {}; + )cpp", + ExpectedHint{"a: ", "param1"}, + ExpectedHint{"b: ", "param2"}); +} + TEST(ParameterHints, NameMismatch) { // Prefer name from declaration. assertParameterHints(R"cpp( @@ -254,6 +304,206 @@ ExpectedHint{"param: ", "param"}); } +TEST(ParameterHints, VariadicForwardedConstructor) { + // Name hint for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +struct S { S(int a); }; +template +T bar(Args&&... args) { return T{std::forward(args)...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlainConstructor) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +struct S { S(int a); }; +template +T bar(Args&&... args) { return T{args...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicForwardedNewConstructor) { + // Name hint for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +struct S { S(int a); }; +template +T* bar(Args&&... args) { return new T{std::forward(args)...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlainNewConstructor) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +struct S { S(int a); }; +template +T* bar(Args&&... args) { return new T{args...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicForwarded) { + // Name for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +void foo(int a); +template +void bar(Args&&... args) { return foo(std::forward(args)...); } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlain) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +void foo(int a); +template +void bar(Args&&... args) { return foo(args...); } +void baz() { + bar($param[[42]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicSplitRecursive) { + // Name f
[PATCH] D124690: [clangd] add inlay hints for std::forward-ed parameter packs
upsj updated this revision to Diff 427930. upsj added a comment. attempt to fix the patch issue Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124690/new/ https://reviews.llvm.org/D124690 Files: clang-tools-extra/clangd/InlayHints.cpp clang-tools-extra/clangd/unittests/InlayHintTests.cpp Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp === --- clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -170,6 +170,43 @@ )cpp"); } +TEST(ParameterHints, NoNameVariadicDeclaration) { + // No hint for anonymous variadic parameter + assertParameterHints(R"cpp( +template +void foo(Args&& ...); +void bar() { + foo(42); +} + )cpp"); +} + +TEST(ParameterHints, NoNameVariadicForwarded) { + // No hint for anonymous variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +void foo(int); +template +void bar(Args&&... args) { return foo(std::forward(args)...); } +void baz() { + bar(42); +} + )cpp"); +} + +TEST(ParameterHints, NoNameVariadicPlain) { + // No hint for anonymous variadic parameter + assertParameterHints(R"cpp( +void foo(int); +template +void bar(Args&&... args) { return foo(args...); } +void baz() { + bar(42); +} + )cpp"); +} + TEST(ParameterHints, NameInDefinition) { // Parameter name picked up from definition if necessary. assertParameterHints(R"cpp( @@ -182,6 +219,19 @@ ExpectedHint{"param: ", "param"}); } +TEST(ParameterHints, NamePartiallyInDefinition) { + // Parameter name picked up from definition if necessary. + assertParameterHints(R"cpp( +void foo(int, int b); +void bar() { + foo($param1[[42]], $param2[[42]]); +} +void foo(int a, int) {}; + )cpp", + ExpectedHint{"a: ", "param1"}, + ExpectedHint{"b: ", "param2"}); +} + TEST(ParameterHints, NameMismatch) { // Prefer name from declaration. assertParameterHints(R"cpp( @@ -254,6 +304,206 @@ ExpectedHint{"param: ", "param"}); } +TEST(ParameterHints, VariadicForwardedConstructor) { + // Name hint for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +struct S { S(int a); }; +template +T bar(Args&&... args) { return T{std::forward(args)...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlainConstructor) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +struct S { S(int a); }; +template +T bar(Args&&... args) { return T{args...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicForwardedNewConstructor) { + // Name hint for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +struct S { S(int a); }; +template +T* bar(Args&&... args) { return new T{std::forward(args)...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlainNewConstructor) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +struct S { S(int a); }; +template +T* bar(Args&&... args) { return new T{args...}; } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicForwarded) { + // Name for variadic parameter + // The forward prototype is not correct, but is converted into builtin anyways + assertParameterHints(R"cpp( +namespace std { template T&& forward(T&); } +void foo(int a); +template +void bar(Args&&... args) { return foo(std::forward(args)...); } +void baz() { + int b; + bar($param[[b]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicPlain) { + // Name hint for variadic parameter + assertParameterHints(R"cpp( +void foo(int a); +template +void bar(Args&&... args) { return foo(args...); } +void baz() { + bar($param[[42]]); +} + )cpp", + ExpectedHint{"a: ", "param"}); +} + +TEST(ParameterHints, VariadicSplitRecursive) { + // Name for variadic parameter + // The forward prototype is not correct, but is converte
[PATCH] D124690: [clangd] add inlay hints for std::forward-ed parameter packs
upsj added inline comments. Comment at: clang-tools-extra/clangd/InlayHints.cpp:208 +// If the parameter is part of an expanded pack and not yet resolved +if (/*isExpandedParameter(Param) && */ +ForwardedParams.find(Param) == ForwardedParams.end()) { This needs to be fixed, see `ParameterHints.VariadicPlain` vs. `ParameterHints.VariadicForwarded` if uncommented - I'd need some input from somebody with more knowledge about the AST Comment at: clang-tools-extra/clangd/InlayHints.cpp:314 +if (auto *FuncCandidate = dyn_cast_or_null(Candidate)) { + if (FuncCandidate->getNumParams() == D->getNumArgs()) { +if (MatchingDecl) { There is probably more generic functionality available for this? Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:447 +namespace std { template T&& forward(T&); } +void *operator new(unsigned long, void *); +struct S { This is not portable, but I don't have access to size_t Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124690/new/ https://reviews.llvm.org/D124690 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124690: [clangd] add inlay hints for std::forward-ed parameter packs
upsj added a comment. It seems like except for the caveats I listed before, all the obvious cases seem to work: `make_unique`, `make_shared`, `emplace_back` with exact type matches. One point that still needs some work is if the parameter needs to be converted inside one of the forwarding functions (probably just needs another `unpack` inside ForwardingParameterVisitor), as well as a way to remove duplicate parameters that come from recursive templates like `std::tuple`. One obvious way would be removing inlay hints for duplicate parameters altogether, but that may not be enough/too heuristic? Alternatively, we could inspect the template instantiation pattern. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124690/new/ https://reviews.llvm.org/D124690 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D125177: Recognize scope of thread local variables in CFGBuilder
kparzysz updated this revision to Diff 427938. kparzysz added a comment. Replace the direct storage class examination with `hasLocalStorage`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125177/new/ https://reviews.llvm.org/D125177 Files: clang/lib/Analysis/CFG.cpp clang/test/Analysis/cfg.cpp Index: clang/test/Analysis/cfg.cpp === --- clang/test/Analysis/cfg.cpp +++ clang/test/Analysis/cfg.cpp @@ -593,6 +593,63 @@ A(), B(); } +// CHECK-LABEL: int crash_with_thread_local(char *p, int *q) +// CHECK: [B7 (ENTRY)] +// CHECK-NEXT:Succs (1): B6 +// CHECK: [B1] +// CHECK-NEXT: bail: +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: return [B1.1]; +// CHECK-NEXT:Preds (2): B2 B5 +// CHECK-NEXT:Succs (1): B0 +// CHECK: [B2] +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: q +// CHECK-NEXT:3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *) +// CHECK-NEXT:4: *[B2.3] +// CHECK-NEXT:5: [B2.4] = [B2.1] +// CHECK-NEXT:Preds (2): B3 B4 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B3] +// WARNINGS-NEXT: 1: (CXXConstructExpr, struct ClassWithDtor) +// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], struct ClassWithDtor) +// CHECK-NEXT:2: thread_local ClassWithDtor a; +// CHECK-NEXT:Preds (1): B4 +// CHECK-NEXT:Succs (1): B2 +// CHECK: [B4] +// CHECK-NEXT:T: static init a +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (2): B2 B3 +// CHECK: [B5] +// CHECK-NEXT:T: goto bail; +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B6] +// CHECK-NEXT:1: p +// CHECK-NEXT:2: [B6.1] (ImplicitCastExpr, LValueToRValue, char *) +// CHECK-NEXT:3: 0 +// CHECK-NEXT:4: [B6.3] (ImplicitCastExpr, NullToPointer, char *) +// CHECK-NEXT:5: [B6.2] != [B6.4] +// CHECK-NEXT:T: if [B6.5] +// CHECK-NEXT:Preds (1): B7 +// CHECK-NEXT:Succs (2): B5 B4 +// CHECK: [B0 (EXIT)] +// CHECK-NEXT:Preds (1): B1 + +struct ClassWithDtor { + ~ClassWithDtor() {} +}; + +int crash_with_thread_local(char *p, int *q) { + if (p != 0) { +goto bail; + } + thread_local ClassWithDtor a; + *q = 0; +bail: + return 0; +} + // CHECK-LABEL: template<> int *PR18472() // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 Index: clang/lib/Analysis/CFG.cpp === --- clang/lib/Analysis/CFG.cpp +++ clang/lib/Analysis/CFG.cpp @@ -2021,6 +2021,11 @@ // Check if variable is local. switch (VD->getStorageClass()) { case SC_None: +if (VD->getTSCSpec() == ThreadStorageClassSpecifier::TSCS_thread_local) { + // TSCS_thread_local implies "static" for block scope variables. + return Scope; +} +break; case SC_Auto: case SC_Register: break; Index: clang/test/Analysis/cfg.cpp === --- clang/test/Analysis/cfg.cpp +++ clang/test/Analysis/cfg.cpp @@ -593,6 +593,63 @@ A(), B(); } +// CHECK-LABEL: int crash_with_thread_local(char *p, int *q) +// CHECK: [B7 (ENTRY)] +// CHECK-NEXT:Succs (1): B6 +// CHECK: [B1] +// CHECK-NEXT: bail: +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: return [B1.1]; +// CHECK-NEXT:Preds (2): B2 B5 +// CHECK-NEXT:Succs (1): B0 +// CHECK: [B2] +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: q +// CHECK-NEXT:3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *) +// CHECK-NEXT:4: *[B2.3] +// CHECK-NEXT:5: [B2.4] = [B2.1] +// CHECK-NEXT:Preds (2): B3 B4 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B3] +// WARNINGS-NEXT: 1: (CXXConstructExpr, struct ClassWithDtor) +// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], struct ClassWithDtor) +// CHECK-NEXT:2: thread_local ClassWithDtor a; +// CHECK-NEXT:Preds (1): B4 +// CHECK-NEXT:Succs (1): B2 +// CHECK: [B4] +// CHECK-NEXT:T: static init a +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (2): B2 B3 +// CHECK: [B5] +// CHECK-NEXT:T: goto bail; +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B6] +// CHECK-NEXT:1: p +// CHECK-NEXT:2: [B6.1] (ImplicitCastExpr, LValueToRValue, char *) +// CHECK-NEXT:3: 0 +// CHECK-NEXT:4: [B6.3] (ImplicitCastExpr, NullToPointer, char *) +// CHECK-NEXT:5: [B6.2] != [B6.4] +// CHECK-NEXT:T: if [B6.5] +// CHECK-NEXT:Preds (1): B7 +// CHECK-NEXT:Succs (2): B5 B4 +// CHECK: [B0 (EXIT)] +// CHECK-NEXT:Preds (1): B1 + +struct ClassWithDtor { + ~ClassWithDtor() {} +}; + +int crash_with_thread_local(char *p, int *q) { + if (p != 0) { +goto bail; + } + thread_local ClassWithDtor a; + *q = 0; +bail: + return 0; +} + // CHECK-LABEL: template<> int *PR18472() // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 Index: clang/lib/Analysis/CFG.cpp =
[PATCH] D125177: Recognize scope of thread local variables in CFGBuilder
kparzysz updated this revision to Diff 427939. kparzysz added a comment. Use the proper diff file this time. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125177/new/ https://reviews.llvm.org/D125177 Files: clang/lib/Analysis/CFG.cpp clang/test/Analysis/cfg.cpp Index: clang/test/Analysis/cfg.cpp === --- clang/test/Analysis/cfg.cpp +++ clang/test/Analysis/cfg.cpp @@ -593,6 +593,63 @@ A(), B(); } +// CHECK-LABEL: int crash_with_thread_local(char *p, int *q) +// CHECK: [B7 (ENTRY)] +// CHECK-NEXT:Succs (1): B6 +// CHECK: [B1] +// CHECK-NEXT: bail: +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: return [B1.1]; +// CHECK-NEXT:Preds (2): B2 B5 +// CHECK-NEXT:Succs (1): B0 +// CHECK: [B2] +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: q +// CHECK-NEXT:3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *) +// CHECK-NEXT:4: *[B2.3] +// CHECK-NEXT:5: [B2.4] = [B2.1] +// CHECK-NEXT:Preds (2): B3 B4 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B3] +// WARNINGS-NEXT: 1: (CXXConstructExpr, struct ClassWithDtor) +// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], struct ClassWithDtor) +// CHECK-NEXT:2: thread_local ClassWithDtor a; +// CHECK-NEXT:Preds (1): B4 +// CHECK-NEXT:Succs (1): B2 +// CHECK: [B4] +// CHECK-NEXT:T: static init a +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (2): B2 B3 +// CHECK: [B5] +// CHECK-NEXT:T: goto bail; +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B6] +// CHECK-NEXT:1: p +// CHECK-NEXT:2: [B6.1] (ImplicitCastExpr, LValueToRValue, char *) +// CHECK-NEXT:3: 0 +// CHECK-NEXT:4: [B6.3] (ImplicitCastExpr, NullToPointer, char *) +// CHECK-NEXT:5: [B6.2] != [B6.4] +// CHECK-NEXT:T: if [B6.5] +// CHECK-NEXT:Preds (1): B7 +// CHECK-NEXT:Succs (2): B5 B4 +// CHECK: [B0 (EXIT)] +// CHECK-NEXT:Preds (1): B1 + +struct ClassWithDtor { + ~ClassWithDtor() {} +}; + +int crash_with_thread_local(char *p, int *q) { + if (p != 0) { +goto bail; + } + thread_local ClassWithDtor a; + *q = 0; +bail: + return 0; +} + // CHECK-LABEL: template<> int *PR18472() // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 Index: clang/lib/Analysis/CFG.cpp === --- clang/lib/Analysis/CFG.cpp +++ clang/lib/Analysis/CFG.cpp @@ -2019,13 +2019,8 @@ return Scope; // Check if variable is local. - switch (VD->getStorageClass()) { - case SC_None: - case SC_Auto: - case SC_Register: -break; - default: return Scope; - } + if (!VD->hasLocalStorage()) +return Scope; if (BuildOpts.AddImplicitDtors) { if (!hasTrivialDestructor(VD) || BuildOpts.AddScopes) { Index: clang/test/Analysis/cfg.cpp === --- clang/test/Analysis/cfg.cpp +++ clang/test/Analysis/cfg.cpp @@ -593,6 +593,63 @@ A(), B(); } +// CHECK-LABEL: int crash_with_thread_local(char *p, int *q) +// CHECK: [B7 (ENTRY)] +// CHECK-NEXT:Succs (1): B6 +// CHECK: [B1] +// CHECK-NEXT: bail: +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: return [B1.1]; +// CHECK-NEXT:Preds (2): B2 B5 +// CHECK-NEXT:Succs (1): B0 +// CHECK: [B2] +// CHECK-NEXT:1: 0 +// CHECK-NEXT:2: q +// CHECK-NEXT:3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *) +// CHECK-NEXT:4: *[B2.3] +// CHECK-NEXT:5: [B2.4] = [B2.1] +// CHECK-NEXT:Preds (2): B3 B4 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B3] +// WARNINGS-NEXT: 1: (CXXConstructExpr, struct ClassWithDtor) +// ANALYZER-NEXT: 1: (CXXConstructExpr, [B3.2], struct ClassWithDtor) +// CHECK-NEXT:2: thread_local ClassWithDtor a; +// CHECK-NEXT:Preds (1): B4 +// CHECK-NEXT:Succs (1): B2 +// CHECK: [B4] +// CHECK-NEXT:T: static init a +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (2): B2 B3 +// CHECK: [B5] +// CHECK-NEXT:T: goto bail; +// CHECK-NEXT:Preds (1): B6 +// CHECK-NEXT:Succs (1): B1 +// CHECK: [B6] +// CHECK-NEXT:1: p +// CHECK-NEXT:2: [B6.1] (ImplicitCastExpr, LValueToRValue, char *) +// CHECK-NEXT:3: 0 +// CHECK-NEXT:4: [B6.3] (ImplicitCastExpr, NullToPointer, char *) +// CHECK-NEXT:5: [B6.2] != [B6.4] +// CHECK-NEXT:T: if [B6.5] +// CHECK-NEXT:Preds (1): B7 +// CHECK-NEXT:Succs (2): B5 B4 +// CHECK: [B0 (EXIT)] +// CHECK-NEXT:Preds (1): B1 + +struct ClassWithDtor { + ~ClassWithDtor() {} +}; + +int crash_with_thread_local(char *p, int *q) { + if (p != 0) { +goto bail; + } + thread_local ClassWithDtor a; + *q = 0; +bail: + return 0; +} + // CHECK-LABEL: template<> int *PR18472() // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 Index: clang/lib/Analysis/CFG.cpp ===
[PATCH] D125189: Added parameter names to signature help.
Qwinci created this revision. Herald added subscribers: usaxena95, kadircet, arphaman. Herald added a project: All. Qwinci requested review of this revision. Herald added projects: clang, clang-tools-extra. Herald added a subscriber: cfe-commits. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D125189 Files: clang-tools-extra/clangd/CodeComplete.cpp clang/include/clang/Sema/CodeCompleteConsumer.h clang/lib/Sema/CodeCompleteConsumer.cpp clang/lib/Sema/SemaCodeComplete.cpp Index: clang/lib/Sema/SemaCodeComplete.cpp === --- clang/lib/Sema/SemaCodeComplete.cpp +++ clang/lib/Sema/SemaCodeComplete.cpp @@ -3722,6 +3722,7 @@ const PrintingPolicy &Policy, const FunctionDecl *Function, const FunctionProtoType *Prototype, + FunctionProtoTypeLoc PrototypeLoc, CodeCompletionBuilder &Result, unsigned CurrentArg, unsigned Start = 0, bool InOptional = false) { @@ -3743,7 +3744,7 @@ if (!FirstParameter) Opt.AddChunk(CodeCompletionString::CK_Comma); // Optional sections are nested. - AddOverloadParameterChunks(Context, Policy, Function, Prototype, Opt, + AddOverloadParameterChunks(Context, Policy, Function, Prototype, PrototypeLoc, Opt, CurrentArg, P, /*InOptional=*/true); Result.AddOptionalChunk(Opt.TakeString()); return; @@ -3764,6 +3765,14 @@ if (Param->hasDefaultArg()) Placeholder += GetDefaultValueString(Param, Context.getSourceManager(), Context.getLangOpts()); +} else if (!PrototypeLoc.isNull()) { + if (P < PrototypeLoc.getNumParams()) { +const ParmVarDecl *Param = PrototypeLoc.getParam(P); +Placeholder = FormatFunctionParameter(Policy, Param); +if (Param->hasDefaultArg()) + Placeholder += GetDefaultValueString(Param, Context.getSourceManager(), +Context.getLangOpts()); + } } else { Placeholder = Prototype->getParamType(P).getAsString(Policy); } @@ -3912,7 +3921,7 @@ if (getKind() == CK_Aggregate) AddOverloadAggregateChunks(getAggregate(), Policy, Result, CurrentArg); else -AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, Result, +AddOverloadParameterChunks(S.getASTContext(), Policy, FDecl, Proto, getFunctionProtoTypeLoc(), Result, CurrentArg); Result.AddChunk(Braced ? CodeCompletionString::CK_RightBrace : CodeCompletionString::CK_RightParen); @@ -5991,6 +6000,42 @@ return getParamType(SemaRef, Candidates, CurrentArg); } +#include +static FunctionProtoTypeLoc GetPrototypeLoc(Expr *Fn) { + if (const auto *T = Fn->getType().getTypePtr()->getAs()) { +const auto *D = T->getDecl(); + +TypeLoc TypedefTarget = D->getTypeSourceInfo()->getTypeLoc(); +if (auto P = TypedefTarget.getAs()) { + TypedefTarget = P.getPointeeLoc(); +} +if (auto P = TypedefTarget.getAs()) { + TypedefTarget = P.getInnerLoc(); +} +if (auto F = TypedefTarget.getAs()) { + return F; +} + } + else if (const auto *DR = dyn_cast(Fn)) { +const auto *D = DR->getDecl(); +if (const auto *const VD = dyn_cast(D)) { +TypeLoc Target = VD->getTypeSourceInfo()->getTypeLoc(); + +if (auto P = Target.getAs()) { + Target = P.getPointeeLoc(); +} +if (auto P = Target.getAs()) { + Target = P.getInnerLoc(); +} +if (auto F = Target.getAs()) { + return F; +} +} + } + + return FunctionProtoTypeLoc(); +} + QualType Sema::ProduceCallSignatureHelp(Expr *Fn, ArrayRef Args, SourceLocation OpenParLoc) { Fn = unwrapParenList(Fn); @@ -6072,6 +6117,8 @@ } else { // Lastly we check whether expression's type is function pointer or // function. + + FunctionProtoTypeLoc P = GetPrototypeLoc(NakedFn); QualType T = NakedFn->getType(); if (!T->getPointeeType().isNull()) T = T->getPointeeType(); @@ -6080,8 +6127,13 @@ if (!TooManyArguments(FP->getNumParams(), ArgsWithoutDependentTypes.size(), /*PartialOverloading=*/true) || -FP->isVariadic()) - Results.push_back(ResultCandidate(FP)); +FP->isVariadic()) { + if (!P.isNull()) { +Results.push_back(ResultCandidate(P)); + } else { +Results.push_back(ResultCandidate(FP)); + } +} } else if (auto FT = T->getAs())
[PATCH] D125177: Recognize scope of thread local variables in CFGBuilder
efriedma accepted this revision. efriedma added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125177/new/ https://reviews.llvm.org/D125177 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124147: [clang][cmake] correct grammar and style inconsistency
VoltrexMaster updated this revision to Diff 427959. VoltrexMaster added a comment. Rebase and add upstream changes to fix CI. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124147/new/ https://reviews.llvm.org/D124147 Files: clang/CMakeLists.txt Index: clang/CMakeLists.txt === --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13.4) -# If we are not building as a part of LLVM, build Clang as an +# If we are not building as a part of LLVM, build Clang as a # standalone project, using LLVM as an external library: if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) project(Clang) @@ -11,7 +11,7 @@ include(GNUInstallDirs) if(CLANG_BUILT_STANDALONE) - set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to") + set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to.") set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) @@ -21,7 +21,7 @@ set (LLVM_CONFIG_FOUND 1) message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}") message(DEPRECATION "Using llvm-config to detect the LLVM installation is \ - deprecated. The installed cmake files should be used \ + deprecated. The installed CMake files should be used \ instead. CMake should be able to detect your LLVM install \ automatically, but you can also use LLVM_DIR to specify \ the path containing LLVMConfig.cmake.") @@ -65,7 +65,7 @@ if(NOT MSVC_IDE) set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS} - CACHE BOOL "Enable assertions") + CACHE BOOL "Enable assertions.") # Assertions should follow llvm-config's. mark_as_advanced(LLVM_ENABLE_ASSERTIONS) endif() @@ -75,7 +75,7 @@ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets # LLVM_CONFIG. - if (NOT LLVM_CONFIG_FOUND) + if(NOT LLVM_CONFIG_FOUND) # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config # path is removed. set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}") @@ -86,11 +86,11 @@ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}") endif() - set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include") - set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") - set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") - set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin") - set(LLVM_LIBRARY_DIR "${LIBRARY_DIR}" CACHE PATH "Path to llvm/lib") + set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include.") + set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree.") + set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree.") + set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin.") + set(LLVM_LIBRARY_DIR "${LIBRARY_DIR}" CACHE PATH "Path to llvm/lib.") find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH) @@ -110,7 +110,7 @@ option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN "Set to ON to force using an old, unsupported host toolchain." OFF) - option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF) + option(CLANG_ENABLE_BOOTSTRAP "Generate the Clang bootstrap target." OFF) option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON) include(AddLLVM) @@ -124,16 +124,16 @@ set(BUG_REPORT_URL "${LLVM_PACKAGE_BUGREPORT}" CACHE STRING "Default URL where bug reports are to be submitted.") - if (NOT DEFINED LLVM_INCLUDE_TESTS) + if(NOT DEFINED LLVM_INCLUDE_TESTS) set(LLVM_INCLUDE_TESTS ON) endif() include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}") link_directories("${LLVM_LIBRARY_DIR}") - set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) - set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) - set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) if(LLVM_INCLUDE_TESTS) find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED @@ -147,7 +147,7 @@ endif() if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) - # Note: path not really used, except for checking if lit was found + # Note: path not really used, except for checking if Lit was found. set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit) add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit) @@ -170,7 +170,7 @@ find_program(LLVM_LIT NAMES llvm-lit lit.py lit PATHS
[PATCH] D125195: [asan][ARMCXXABI] Added missing asan poison array cookie hooks.
rsundahl created this revision. rsundahl added reviewers: yln, kubamracek, rjmccall, dcoughlin, delcypher, aralisza, thetruestblue, wrotki. Herald added subscribers: pengfei, kristof.beyls. Herald added a project: All. rsundahl requested review of this revision. Herald added projects: clang, Sanitizers. Herald added subscribers: Sanitizers, cfe-commits. Hooks into the address sanitizer that support array cookie poisoning and validation were being generated for x86_64 but not for ARM. (amended) In addition to the ItaniumCXXABI array cookie of a single size_t element containing the number of elements in the allocated array, the ARMCXXABI adds a second size_t element containing the sizeof(element). This difference in cookie size created the need to override the methods ::InitializeArrayCookie() and ::readArrayCookieImpl(). Later, in support of ASAN poison array cookies, calls to __asan_poison_cxx_array_cookie() and __asan_load_cxx_array_cookie() were added to each method respectively. However, these "hooks" were only implemented for the ItaniumCXXABI. This commit adds the same functionality to the overridden ARMCXXABI methods. rdar://92765369 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D125195 Files: clang/lib/CodeGen/ItaniumCXXABI.cpp compiler-rt/lib/asan/asan_poisoning.cpp compiler-rt/test/asan/TestCases/Posix/new_array_cookie_test.cpp compiler-rt/test/asan/TestCases/Posix/new_array_cookie_uaf_test.cpp Index: compiler-rt/test/asan/TestCases/Posix/new_array_cookie_uaf_test.cpp === --- compiler-rt/test/asan/TestCases/Posix/new_array_cookie_uaf_test.cpp +++ compiler-rt/test/asan/TestCases/Posix/new_array_cookie_uaf_test.cpp @@ -3,17 +3,12 @@ // RUN: %env_asan_opts=poison_array_cookie=1 not %run %t 2>&1 | FileCheck %s --check-prefix=COOKIE // RUN: %env_asan_opts=poison_array_cookie=0 not %run %t 2>&1 | FileCheck %s --check-prefix=NO_COOKIE -// UNSUPPORTED: ios - -// Added to allow enabling of tests but needs investigation (rdar://91448627) -// XFAIL: (darwin && (arm64-target-arch || arm64e-target-arch)) - #include #include #include int dtor_counter; struct C { - int x; + size_t x; ~C() { dtor_counter++; fprintf(stderr, "DTOR %d\n", dtor_counter); @@ -22,7 +17,7 @@ __attribute__((noinline)) void Delete(C *c) { delete[] c; } __attribute__((no_sanitize_address)) void Write42ToCookie(C *c) { - long *p = reinterpret_cast(c); + size_t *p = reinterpret_cast(c); p[-1] = 42; } Index: compiler-rt/test/asan/TestCases/Posix/new_array_cookie_test.cpp === --- compiler-rt/test/asan/TestCases/Posix/new_array_cookie_test.cpp +++ compiler-rt/test/asan/TestCases/Posix/new_array_cookie_test.cpp @@ -1,18 +1,13 @@ // REQUIRES: asan-64-bits // RUN: %clangxx_asan -O3 %s -o %t -// RUN:not %run %t 2>&1 | FileCheck %s +// RUN: not %run %t 2>&1 | FileCheck %s // RUN: %env_asan_opts=poison_array_cookie=1 not %run %t 2>&1 | FileCheck %s // RUN: %env_asan_opts=poison_array_cookie=0 not %run %t 2>&1 | FileCheck %s --check-prefix=NO_COOKIE -// UNSUPPORTED: ios - -// Added to allow enabling of tests but needs investigation (rdar://91448627) -// XFAIL: (darwin && (arm64-target-arch || arm64e-target-arch)) - #include #include struct C { - int x; + size_t x; ~C() { fprintf(stderr, "\n"); exit(1); @@ -21,10 +16,10 @@ int main(int argc, char **argv) { C *buffer = new C[argc]; - buffer[-2].x = 10; + buffer[-1].x = 10; // CHECK: AddressSanitizer: heap-buffer-overflow // CHECK: in main {{.*}}new_array_cookie_test.cpp:[[@LINE-2]] -// CHECK: is located 0 bytes inside of 12-byte region +// CHECK: is located {{0 bytes inside of 12|8 bytes inside of 24}}-byte region // NO_COOKIE: delete [] buffer; } Index: compiler-rt/lib/asan/asan_poisoning.cpp === --- compiler-rt/lib/asan/asan_poisoning.cpp +++ compiler-rt/lib/asan/asan_poisoning.cpp @@ -259,6 +259,10 @@ if (!flags()->poison_array_cookie) return; uptr s = MEM_TO_SHADOW(p); *reinterpret_cast(s) = kAsanArrayCookieMagic; + // The ARM64 cookie has a second "elementSize" entry so poison it as well + #if SANITIZER_ARM64 +*(reinterpret_cast(s)-1) = kAsanArrayCookieMagic; + #endif } extern "C" SANITIZER_INTERFACE_ATTRIBUTE Index: clang/lib/CodeGen/ItaniumCXXABI.cpp === --- clang/lib/CodeGen/ItaniumCXXABI.cpp +++ clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2424,6 +2424,8 @@ QualType elementType) { assert(requiresArrayCookie(expr)); + unsigned AS = newPtr.getAddressSpace(); + // The cookie is always at the start of the buffer. Address cookie = newPtr; @@ -2435,7 +2437,20 @@ // The
[PATCH] D125088: [clangd] Add parsing for IgnoreHeaders config option
nridge added a comment. Is there a related change that explains what this setting does? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125088/new/ https://reviews.llvm.org/D125088 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124750: [MLIR] Add a utility to sort the operands of commutative ops
srishti-pm updated this revision to Diff 427964. srishti-pm added a comment. Fixing a comment typo and enhancing the commit summary even further. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124750/new/ https://reviews.llvm.org/D124750 Files: clang/docs/tools/clang-formatted-files.txt mlir/include/mlir/Transforms/CommutativityUtils.h mlir/lib/Transforms/Utils/CMakeLists.txt mlir/lib/Transforms/Utils/CommutativityUtils.cpp mlir/test/Transforms/test-commutativity-utils.mlir mlir/test/lib/Dialect/Test/TestOps.td mlir/test/lib/Transforms/CMakeLists.txt mlir/test/lib/Transforms/TestCommutativityUtils.cpp mlir/tools/mlir-opt/mlir-opt.cpp Index: mlir/tools/mlir-opt/mlir-opt.cpp === --- mlir/tools/mlir-opt/mlir-opt.cpp +++ mlir/tools/mlir-opt/mlir-opt.cpp @@ -56,6 +56,7 @@ void registerVectorizerTestPass(); namespace test { +void registerCommutativityUtils(); void registerConvertCallOpPass(); void registerInliner(); void registerMemRefBoundCheck(); @@ -146,6 +147,7 @@ registerVectorizerTestPass(); registerTosaTestQuantUtilAPIPass(); + mlir::test::registerCommutativityUtils(); mlir::test::registerConvertCallOpPass(); mlir::test::registerInliner(); mlir::test::registerMemRefBoundCheck(); Index: mlir/test/lib/Transforms/TestCommutativityUtils.cpp === --- /dev/null +++ mlir/test/lib/Transforms/TestCommutativityUtils.cpp @@ -0,0 +1,67 @@ +//===- TestCommutativityUtils.cpp - Pass to test the commutativity utility-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// +// +// This pass tests the functionality of the commutativity utility. +// +//===--===// + +#include "mlir/Transforms/CommutativityUtils.h" + +#include "TestDialect.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" + +using namespace mlir; +using namespace test; + +namespace { + +struct SmallPattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + LogicalResult matchAndRewrite(TestCommutativeOp testCommOp, +PatternRewriter &rewriter) const override { +sortCommutativeOperands(testCommOp.getOperation(), rewriter); +return success(); + } +}; + +struct LargePattern : public OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + LogicalResult matchAndRewrite(TestLargeCommutativeOp testLargeCommOp, +PatternRewriter &rewriter) const override { +sortCommutativeOperands(testLargeCommOp.getOperation(), rewriter); +return success(); + } +}; + +struct CommutativityUtils +: public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(CommutativityUtils) + + StringRef getArgument() const final { return "test-commutativity-utils"; } + StringRef getDescription() const final { +return "Test the functionality of the commutativity utility"; + } + + void runOnOperation() override { +auto func = getOperation(); +auto *context = &getContext(); + +RewritePatternSet patterns(context); +patterns.add(context); + +(void)applyPatternsAndFoldGreedily(func, std::move(patterns)); + } +}; +} // namespace + +namespace mlir { +namespace test { +void registerCommutativityUtils() { PassRegistration(); } +} // namespace test +} // namespace mlir Index: mlir/test/lib/Transforms/CMakeLists.txt === --- mlir/test/lib/Transforms/CMakeLists.txt +++ mlir/test/lib/Transforms/CMakeLists.txt @@ -1,5 +1,6 @@ # Exclude tests from libMLIR.so add_mlir_library(MLIRTestTransforms + TestCommutativityUtils.cpp TestConstantFold.cpp TestControlFlowSink.cpp TestInlining.cpp Index: mlir/test/lib/Dialect/Test/TestOps.td === --- mlir/test/lib/Dialect/Test/TestOps.td +++ mlir/test/lib/Dialect/Test/TestOps.td @@ -1101,11 +1101,21 @@ let hasFolder = 1; } +def TestAddIOp : TEST_Op<"addi"> { + let arguments = (ins I32:$op1, I32:$op2); + let results = (outs I32); +} + def TestCommutativeOp : TEST_Op<"op_commutative", [Commutative]> { let arguments = (ins I32:$op1, I32:$op2, I32:$op3, I32:$op4); let results = (outs I32); } +def TestLargeCommutativeOp : TEST_Op<"op_large_commutative", [Commutative]> { + let arguments = (ins I32:$op1, I32:$op2, I32:$op3, I32:$op4, I32:$op5, I32:$op6, I32:$op7); + let results = (outs I32); +} + def TestCommutative2Op : TEST_Op<"op_commutative2", [Commutative]> { let arguments = (ins I32:$op1, I32:$op2);
[PATCH] D124977: [NFC][Clang] Modify expect of fail test or XFAIL because CSKY align is different
zixuan-wu added a comment. Could anybody else have a review or nominate a reviewer? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124977/new/ https://reviews.llvm.org/D124977 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124500: [clang-tidy] Support expressions of literals in modernize-macro-to-enum
LegalizeAdulthood marked an inline comment as done. LegalizeAdulthood added inline comments. Comment at: clang-tools-extra/clang-tidy/modernize/IntegralLiteralExpressionMatcher.cpp:99 + + if (!Current->isLiteral() || isStringLiteral(Current->getKind()) || + !isIntegralConstant(*Current)) { aaron.ballman wrote: > aaron.ballman wrote: > > LegalizeAdulthood wrote: > > > LegalizeAdulthood wrote: > > > > aaron.ballman wrote: > > > > > LegalizeAdulthood wrote: > > > > > > aaron.ballman wrote: > > > > > > > LegalizeAdulthood wrote: > > > > > > > > aaron.ballman wrote: > > > > > > > > > LegalizeAdulthood wrote: > > > > > > > > > > aaron.ballman wrote: > > > > > > > > > > > I know this is code moved from elsewhere, but I suppose > > > > > > > > > > > we never considered the odd edge case where a user does > > > > > > > > > > > something like `"foo"[0]` as a really awful integer > > > > > > > > > > > constant. :-D > > > > > > > > > > It's always possible to write crazy contorted code and have > > > > > > > > > > a check not recognize it. I don't think it's worthwhile to > > > > > > > > > > spend time trying to handle torture cases unless we can > > > > > > > > > > find data that shows it's prevalent in real world code. > > > > > > > > > > > > > > > > > > > > If I was doing a code review and saw this: > > > > > > > > > > ``` > > > > > > > > > > enum { > > > > > > > > > > FOO = "foo"[0] > > > > > > > > > > }; > > > > > > > > > > ``` > > > > > > > > > > I'd flag that in a code review as bogus, whereas if I saw: > > > > > > > > > > ``` > > > > > > > > > > enum { > > > > > > > > > > FOO = 'f' > > > > > > > > > > }; > > > > > > > > > > ``` > > > > > > > > > > That would be acceptable, which is why character literals > > > > > > > > > > are accepted as an integral literal initializer for an enum > > > > > > > > > > in this check. > > > > > > > > > > I don't think it's worthwhile to spend time trying to > > > > > > > > > > handle torture cases unless we can find data that shows > > > > > > > > > > it's prevalent in real world code. > > > > > > > > > > > > > > > > > > I think I'm okay agreeing to that in this particular case, > > > > > > > > > but this is more to point out that writing your own parser is > > > > > > > > > a maintenance burden. Users will hit cases we've both > > > > > > > > > forgotten about here, they'll file a bug, then someone has to > > > > > > > > > deal with it. It's very hard to justify to users "we think > > > > > > > > > you write silly code" because they often have creative ways > > > > > > > > > in which their code is not actually so silly, especially when > > > > > > > > > we support "most" valid expressions. > > > > > > > > Writing your own parser is unavoidable here because we can't > > > > > > > > just assume that any old thing will be a valid initializer just > > > > > > > > by looking at the set of tokens present in the macro body. > > > > > > > > (There is a separate discussion going on about improving the > > > > > > > > preprocessor support and parsing things more deeply, but that > > > > > > > > isn't even to the point of a prototype yet.) The worst thing > > > > > > > > we can do is create "fixits" that produce invalid code. > > > > > > > > > > > > > > > > The worst that happens if your expression isn't recognized is > > > > > > > > that your macro isn't matched as a candidate for an enum. You > > > > > > > > can always make it an enum manually and join it with adjacent > > > > > > > > macros that were recognized and converted. > > > > > > > > > > > > > > > > As it stands, the check only recognizes a single literal with > > > > > > > > an optional unary operator. > > > > > > > > > > > > > > > > This change expands the check to recognize a broad range of > > > > > > > > expressions, allowing those macros to be converted to enums. I > > > > > > > > opened the issue because running modernize-macro-to-enum on the > > > > > > > > [[ https://github.com/InsightSoftwareConsortium/ITK | ITK > > > > > > > > codebase ]] showed some simple expressions involving literals > > > > > > > > that weren't recognized and converted. > > > > > > > > > > > > > > > > If an expression isn't recognized and an issue is opened, it > > > > > > > > will be an enhancement request to support a broader range of > > > > > > > > expression, not a bug that this check created invalid code. > > > > > > > > > > > > > > > > IMO, the more useful thing that's missing from the grammar is > > > > > > > > recognizing `sizeof` expressions rather than indexing string > > > > > > > > literals with an integral literal subscript. > > > > > > > > > > > > > > > > I had planned on doing another increment to recognize `sizeof` > > > > > > > > expressions. > > > > > > > > Writing your own parser is unavoidable here because we can't > > > > > > > > just assume that any old thing will be a valid initializer just > > > > > > > > by looking a
[PATCH] D124500: [clang-tidy] Support expressions of literals in modernize-macro-to-enum
LegalizeAdulthood marked 2 inline comments as done. LegalizeAdulthood added a comment. OK, so thinking about this review a little more, I propose this: - Take the check as is, but document that the initializing expressions may result in an invalid enum, particularly for C which restricts the underlying type to be `int` - Create a subsequent commit that rejects the enums where the language is C and the initializing expression is a value larger than an `int` by rejecting any macro where any integer token in the expression is larger than an `int` - Create an additional subsequent commit that not only matches the expression but also computes the value and checks it for range. How does that sound? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124500/new/ https://reviews.llvm.org/D124500 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D123924: [clang-apply-replacements] Added an option to ignore insert conflict.
Sockke added a comment. Friendly ping. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D123924/new/ https://reviews.llvm.org/D123924 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D124658: [analyzer] Canonicalize SymIntExpr so the RHS is positive when possible
tomasz-kaminski-sonarsource updated this revision to Diff 427982. tomasz-kaminski-sonarsource added a comment. Updated patch to match master after revert. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124658/new/ https://reviews.llvm.org/D124658 Files: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp clang/test/Analysis/additive-op-on-sym-int-expr.c Index: clang/test/Analysis/additive-op-on-sym-int-expr.c === --- clang/test/Analysis/additive-op-on-sym-int-expr.c +++ clang/test/Analysis/additive-op-on-sym-int-expr.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -triple=x86_64-unknown-linux -analyzer-checker=core,debug.ExprInspection -analyzer-config eagerly-assume=false -verify %s +// RUN: %clang_analyze_cc1 -triple=x86_64-unknown-linux-gnu -analyzer-checker=core,apiModeling,debug.ExprInspection -analyzer-config eagerly-assume=false -verify %s void clang_analyzer_dump(int); void clang_analyzer_dumpL(long); @@ -42,17 +42,127 @@ clang_analyzer_dumpL(l); // expected-warning-re {{(reg_${{[0-9]+}}) - 9U }} instead of + 4294967287U } +const int intMin = 1 << (sizeof(int) * 8 - 1); // INT_MIN, negation value is not representable +const long longMin = 1L << (sizeof(long) * 8 - 1); // LONG_MIN, negation value is not representable + void testMin(int i, long l) { clang_analyzer_dump(i + (-1)); // expected-warning-re {{(reg_${{[0-9]+}}) - 1 }} instead of + -1 clang_analyzer_dump(i - (-1)); // expected-warning-re {{(reg_${{[0-9]+}}) + 1 }} instead of - -1 clang_analyzer_dumpL(l + (-1)); // expected-warning-re {{(reg_${{[0-9]+}}) - 1 }} instead of + -1 clang_analyzer_dumpL(l - (-1)); // expected-warning-re {{(reg_${{[0-9]+}}) + 1 }} instead of - -1 - int intMin = 1 << (sizeof(int) * 8 - 1); // INT_MIN, negative value is not representable // Do not normalize representation if negation would not be representable - clang_analyzer_dump(i + intMin); // expected-warning-re {{(reg_${{[0-9]+}}) + -2147483648 }} - clang_analyzer_dump(i - intMin); // expected-warning-re {{(reg_${{[0-9]+}}) - -2147483648 }} + clang_analyzer_dump(i + intMin); // expected-warning-re {{(reg_${{[0-9]+}}) + -2147483648 }} no change + clang_analyzer_dump(i - intMin); // expected-warning-re {{(reg_${{[0-9]+}}) - -2147483648 }} no change // Produced value has higher bit with (long) so negation if representable clang_analyzer_dumpL(l + intMin); // expected-warning-re {{(reg_${{[0-9]+}}) - 2147483648 }} instead of + -2147483648 clang_analyzer_dumpL(l - intMin); // expected-warning-re {{(reg_${{[0-9]+}}) + 2147483648 }} instead of - -2147483648 } + +void changingToUnsinged(unsigned u, int i) { + unsigned c = u + (unsigned)i; + unsigned d = u - (unsigned)i; + if (i == -1) { + clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 1U }} + clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 1U }} + return; + } + if (i == intMin) { + clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 2147483648U }} + clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 2147483648U }} + return; + } +} + +void extendingToSigned(long l, int i) { + long c = l + (long)i; + long d = l - (long)i; + if (i == -1) { +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 1 }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 1 }} +return; + } + if (i == intMin) { +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 2147483648 }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 2147483648 }} +return; + } +} + +void extendingToUnigned(unsigned long ul, int i) { + unsigned long c = ul + (unsigned long)i; + unsigned long d = ul - (unsigned long)i; + if (i == -1) { +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 1U }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 1U }} +return; + } + if (i == intMin) { +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 2147483648U }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 2147483648U }} +return; + } +} + +void truncatingToSigned(int i, long l) { + int c = i + (int)l; + int d = i - (int)l; + if (l == -1L) { +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) - 1 }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + 1 }} +return; + } + if (l == (long)intMin) { // negation outside of range, no-changes +clang_analyzer_dump(c + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + -2147483648 }} +clang_analyzer_dump(d + 0); // expected-warning-re {{(reg_${{[0-9]+}}) + -2147483648 }} +return; + } + if (l == ((long)intMin - 1L)) { // outside or range, no changes +clang_analyzer_dump(c + 0); // expecte
[PATCH] D125157: [RISCV][NFC] Add more tests for clang driver.
sunshaoce added inline comments. Comment at: clang/test/Driver/riscv-arch.c:583 +// RV32-ZHINX-BADVERS: unsupported version number 0.1 for extension 'zhinx' \ No newline at end of file Add a newline here. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125157/new/ https://reviews.llvm.org/D125157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits