Index: clang/lib/Headers/CMakeLists.txt =================================================================== --- clang/lib/Headers/CMakeLists.txt +++ clang/lib/Headers/CMakeLists.txt @@ -46,6 +46,7 @@ __clang_cuda_math_forward_declares.h __clang_cuda_runtime_wrapper.h cetintrin.h + cet.h cldemoteintrin.h clzerointrin.h cpuid.h Index: clang/lib/Headers/cet.h =================================================================== --- /dev/null +++ clang/lib/Headers/cet.h @@ -0,0 +1,59 @@ +/*===------ cet.h -Control-flow Enforcement Technology feature ------------=== + * Add x86 feature with IBT and/or SHSTK bits to ELF program property if they + * are enabled. Otherwise, contents in this header file are unused. This file + * is mainly design for assembly source code which want to enable CET. + * + * 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 + * + *===-----------------------------------------------------------------------=== + */ + +#ifdef __ASSEMBLER__ + +#ifndef _CET_ENDBR +# define _CET_ENDBR +# ifdef __LP64__ +# if __CET__ & 0x1 +# undef _CET_ENDBR +# define _CET_ENDBR endbr64 +# endif +# else +# if __CET__ & 0x1 +# undef _CET_ENDBR +# define _CET_ENDBR endbr32 +# endif +# endif +#endif + +# ifdef __CET__ + +# ifdef __LP64__ +# define __PROPERTY_ALIGN 3 +# else +# define __PROPERTY_ALIGN 2 +# endif + + .pushsection ".note.gnu.property", "a" + .p2align __PROPERTY_ALIGN + .long 1f - 0f /* name length. */ + .long 4f - 1f /* data length. */ + /* NT_GNU_PROPERTY_TYPE_0. */ + .long 5 /* note type. */ +0: + .asciz "GNU" /* vendor name. */ +1: + .p2align __PROPERTY_ALIGN + /* GNU_PROPERTY_X86_FEATURE_1_AND. */ + .long 0xc0000002 /* pr_type. */ + .long 3f - 2f /* pr_datasz. */ +2: + /* GNU_PROPERTY_X86_FEATURE_1_XXX. */ + .long __CET__ +3: + .p2align __PROPERTY_ALIGN +4: + .popsection +# endif +#endif Index: clang/test/CodeGen/asm-cet.S =================================================================== --- /dev/null +++ clang/test/CodeGen/asm-cet.S @@ -0,0 +1,26 @@ +// RUN: %clang --target=x86_64-pc-linux -fcf-protection -include cet.h -c %s -o - | llvm-readelf -n | FileCheck %s +// RUN: %clang --target=x86_64-pc-linux -include cet.h -c %s -o - | llvm-readelf -S | FileCheck %s --check-prefixes=NOCET +// RUN: %clang --target=x86_64-pc-linux -include cet.h -S %s -o - | FileCheck %s --check-prefixes=NOENDBR +// RUN: %clang --target=x86_64-pc-linux -fcf-protection -include cet.h -S %s -o - | FileCheck %s --check-prefixes=ENDBR64 + +// RUN: %clang --target=i386-pc-linux -fcf-protection -include cet.h -c %s -o - | llvm-readelf -n | FileCheck %s +// RUN: %clang --target=i386-pc-linux -include cet.h -c %s -o - | llvm-readelf -S | FileCheck %s --check-prefixes=NOCET +// RUN: %clang --target=i386-pc-linux -include cet.h -S %s -o - | FileCheck %s --check-prefixes=NOENDBR +// RUN: %clang --target=i386-pc-linux -fcf-protection -include cet.h -S %s -o - | FileCheck %s --check-prefixes=ENDBR32 + +// CHECK: IBT, SHSTK + +// NOCET: Section Headers +// NOCET-NOT: .note.gnu.property + +// NOENDBR: foo +// NOENDBR-NOT: endbr + +// ENDBR64: endbr64 +// ENDBR32: endbr32 + .text + .globl foo + .type foo, @function +foo: + _CET_ENDBR + ret