================
@@ -4823,9 +4824,47 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned
BuiltinID,
llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
- llvm::Function *F =
- CGM.getIntrinsic(Intrinsic::read_register, {Int64Ty});
- return Builder.CreateCall(F, Metadata);
+ CallInst *CI;
+ if (BuiltinID == clang::AArch64::BI__getReg) {
+ llvm::Function *F =
+ CGM.getIntrinsic(Intrinsic::read_volatile_register, {Int64Ty});
+ CI = Builder.CreateCall(F, Metadata);
+ } else {
+ llvm::Function *F =
+ CGM.getIntrinsic(Intrinsic::write_volatile_register, {Int64Ty});
+ CI = Builder.CreateCall(F, {Metadata, EmitScalarExpr(E->getArg(1))});
+ }
+ return CI;
+ }
+
+ if (BuiltinID == clang::AArch64::BI__getRegFp ||
+ BuiltinID == clang::AArch64::BI__setRegFp) {
+ Expr::EvalResult Result;
+ if (!E->getArg(0)->EvaluateAsInt(Result, CGM.getContext()))
+ llvm_unreachable("Sema will ensure that the parameter is constant");
+
+ llvm::APSInt Value = Result.Val.getInt();
+ LLVMContext &Context = CGM.getLLVMContext();
+ std::string Reg = "d" + toString(Value, 10);
+
+ llvm::Metadata *Ops[] = {llvm::MDString::get(Context, Reg)};
+ llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
+ llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
+
+ llvm::Value *Ret;
+ if (BuiltinID == clang::AArch64::BI__getRegFp) {
+ llvm::Function *F =
+ CGM.getIntrinsic(Intrinsic::read_volatile_register, {Int64Ty});
----------------
zatrazz wrote:
I recall I have tried something similar, but double checking it would require
further changes on how the builtin is define (currently it is as
llvm.read_volatile_register.i{32,64}). I double check and with this change,
trying to compile a getRegFP triggers:
intrinsic has incorrect return type!
ptr @llvm.read_volatile_register.f64
intrinsic has incorrect return type!
ptr @llvm.read_volatile_register.f64
fatal error: error in backend: Broken module found, compilation aborted!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and
include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: C:\\Projects\\llvm\\build\\bin\\clang.exe -O2 -Wall
-march=armv8 -c ..\\test_getregfp.c
1. <eof> parser at end of file
2. Optimizer
3. Running pass "verify" on module "..\test_getregfp.c"
https://github.com/llvm/llvm-project/pull/194632
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits