jmciver created this revision. Herald added a project: All. jmciver published this revision for review. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This change helps to prevents mixing fine grained and non fine grained bit-field addressing schemes, which can result in incorrect poison state at initialization. The IR function attribute fine_grained_bitfields is only added when fine grained bitfield accesses are enable. The attribute is used by opt to prevent inlining. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D129542 Files: clang/lib/CodeGen/CGCall.cpp clang/lib/CodeGen/CodeGenFunction.cpp clang/test/CodeGen/fine-grained-bitfield-accesses.c Index: clang/test/CodeGen/fine-grained-bitfield-accesses.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fine-grained-bitfield-accesses.c @@ -0,0 +1,21 @@ +// RUN: %clang -ffine-grained-bitfield-accesses -S -emit-llvm -o - %s | FileCheck %s +// CHECK: define{{.*}} @g(){{.*}} #[[GATTR:[0-9]+]] { +// CHECK: declare{{.*}} void @f(ptr noundef){{.*}} #[[FATTR:[0-9]+]] +// CHECK: attributes #[[GATTR]] = {{.*}} fine_grained_bitfields {{.*}} +// CHECK: attributes #[[FATTR]] = {{.*}} fine_grained_bitfields {{.*}} +// +// Verify that the clang fine-grained-bitfield-accesses option adds the IR +// function attribute fine_grained_bitfields. +struct X { + int a : 8; + int b : 24; +}; + +void f(struct X*); + +int g() { + struct X x; + x.a = 10; + f(&x); + return x.a; +} Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -984,6 +984,11 @@ Fn->addFnAttr(llvm::Attribute::StrictFP); } + // The fine grained bit-fields attribute is used to determine IPO inlining + // compatibility. + if (getTypes().getCodeGenOpts().FineGrainedBitfieldAccesses) + Fn->addFnAttr(llvm::Attribute::FineGrainedBitfields); + // If a custom alignment is used, force realigning to this alignment on // any main function which certainly will need it. if (FD && ((FD->isMain() || FD->isMSVCRTEntryPoint()) && Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -1890,6 +1890,9 @@ if (CodeGenOpts.SpeculativeLoadHardening) FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening); + if (getTypes().getCodeGenOpts().FineGrainedBitfieldAccesses) + FuncAttrs.addAttribute(llvm::Attribute::FineGrainedBitfields); + // Add zero-call-used-regs attribute. switch (CodeGenOpts.getZeroCallUsedRegs()) { case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
Index: clang/test/CodeGen/fine-grained-bitfield-accesses.c =================================================================== --- /dev/null +++ clang/test/CodeGen/fine-grained-bitfield-accesses.c @@ -0,0 +1,21 @@ +// RUN: %clang -ffine-grained-bitfield-accesses -S -emit-llvm -o - %s | FileCheck %s +// CHECK: define{{.*}} @g(){{.*}} #[[GATTR:[0-9]+]] { +// CHECK: declare{{.*}} void @f(ptr noundef){{.*}} #[[FATTR:[0-9]+]] +// CHECK: attributes #[[GATTR]] = {{.*}} fine_grained_bitfields {{.*}} +// CHECK: attributes #[[FATTR]] = {{.*}} fine_grained_bitfields {{.*}} +// +// Verify that the clang fine-grained-bitfield-accesses option adds the IR +// function attribute fine_grained_bitfields. +struct X { + int a : 8; + int b : 24; +}; + +void f(struct X*); + +int g() { + struct X x; + x.a = 10; + f(&x); + return x.a; +} Index: clang/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- clang/lib/CodeGen/CodeGenFunction.cpp +++ clang/lib/CodeGen/CodeGenFunction.cpp @@ -984,6 +984,11 @@ Fn->addFnAttr(llvm::Attribute::StrictFP); } + // The fine grained bit-fields attribute is used to determine IPO inlining + // compatibility. + if (getTypes().getCodeGenOpts().FineGrainedBitfieldAccesses) + Fn->addFnAttr(llvm::Attribute::FineGrainedBitfields); + // If a custom alignment is used, force realigning to this alignment on // any main function which certainly will need it. if (FD && ((FD->isMain() || FD->isMSVCRTEntryPoint()) && Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -1890,6 +1890,9 @@ if (CodeGenOpts.SpeculativeLoadHardening) FuncAttrs.addAttribute(llvm::Attribute::SpeculativeLoadHardening); + if (getTypes().getCodeGenOpts().FineGrainedBitfieldAccesses) + FuncAttrs.addAttribute(llvm::Attribute::FineGrainedBitfields); + // Add zero-call-used-regs attribute. switch (CodeGenOpts.getZeroCallUsedRegs()) { case llvm::ZeroCallUsedRegs::ZeroCallUsedRegsKind::Skip:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits