[clang] [llvm] [AIX] Implement the ifunc attribute. (PR #153049)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 11 09:46:26 PDT 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff HEAD~1 HEAD --extensions h,cpp -- clang/include/clang/Basic/TargetInfo.h llvm/include/llvm/Transforms/Utils/ModuleUtils.h llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp llvm/lib/Target/PowerPC/PPCISelLowering.cpp llvm/lib/Target/PowerPC/PPCTargetMachine.cpp llvm/lib/Target/PowerPC/PPCTargetMachine.h llvm/lib/Transforms/Utils/LowerIFunc.cpp llvm/lib/Transforms/Utils/ModuleUtils.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
index 6be7ac80d..2734422ba 100644
--- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
+++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
@@ -162,8 +162,8 @@ lowerGlobalIFuncUsersAsGlobalCtor(Module &M,
/// AIX specific lowering of ifuncs where we convert an ifunc to a regular
/// function with the following implementation:
/// Check if the function's descriptor still points to itself (true on first
-/// entry), if so then call the resolver function and atomically store the
-/// resulting function pointer into the descriptor. Make an indirect call
+/// entry), if so then call the resolver function and atomically store the
+/// resulting function pointer into the descriptor. Make an indirect call
/// through the function pointer in the descriptor.
LLVM_ABI void lowerIFuncsOnAIX(Module &M);
} // End llvm namespace
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 957b2b3e7..8b9b49756 100644
--- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -764,7 +764,7 @@ static MCSymbol *getMCSymbolForTOCPseudoMO(const MachineOperand &MO,
case MachineOperand::MO_BlockAddress:
return AP.GetBlockAddressSymbol(MO.getBlockAddress());
case MachineOperand::MO_MCSymbol:
- return MO.getMCSymbol();
+ return MO.getMCSymbol();
default:
llvm_unreachable("Unexpected operand type to get symbol.");
}
@@ -1047,7 +1047,8 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
TmpInst.setOpcode(PPC::LWZ);
const MachineOperand &MO = MI->getOperand(1);
- assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress() || MO.isMCSymbol()) &&
+ assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress() ||
+ MO.isMCSymbol()) &&
"Invalid operand for LWZtoc.");
// Map the operand to its corresponding MCSymbol.
@@ -1131,7 +1132,8 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
TmpInst.setOpcode(PPC::LD);
const MachineOperand &MO = MI->getOperand(1);
- assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress() || MO.isMCSymbol()) &&
+ assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress() ||
+ MO.isMCSymbol()) &&
"Invalid operand!");
// Map the operand to its corresponding MCSymbol.
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index bbdd573f4..63e951ce1 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -11185,12 +11185,13 @@ SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
SDValue EntryPointSym = DAG.getMCSymbol(S, PtrVT);
return getTOCEntry(DAG, dl, EntryPointSym);
}
- assert (Op1.getOpcode() == ISD::CopyFromReg);
+ assert(Op1.getOpcode() == ISD::CopyFromReg);
SDLoc dl(Op);
EVT PtrVT = getPointerTy(DAG.getDataLayout());
- SDValue Result = DAG.getLoad(
- PtrVT, dl, DAG.getEntryNode(), Op1, MachinePointerInfo(), DAG.getDataLayout().getPointerABIAlignment(0),
- MachineMemOperand::MODereferenceable);
+ SDValue Result =
+ DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Op1, MachinePointerInfo(),
+ DAG.getDataLayout().getPointerABIAlignment(0),
+ MachineMemOperand::MODereferenceable);
return Result;
}
case Intrinsic::thread_pointer:
diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
index d8e840912..a2d8bca66 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -456,11 +456,12 @@ public:
void PPCTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
if (getTargetTriple().isOSAIX())
- PB.registerOptimizerLastEPCallback(
- [](ModulePassManager &PM, OptimizationLevel Level, ThinOrFullLTOPhase Phase) {
- if (Phase == ThinOrFullLTOPhase::None)
- PM.addPass(LowerIFuncPass());
- });
+ PB.registerOptimizerLastEPCallback([](ModulePassManager &PM,
+ OptimizationLevel Level,
+ ThinOrFullLTOPhase Phase) {
+ if (Phase == ThinOrFullLTOPhase::None)
+ PM.addPass(LowerIFuncPass());
+ });
}
TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) {
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 67da3e66c..10e898bf2 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -11,8 +11,8 @@
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Utils/ModuleUtils.h"
-#include "llvm/Analysis/VectorUtils.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
@@ -409,7 +409,8 @@ void llvm::lowerIFuncsOnAIX(Module &M) {
// Create the regular (non-ifunc) function:
// define rt-type @foo(type1 %0, type2 %1)
- Function *F = Function::Create(FTy, IFunc.getLinkage(), IFunc.getAddressSpace(), IFunc.getName(), &M);
+ Function *F = Function::Create(
+ FTy, IFunc.getLinkage(), IFunc.getAddressSpace(), IFunc.getName(), &M);
LLVMContext &Ctx = F->getContext();
// entry:
@@ -418,17 +419,25 @@ void llvm::lowerIFuncsOnAIX(Module &M) {
PointerType *PtrTy = Builder.getPtrTy();
// %DescPtr = call ptr @ppc_get_function_descriptor(ptr noundef @foo)
- auto *DescPtr = Builder.CreateIntrinsic(/*RetTy*/ PtrTy, Intrinsic::ppc_get_function_descriptor, {F}, {}, "desc.ptr");
+ auto *DescPtr = Builder.CreateIntrinsic(
+ /*RetTy*/ PtrTy, Intrinsic::ppc_get_function_descriptor, {F}, {},
+ "desc.ptr");
- // %DesctAddr = getelementptr inbounds %struct.Desc_t, ptr %DescPtr, i32 0, i32 0
+ // %DesctAddr = getelementptr inbounds %struct.Desc_t, ptr %DescPtr, i32
+ // 0, i32 0
StructType *DescriptorType = StructType::get(PtrTy, PtrTy, PtrTy);
- auto *DesctAddr = Builder.CreateStructGEP(DescriptorType, DescPtr, 0, "desc_t.addr");
+ auto *DesctAddr =
+ Builder.CreateStructGEP(DescriptorType, DescPtr, 0, "desc_t.addr");
// %AddrInDesc = load ptr, ptr %DesctAddr, align 4
- auto *AddrInDesc = Builder.CreateAlignedLoad(PtrTy, DesctAddr, DesctAddr->getPointerAlignment(M.getDataLayout()), "addr.in.desc");
+ auto *AddrInDesc = Builder.CreateAlignedLoad(
+ PtrTy, DesctAddr, DesctAddr->getPointerAlignment(M.getDataLayout()),
+ "addr.in.desc");
// %OriginalAddr = call ptr @ppc_get_function_entry(ptr noundef @foo) #3
- auto *OriginalAddr = Builder.CreateIntrinsic(/*RetTy*/ PtrTy, Intrinsic::ppc_get_function_entry, {F}, {}, "original.addr");
+ auto *OriginalAddr = Builder.CreateIntrinsic(
+ /*RetTy*/ PtrTy, Intrinsic::ppc_get_function_entry, {F}, {},
+ "original.addr");
// %cmp = icmp eq ptr %AddrInDesc, %OriginalAddr
auto *CMP = Builder.CreateICmpEQ(AddrInDesc, OriginalAddr);
@@ -447,11 +456,16 @@ void llvm::lowerIFuncsOnAIX(Module &M) {
// %4 = ptrtoint ptr %ResolvedAddr to i32
// store atomic i32 %4, ptr %desc_t.addr release, align 4
Function *ResolverFunc = IFunc.getResolverFunction();
- auto *ResolvedFunc = Builder.CreateCall(ResolverFunc, ArrayRef<Value *>(), "resolved.func");
- auto *ResolvedAddr = Builder.CreateIntrinsic(/*RetTy*/ PtrTy, Intrinsic::ppc_get_function_entry, {ResolvedFunc}, {}, "resolved.addr");
- auto *PtrToInt = Builder.CreatePtrToInt(ResolvedAddr, Builder.getIntPtrTy(M.getDataLayout()));
+ auto *ResolvedFunc =
+ Builder.CreateCall(ResolverFunc, ArrayRef<Value *>(), "resolved.func");
+ auto *ResolvedAddr = Builder.CreateIntrinsic(
+ /*RetTy*/ PtrTy, Intrinsic::ppc_get_function_entry, {ResolvedFunc}, {},
+ "resolved.addr");
+ auto *PtrToInt = Builder.CreatePtrToInt(
+ ResolvedAddr, Builder.getIntPtrTy(M.getDataLayout()));
// TODO fix alignment
- Builder.CreateAlignedStore(PtrToInt, DesctAddr, MaybeAlign())->setAtomic(AtomicOrdering::Release);
+ Builder.CreateAlignedStore(PtrToInt, DesctAddr, MaybeAlign())
+ ->setAtomic(AtomicOrdering::Release);
// br label %if.end
Builder.CreateBr(FinalBlock);
@@ -461,8 +475,9 @@ void llvm::lowerIFuncsOnAIX(Module &M) {
// %res = musttail call i32 %DescPtr(i32 noundef %a) #3
SmallVector<Value *, 10> Args(make_pointer_range(F->args()));
- CallInst *Result = Builder.CreateCall(F->getFunctionType(), DescPtr, Args, "res");
- //Result->setTailCallKind(CallInst::TCK_MustTail);
+ CallInst *Result =
+ Builder.CreateCall(F->getFunctionType(), DescPtr, Args, "res");
+ // Result->setTailCallKind(CallInst::TCK_MustTail);
// ret i32 %res
if (F->getReturnType()->isVoidTy())
``````````
</details>
https://github.com/llvm/llvm-project/pull/153049
More information about the cfe-commits
mailing list