llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Sam Elliott (lenary) <details> <summary>Changes</summary> This change: - Adds a `[[clang::nooutline]]` function attribute for C and C++. There is no equivalent GNU syntax for this attribute, so no `__attribute__` syntax. - Uses the presence of `[[clang::nooutline]]` to add the `nooutline` attribute to IR function definitions. - Adds test for the above. The `nooutline` attribute disables both the Machine Outliner (enabled at Oz for some targets), and the IR Outliner (disabled by default). --- Full diff: https://github.com/llvm/llvm-project/pull/163666.diff 6 Files Affected: - (modified) clang/include/clang/Basic/Attr.td (+7) - (modified) clang/lib/CodeGen/CodeGenModule.cpp (+3) - (added) clang/test/CodeGen/attr-nooutline.c (+16) - (modified) clang/test/Misc/pragma-attribute-supported-attributes-list.test (+1) - (added) clang/test/Sema/attr-nooutline.c (+7) - (added) clang/test/Sema/attr-nooutline.cpp (+7) ``````````diff diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 22e60aa9fe312..b8a61ba4cbac9 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -2355,6 +2355,13 @@ def NoInline : DeclOrStmtAttr { let SimpleHandler = 1; } +def NoOutline : DeclOrStmtAttr { + let Spellings = [CXX11<"clang", "nooutline">, C23<"clang", "nooutline">]; + let Subjects = SubjectList<[Function], ErrorDiag>; + let Documentation = [Undocumented]; + let SimpleHandler = 1; +} + def NoMips16 : InheritableAttr, TargetSpecificAttr<TargetMips32> { let Spellings = [GCC<"nomips16">]; let Subjects = SubjectList<[Function], ErrorDiag>; diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 8d019d4b2da25..ab267236ed579 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2820,6 +2820,9 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, B.addAttribute(llvm::Attribute::MinSize); } + if (D->hasAttr<NoOutlineAttr>()) + B.addAttribute(llvm::Attribute::NoOutline); + F->addFnAttrs(B); unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); diff --git a/clang/test/CodeGen/attr-nooutline.c b/clang/test/CodeGen/attr-nooutline.c new file mode 100644 index 0000000000000..b9f175da24cb5 --- /dev/null +++ b/clang/test/CodeGen/attr-nooutline.c @@ -0,0 +1,16 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-attributes --version 6 +// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-unknown-linux-gnu -disable-O0-optnone -o - | FileCheck %s + + +// CHECK: Function Attrs: noinline nooutline nounwind +// CHECK-LABEL: define dso_local i32 @t1( +// CHECK-SAME: i32 noundef [[X:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 +// CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 +// CHECK-NEXT: ret i32 [[TMP0]] +// +[[clang::nooutline]] int t1(int x) { + return x; +} diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index 73d4cb1769ed5..7ef758dbea9eb 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -123,6 +123,7 @@ // CHECK-NEXT: NoMerge (SubjectMatchRule_function, SubjectMatchRule_variable) // CHECK-NEXT: NoMicroMips (SubjectMatchRule_function) // CHECK-NEXT: NoMips16 (SubjectMatchRule_function) +// CHECK-NEXT: NoOutline (SubjectMatchRule_function) // CHECK-NEXT: NoProfileFunction (SubjectMatchRule_function) // CHECK-NEXT: NoRandomizeLayout (SubjectMatchRule_record) // CHECK-NEXT: NoSanitize (SubjectMatchRule_function, SubjectMatchRule_objc_method, SubjectMatchRule_variable_is_global) diff --git a/clang/test/Sema/attr-nooutline.c b/clang/test/Sema/attr-nooutline.c new file mode 100644 index 0000000000000..83848c22d1003 --- /dev/null +++ b/clang/test/Sema/attr-nooutline.c @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +[[clang::nooutline]] int a; // expected-error {{'clang::nooutline' attribute only applies to functions}} + +[[clang::nooutline]] void t1(void); + +[[clang::nooutline(2)]] void t2(void); // expected-error {{'clang::nooutline' attribute takes no arguments}} diff --git a/clang/test/Sema/attr-nooutline.cpp b/clang/test/Sema/attr-nooutline.cpp new file mode 100644 index 0000000000000..b6c9b3995081a --- /dev/null +++ b/clang/test/Sema/attr-nooutline.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -verify -fsyntax-only %s -Wno-c++17-extensions + +[[clang::nooutline]] int a; // expected-error {{'clang::nooutline' attribute only applies to functions}} + +[[clang::nooutline]] void t1(void); + +[[clang::nooutline(2)]] void t2(void); // expected-error {{'clang::nooutline' attribute takes no arguments}} `````````` </details> https://github.com/llvm/llvm-project/pull/163666 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
