diff --git a/clang/test/CodeGen/mcount-aix.c b/clang/test/CodeGen/mcount-aix.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/mcount-aix.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -pg -triple powerpc-ibm-aix7.2.0.0 -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -pg -triple powerpc64-ibm-aix7.2.0.0 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK64 + +void foo() { +} + +void bar() { + foo(); +} +// CHECK: @[[GLOB0:[0-9]+]] = internal global i32 0 +// CHECK: @[[GLOB1:[0-9]+]] = internal global i32 0 +// CHECK64: @[[GLOB0:[0-9]+]] = internal global i64 0 +// CHECK64: @[[GLOB1:[0-9]+]] = internal global i64 0 +// CHECK-LABEL: @foo( +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @__mcount(i32* @[[GLOB0]]) +// CHECK64-LABEL: @foo( +// CHECK64-NEXT: entry: +// CHECK64-NEXT: call void @__mcount(i64* @[[GLOB0]]) +// CHECK-LABEL: @bar( +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @__mcount(i32* @[[GLOB1]]) +// CHECK64-LABEL: @bar( +// CHECK64-NEXT: entry: +// CHECK64-NEXT: call void @__mcount(i64* @[[GLOB1]]) diff --git a/llvm/lib/Transforms/Utils/EntryExitInstrumenter.cpp b/llvm/lib/Transforms/Utils/EntryExitInstrumenter.cpp --- a/llvm/lib/Transforms/Utils/EntryExitInstrumenter.cpp +++ b/llvm/lib/Transforms/Utils/EntryExitInstrumenter.cpp @@ -40,6 +40,21 @@ return; } + if (Func == "__mcount.aix") { + Type *SizeTy = M.getDataLayout().getIntPtrType(C); + Type *SizePtrTy = SizeTy->getPointerTo(); + GlobalVariable *GV = new GlobalVariable(M, SizeTy, /*isConstant=*/false, + GlobalValue::InternalLinkage, + ConstantInt::get(SizeTy, 0)); + CallInst *Call = CallInst::Create( + M.getOrInsertFunction("__mcount", + FunctionType::get(Type::getVoidTy(C), {SizePtrTy}, + /*isVarArg=*/false)), + {GV}, "", InsertionPt); + Call->setDebugLoc(DL); + return; + } + if (Func == "__cyg_profile_func_enter" || Func == "__cyg_profile_func_exit") { Type *ArgTypes[] = {Type::getInt8PtrTy(C), Type::getInt8PtrTy(C)};