# HG changeset patch # User anatofuz # Date 1583922183 -32400 # Node ID f7e988d3e4cc24ee1642762828ccda81c7e68eca # Parent 89bc3402280da0b46b636f239f11c9f1f3e39209 fix def file diff -r 89bc3402280d -r f7e988d3e4cc clang/include/clang/AST/BuiltinTypes.def --- a/clang/include/clang/AST/BuiltinTypes.def Wed Mar 11 18:44:00 2020 +0900 +++ b/clang/include/clang/AST/BuiltinTypes.def Wed Mar 11 19:23:03 2020 +0900 @@ -57,6 +57,10 @@ // void BUILTIN_TYPE(Void, VoidTy) +#ifndef noCbC +BUILTIN_TYPE(__Code, __CodeTy) +#endif + //===- Unsigned Types -----------------------------------------------------===// // 'bool' in C++, '_Bool' in C99 diff -r 89bc3402280d -r f7e988d3e4cc clang/include/clang/Basic/LangOptions.def --- a/clang/include/clang/Basic/LangOptions.def Wed Mar 11 18:44:00 2020 +0900 +++ b/clang/include/clang/Basic/LangOptions.def Wed Mar 11 19:23:03 2020 +0900 @@ -334,6 +334,10 @@ BENIGN_LANGOPT(AllowEditorPlaceholders, 1, 0, "allow editor placeholders in source") +#ifndef noCbC +LANGOPT(HasCodeSegment , 1, 0, "CbC") +#endif + ENUM_LANGOPT(ClangABICompat, ClangABI, 4, ClangABI::Latest, "version of Clang that we should attempt to be ABI-compatible " "with") diff -r 89bc3402280d -r f7e988d3e4cc clang/include/clang/Basic/TokenKinds.def --- a/clang/include/clang/Basic/TokenKinds.def Wed Mar 11 18:44:00 2020 +0900 +++ b/clang/include/clang/Basic/TokenKinds.def Wed Mar 11 19:23:03 2020 +0900 @@ -315,6 +315,11 @@ KEYWORD(__objc_yes , KEYALL) KEYWORD(__objc_no , KEYALL) +#ifndef noCbC // CbC Keywords. +KEYWORD(__code , KEYALL) +KEYWORD(_CbC_return , KEYALL) +KEYWORD(_CbC_environment , KEYALL) +#endif // C++ 2.11p1: Keywords. KEYWORD(asm , KEYCXX|KEYGNU) diff -r 89bc3402280d -r f7e988d3e4cc llvm/lib/Transforms/IPO/PassManagerBuilder.cpp --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp Wed Mar 11 18:44:00 2020 +0900 +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp Wed Mar 11 19:23:03 2020 +0900 @@ -994,7 +994,11 @@ // LTO provides additional opportunities for tailcall elimination due to // link-time inlining, and visibility of nocapture attribute. if (OptLevel > 1) +#ifndef noCbC + PM.add(createTailCallEliminationPass(false)); +#else PM.add(createTailCallEliminationPass()); +#endif // Infer attributes on declarations, call sites, arguments, etc. PM.add(createPostOrderFunctionAttrsLegacyPass()); // Add nocapture. diff -r 89bc3402280d -r f7e988d3e4cc llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp --- a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp Wed Mar 11 18:44:00 2020 +0900 +++ b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp Wed Mar 11 19:23:03 2020 +0900 @@ -186,6 +186,28 @@ }; } +#ifndef noCmarkTailToCodeSegmentsbC +static bool markTailToCodeSegments(Function &F){ + bool Modified = false; + for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { + for (auto &I : *BB) { + CallInst *CI = dyn_cast(&I); + Function* Called; + if (CI) + Called = CI->getCalledFunction(); + else + continue; + // We should touch only code segment call. + if (Called && Called->getReturnType()->is__CodeTy()) { + CI->setTailCall(); + Modified = true; + } + } + } + return Modified; +} +#endif + static bool markTails(Function &F, bool &AllCallsAreTailCalls, OptimizationRemarkEmitter *ORE) { if (F.callsFunctionThatReturnsTwice())