1 //===---- CGBuiltin.cpp - Emit LLVM Code for builtins ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This contains code to emit Builtin calls as LLVM code. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "CGBuiltin.h" 14 #include "ABIInfo.h" 15 #include "CGCUDARuntime.h" 16 #include "CGCXXABI.h" 17 #include "CGDebugInfo.h" 18 #include "CGObjCRuntime.h" 19 #include "CGOpenCLRuntime.h" 20 #include "CGRecordLayout.h" 21 #include "CGValue.h" 22 #include "CodeGenFunction.h" 23 #include "CodeGenModule.h" 24 #include "ConstantEmitter.h" 25 #include "PatternInit.h" 26 #include "TargetInfo.h" 27 #include "clang/AST/OSLog.h" 28 #include "clang/AST/StmtVisitor.h" 29 #include "clang/Basic/TargetInfo.h" 30 #include "clang/Frontend/FrontendDiagnostic.h" 31 #include "llvm/IR/InlineAsm.h" 32 #include "llvm/IR/Instruction.h" 33 #include "llvm/IR/Intrinsics.h" 34 #include "llvm/IR/IntrinsicsX86.h" 35 #include "llvm/IR/MatrixBuilder.h" 36 #include "llvm/Support/ConvertUTF.h" 37 #include "llvm/Support/ScopedPrinter.h" 38 #include <optional> 39 #include <utility> 40 41 using namespace clang; 42 using namespace CodeGen; 43 using namespace llvm; 44 45 /// Some builtins do not have library implementation on some targets and 46 /// are instead emitted as LLVM IRs by some target builtin emitters. 47 /// FIXME: Remove this when library support is added 48 static bool shouldEmitBuiltinAsIR(unsigned BuiltinID, 49 const Builtin::Context &BI, 50 const CodeGenFunction &CGF) { 51 if (!CGF.CGM.getLangOpts().MathErrno && 52 CGF.CurFPFeatures.getExceptionMode() == 53 LangOptions::FPExceptionModeKind::FPE_Ignore && 54 !CGF.CGM.getTargetCodeGenInfo().supportsLibCall()) { 55 switch (BuiltinID) { 56 default: 57 return false; 58 case Builtin::BIlogbf: 59 case Builtin::BI__builtin_logbf: 60 case Builtin::BIlogb: 61 case Builtin::BI__builtin_logb: 62 case Builtin::BIscalbnf: 63 case Builtin::BI__builtin_scalbnf: 64 case Builtin::BIscalbn: 65 case Builtin::BI__builtin_scalbn: 66 return true; 67 } 68 } 69 return false; 70 } 71 72 static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF, 73 unsigned BuiltinID, const CallExpr *E, 74 ReturnValueSlot ReturnValue, 75 llvm::Triple::ArchType Arch) { 76 // When compiling in HipStdPar mode we have to be conservative in rejecting 77 // target specific features in the FE, and defer the possible error to the 78 // AcceleratorCodeSelection pass, wherein iff an unsupported target builtin is 79 // referenced by an accelerator executable function, we emit an error. 80 // Returning nullptr here leads to the builtin being handled in 81 // EmitStdParUnsupportedBuiltin. 82 if (CGF->getLangOpts().HIPStdPar && CGF->getLangOpts().CUDAIsDevice && 83 Arch != CGF->getTarget().getTriple().getArch()) 84 return nullptr; 85 86 switch (Arch) { 87 case llvm::Triple::arm: 88 case llvm::Triple::armeb: 89 case llvm::Triple::thumb: 90 case llvm::Triple::thumbeb: 91 return CGF->EmitARMBuiltinExpr(BuiltinID, E, ReturnValue, Arch); 92 case llvm::Triple::aarch64: 93 case llvm::Triple::aarch64_32: 94 case llvm::Triple::aarch64_be: 95 return CGF->EmitAArch64BuiltinExpr(BuiltinID, E, Arch); 96 case llvm::Triple::bpfeb: 97 case llvm::Triple::bpfel: 98 return CGF->EmitBPFBuiltinExpr(BuiltinID, E); 99 case llvm::Triple::dxil: 100 return CGF->EmitDirectXBuiltinExpr(BuiltinID, E); 101 case llvm::Triple::x86: 102 case llvm::Triple::x86_64: 103 return CGF->EmitX86BuiltinExpr(BuiltinID, E); 104 case llvm::Triple::ppc: 105 case llvm::Triple::ppcle: 106 case llvm::Triple::ppc64: 107 case llvm::Triple::ppc64le: 108 return CGF->EmitPPCBuiltinExpr(BuiltinID, E); 109 case llvm::Triple::r600: 110 case llvm::Triple::amdgcn: 111 return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E); 112 case llvm::Triple::systemz: 113 return CGF->EmitSystemZBuiltinExpr(BuiltinID, E); 114 case llvm::Triple::nvptx: 115 case llvm::Triple::nvptx64: 116 return CGF->EmitNVPTXBuiltinExpr(BuiltinID, E); 117 case llvm::Triple::wasm32: 118 case llvm::Triple::wasm64: 119 return CGF->EmitWebAssemblyBuiltinExpr(BuiltinID, E); 120 case llvm::Triple::hexagon: 121 return CGF->EmitHexagonBuiltinExpr(BuiltinID, E); 122 case llvm::Triple::riscv32: 123 case llvm::Triple::riscv64: 124 return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue); 125 case llvm::Triple::spirv32: 126 case llvm::Triple::spirv64: 127 if (CGF->getTarget().getTriple().getOS() == llvm::Triple::OSType::AMDHSA) 128 return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E); 129 [[fallthrough]]; 130 case llvm::Triple::spirv: 131 return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E); 132 default: 133 return nullptr; 134 } 135 } 136 137 Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, 138 const CallExpr *E, 139 ReturnValueSlot ReturnValue) { 140 if (getContext().BuiltinInfo.isAuxBuiltinID(BuiltinID)) { 141 assert(getContext().getAuxTargetInfo() && "Missing aux target info"); 142 return EmitTargetArchBuiltinExpr( 143 this, getContext().BuiltinInfo.getAuxBuiltinID(BuiltinID), E, 144 ReturnValue, getContext().getAuxTargetInfo()->getTriple().getArch()); 145 } 146 147 return EmitTargetArchBuiltinExpr(this, BuiltinID, E, ReturnValue, 148 getTarget().getTriple().getArch()); 149 } 150 151 static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size, 152 Align AlignmentInBytes) { 153 ConstantInt *Byte; 154 switch (CGF.getLangOpts().getTrivialAutoVarInit()) { 155 case LangOptions::TrivialAutoVarInitKind::Uninitialized: 156 // Nothing to initialize. 157 return; 158 case LangOptions::TrivialAutoVarInitKind::Zero: 159 Byte = CGF.Builder.getInt8(0x00); 160 break; 161 case LangOptions::TrivialAutoVarInitKind::Pattern: { 162 llvm::Type *Int8 = llvm::IntegerType::getInt8Ty(CGF.CGM.getLLVMContext()); 163 Byte = llvm::dyn_cast<llvm::ConstantInt>( 164 initializationPatternFor(CGF.CGM, Int8)); 165 break; 166 } 167 } 168 if (CGF.CGM.stopAutoInit()) 169 return; 170 auto *I = CGF.Builder.CreateMemSet(AI, Byte, Size, AlignmentInBytes); 171 I->addAnnotationMetadata("auto-init"); 172 } 173 174 /// getBuiltinLibFunction - Given a builtin id for a function like 175 /// "__builtin_fabsf", return a Function* for "fabsf". 176 llvm::Constant *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD, 177 unsigned BuiltinID) { 178 assert(Context.BuiltinInfo.isLibFunction(BuiltinID)); 179 180 // Get the name, skip over the __builtin_ prefix (if necessary). We may have 181 // to build this up so provide a small stack buffer to handle the vast 182 // majority of names. 183 llvm::SmallString<64> Name; 184 GlobalDecl D(FD); 185 186 // TODO: This list should be expanded or refactored after all GCC-compatible 187 // std libcall builtins are implemented. 188 static SmallDenseMap<unsigned, StringRef, 64> F128Builtins{ 189 {Builtin::BI__builtin___fprintf_chk, "__fprintf_chkieee128"}, 190 {Builtin::BI__builtin___printf_chk, "__printf_chkieee128"}, 191 {Builtin::BI__builtin___snprintf_chk, "__snprintf_chkieee128"}, 192 {Builtin::BI__builtin___sprintf_chk, "__sprintf_chkieee128"}, 193 {Builtin::BI__builtin___vfprintf_chk, "__vfprintf_chkieee128"}, 194 {Builtin::BI__builtin___vprintf_chk, "__vprintf_chkieee128"}, 195 {Builtin::BI__builtin___vsnprintf_chk, "__vsnprintf_chkieee128"}, 196 {Builtin::BI__builtin___vsprintf_chk, "__vsprintf_chkieee128"}, 197 {Builtin::BI__builtin_fprintf, "__fprintfieee128"}, 198 {Builtin::BI__builtin_printf, "__printfieee128"}, 199 {Builtin::BI__builtin_snprintf, "__snprintfieee128"}, 200 {Builtin::BI__builtin_sprintf, "__sprintfieee128"}, 201 {Builtin::BI__builtin_vfprintf, "__vfprintfieee128"}, 202 {Builtin::BI__builtin_vprintf, "__vprintfieee128"}, 203 {Builtin::BI__builtin_vsnprintf, "__vsnprintfieee128"}, 204 {Builtin::BI__builtin_vsprintf, "__vsprintfieee128"}, 205 {Builtin::BI__builtin_fscanf, "__fscanfieee128"}, 206 {Builtin::BI__builtin_scanf, "__scanfieee128"}, 207 {Builtin::BI__builtin_sscanf, "__sscanfieee128"}, 208 {Builtin::BI__builtin_vfscanf, "__vfscanfieee128"}, 209 {Builtin::BI__builtin_vscanf, "__vscanfieee128"}, 210 {Builtin::BI__builtin_vsscanf, "__vsscanfieee128"}, 211 {Builtin::BI__builtin_nexttowardf128, "__nexttowardieee128"}, 212 }; 213 214 // The AIX library functions frexpl, ldexpl, and modfl are for 128-bit 215 // IBM 'long double' (i.e. __ibm128). Map to the 'double' versions 216 // if it is 64-bit 'long double' mode. 217 static SmallDenseMap<unsigned, StringRef, 4> AIXLongDouble64Builtins{ 218 {Builtin::BI__builtin_frexpl, "frexp"}, 219 {Builtin::BI__builtin_ldexpl, "ldexp"}, 220 {Builtin::BI__builtin_modfl, "modf"}, 221 }; 222 223 // If the builtin has been declared explicitly with an assembler label, 224 // use the mangled name. This differs from the plain label on platforms 225 // that prefix labels. 226 if (FD->hasAttr<AsmLabelAttr>()) 227 Name = getMangledName(D); 228 else { 229 // TODO: This mutation should also be applied to other targets other than 230 // PPC, after backend supports IEEE 128-bit style libcalls. 231 // FreeBSD's powerpc64le has a single IEEE-128 long double format and uses 232 // the unsuffixed libm names, so skip the IEEE-128 libcall redirection 233 // there; other PPC64 IEEE-128 targets keep it. 234 if (getTriple().isPPC64() && !getTriple().isOSFreeBSD() && 235 &getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad() && 236 F128Builtins.contains(BuiltinID)) 237 Name = F128Builtins[BuiltinID]; 238 else if (getTriple().isOSAIX() && 239 &getTarget().getLongDoubleFormat() == 240 &llvm::APFloat::IEEEdouble() && 241 AIXLongDouble64Builtins.contains(BuiltinID)) 242 Name = AIXLongDouble64Builtins[BuiltinID]; 243 else 244 Name = Context.BuiltinInfo.getName(BuiltinID).substr(10); 245 } 246 247 llvm::FunctionType *Ty = 248 cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType())); 249 250 return GetOrCreateLLVMFunction(Name, Ty, D, /*ForVTable=*/false); 251 } 252 253 /// Emit the conversions required to turn the given value into an 254 /// integer of the given size. 255 Value *EmitToInt(CodeGenFunction &CGF, llvm::Value *V, 256 QualType T, llvm::IntegerType *IntType) { 257 V = CGF.EmitToMemory(V, T); 258 259 if (V->getType()->isPointerTy()) 260 return CGF.Builder.CreatePtrToInt(V, IntType); 261 262 assert(V->getType() == IntType); 263 return V; 264 } 265 266 Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V, 267 QualType T, llvm::Type *ResultType) { 268 V = CGF.EmitFromMemory(V, T); 269 270 if (ResultType->isPointerTy()) 271 return CGF.Builder.CreateIntToPtr(V, ResultType); 272 273 assert(V->getType() == ResultType); 274 return V; 275 } 276 277 Address CheckAtomicAlignment(CodeGenFunction &CGF, const CallExpr *E) { 278 ASTContext &Ctx = CGF.getContext(); 279 Address Ptr = CGF.EmitPointerWithAlignment(E->getArg(0)); 280 const llvm::DataLayout &DL = CGF.CGM.getDataLayout(); 281 unsigned Bytes = Ptr.getElementType()->isPointerTy() 282 ? Ctx.getTypeSizeInChars(Ctx.VoidPtrTy).getQuantity() 283 : DL.getTypeStoreSize(Ptr.getElementType()); 284 unsigned Align = Ptr.getAlignment().getQuantity(); 285 if (Align % Bytes != 0) { 286 DiagnosticsEngine &Diags = CGF.CGM.getDiags(); 287 Diags.Report(E->getBeginLoc(), diag::warn_sync_op_misaligned); 288 // Force address to be at least naturally-aligned. 289 return Ptr.withAlignment(CharUnits::fromQuantity(Bytes)); 290 } 291 return Ptr; 292 } 293 294 /// Utility to insert an atomic instruction based on Intrinsic::ID 295 /// and the expression node. 296 Value *MakeBinaryAtomicValue( 297 CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E, 298 AtomicOrdering Ordering) { 299 300 QualType T = E->getType(); 301 assert(E->getArg(0)->getType()->isPointerType()); 302 assert(CGF.getContext().hasSameUnqualifiedType(T, 303 E->getArg(0)->getType()->getPointeeType())); 304 assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType())); 305 306 Address DestAddr = CheckAtomicAlignment(CGF, E); 307 308 llvm::IntegerType *IntType = llvm::IntegerType::get( 309 CGF.getLLVMContext(), CGF.getContext().getTypeSize(T)); 310 311 llvm::Value *Val = CGF.EmitScalarExpr(E->getArg(1)); 312 llvm::Type *ValueType = Val->getType(); 313 Val = EmitToInt(CGF, Val, T, IntType); 314 315 llvm::Value *Result = 316 CGF.Builder.CreateAtomicRMW(Kind, DestAddr, Val, Ordering); 317 return EmitFromInt(CGF, Result, T, ValueType); 318 } 319 320 static Value *EmitNontemporalStore(CodeGenFunction &CGF, const CallExpr *E) { 321 Value *Val = CGF.EmitScalarExpr(E->getArg(0)); 322 Address Addr = CGF.EmitPointerWithAlignment(E->getArg(1)); 323 324 Val = CGF.EmitToMemory(Val, E->getArg(0)->getType()); 325 LValue LV = CGF.MakeAddrLValue(Addr, E->getArg(0)->getType()); 326 LV.setNontemporal(true); 327 CGF.EmitStoreOfScalar(Val, LV, false); 328 return nullptr; 329 } 330 331 static Value *EmitNontemporalLoad(CodeGenFunction &CGF, const CallExpr *E) { 332 Address Addr = CGF.EmitPointerWithAlignment(E->getArg(0)); 333 334 LValue LV = CGF.MakeAddrLValue(Addr, E->getType()); 335 LV.setNontemporal(true); 336 return CGF.EmitLoadOfScalar(LV, E->getExprLoc()); 337 } 338 339 static RValue EmitBinaryAtomic(CodeGenFunction &CGF, 340 llvm::AtomicRMWInst::BinOp Kind, 341 const CallExpr *E) { 342 return RValue::get(MakeBinaryAtomicValue(CGF, Kind, E)); 343 } 344 345 /// Utility to insert an atomic instruction based Intrinsic::ID and 346 /// the expression node, where the return value is the result of the 347 /// operation. 348 static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF, 349 llvm::AtomicRMWInst::BinOp Kind, 350 const CallExpr *E, 351 Instruction::BinaryOps Op, 352 bool Invert = false) { 353 QualType T = E->getType(); 354 assert(E->getArg(0)->getType()->isPointerType()); 355 assert(CGF.getContext().hasSameUnqualifiedType(T, 356 E->getArg(0)->getType()->getPointeeType())); 357 assert(CGF.getContext().hasSameUnqualifiedType(T, E->getArg(1)->getType())); 358 359 Address DestAddr = CheckAtomicAlignment(CGF, E); 360 361 llvm::IntegerType *IntType = llvm::IntegerType::get( 362 CGF.getLLVMContext(), CGF.getContext().getTypeSize(T)); 363 364 llvm::Value *Val = CGF.EmitScalarExpr(E->getArg(1)); 365 llvm::Type *ValueType = Val->getType(); 366 Val = EmitToInt(CGF, Val, T, IntType); 367 368 llvm::Value *Result = CGF.Builder.CreateAtomicRMW( 369 Kind, DestAddr, Val, llvm::AtomicOrdering::SequentiallyConsistent); 370 Result = CGF.Builder.CreateBinOp(Op, Result, Val); 371 if (Invert) 372 Result = 373 CGF.Builder.CreateBinOp(llvm::Instruction::Xor, Result, 374 llvm::ConstantInt::getAllOnesValue(IntType)); 375 Result = EmitFromInt(CGF, Result, T, ValueType); 376 return RValue::get(Result); 377 } 378 379 /// Utility to insert an atomic cmpxchg instruction. 380 /// 381 /// @param CGF The current codegen function. 382 /// @param E Builtin call expression to convert to cmpxchg. 383 /// arg0 - address to operate on 384 /// arg1 - value to compare with 385 /// arg2 - new value 386 /// @param ReturnBool Specifies whether to return success flag of 387 /// cmpxchg result or the old value. 388 /// 389 /// @returns result of cmpxchg, according to ReturnBool 390 /// 391 /// Note: In order to lower Microsoft's _InterlockedCompareExchange* intrinsics 392 /// invoke the function EmitAtomicCmpXchgForMSIntrin. 393 Value *MakeAtomicCmpXchgValue(CodeGenFunction &CGF, const CallExpr *E, 394 bool ReturnBool) { 395 QualType T = ReturnBool ? E->getArg(1)->getType() : E->getType(); 396 Address DestAddr = CheckAtomicAlignment(CGF, E); 397 398 llvm::IntegerType *IntType = llvm::IntegerType::get( 399 CGF.getLLVMContext(), CGF.getContext().getTypeSize(T)); 400 401 Value *Cmp = CGF.EmitScalarExpr(E->getArg(1)); 402 llvm::Type *ValueType = Cmp->getType(); 403 Cmp = EmitToInt(CGF, Cmp, T, IntType); 404 Value *New = EmitToInt(CGF, CGF.EmitScalarExpr(E->getArg(2)), T, IntType); 405 406 Value *Pair = CGF.Builder.CreateAtomicCmpXchg( 407 DestAddr, Cmp, New, llvm::AtomicOrdering::SequentiallyConsistent, 408 llvm::AtomicOrdering::SequentiallyConsistent); 409 if (ReturnBool) 410 // Extract boolean success flag and zext it to int. 411 return CGF.Builder.CreateZExt(CGF.Builder.CreateExtractValue(Pair, 1), 412 CGF.ConvertType(E->getType())); 413 else 414 // Extract old value and emit it using the same type as compare value. 415 return EmitFromInt(CGF, CGF.Builder.CreateExtractValue(Pair, 0), T, 416 ValueType); 417 } 418 419 /// This function should be invoked to emit atomic cmpxchg for Microsoft's 420 /// _InterlockedCompareExchange* intrinsics which have the following signature: 421 /// T _InterlockedCompareExchange(T volatile *Destination, 422 /// T Exchange, 423 /// T Comparand); 424 /// 425 /// Whereas the llvm 'cmpxchg' instruction has the following syntax: 426 /// cmpxchg *Destination, Comparand, Exchange. 427 /// So we need to swap Comparand and Exchange when invoking 428 /// CreateAtomicCmpXchg. That is the reason we could not use the above utility 429 /// function MakeAtomicCmpXchgValue since it expects the arguments to be 430 /// already swapped. 431 432 static 433 Value *EmitAtomicCmpXchgForMSIntrin(CodeGenFunction &CGF, const CallExpr *E, 434 AtomicOrdering SuccessOrdering = AtomicOrdering::SequentiallyConsistent) { 435 assert(E->getArg(0)->getType()->isPointerType()); 436 assert(CGF.getContext().hasSameUnqualifiedType( 437 E->getType(), E->getArg(0)->getType()->getPointeeType())); 438 assert(CGF.getContext().hasSameUnqualifiedType(E->getType(), 439 E->getArg(1)->getType())); 440 assert(CGF.getContext().hasSameUnqualifiedType(E->getType(), 441 E->getArg(2)->getType())); 442 443 Address DestAddr = CheckAtomicAlignment(CGF, E); 444 445 auto *Exchange = CGF.EmitScalarExpr(E->getArg(1)); 446 auto *RTy = Exchange->getType(); 447 448 auto *Comparand = CGF.EmitScalarExpr(E->getArg(2)); 449 450 if (RTy->isPointerTy()) { 451 Exchange = CGF.Builder.CreatePtrToInt(Exchange, CGF.IntPtrTy); 452 Comparand = CGF.Builder.CreatePtrToInt(Comparand, CGF.IntPtrTy); 453 } 454 455 // For Release ordering, the failure ordering should be Monotonic. 456 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release ? 457 AtomicOrdering::Monotonic : 458 SuccessOrdering; 459 460 // The atomic instruction is marked volatile for consistency with MSVC. This 461 // blocks the few atomics optimizations that LLVM has. If we want to optimize 462 // _Interlocked* operations in the future, we will have to remove the volatile 463 // marker. 464 auto *CmpXchg = CGF.Builder.CreateAtomicCmpXchg( 465 DestAddr, Comparand, Exchange, SuccessOrdering, FailureOrdering); 466 CmpXchg->setVolatile(true); 467 468 auto *Result = CGF.Builder.CreateExtractValue(CmpXchg, 0); 469 if (RTy->isPointerTy()) { 470 Result = CGF.Builder.CreateIntToPtr(Result, RTy); 471 } 472 473 return Result; 474 } 475 476 // 64-bit Microsoft platforms support 128 bit cmpxchg operations. They are 477 // prototyped like this: 478 // 479 // unsigned char _InterlockedCompareExchange128...( 480 // __int64 volatile * _Destination, 481 // __int64 _ExchangeHigh, 482 // __int64 _ExchangeLow, 483 // __int64 * _ComparandResult); 484 // 485 // Note that Destination is assumed to be at least 16-byte aligned, despite 486 // being typed int64. 487 488 static Value *EmitAtomicCmpXchg128ForMSIntrin(CodeGenFunction &CGF, 489 const CallExpr *E, 490 AtomicOrdering SuccessOrdering) { 491 assert(E->getNumArgs() == 4); 492 llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0)); 493 llvm::Value *ExchangeHigh = CGF.EmitScalarExpr(E->getArg(1)); 494 llvm::Value *ExchangeLow = CGF.EmitScalarExpr(E->getArg(2)); 495 Address ComparandAddr = CGF.EmitPointerWithAlignment(E->getArg(3)); 496 497 assert(DestPtr->getType()->isPointerTy()); 498 assert(!ExchangeHigh->getType()->isPointerTy()); 499 assert(!ExchangeLow->getType()->isPointerTy()); 500 501 // For Release ordering, the failure ordering should be Monotonic. 502 auto FailureOrdering = SuccessOrdering == AtomicOrdering::Release 503 ? AtomicOrdering::Monotonic 504 : SuccessOrdering; 505 506 // Convert to i128 pointers and values. Alignment is also overridden for 507 // destination pointer. 508 llvm::Type *Int128Ty = llvm::IntegerType::get(CGF.getLLVMContext(), 128); 509 Address DestAddr(DestPtr, Int128Ty, 510 CGF.getContext().toCharUnitsFromBits(128)); 511 ComparandAddr = ComparandAddr.withElementType(Int128Ty); 512 513 // (((i128)hi) << 64) | ((i128)lo) 514 ExchangeHigh = CGF.Builder.CreateZExt(ExchangeHigh, Int128Ty); 515 ExchangeLow = CGF.Builder.CreateZExt(ExchangeLow, Int128Ty); 516 ExchangeHigh = 517 CGF.Builder.CreateShl(ExchangeHigh, llvm::ConstantInt::get(Int128Ty, 64)); 518 llvm::Value *Exchange = CGF.Builder.CreateOr(ExchangeHigh, ExchangeLow); 519 520 // Load the comparand for the instruction. 521 llvm::Value *Comparand = CGF.Builder.CreateLoad(ComparandAddr); 522 523 auto *CXI = CGF.Builder.CreateAtomicCmpXchg(DestAddr, Comparand, Exchange, 524 SuccessOrdering, FailureOrdering); 525 526 // The atomic instruction is marked volatile for consistency with MSVC. This 527 // blocks the few atomics optimizations that LLVM has. If we want to optimize 528 // _Interlocked* operations in the future, we will have to remove the volatile 529 // marker. 530 CXI->setVolatile(true); 531 532 // Store the result as an outparameter. 533 CGF.Builder.CreateStore(CGF.Builder.CreateExtractValue(CXI, 0), 534 ComparandAddr); 535 536 // Get the success boolean and zero extend it to i8. 537 Value *Success = CGF.Builder.CreateExtractValue(CXI, 1); 538 return CGF.Builder.CreateZExt(Success, CGF.Int8Ty); 539 } 540 541 static Value *EmitAtomicIncrementValue(CodeGenFunction &CGF, const CallExpr *E, 542 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) { 543 assert(E->getArg(0)->getType()->isPointerType()); 544 545 auto *IntTy = CGF.ConvertType(E->getType()); 546 Address DestAddr = CheckAtomicAlignment(CGF, E); 547 auto *Result = CGF.Builder.CreateAtomicRMW( 548 AtomicRMWInst::Add, DestAddr, ConstantInt::get(IntTy, 1), Ordering); 549 return CGF.Builder.CreateAdd(Result, ConstantInt::get(IntTy, 1)); 550 } 551 552 static Value *EmitAtomicDecrementValue( 553 CodeGenFunction &CGF, const CallExpr *E, 554 AtomicOrdering Ordering = AtomicOrdering::SequentiallyConsistent) { 555 assert(E->getArg(0)->getType()->isPointerType()); 556 557 auto *IntTy = CGF.ConvertType(E->getType()); 558 Address DestAddr = CheckAtomicAlignment(CGF, E); 559 auto *Result = CGF.Builder.CreateAtomicRMW( 560 AtomicRMWInst::Sub, DestAddr, ConstantInt::get(IntTy, 1), Ordering); 561 return CGF.Builder.CreateSub(Result, ConstantInt::get(IntTy, 1)); 562 } 563 564 // Build a plain volatile load. 565 static Value *EmitISOVolatileLoad(CodeGenFunction &CGF, const CallExpr *E) { 566 Value *Ptr = CGF.EmitScalarExpr(E->getArg(0)); 567 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 568 CharUnits LoadSize = CGF.getContext().getTypeSizeInChars(ElTy); 569 llvm::Type *ITy = 570 llvm::IntegerType::get(CGF.getLLVMContext(), LoadSize.getQuantity() * 8); 571 llvm::LoadInst *Load = CGF.Builder.CreateAlignedLoad(ITy, Ptr, LoadSize); 572 Load->setVolatile(true); 573 return Load; 574 } 575 576 // Build a plain volatile store. 577 static Value *EmitISOVolatileStore(CodeGenFunction &CGF, const CallExpr *E) { 578 Value *Ptr = CGF.EmitScalarExpr(E->getArg(0)); 579 Value *Value = CGF.EmitScalarExpr(E->getArg(1)); 580 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 581 CharUnits StoreSize = CGF.getContext().getTypeSizeInChars(ElTy); 582 llvm::StoreInst *Store = 583 CGF.Builder.CreateAlignedStore(Value, Ptr, StoreSize); 584 Store->setVolatile(true); 585 return Store; 586 } 587 588 // Emit a simple mangled intrinsic that has 1 argument and a return type 589 // matching the argument type. Depending on mode, this may be a constrained 590 // floating-point intrinsic. 591 Value *emitUnaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, 592 const CallExpr *E, unsigned IntrinsicID, 593 unsigned ConstrainedIntrinsicID) { 594 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 595 596 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 597 if (CGF.Builder.getIsFPConstrained()) { 598 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID, Src0->getType()); 599 return CGF.Builder.CreateConstrainedFPCall(F, { Src0 }); 600 } else { 601 Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 602 return CGF.Builder.CreateCall(F, Src0); 603 } 604 } 605 606 // Emit an intrinsic that has 2 operands of the same type as its result. 607 // Depending on mode, this may be a constrained floating-point intrinsic. 608 static Value *emitBinaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, 609 const CallExpr *E, unsigned IntrinsicID, 610 unsigned ConstrainedIntrinsicID) { 611 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 612 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 613 614 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 615 if (CGF.Builder.getIsFPConstrained()) { 616 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID, Src0->getType()); 617 return CGF.Builder.CreateConstrainedFPCall(F, { Src0, Src1 }); 618 } else { 619 Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 620 return CGF.Builder.CreateCall(F, { Src0, Src1 }); 621 } 622 } 623 624 // Has second type mangled argument. 625 static Value * 626 emitBinaryExpMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, const CallExpr *E, 627 Intrinsic::ID IntrinsicID, 628 Intrinsic::ID ConstrainedIntrinsicID) { 629 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 630 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 631 632 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 633 if (CGF.Builder.getIsFPConstrained()) { 634 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID, 635 {Src0->getType(), Src1->getType()}); 636 return CGF.Builder.CreateConstrainedFPCall(F, {Src0, Src1}); 637 } 638 639 Function *F = 640 CGF.CGM.getIntrinsic(IntrinsicID, {Src0->getType(), Src1->getType()}); 641 return CGF.Builder.CreateCall(F, {Src0, Src1}); 642 } 643 644 // Emit an intrinsic that has 3 operands of the same type as its result. 645 // Depending on mode, this may be a constrained floating-point intrinsic. 646 static Value *emitTernaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF, 647 const CallExpr *E, unsigned IntrinsicID, 648 unsigned ConstrainedIntrinsicID) { 649 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 650 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 651 llvm::Value *Src2 = CGF.EmitScalarExpr(E->getArg(2)); 652 653 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 654 if (CGF.Builder.getIsFPConstrained()) { 655 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID, Src0->getType()); 656 return CGF.Builder.CreateConstrainedFPCall(F, { Src0, Src1, Src2 }); 657 } else { 658 Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Src0->getType()); 659 return CGF.Builder.CreateCall(F, { Src0, Src1, Src2 }); 660 } 661 } 662 663 // Emit an intrinsic that has overloaded integer result and fp operand. 664 static Value * 665 emitMaybeConstrainedFPToIntRoundBuiltin(CodeGenFunction &CGF, const CallExpr *E, 666 unsigned IntrinsicID, 667 unsigned ConstrainedIntrinsicID) { 668 llvm::Type *ResultType = CGF.ConvertType(E->getType()); 669 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 670 671 if (CGF.Builder.getIsFPConstrained()) { 672 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 673 Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID, 674 {ResultType, Src0->getType()}); 675 return CGF.Builder.CreateConstrainedFPCall(F, {Src0}); 676 } else { 677 Function *F = 678 CGF.CGM.getIntrinsic(IntrinsicID, {ResultType, Src0->getType()}); 679 return CGF.Builder.CreateCall(F, Src0); 680 } 681 } 682 683 static Value *emitFrexpBuiltin(CodeGenFunction &CGF, const CallExpr *E, 684 Intrinsic::ID IntrinsicID) { 685 llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0)); 686 llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1)); 687 688 QualType IntPtrTy = E->getArg(1)->getType()->getPointeeType(); 689 llvm::Type *IntTy = CGF.ConvertType(IntPtrTy); 690 llvm::Function *F = 691 CGF.CGM.getIntrinsic(IntrinsicID, {Src0->getType(), IntTy}); 692 llvm::Value *Call = CGF.Builder.CreateCall(F, Src0); 693 694 llvm::Value *Exp = CGF.Builder.CreateExtractValue(Call, 1); 695 LValue LV = CGF.MakeNaturalAlignAddrLValue(Src1, IntPtrTy); 696 CGF.EmitStoreOfScalar(Exp, LV); 697 698 return CGF.Builder.CreateExtractValue(Call, 0); 699 } 700 701 static void emitSincosBuiltin(CodeGenFunction &CGF, const CallExpr *E, 702 Intrinsic::ID IntrinsicID) { 703 llvm::Value *Val = CGF.EmitScalarExpr(E->getArg(0)); 704 llvm::Value *Dest0 = CGF.EmitScalarExpr(E->getArg(1)); 705 llvm::Value *Dest1 = CGF.EmitScalarExpr(E->getArg(2)); 706 707 llvm::Function *F = CGF.CGM.getIntrinsic(IntrinsicID, {Val->getType()}); 708 llvm::Value *Call = CGF.Builder.CreateCall(F, Val); 709 710 llvm::Value *SinResult = CGF.Builder.CreateExtractValue(Call, 0); 711 llvm::Value *CosResult = CGF.Builder.CreateExtractValue(Call, 1); 712 713 QualType DestPtrType = E->getArg(1)->getType()->getPointeeType(); 714 LValue SinLV = CGF.MakeNaturalAlignAddrLValue(Dest0, DestPtrType); 715 LValue CosLV = CGF.MakeNaturalAlignAddrLValue(Dest1, DestPtrType); 716 717 llvm::StoreInst *StoreSin = 718 CGF.Builder.CreateStore(SinResult, SinLV.getAddress()); 719 llvm::StoreInst *StoreCos = 720 CGF.Builder.CreateStore(CosResult, CosLV.getAddress()); 721 722 // Mark the two stores as non-aliasing with each other. The order of stores 723 // emitted by this builtin is arbitrary, enforcing a particular order will 724 // prevent optimizations later on. 725 llvm::MDBuilder MDHelper(CGF.getLLVMContext()); 726 MDNode *Domain = MDHelper.createAnonymousAliasScopeDomain(); 727 MDNode *AliasScope = MDHelper.createAnonymousAliasScope(Domain); 728 MDNode *AliasScopeList = MDNode::get(Call->getContext(), AliasScope); 729 StoreSin->setMetadata(LLVMContext::MD_alias_scope, AliasScopeList); 730 StoreCos->setMetadata(LLVMContext::MD_noalias, AliasScopeList); 731 } 732 733 static llvm::Value *emitModfBuiltin(CodeGenFunction &CGF, const CallExpr *E, 734 Intrinsic::ID IntrinsicID) { 735 llvm::Value *Val = CGF.EmitScalarExpr(E->getArg(0)); 736 llvm::Value *IntPartDest = CGF.EmitScalarExpr(E->getArg(1)); 737 738 llvm::Value *Call = 739 CGF.Builder.CreateIntrinsic(IntrinsicID, {Val->getType()}, Val); 740 741 llvm::Value *FractionalResult = CGF.Builder.CreateExtractValue(Call, 0); 742 llvm::Value *IntegralResult = CGF.Builder.CreateExtractValue(Call, 1); 743 744 QualType DestPtrType = E->getArg(1)->getType()->getPointeeType(); 745 LValue IntegralLV = CGF.MakeNaturalAlignAddrLValue(IntPartDest, DestPtrType); 746 CGF.EmitStoreOfScalar(IntegralResult, IntegralLV); 747 748 return FractionalResult; 749 } 750 751 /// EmitFAbs - Emit a call to @llvm.fabs(). 752 static Value *EmitFAbs(CodeGenFunction &CGF, Value *V) { 753 Function *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType()); 754 llvm::CallInst *Call = CGF.Builder.CreateCall(F, V); 755 Call->setDoesNotAccessMemory(); 756 return Call; 757 } 758 759 /// Emit the computation of the sign bit for a floating point value. Returns 760 /// the i1 sign bit value. 761 static Value *EmitSignBit(CodeGenFunction &CGF, Value *V) { 762 LLVMContext &C = CGF.CGM.getLLVMContext(); 763 764 llvm::Type *Ty = V->getType(); 765 int Width = Ty->getPrimitiveSizeInBits(); 766 llvm::Type *IntTy = llvm::IntegerType::get(C, Width); 767 V = CGF.Builder.CreateBitCast(V, IntTy); 768 if (Ty->isPPC_FP128Ty()) { 769 // We want the sign bit of the higher-order double. The bitcast we just 770 // did works as if the double-double was stored to memory and then 771 // read as an i128. The "store" will put the higher-order double in the 772 // lower address in both little- and big-Endian modes, but the "load" 773 // will treat those bits as a different part of the i128: the low bits in 774 // little-Endian, the high bits in big-Endian. Therefore, on big-Endian 775 // we need to shift the high bits down to the low before truncating. 776 Width >>= 1; 777 if (CGF.getTarget().isBigEndian()) { 778 Value *ShiftCst = llvm::ConstantInt::get(IntTy, Width); 779 V = CGF.Builder.CreateLShr(V, ShiftCst); 780 } 781 // We are truncating value in order to extract the higher-order 782 // double, which we will be using to extract the sign from. 783 IntTy = llvm::IntegerType::get(C, Width); 784 V = CGF.Builder.CreateTrunc(V, IntTy); 785 } 786 Value *Zero = llvm::Constant::getNullValue(IntTy); 787 return CGF.Builder.CreateICmpSLT(V, Zero); 788 } 789 790 /// Checks no arguments or results are passed indirectly in the ABI (i.e. via a 791 /// hidden pointer). This is used to check annotating FP libcalls (that could 792 /// set `errno`) with "int" TBAA metadata is safe. If any floating-point 793 /// arguments are passed indirectly, setup for the call could be incorrectly 794 /// optimized out. 795 static bool HasNoIndirectArgumentsOrResults(CGFunctionInfo const &FnInfo) { 796 auto IsIndirect = [&](ABIArgInfo const &info) { 797 return info.isIndirect() || info.isIndirectAliased() || info.isInAlloca(); 798 }; 799 return !IsIndirect(FnInfo.getReturnInfo()) && 800 llvm::none_of(FnInfo.arguments(), 801 [&](CGFunctionInfoArgInfo const &ArgInfo) { 802 return IsIndirect(ArgInfo.info); 803 }); 804 } 805 806 static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl *FD, 807 const CallExpr *E, llvm::Constant *calleeValue) { 808 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E); 809 CGCallee callee = CGCallee::forDirect(calleeValue, GlobalDecl(FD)); 810 llvm::CallBase *callOrInvoke = nullptr; 811 CGFunctionInfo const *FnInfo = nullptr; 812 RValue Call = 813 CGF.EmitCall(E->getCallee()->getType(), callee, E, ReturnValueSlot(), 814 /*Chain=*/nullptr, &callOrInvoke, &FnInfo); 815 816 if (unsigned BuiltinID = FD->getBuiltinID()) { 817 // Check whether a FP math builtin function, such as BI__builtin_expf 818 ASTContext &Context = CGF.getContext(); 819 bool ConstWithoutErrnoAndExceptions = 820 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID); 821 // Restrict to target with errno, for example, MacOS doesn't set errno. 822 // TODO: Support builtin function with complex type returned, eg: cacosh 823 if (ConstWithoutErrnoAndExceptions && CGF.CGM.getLangOpts().MathErrno && 824 !CGF.Builder.getIsFPConstrained() && Call.isScalar() && 825 HasNoIndirectArgumentsOrResults(*FnInfo)) { 826 // Emit "int" TBAA metadata on FP math libcalls. 827 clang::QualType IntTy = Context.IntTy; 828 TBAAAccessInfo TBAAInfo = CGF.CGM.getTBAAAccessInfo(IntTy); 829 CGF.CGM.DecorateInstructionWithTBAA(callOrInvoke, TBAAInfo); 830 } 831 } 832 return Call; 833 } 834 835 /// Emit a call to llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* 836 /// depending on IntrinsicID. 837 /// 838 /// \arg CGF The current codegen function. 839 /// \arg IntrinsicID The ID for the Intrinsic we wish to generate. 840 /// \arg X The first argument to the llvm.*.with.overflow.*. 841 /// \arg Y The second argument to the llvm.*.with.overflow.*. 842 /// \arg Carry The carry returned by the llvm.*.with.overflow.*. 843 /// \returns The result (i.e. sum/product) returned by the intrinsic. 844 llvm::Value *EmitOverflowIntrinsic(CodeGenFunction &CGF, 845 const Intrinsic::ID IntrinsicID, 846 llvm::Value *X, llvm::Value *Y, 847 llvm::Value *&Carry) { 848 // Make sure we have integers of the same width. 849 assert(X->getType() == Y->getType() && 850 "Arguments must be the same type. (Did you forget to make sure both " 851 "arguments have the same integer width?)"); 852 853 Function *Callee = CGF.CGM.getIntrinsic(IntrinsicID, X->getType()); 854 llvm::Value *Tmp = CGF.Builder.CreateCall(Callee, {X, Y}); 855 Carry = CGF.Builder.CreateExtractValue(Tmp, 1); 856 return CGF.Builder.CreateExtractValue(Tmp, 0); 857 } 858 859 namespace { 860 struct WidthAndSignedness { 861 unsigned Width; 862 bool Signed; 863 }; 864 } 865 866 static WidthAndSignedness 867 getIntegerWidthAndSignedness(const clang::ASTContext &context, 868 const clang::QualType Type) { 869 assert(Type->isIntegerType() && "Given type is not an integer."); 870 unsigned Width = context.getIntWidth(Type); 871 bool Signed = Type->isSignedIntegerType(); 872 return {Width, Signed}; 873 } 874 875 // Given one or more integer types, this function produces an integer type that 876 // encompasses them: any value in one of the given types could be expressed in 877 // the encompassing type. 878 static struct WidthAndSignedness 879 EncompassingIntegerType(ArrayRef<struct WidthAndSignedness> Types) { 880 assert(Types.size() > 0 && "Empty list of types."); 881 882 // If any of the given types is signed, we must return a signed type. 883 bool Signed = false; 884 for (const auto &Type : Types) { 885 Signed |= Type.Signed; 886 } 887 888 // The encompassing type must have a width greater than or equal to the width 889 // of the specified types. Additionally, if the encompassing type is signed, 890 // its width must be strictly greater than the width of any unsigned types 891 // given. 892 unsigned Width = 0; 893 for (const auto &Type : Types) { 894 unsigned MinWidth = Type.Width + (Signed && !Type.Signed); 895 if (Width < MinWidth) { 896 Width = MinWidth; 897 } 898 } 899 900 return {Width, Signed}; 901 } 902 903 Value *CodeGenFunction::EmitVAStartEnd(Value *ArgValue, bool IsStart) { 904 Intrinsic::ID inst = IsStart ? Intrinsic::vastart : Intrinsic::vaend; 905 return Builder.CreateCall(CGM.getIntrinsic(inst, {ArgValue->getType()}), 906 ArgValue); 907 } 908 909 /// Checks if using the result of __builtin_object_size(p, @p From) in place of 910 /// __builtin_object_size(p, @p To) is correct 911 static bool areBOSTypesCompatible(int From, int To) { 912 // Note: Our __builtin_object_size implementation currently treats Type=0 and 913 // Type=2 identically. Encoding this implementation detail here may make 914 // improving __builtin_object_size difficult in the future, so it's omitted. 915 return From == To || (From == 0 && To == 1) || (From == 3 && To == 2); 916 } 917 918 static llvm::Value * 919 getDefaultBuiltinObjectSizeResult(unsigned Type, llvm::IntegerType *ResType) { 920 return ConstantInt::get(ResType, (Type & 2) ? 0 : -1, /*isSigned=*/true); 921 } 922 923 llvm::Value * 924 CodeGenFunction::evaluateOrEmitBuiltinObjectSize(const Expr *E, unsigned Type, 925 llvm::IntegerType *ResType, 926 llvm::Value *EmittedE, 927 bool IsDynamic) { 928 uint64_t ObjectSize; 929 if (!E->tryEvaluateObjectSize(ObjectSize, getContext(), Type)) 930 return emitBuiltinObjectSize(E, Type, ResType, EmittedE, IsDynamic); 931 return ConstantInt::get(ResType, ObjectSize, /*isSigned=*/true); 932 } 933 934 namespace { 935 936 /// StructFieldAccess is a simple visitor class to grab the first MemberExpr 937 /// from an Expr. It records any ArraySubscriptExpr we meet along the way. 938 class StructFieldAccess 939 : public ConstStmtVisitor<StructFieldAccess, const Expr *> { 940 bool AddrOfSeen = false; 941 942 public: 943 const Expr *ArrayIndex = nullptr; 944 QualType ArrayElementTy; 945 946 const Expr *VisitMemberExpr(const MemberExpr *E) { 947 if (AddrOfSeen && E->getType()->isArrayType()) 948 // Avoid forms like '&ptr->array'. 949 return nullptr; 950 return E; 951 } 952 953 const Expr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { 954 if (ArrayIndex) 955 // We don't support multiple subscripts. 956 return nullptr; 957 958 AddrOfSeen = false; // '&ptr->array[idx]' is okay. 959 ArrayIndex = E->getIdx(); 960 ArrayElementTy = E->getBase()->getType(); 961 return Visit(E->getBase()); 962 } 963 const Expr *VisitCastExpr(const CastExpr *E) { 964 if (E->getCastKind() == CK_LValueToRValue) 965 return E; 966 return Visit(E->getSubExpr()); 967 } 968 const Expr *VisitParenExpr(const ParenExpr *E) { 969 return Visit(E->getSubExpr()); 970 } 971 const Expr *VisitUnaryAddrOf(const clang::UnaryOperator *E) { 972 AddrOfSeen = true; 973 return Visit(E->getSubExpr()); 974 } 975 const Expr *VisitUnaryDeref(const clang::UnaryOperator *E) { 976 AddrOfSeen = false; 977 return Visit(E->getSubExpr()); 978 } 979 }; 980 981 } // end anonymous namespace 982 983 /// Find a struct's flexible array member. It may be embedded inside multiple 984 /// sub-structs, but must still be the last field. 985 static const FieldDecl *FindFlexibleArrayMemberField(CodeGenFunction &CGF, 986 ASTContext &Ctx, 987 const RecordDecl *RD) { 988 const LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel = 989 CGF.getLangOpts().getStrictFlexArraysLevel(); 990 991 if (RD->isImplicit()) 992 return nullptr; 993 994 for (const FieldDecl *FD : RD->fields()) { 995 if (Decl::isFlexibleArrayMemberLike( 996 Ctx, FD, FD->getType(), StrictFlexArraysLevel, 997 /*IgnoreTemplateOrMacroSubstitution=*/true)) 998 return FD; 999 1000 if (auto RT = FD->getType()->getAs<RecordType>()) 1001 if (const FieldDecl *FD = 1002 FindFlexibleArrayMemberField(CGF, Ctx, RT->getAsRecordDecl())) 1003 return FD; 1004 } 1005 1006 return nullptr; 1007 } 1008 1009 /// Calculate the offset of a struct field. It may be embedded inside multiple 1010 /// sub-structs. 1011 static bool GetFieldOffset(ASTContext &Ctx, const RecordDecl *RD, 1012 const FieldDecl *FD, int64_t &Offset) { 1013 if (RD->isImplicit()) 1014 return false; 1015 1016 // Keep track of the field number ourselves, because the other methods 1017 // (CGRecordLayout::getLLVMFieldNo) aren't always equivalent to how the AST 1018 // is laid out. 1019 uint32_t FieldNo = 0; 1020 const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD); 1021 1022 for (const FieldDecl *Field : RD->fields()) { 1023 if (Field == FD) { 1024 Offset += Layout.getFieldOffset(FieldNo); 1025 return true; 1026 } 1027 1028 if (auto RT = Field->getType()->getAs<RecordType>()) { 1029 if (GetFieldOffset(Ctx, RT->getAsRecordDecl(), FD, Offset)) { 1030 Offset += Layout.getFieldOffset(FieldNo); 1031 return true; 1032 } 1033 } 1034 1035 if (!RD->isUnion()) 1036 ++FieldNo; 1037 } 1038 1039 return false; 1040 } 1041 1042 static std::optional<int64_t> 1043 GetFieldOffset(ASTContext &Ctx, const RecordDecl *RD, const FieldDecl *FD) { 1044 int64_t Offset = 0; 1045 1046 if (GetFieldOffset(Ctx, RD, FD, Offset)) 1047 return std::optional<int64_t>(Offset); 1048 1049 return std::nullopt; 1050 } 1051 1052 llvm::Value *CodeGenFunction::emitCountedBySize(const Expr *E, 1053 llvm::Value *EmittedE, 1054 unsigned Type, 1055 llvm::IntegerType *ResType) { 1056 // Note: If the whole struct is specificed in the __bdos (i.e. Visitor 1057 // returns a DeclRefExpr). The calculation of the whole size of the structure 1058 // with a flexible array member can be done in two ways: 1059 // 1060 // 1) sizeof(struct S) + count * sizeof(typeof(fam)) 1061 // 2) offsetof(struct S, fam) + count * sizeof(typeof(fam)) 1062 // 1063 // The first will add additional padding after the end of the array 1064 // allocation while the second method is more precise, but not quite expected 1065 // from programmers. See 1066 // https://lore.kernel.org/lkml/ZvV6X5FPBBW7CO1f@archlinux/ for a discussion 1067 // of the topic. 1068 // 1069 // GCC isn't (currently) able to calculate __bdos on a pointer to the whole 1070 // structure. Therefore, because of the above issue, we choose to match what 1071 // GCC does for consistency's sake. 1072 1073 StructFieldAccess Visitor; 1074 E = Visitor.Visit(E); 1075 if (!E) 1076 return nullptr; 1077 1078 const Expr *Idx = Visitor.ArrayIndex; 1079 if (Idx) { 1080 if (Idx->HasSideEffects(getContext())) 1081 // We can't have side-effects. 1082 return getDefaultBuiltinObjectSizeResult(Type, ResType); 1083 1084 if (const auto *IL = dyn_cast<IntegerLiteral>(Idx)) { 1085 int64_t Val = IL->getValue().getSExtValue(); 1086 if (Val < 0) 1087 return getDefaultBuiltinObjectSizeResult(Type, ResType); 1088 1089 // The index is 0, so we don't need to take it into account. 1090 if (Val == 0) 1091 Idx = nullptr; 1092 } 1093 } 1094 1095 // __counted_by on either a flexible array member or a pointer into a struct 1096 // with a flexible array member. 1097 if (const auto *ME = dyn_cast<MemberExpr>(E)) 1098 return emitCountedByMemberSize(ME, Idx, EmittedE, Visitor.ArrayElementTy, 1099 Type, ResType); 1100 1101 // __counted_by on a pointer in a struct. 1102 if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E); 1103 ICE && ICE->getCastKind() == CK_LValueToRValue) 1104 return emitCountedByPointerSize(ICE, Idx, EmittedE, Visitor.ArrayElementTy, 1105 Type, ResType); 1106 1107 return nullptr; 1108 } 1109 1110 static llvm::Value *EmitPositiveResultOrZero(CodeGenFunction &CGF, 1111 llvm::Value *Res, 1112 llvm::Value *Index, 1113 llvm::IntegerType *ResType, 1114 bool IsSigned) { 1115 // cmp = (array_size >= 0) 1116 Value *Cmp = CGF.Builder.CreateIsNotNeg(Res); 1117 if (Index) 1118 // cmp = (cmp && index >= 0) 1119 Cmp = CGF.Builder.CreateAnd(CGF.Builder.CreateIsNotNeg(Index), Cmp); 1120 1121 // return cmp ? result : 0 1122 return CGF.Builder.CreateSelect(Cmp, Res, 1123 ConstantInt::get(ResType, 0, IsSigned)); 1124 } 1125 1126 static std::pair<llvm::Value *, llvm::Value *> 1127 GetCountFieldAndIndex(CodeGenFunction &CGF, const MemberExpr *ME, 1128 const FieldDecl *ArrayFD, const FieldDecl *CountFD, 1129 const Expr *Idx, llvm::IntegerType *ResType, 1130 bool IsSigned) { 1131 // count = ptr->count; 1132 Value *Count = CGF.EmitLoadOfCountedByField(ME, ArrayFD, CountFD); 1133 if (!Count) 1134 return std::make_pair<Value *>(nullptr, nullptr); 1135 Count = CGF.Builder.CreateIntCast(Count, ResType, IsSigned, "count"); 1136 1137 // index = ptr->index; 1138 Value *Index = nullptr; 1139 if (Idx) { 1140 bool IdxSigned = Idx->getType()->isSignedIntegerType(); 1141 Index = CGF.EmitScalarExpr(Idx); 1142 Index = CGF.Builder.CreateIntCast(Index, ResType, IdxSigned, "index"); 1143 } 1144 1145 return std::make_pair(Count, Index); 1146 } 1147 1148 llvm::Value *CodeGenFunction::emitCountedByPointerSize( 1149 const ImplicitCastExpr *E, const Expr *Idx, llvm::Value *EmittedE, 1150 QualType CastedArrayElementTy, unsigned Type, llvm::IntegerType *ResType) { 1151 assert(E->getCastKind() == CK_LValueToRValue && 1152 "must be an LValue to RValue cast"); 1153 1154 const MemberExpr *ME = dyn_cast<MemberExpr>(E->getSubExpr()); 1155 if (!ME) 1156 return nullptr; 1157 1158 const auto *ArrayBaseFD = dyn_cast<FieldDecl>(ME->getMemberDecl()); 1159 if (!ArrayBaseFD || !ArrayBaseFD->getType()->isPointerType() || 1160 !ArrayBaseFD->getType()->isCountAttributedType()) 1161 return nullptr; 1162 1163 // Get the 'count' FieldDecl. 1164 const FieldDecl *CountFD = ArrayBaseFD->findCountedByField(); 1165 if (!CountFD) 1166 // Can't find the field referenced by the "counted_by" attribute. 1167 return nullptr; 1168 1169 // Calculate the array's object size using these formulae. (Note: if the 1170 // calculation is negative, we return 0.): 1171 // 1172 // struct p; 1173 // struct s { 1174 // /* ... */ 1175 // struct p **array __attribute__((counted_by(count))); 1176 // int count; 1177 // }; 1178 // 1179 // 1) 'ptr->array': 1180 // 1181 // count = ptr->count; 1182 // 1183 // array_element_size = sizeof (*ptr->array); 1184 // array_size = count * array_element_size; 1185 // 1186 // result = array_size; 1187 // 1188 // cmp = (result >= 0) 1189 // return cmp ? result : 0; 1190 // 1191 // 2) '&((cast) ptr->array)[idx]': 1192 // 1193 // count = ptr->count; 1194 // index = idx; 1195 // 1196 // array_element_size = sizeof (*ptr->array); 1197 // array_size = count * array_element_size; 1198 // 1199 // casted_array_element_size = sizeof (*((cast) ptr->array)); 1200 // 1201 // index_size = index * casted_array_element_size; 1202 // result = array_size - index_size; 1203 // 1204 // cmp = (result >= 0) 1205 // if (index) 1206 // cmp = (cmp && index > 0) 1207 // return cmp ? result : 0; 1208 1209 auto GetElementBaseSize = [&](QualType ElementTy) { 1210 CharUnits ElementSize = 1211 getContext().getTypeSizeInChars(ElementTy->getPointeeType()); 1212 1213 if (ElementSize.isZero()) { 1214 // This might be a __sized_by on a 'void *', which counts bytes, not 1215 // elements. 1216 auto *CAT = ElementTy->getAs<CountAttributedType>(); 1217 if (!CAT || (CAT->getKind() != CountAttributedType::SizedBy && 1218 CAT->getKind() != CountAttributedType::SizedByOrNull)) 1219 // Okay, not sure what it is now. 1220 // FIXME: Should this be an assert? 1221 return std::optional<CharUnits>(); 1222 1223 ElementSize = CharUnits::One(); 1224 } 1225 1226 return std::optional<CharUnits>(ElementSize); 1227 }; 1228 1229 // Get the sizes of the original array element and the casted array element, 1230 // if different. 1231 std::optional<CharUnits> ArrayElementBaseSize = 1232 GetElementBaseSize(ArrayBaseFD->getType()); 1233 if (!ArrayElementBaseSize) 1234 return nullptr; 1235 1236 std::optional<CharUnits> CastedArrayElementBaseSize = ArrayElementBaseSize; 1237 if (!CastedArrayElementTy.isNull() && CastedArrayElementTy->isPointerType()) { 1238 CastedArrayElementBaseSize = GetElementBaseSize(CastedArrayElementTy); 1239 if (!CastedArrayElementBaseSize) 1240 return nullptr; 1241 } 1242 1243 bool IsSigned = CountFD->getType()->isSignedIntegerType(); 1244 1245 // count = ptr->count; 1246 // index = ptr->index; 1247 Value *Count, *Index; 1248 std::tie(Count, Index) = GetCountFieldAndIndex( 1249 *this, ME, ArrayBaseFD, CountFD, Idx, ResType, IsSigned); 1250 if (!Count) 1251 return nullptr; 1252 1253 // array_element_size = sizeof (*ptr->array) 1254 auto *ArrayElementSize = llvm::ConstantInt::get( 1255 ResType, ArrayElementBaseSize->getQuantity(), IsSigned); 1256 1257 // casted_array_element_size = sizeof (*((cast) ptr->array)); 1258 auto *CastedArrayElementSize = llvm::ConstantInt::get( 1259 ResType, CastedArrayElementBaseSize->getQuantity(), IsSigned); 1260 1261 // array_size = count * array_element_size; 1262 Value *ArraySize = Builder.CreateMul(Count, ArrayElementSize, "array_size", 1263 !IsSigned, IsSigned); 1264 1265 // Option (1) 'ptr->array' 1266 // result = array_size 1267 Value *Result = ArraySize; 1268 1269 if (Idx) { // Option (2) '&((cast) ptr->array)[idx]' 1270 // index_size = index * casted_array_element_size; 1271 Value *IndexSize = Builder.CreateMul(Index, CastedArrayElementSize, 1272 "index_size", !IsSigned, IsSigned); 1273 1274 // result = result - index_size; 1275 Result = 1276 Builder.CreateSub(Result, IndexSize, "result", !IsSigned, IsSigned); 1277 } 1278 1279 return EmitPositiveResultOrZero(*this, Result, Index, ResType, IsSigned); 1280 } 1281 1282 llvm::Value *CodeGenFunction::emitCountedByMemberSize( 1283 const MemberExpr *ME, const Expr *Idx, llvm::Value *EmittedE, 1284 QualType CastedArrayElementTy, unsigned Type, llvm::IntegerType *ResType) { 1285 const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl()); 1286 if (!FD) 1287 return nullptr; 1288 1289 // Find the flexible array member and check that it has the __counted_by 1290 // attribute. 1291 ASTContext &Ctx = getContext(); 1292 const RecordDecl *RD = FD->getDeclContext()->getOuterLexicalRecordContext(); 1293 const FieldDecl *FlexibleArrayMemberFD = nullptr; 1294 1295 if (Decl::isFlexibleArrayMemberLike( 1296 Ctx, FD, FD->getType(), getLangOpts().getStrictFlexArraysLevel(), 1297 /*IgnoreTemplateOrMacroSubstitution=*/true)) 1298 FlexibleArrayMemberFD = FD; 1299 else 1300 FlexibleArrayMemberFD = FindFlexibleArrayMemberField(*this, Ctx, RD); 1301 1302 if (!FlexibleArrayMemberFD || 1303 !FlexibleArrayMemberFD->getType()->isCountAttributedType()) 1304 return nullptr; 1305 1306 // Get the 'count' FieldDecl. 1307 const FieldDecl *CountFD = FlexibleArrayMemberFD->findCountedByField(); 1308 if (!CountFD) 1309 // Can't find the field referenced by the "counted_by" attribute. 1310 return nullptr; 1311 1312 // Calculate the flexible array member's object size using these formulae. 1313 // (Note: if the calculation is negative, we return 0.): 1314 // 1315 // struct p; 1316 // struct s { 1317 // /* ... */ 1318 // int count; 1319 // struct p *array[] __attribute__((counted_by(count))); 1320 // }; 1321 // 1322 // 1) 'ptr->array': 1323 // 1324 // count = ptr->count; 1325 // 1326 // flexible_array_member_element_size = sizeof (*ptr->array); 1327 // flexible_array_member_size = 1328 // count * flexible_array_member_element_size; 1329 // 1330 // result = flexible_array_member_size; 1331 // 1332 // cmp = (result >= 0) 1333 // return cmp ? result : 0; 1334 // 1335 // 2) '&((cast) ptr->array)[idx]': 1336 // 1337 // count = ptr->count; 1338 // index = idx; 1339 // 1340 // flexible_array_member_element_size = sizeof (*ptr->array); 1341 // flexible_array_member_size = 1342 // count * flexible_array_member_element_size; 1343 // 1344 // casted_flexible_array_member_element_size = 1345 // sizeof (*((cast) ptr->array)); 1346 // index_size = index * casted_flexible_array_member_element_size; 1347 // 1348 // result = flexible_array_member_size - index_size; 1349 // 1350 // cmp = (result >= 0) 1351 // if (index != 0) 1352 // cmp = (cmp && index >= 0) 1353 // return cmp ? result : 0; 1354 // 1355 // 3) '&ptr->field': 1356 // 1357 // count = ptr->count; 1358 // sizeof_struct = sizeof (struct s); 1359 // 1360 // flexible_array_member_element_size = sizeof (*ptr->array); 1361 // flexible_array_member_size = 1362 // count * flexible_array_member_element_size; 1363 // 1364 // field_offset = offsetof (struct s, field); 1365 // offset_diff = sizeof_struct - field_offset; 1366 // 1367 // result = offset_diff + flexible_array_member_size; 1368 // 1369 // cmp = (result >= 0) 1370 // return cmp ? result : 0; 1371 // 1372 // 4) '&((cast) ptr->field_array)[idx]': 1373 // 1374 // count = ptr->count; 1375 // index = idx; 1376 // sizeof_struct = sizeof (struct s); 1377 // 1378 // flexible_array_member_element_size = sizeof (*ptr->array); 1379 // flexible_array_member_size = 1380 // count * flexible_array_member_element_size; 1381 // 1382 // casted_field_element_size = sizeof (*((cast) ptr->field_array)); 1383 // field_offset = offsetof (struct s, field) 1384 // field_offset += index * casted_field_element_size; 1385 // 1386 // offset_diff = sizeof_struct - field_offset; 1387 // 1388 // result = offset_diff + flexible_array_member_size; 1389 // 1390 // cmp = (result >= 0) 1391 // if (index != 0) 1392 // cmp = (cmp && index >= 0) 1393 // return cmp ? result : 0; 1394 1395 bool IsSigned = CountFD->getType()->isSignedIntegerType(); 1396 1397 QualType FlexibleArrayMemberTy = FlexibleArrayMemberFD->getType(); 1398 1399 // Explicit cast because otherwise the CharWidth will promote an i32's into 1400 // u64's leading to overflows. 1401 int64_t CharWidth = static_cast<int64_t>(CGM.getContext().getCharWidth()); 1402 1403 // field_offset = offsetof (struct s, field); 1404 Value *FieldOffset = nullptr; 1405 if (FlexibleArrayMemberFD != FD) { 1406 std::optional<int64_t> Offset = GetFieldOffset(Ctx, RD, FD); 1407 if (!Offset) 1408 return nullptr; 1409 FieldOffset = 1410 llvm::ConstantInt::get(ResType, *Offset / CharWidth, IsSigned); 1411 } 1412 1413 // count = ptr->count; 1414 // index = ptr->index; 1415 Value *Count, *Index; 1416 std::tie(Count, Index) = GetCountFieldAndIndex( 1417 *this, ME, FlexibleArrayMemberFD, CountFD, Idx, ResType, IsSigned); 1418 if (!Count) 1419 return nullptr; 1420 1421 // flexible_array_member_element_size = sizeof (*ptr->array); 1422 const ArrayType *ArrayTy = Ctx.getAsArrayType(FlexibleArrayMemberTy); 1423 CharUnits BaseSize = Ctx.getTypeSizeInChars(ArrayTy->getElementType()); 1424 auto *FlexibleArrayMemberElementSize = 1425 llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned); 1426 1427 // flexible_array_member_size = count * flexible_array_member_element_size; 1428 Value *FlexibleArrayMemberSize = 1429 Builder.CreateMul(Count, FlexibleArrayMemberElementSize, 1430 "flexible_array_member_size", !IsSigned, IsSigned); 1431 1432 Value *Result = nullptr; 1433 if (FlexibleArrayMemberFD == FD) { 1434 if (Idx) { // Option (2) '&((cast) ptr->array)[idx]' 1435 // casted_flexible_array_member_element_size = 1436 // sizeof (*((cast) ptr->array)); 1437 llvm::ConstantInt *CastedFlexibleArrayMemberElementSize = 1438 FlexibleArrayMemberElementSize; 1439 if (!CastedArrayElementTy.isNull() && 1440 CastedArrayElementTy->isPointerType()) { 1441 CharUnits BaseSize = 1442 Ctx.getTypeSizeInChars(CastedArrayElementTy->getPointeeType()); 1443 CastedFlexibleArrayMemberElementSize = 1444 llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned); 1445 } 1446 1447 // index_size = index * casted_flexible_array_member_element_size; 1448 Value *IndexSize = 1449 Builder.CreateMul(Index, CastedFlexibleArrayMemberElementSize, 1450 "index_size", !IsSigned, IsSigned); 1451 1452 // result = flexible_array_member_size - index_size; 1453 Result = Builder.CreateSub(FlexibleArrayMemberSize, IndexSize, "result", 1454 !IsSigned, IsSigned); 1455 } else { // Option (1) 'ptr->array' 1456 // result = flexible_array_member_size; 1457 Result = FlexibleArrayMemberSize; 1458 } 1459 } else { 1460 // sizeof_struct = sizeof (struct s); 1461 llvm::StructType *StructTy = getTypes().getCGRecordLayout(RD).getLLVMType(); 1462 const llvm::DataLayout &Layout = CGM.getDataLayout(); 1463 TypeSize Size = Layout.getTypeSizeInBits(StructTy); 1464 Value *SizeofStruct = 1465 llvm::ConstantInt::get(ResType, Size.getKnownMinValue() / CharWidth); 1466 1467 if (Idx) { // Option (4) '&((cast) ptr->field_array)[idx]' 1468 // casted_field_element_size = sizeof (*((cast) ptr->field_array)); 1469 CharUnits BaseSize; 1470 if (!CastedArrayElementTy.isNull() && 1471 CastedArrayElementTy->isPointerType()) { 1472 BaseSize = 1473 Ctx.getTypeSizeInChars(CastedArrayElementTy->getPointeeType()); 1474 } else { 1475 const ArrayType *ArrayTy = Ctx.getAsArrayType(FD->getType()); 1476 BaseSize = Ctx.getTypeSizeInChars(ArrayTy->getElementType()); 1477 } 1478 1479 llvm::ConstantInt *CastedFieldElementSize = 1480 llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned); 1481 1482 // field_offset += index * casted_field_element_size; 1483 Value *Mul = Builder.CreateMul(Index, CastedFieldElementSize, 1484 "field_offset", !IsSigned, IsSigned); 1485 FieldOffset = Builder.CreateAdd(FieldOffset, Mul); 1486 } 1487 // Option (3) '&ptr->field', and Option (4) continuation. 1488 // offset_diff = flexible_array_member_offset - field_offset; 1489 Value *OffsetDiff = Builder.CreateSub(SizeofStruct, FieldOffset, 1490 "offset_diff", !IsSigned, IsSigned); 1491 1492 // result = offset_diff + flexible_array_member_size; 1493 Result = Builder.CreateAdd(FlexibleArrayMemberSize, OffsetDiff, "result"); 1494 } 1495 1496 return EmitPositiveResultOrZero(*this, Result, Index, ResType, IsSigned); 1497 } 1498 1499 /// Returns a Value corresponding to the size of the given expression. 1500 /// This Value may be either of the following: 1501 /// - A llvm::Argument (if E is a param with the pass_object_size attribute on 1502 /// it) 1503 /// - A call to the @llvm.objectsize intrinsic 1504 /// 1505 /// EmittedE is the result of emitting `E` as a scalar expr. If it's non-null 1506 /// and we wouldn't otherwise try to reference a pass_object_size parameter, 1507 /// we'll call @llvm.objectsize on EmittedE, rather than emitting E. 1508 llvm::Value * 1509 CodeGenFunction::emitBuiltinObjectSize(const Expr *E, unsigned Type, 1510 llvm::IntegerType *ResType, 1511 llvm::Value *EmittedE, bool IsDynamic) { 1512 // We need to reference an argument if the pointer is a parameter with the 1513 // pass_object_size attribute. 1514 if (auto *D = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts())) { 1515 auto *Param = dyn_cast<ParmVarDecl>(D->getDecl()); 1516 auto *PS = D->getDecl()->getAttr<PassObjectSizeAttr>(); 1517 if (Param != nullptr && PS != nullptr && 1518 areBOSTypesCompatible(PS->getType(), Type)) { 1519 auto Iter = SizeArguments.find(Param); 1520 assert(Iter != SizeArguments.end()); 1521 1522 const ImplicitParamDecl *D = Iter->second; 1523 auto DIter = LocalDeclMap.find(D); 1524 assert(DIter != LocalDeclMap.end()); 1525 1526 return EmitLoadOfScalar(DIter->second, /*Volatile=*/false, 1527 getContext().getSizeType(), E->getBeginLoc()); 1528 } 1529 } 1530 1531 // LLVM can't handle Type=3 appropriately, and __builtin_object_size shouldn't 1532 // evaluate E for side-effects. In either case, we shouldn't lower to 1533 // @llvm.objectsize. 1534 if (Type == 3 || (!EmittedE && E->HasSideEffects(getContext()))) 1535 return getDefaultBuiltinObjectSizeResult(Type, ResType); 1536 1537 Value *Ptr = EmittedE ? EmittedE : EmitScalarExpr(E); 1538 assert(Ptr->getType()->isPointerTy() && 1539 "Non-pointer passed to __builtin_object_size?"); 1540 1541 if (IsDynamic) 1542 // Emit special code for a flexible array member with the "counted_by" 1543 // attribute. 1544 if (Value *V = emitCountedBySize(E, Ptr, Type, ResType)) 1545 return V; 1546 1547 Function *F = 1548 CGM.getIntrinsic(Intrinsic::objectsize, {ResType, Ptr->getType()}); 1549 1550 // LLVM only supports 0 and 2, make sure that we pass along that as a boolean. 1551 Value *Min = Builder.getInt1((Type & 2) != 0); 1552 // For GCC compatibility, __builtin_object_size treat NULL as unknown size. 1553 Value *NullIsUnknown = Builder.getTrue(); 1554 Value *Dynamic = Builder.getInt1(IsDynamic); 1555 return Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}); 1556 } 1557 1558 namespace { 1559 /// A struct to generically describe a bit test intrinsic. 1560 struct BitTest { 1561 enum ActionKind : uint8_t { TestOnly, Complement, Reset, Set }; 1562 enum InterlockingKind : uint8_t { 1563 Unlocked, 1564 Sequential, 1565 Acquire, 1566 Release, 1567 NoFence 1568 }; 1569 1570 ActionKind Action; 1571 InterlockingKind Interlocking; 1572 bool Is64Bit; 1573 1574 static BitTest decodeBitTestBuiltin(unsigned BuiltinID); 1575 }; 1576 1577 } // namespace 1578 1579 BitTest BitTest::decodeBitTestBuiltin(unsigned BuiltinID) { 1580 switch (BuiltinID) { 1581 // Main portable variants. 1582 case Builtin::BI_bittest: 1583 return {TestOnly, Unlocked, false}; 1584 case Builtin::BI_bittestandcomplement: 1585 return {Complement, Unlocked, false}; 1586 case Builtin::BI_bittestandreset: 1587 return {Reset, Unlocked, false}; 1588 case Builtin::BI_bittestandset: 1589 return {Set, Unlocked, false}; 1590 case Builtin::BI_interlockedbittestandreset: 1591 return {Reset, Sequential, false}; 1592 case Builtin::BI_interlockedbittestandset: 1593 return {Set, Sequential, false}; 1594 1595 // 64-bit variants. 1596 case Builtin::BI_bittest64: 1597 return {TestOnly, Unlocked, true}; 1598 case Builtin::BI_bittestandcomplement64: 1599 return {Complement, Unlocked, true}; 1600 case Builtin::BI_bittestandreset64: 1601 return {Reset, Unlocked, true}; 1602 case Builtin::BI_bittestandset64: 1603 return {Set, Unlocked, true}; 1604 case Builtin::BI_interlockedbittestandreset64: 1605 return {Reset, Sequential, true}; 1606 case Builtin::BI_interlockedbittestandset64: 1607 return {Set, Sequential, true}; 1608 1609 // ARM/AArch64-specific ordering variants. 1610 case Builtin::BI_interlockedbittestandset_acq: 1611 return {Set, Acquire, false}; 1612 case Builtin::BI_interlockedbittestandset_rel: 1613 return {Set, Release, false}; 1614 case Builtin::BI_interlockedbittestandset_nf: 1615 return {Set, NoFence, false}; 1616 case Builtin::BI_interlockedbittestandreset_acq: 1617 return {Reset, Acquire, false}; 1618 case Builtin::BI_interlockedbittestandreset_rel: 1619 return {Reset, Release, false}; 1620 case Builtin::BI_interlockedbittestandreset_nf: 1621 return {Reset, NoFence, false}; 1622 case Builtin::BI_interlockedbittestandreset64_acq: 1623 return {Reset, Acquire, false}; 1624 case Builtin::BI_interlockedbittestandreset64_rel: 1625 return {Reset, Release, false}; 1626 case Builtin::BI_interlockedbittestandreset64_nf: 1627 return {Reset, NoFence, false}; 1628 case Builtin::BI_interlockedbittestandset64_acq: 1629 return {Set, Acquire, false}; 1630 case Builtin::BI_interlockedbittestandset64_rel: 1631 return {Set, Release, false}; 1632 case Builtin::BI_interlockedbittestandset64_nf: 1633 return {Set, NoFence, false}; 1634 } 1635 llvm_unreachable("expected only bittest intrinsics"); 1636 } 1637 1638 static char bitActionToX86BTCode(BitTest::ActionKind A) { 1639 switch (A) { 1640 case BitTest::TestOnly: return '\0'; 1641 case BitTest::Complement: return 'c'; 1642 case BitTest::Reset: return 'r'; 1643 case BitTest::Set: return 's'; 1644 } 1645 llvm_unreachable("invalid action"); 1646 } 1647 1648 static llvm::Value *EmitX86BitTestIntrinsic(CodeGenFunction &CGF, 1649 BitTest BT, 1650 const CallExpr *E, Value *BitBase, 1651 Value *BitPos) { 1652 char Action = bitActionToX86BTCode(BT.Action); 1653 char SizeSuffix = BT.Is64Bit ? 'q' : 'l'; 1654 1655 // Build the assembly. 1656 SmallString<64> Asm; 1657 raw_svector_ostream AsmOS(Asm); 1658 if (BT.Interlocking != BitTest::Unlocked) 1659 AsmOS << "lock "; 1660 AsmOS << "bt"; 1661 if (Action) 1662 AsmOS << Action; 1663 AsmOS << SizeSuffix << " $2, ($1)"; 1664 1665 // Build the constraints. FIXME: We should support immediates when possible. 1666 std::string Constraints = "={@ccc},r,r,~{cc},~{memory}"; 1667 std::string_view MachineClobbers = CGF.getTarget().getClobbers(); 1668 if (!MachineClobbers.empty()) { 1669 Constraints += ','; 1670 Constraints += MachineClobbers; 1671 } 1672 llvm::IntegerType *IntType = llvm::IntegerType::get( 1673 CGF.getLLVMContext(), 1674 CGF.getContext().getTypeSize(E->getArg(1)->getType())); 1675 llvm::FunctionType *FTy = 1676 llvm::FunctionType::get(CGF.Int8Ty, {CGF.UnqualPtrTy, IntType}, false); 1677 1678 llvm::InlineAsm *IA = 1679 llvm::InlineAsm::get(FTy, Asm, Constraints, /*hasSideEffects=*/true); 1680 return CGF.Builder.CreateCall(IA, {BitBase, BitPos}); 1681 } 1682 1683 static llvm::AtomicOrdering 1684 getBitTestAtomicOrdering(BitTest::InterlockingKind I) { 1685 switch (I) { 1686 case BitTest::Unlocked: return llvm::AtomicOrdering::NotAtomic; 1687 case BitTest::Sequential: return llvm::AtomicOrdering::SequentiallyConsistent; 1688 case BitTest::Acquire: return llvm::AtomicOrdering::Acquire; 1689 case BitTest::Release: return llvm::AtomicOrdering::Release; 1690 case BitTest::NoFence: return llvm::AtomicOrdering::Monotonic; 1691 } 1692 llvm_unreachable("invalid interlocking"); 1693 } 1694 1695 /// Emit a _bittest* intrinsic. These intrinsics take a pointer to an array of 1696 /// bits and a bit position and read and optionally modify the bit at that 1697 /// position. The position index can be arbitrarily large, i.e. it can be larger 1698 /// than 31 or 63, so we need an indexed load in the general case. 1699 static llvm::Value *EmitBitTestIntrinsic(CodeGenFunction &CGF, 1700 unsigned BuiltinID, 1701 const CallExpr *E) { 1702 Value *BitBase = CGF.EmitScalarExpr(E->getArg(0)); 1703 Value *BitPos = CGF.EmitScalarExpr(E->getArg(1)); 1704 1705 BitTest BT = BitTest::decodeBitTestBuiltin(BuiltinID); 1706 1707 // X86 has special BT, BTC, BTR, and BTS instructions that handle the array 1708 // indexing operation internally. Use them if possible. 1709 if (CGF.getTarget().getTriple().isX86()) 1710 return EmitX86BitTestIntrinsic(CGF, BT, E, BitBase, BitPos); 1711 1712 // Otherwise, use generic code to load one byte and test the bit. Use all but 1713 // the bottom three bits as the array index, and the bottom three bits to form 1714 // a mask. 1715 // Bit = BitBaseI8[BitPos >> 3] & (1 << (BitPos & 0x7)) != 0; 1716 Value *ByteIndex = CGF.Builder.CreateAShr( 1717 BitPos, llvm::ConstantInt::get(BitPos->getType(), 3), "bittest.byteidx"); 1718 Address ByteAddr(CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, BitBase, ByteIndex, 1719 "bittest.byteaddr"), 1720 CGF.Int8Ty, CharUnits::One()); 1721 Value *PosLow = 1722 CGF.Builder.CreateAnd(CGF.Builder.CreateTrunc(BitPos, CGF.Int8Ty), 1723 llvm::ConstantInt::get(CGF.Int8Ty, 0x7)); 1724 1725 // The updating instructions will need a mask. 1726 Value *Mask = nullptr; 1727 if (BT.Action != BitTest::TestOnly) { 1728 Mask = CGF.Builder.CreateShl(llvm::ConstantInt::get(CGF.Int8Ty, 1), PosLow, 1729 "bittest.mask"); 1730 } 1731 1732 // Check the action and ordering of the interlocked intrinsics. 1733 llvm::AtomicOrdering Ordering = getBitTestAtomicOrdering(BT.Interlocking); 1734 1735 Value *OldByte = nullptr; 1736 if (Ordering != llvm::AtomicOrdering::NotAtomic) { 1737 // Emit a combined atomicrmw load/store operation for the interlocked 1738 // intrinsics. 1739 llvm::AtomicRMWInst::BinOp RMWOp = llvm::AtomicRMWInst::Or; 1740 if (BT.Action == BitTest::Reset) { 1741 Mask = CGF.Builder.CreateNot(Mask); 1742 RMWOp = llvm::AtomicRMWInst::And; 1743 } 1744 OldByte = CGF.Builder.CreateAtomicRMW(RMWOp, ByteAddr, Mask, Ordering); 1745 } else { 1746 // Emit a plain load for the non-interlocked intrinsics. 1747 OldByte = CGF.Builder.CreateLoad(ByteAddr, "bittest.byte"); 1748 Value *NewByte = nullptr; 1749 switch (BT.Action) { 1750 case BitTest::TestOnly: 1751 // Don't store anything. 1752 break; 1753 case BitTest::Complement: 1754 NewByte = CGF.Builder.CreateXor(OldByte, Mask); 1755 break; 1756 case BitTest::Reset: 1757 NewByte = CGF.Builder.CreateAnd(OldByte, CGF.Builder.CreateNot(Mask)); 1758 break; 1759 case BitTest::Set: 1760 NewByte = CGF.Builder.CreateOr(OldByte, Mask); 1761 break; 1762 } 1763 if (NewByte) 1764 CGF.Builder.CreateStore(NewByte, ByteAddr); 1765 } 1766 1767 // However we loaded the old byte, either by plain load or atomicrmw, shift 1768 // the bit into the low position and mask it to 0 or 1. 1769 Value *ShiftedByte = CGF.Builder.CreateLShr(OldByte, PosLow, "bittest.shr"); 1770 return CGF.Builder.CreateAnd( 1771 ShiftedByte, llvm::ConstantInt::get(CGF.Int8Ty, 1), "bittest.res"); 1772 } 1773 1774 namespace { 1775 enum class MSVCSetJmpKind { 1776 _setjmpex, 1777 _setjmp3, 1778 _setjmp 1779 }; 1780 } 1781 1782 /// MSVC handles setjmp a bit differently on different platforms. On every 1783 /// architecture except 32-bit x86, the frame address is passed. On x86, extra 1784 /// parameters can be passed as variadic arguments, but we always pass none. 1785 static RValue EmitMSVCRTSetJmp(CodeGenFunction &CGF, MSVCSetJmpKind SJKind, 1786 const CallExpr *E) { 1787 llvm::Value *Arg1 = nullptr; 1788 llvm::Type *Arg1Ty = nullptr; 1789 StringRef Name; 1790 bool IsVarArg = false; 1791 if (SJKind == MSVCSetJmpKind::_setjmp3) { 1792 Name = "_setjmp3"; 1793 Arg1Ty = CGF.Int32Ty; 1794 Arg1 = llvm::ConstantInt::get(CGF.IntTy, 0); 1795 IsVarArg = true; 1796 } else { 1797 Name = SJKind == MSVCSetJmpKind::_setjmp ? "_setjmp" : "_setjmpex"; 1798 Arg1Ty = CGF.Int8PtrTy; 1799 if (CGF.getTarget().getTriple().getArch() == llvm::Triple::aarch64) { 1800 Arg1 = CGF.Builder.CreateCall( 1801 CGF.CGM.getIntrinsic(Intrinsic::sponentry, CGF.AllocaInt8PtrTy)); 1802 } else 1803 Arg1 = CGF.Builder.CreateCall( 1804 CGF.CGM.getIntrinsic(Intrinsic::frameaddress, CGF.AllocaInt8PtrTy), 1805 llvm::ConstantInt::get(CGF.Int32Ty, 0)); 1806 } 1807 1808 // Mark the call site and declaration with ReturnsTwice. 1809 llvm::Type *ArgTypes[2] = {CGF.Int8PtrTy, Arg1Ty}; 1810 llvm::AttributeList ReturnsTwiceAttr = llvm::AttributeList::get( 1811 CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, 1812 llvm::Attribute::ReturnsTwice); 1813 llvm::FunctionCallee SetJmpFn = CGF.CGM.CreateRuntimeFunction( 1814 llvm::FunctionType::get(CGF.IntTy, ArgTypes, IsVarArg), Name, 1815 ReturnsTwiceAttr, /*Local=*/true); 1816 1817 llvm::Value *Buf = CGF.Builder.CreateBitOrPointerCast( 1818 CGF.EmitScalarExpr(E->getArg(0)), CGF.Int8PtrTy); 1819 llvm::Value *Args[] = {Buf, Arg1}; 1820 llvm::CallBase *CB = CGF.EmitRuntimeCallOrInvoke(SetJmpFn, Args); 1821 CB->setAttributes(ReturnsTwiceAttr); 1822 return RValue::get(CB); 1823 } 1824 1825 // Emit an MSVC intrinsic. Assumes that arguments have *not* been evaluated. 1826 Value *CodeGenFunction::EmitMSVCBuiltinExpr(MSVCIntrin BuiltinID, 1827 const CallExpr *E) { 1828 switch (BuiltinID) { 1829 case MSVCIntrin::_BitScanForward: 1830 case MSVCIntrin::_BitScanReverse: { 1831 Address IndexAddress(EmitPointerWithAlignment(E->getArg(0))); 1832 Value *ArgValue = EmitScalarExpr(E->getArg(1)); 1833 1834 llvm::Type *ArgType = ArgValue->getType(); 1835 llvm::Type *IndexType = IndexAddress.getElementType(); 1836 llvm::Type *ResultType = ConvertType(E->getType()); 1837 1838 Value *ArgZero = llvm::Constant::getNullValue(ArgType); 1839 Value *ResZero = llvm::Constant::getNullValue(ResultType); 1840 Value *ResOne = llvm::ConstantInt::get(ResultType, 1); 1841 1842 BasicBlock *Begin = Builder.GetInsertBlock(); 1843 BasicBlock *End = createBasicBlock("bitscan_end", this->CurFn); 1844 Builder.SetInsertPoint(End); 1845 PHINode *Result = Builder.CreatePHI(ResultType, 2, "bitscan_result"); 1846 1847 Builder.SetInsertPoint(Begin); 1848 Value *IsZero = Builder.CreateICmpEQ(ArgValue, ArgZero); 1849 BasicBlock *NotZero = createBasicBlock("bitscan_not_zero", this->CurFn); 1850 Builder.CreateCondBr(IsZero, End, NotZero); 1851 Result->addIncoming(ResZero, Begin); 1852 1853 Builder.SetInsertPoint(NotZero); 1854 1855 if (BuiltinID == MSVCIntrin::_BitScanForward) { 1856 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 1857 Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()}); 1858 ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false); 1859 Builder.CreateStore(ZeroCount, IndexAddress, false); 1860 } else { 1861 unsigned ArgWidth = cast<llvm::IntegerType>(ArgType)->getBitWidth(); 1862 Value *ArgTypeLastIndex = llvm::ConstantInt::get(IndexType, ArgWidth - 1); 1863 1864 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 1865 Value *ZeroCount = Builder.CreateCall(F, {ArgValue, Builder.getTrue()}); 1866 ZeroCount = Builder.CreateIntCast(ZeroCount, IndexType, false); 1867 Value *Index = Builder.CreateNSWSub(ArgTypeLastIndex, ZeroCount); 1868 Builder.CreateStore(Index, IndexAddress, false); 1869 } 1870 Builder.CreateBr(End); 1871 Result->addIncoming(ResOne, NotZero); 1872 1873 Builder.SetInsertPoint(End); 1874 return Result; 1875 } 1876 case MSVCIntrin::_InterlockedAnd: 1877 return MakeBinaryAtomicValue(*this, AtomicRMWInst::And, E); 1878 case MSVCIntrin::_InterlockedExchange: 1879 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xchg, E); 1880 case MSVCIntrin::_InterlockedExchangeAdd: 1881 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Add, E); 1882 case MSVCIntrin::_InterlockedExchangeSub: 1883 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Sub, E); 1884 case MSVCIntrin::_InterlockedOr: 1885 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Or, E); 1886 case MSVCIntrin::_InterlockedXor: 1887 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xor, E); 1888 case MSVCIntrin::_InterlockedExchangeAdd_acq: 1889 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Add, E, 1890 AtomicOrdering::Acquire); 1891 case MSVCIntrin::_InterlockedExchangeAdd_rel: 1892 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Add, E, 1893 AtomicOrdering::Release); 1894 case MSVCIntrin::_InterlockedExchangeAdd_nf: 1895 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Add, E, 1896 AtomicOrdering::Monotonic); 1897 case MSVCIntrin::_InterlockedExchange_acq: 1898 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xchg, E, 1899 AtomicOrdering::Acquire); 1900 case MSVCIntrin::_InterlockedExchange_rel: 1901 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xchg, E, 1902 AtomicOrdering::Release); 1903 case MSVCIntrin::_InterlockedExchange_nf: 1904 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xchg, E, 1905 AtomicOrdering::Monotonic); 1906 case MSVCIntrin::_InterlockedCompareExchange: 1907 return EmitAtomicCmpXchgForMSIntrin(*this, E); 1908 case MSVCIntrin::_InterlockedCompareExchange_acq: 1909 return EmitAtomicCmpXchgForMSIntrin(*this, E, AtomicOrdering::Acquire); 1910 case MSVCIntrin::_InterlockedCompareExchange_rel: 1911 return EmitAtomicCmpXchgForMSIntrin(*this, E, AtomicOrdering::Release); 1912 case MSVCIntrin::_InterlockedCompareExchange_nf: 1913 return EmitAtomicCmpXchgForMSIntrin(*this, E, AtomicOrdering::Monotonic); 1914 case MSVCIntrin::_InterlockedCompareExchange128: 1915 return EmitAtomicCmpXchg128ForMSIntrin( 1916 *this, E, AtomicOrdering::SequentiallyConsistent); 1917 case MSVCIntrin::_InterlockedCompareExchange128_acq: 1918 return EmitAtomicCmpXchg128ForMSIntrin(*this, E, AtomicOrdering::Acquire); 1919 case MSVCIntrin::_InterlockedCompareExchange128_rel: 1920 return EmitAtomicCmpXchg128ForMSIntrin(*this, E, AtomicOrdering::Release); 1921 case MSVCIntrin::_InterlockedCompareExchange128_nf: 1922 return EmitAtomicCmpXchg128ForMSIntrin(*this, E, AtomicOrdering::Monotonic); 1923 case MSVCIntrin::_InterlockedOr_acq: 1924 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Or, E, 1925 AtomicOrdering::Acquire); 1926 case MSVCIntrin::_InterlockedOr_rel: 1927 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Or, E, 1928 AtomicOrdering::Release); 1929 case MSVCIntrin::_InterlockedOr_nf: 1930 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Or, E, 1931 AtomicOrdering::Monotonic); 1932 case MSVCIntrin::_InterlockedXor_acq: 1933 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xor, E, 1934 AtomicOrdering::Acquire); 1935 case MSVCIntrin::_InterlockedXor_rel: 1936 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xor, E, 1937 AtomicOrdering::Release); 1938 case MSVCIntrin::_InterlockedXor_nf: 1939 return MakeBinaryAtomicValue(*this, AtomicRMWInst::Xor, E, 1940 AtomicOrdering::Monotonic); 1941 case MSVCIntrin::_InterlockedAnd_acq: 1942 return MakeBinaryAtomicValue(*this, AtomicRMWInst::And, E, 1943 AtomicOrdering::Acquire); 1944 case MSVCIntrin::_InterlockedAnd_rel: 1945 return MakeBinaryAtomicValue(*this, AtomicRMWInst::And, E, 1946 AtomicOrdering::Release); 1947 case MSVCIntrin::_InterlockedAnd_nf: 1948 return MakeBinaryAtomicValue(*this, AtomicRMWInst::And, E, 1949 AtomicOrdering::Monotonic); 1950 case MSVCIntrin::_InterlockedIncrement_acq: 1951 return EmitAtomicIncrementValue(*this, E, AtomicOrdering::Acquire); 1952 case MSVCIntrin::_InterlockedIncrement_rel: 1953 return EmitAtomicIncrementValue(*this, E, AtomicOrdering::Release); 1954 case MSVCIntrin::_InterlockedIncrement_nf: 1955 return EmitAtomicIncrementValue(*this, E, AtomicOrdering::Monotonic); 1956 case MSVCIntrin::_InterlockedDecrement_acq: 1957 return EmitAtomicDecrementValue(*this, E, AtomicOrdering::Acquire); 1958 case MSVCIntrin::_InterlockedDecrement_rel: 1959 return EmitAtomicDecrementValue(*this, E, AtomicOrdering::Release); 1960 case MSVCIntrin::_InterlockedDecrement_nf: 1961 return EmitAtomicDecrementValue(*this, E, AtomicOrdering::Monotonic); 1962 1963 case MSVCIntrin::_InterlockedDecrement: 1964 return EmitAtomicDecrementValue(*this, E); 1965 case MSVCIntrin::_InterlockedIncrement: 1966 return EmitAtomicIncrementValue(*this, E); 1967 1968 case MSVCIntrin::__fastfail: { 1969 // Request immediate process termination from the kernel. The instruction 1970 // sequences to do this are documented on MSDN: 1971 // https://msdn.microsoft.com/en-us/library/dn774154.aspx 1972 llvm::Triple::ArchType ISA = getTarget().getTriple().getArch(); 1973 StringRef Asm, Constraints; 1974 switch (ISA) { 1975 default: 1976 ErrorUnsupported(E, "__fastfail call for this architecture"); 1977 break; 1978 case llvm::Triple::x86: 1979 case llvm::Triple::x86_64: 1980 Asm = "int $$0x29"; 1981 Constraints = "{cx}"; 1982 break; 1983 case llvm::Triple::thumb: 1984 Asm = "udf #251"; 1985 Constraints = "{r0}"; 1986 break; 1987 case llvm::Triple::aarch64: 1988 Asm = "brk #0xF003"; 1989 Constraints = "{w0}"; 1990 } 1991 llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, {Int32Ty}, false); 1992 llvm::InlineAsm *IA = 1993 llvm::InlineAsm::get(FTy, Asm, Constraints, /*hasSideEffects=*/true); 1994 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get( 1995 getLLVMContext(), llvm::AttributeList::FunctionIndex, 1996 llvm::Attribute::NoReturn); 1997 llvm::CallInst *CI = Builder.CreateCall(IA, EmitScalarExpr(E->getArg(0))); 1998 CI->setAttributes(NoReturnAttr); 1999 return CI; 2000 } 2001 } 2002 llvm_unreachable("Incorrect MSVC intrinsic!"); 2003 } 2004 2005 namespace { 2006 // ARC cleanup for __builtin_os_log_format 2007 struct CallObjCArcUse final : EHScopeStack::Cleanup { 2008 CallObjCArcUse(llvm::Value *object) : object(object) {} 2009 llvm::Value *object; 2010 2011 void Emit(CodeGenFunction &CGF, Flags flags) override { 2012 CGF.EmitARCIntrinsicUse(object); 2013 } 2014 }; 2015 } 2016 2017 Value *CodeGenFunction::EmitCheckedArgForBuiltin(const Expr *E, 2018 BuiltinCheckKind Kind) { 2019 assert((Kind == BCK_CLZPassedZero || Kind == BCK_CTZPassedZero) && 2020 "Unsupported builtin check kind"); 2021 2022 Value *ArgValue = EmitScalarExpr(E); 2023 if (!SanOpts.has(SanitizerKind::Builtin)) 2024 return ArgValue; 2025 2026 auto CheckOrdinal = SanitizerKind::SO_Builtin; 2027 auto CheckHandler = SanitizerHandler::InvalidBuiltin; 2028 SanitizerDebugLocation SanScope(this, {CheckOrdinal}, CheckHandler); 2029 Value *Cond = Builder.CreateICmpNE( 2030 ArgValue, llvm::Constant::getNullValue(ArgValue->getType())); 2031 EmitCheck(std::make_pair(Cond, CheckOrdinal), CheckHandler, 2032 {EmitCheckSourceLocation(E->getExprLoc()), 2033 llvm::ConstantInt::get(Builder.getInt8Ty(), Kind)}, 2034 {}); 2035 return ArgValue; 2036 } 2037 2038 Value *CodeGenFunction::EmitCheckedArgForAssume(const Expr *E) { 2039 Value *ArgValue = EvaluateExprAsBool(E); 2040 if (!SanOpts.has(SanitizerKind::Builtin)) 2041 return ArgValue; 2042 2043 auto CheckOrdinal = SanitizerKind::SO_Builtin; 2044 auto CheckHandler = SanitizerHandler::InvalidBuiltin; 2045 SanitizerDebugLocation SanScope(this, {CheckOrdinal}, CheckHandler); 2046 EmitCheck( 2047 std::make_pair(ArgValue, CheckOrdinal), CheckHandler, 2048 {EmitCheckSourceLocation(E->getExprLoc()), 2049 llvm::ConstantInt::get(Builder.getInt8Ty(), BCK_AssumePassedFalse)}, 2050 {}); 2051 return ArgValue; 2052 } 2053 2054 static Value *EmitAbs(CodeGenFunction &CGF, Value *ArgValue, bool HasNSW) { 2055 return CGF.Builder.CreateBinaryIntrinsic( 2056 Intrinsic::abs, ArgValue, 2057 ConstantInt::get(CGF.Builder.getInt1Ty(), HasNSW)); 2058 } 2059 2060 static Value *EmitOverflowCheckedAbs(CodeGenFunction &CGF, const CallExpr *E, 2061 bool SanitizeOverflow) { 2062 Value *ArgValue = CGF.EmitScalarExpr(E->getArg(0)); 2063 2064 // Try to eliminate overflow check. 2065 if (const auto *VCI = dyn_cast<llvm::ConstantInt>(ArgValue)) { 2066 if (!VCI->isMinSignedValue()) 2067 return EmitAbs(CGF, ArgValue, true); 2068 } 2069 2070 SmallVector<SanitizerKind::SanitizerOrdinal, 1> Ordinals; 2071 SanitizerHandler CheckHandler; 2072 if (SanitizeOverflow) { 2073 Ordinals.push_back(SanitizerKind::SO_SignedIntegerOverflow); 2074 CheckHandler = SanitizerHandler::NegateOverflow; 2075 } else 2076 CheckHandler = SanitizerHandler::SubOverflow; 2077 2078 SanitizerDebugLocation SanScope(&CGF, Ordinals, CheckHandler); 2079 2080 Constant *Zero = Constant::getNullValue(ArgValue->getType()); 2081 Value *ResultAndOverflow = CGF.Builder.CreateBinaryIntrinsic( 2082 Intrinsic::ssub_with_overflow, Zero, ArgValue); 2083 Value *Result = CGF.Builder.CreateExtractValue(ResultAndOverflow, 0); 2084 Value *NotOverflow = CGF.Builder.CreateNot( 2085 CGF.Builder.CreateExtractValue(ResultAndOverflow, 1)); 2086 2087 // TODO: support -ftrapv-handler. 2088 if (SanitizeOverflow) { 2089 CGF.EmitCheck({{NotOverflow, SanitizerKind::SO_SignedIntegerOverflow}}, 2090 CheckHandler, 2091 {CGF.EmitCheckSourceLocation(E->getArg(0)->getExprLoc()), 2092 CGF.EmitCheckTypeDescriptor(E->getType())}, 2093 {ArgValue}); 2094 } else 2095 CGF.EmitTrapCheck(NotOverflow, CheckHandler); 2096 2097 Value *CmpResult = CGF.Builder.CreateICmpSLT(ArgValue, Zero, "abscond"); 2098 return CGF.Builder.CreateSelect(CmpResult, Result, ArgValue, "abs"); 2099 } 2100 2101 /// Get the argument type for arguments to os_log_helper. 2102 static CanQualType getOSLogArgType(ASTContext &C, int Size) { 2103 QualType UnsignedTy = C.getIntTypeForBitwidth(Size * 8, /*Signed=*/false); 2104 return C.getCanonicalType(UnsignedTy); 2105 } 2106 2107 llvm::Function *CodeGenFunction::generateBuiltinOSLogHelperFunction( 2108 const analyze_os_log::OSLogBufferLayout &Layout, 2109 CharUnits BufferAlignment) { 2110 ASTContext &Ctx = getContext(); 2111 2112 llvm::SmallString<64> Name; 2113 { 2114 raw_svector_ostream OS(Name); 2115 OS << "__os_log_helper"; 2116 OS << "_" << BufferAlignment.getQuantity(); 2117 OS << "_" << int(Layout.getSummaryByte()); 2118 OS << "_" << int(Layout.getNumArgsByte()); 2119 for (const auto &Item : Layout.Items) 2120 OS << "_" << int(Item.getSizeByte()) << "_" 2121 << int(Item.getDescriptorByte()); 2122 } 2123 2124 if (llvm::Function *F = CGM.getModule().getFunction(Name)) 2125 return F; 2126 2127 llvm::SmallVector<QualType, 4> ArgTys; 2128 FunctionArgList Args; 2129 Args.push_back(ImplicitParamDecl::Create( 2130 Ctx, nullptr, SourceLocation(), &Ctx.Idents.get("buffer"), Ctx.VoidPtrTy, 2131 ImplicitParamKind::Other)); 2132 ArgTys.emplace_back(Ctx.VoidPtrTy); 2133 2134 for (unsigned int I = 0, E = Layout.Items.size(); I < E; ++I) { 2135 char Size = Layout.Items[I].getSizeByte(); 2136 if (!Size) 2137 continue; 2138 2139 QualType ArgTy = getOSLogArgType(Ctx, Size); 2140 Args.push_back(ImplicitParamDecl::Create( 2141 Ctx, nullptr, SourceLocation(), 2142 &Ctx.Idents.get(std::string("arg") + llvm::to_string(I)), ArgTy, 2143 ImplicitParamKind::Other)); 2144 ArgTys.emplace_back(ArgTy); 2145 } 2146 2147 QualType ReturnTy = Ctx.VoidTy; 2148 2149 // The helper function has linkonce_odr linkage to enable the linker to merge 2150 // identical functions. To ensure the merging always happens, 'noinline' is 2151 // attached to the function when compiling with -Oz. 2152 const CGFunctionInfo &FI = 2153 CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, Args); 2154 llvm::FunctionType *FuncTy = CGM.getTypes().GetFunctionType(FI); 2155 llvm::Function *Fn = llvm::Function::Create( 2156 FuncTy, llvm::GlobalValue::LinkOnceODRLinkage, Name, &CGM.getModule()); 2157 Fn->setVisibility(llvm::GlobalValue::HiddenVisibility); 2158 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Fn, /*IsThunk=*/false); 2159 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Fn); 2160 Fn->setDoesNotThrow(); 2161 2162 // Attach 'noinline' at -Oz. 2163 if (CGM.getCodeGenOpts().OptimizeSize == 2) 2164 Fn->addFnAttr(llvm::Attribute::NoInline); 2165 2166 auto NL = ApplyDebugLocation::CreateEmpty(*this); 2167 StartFunction(GlobalDecl(), ReturnTy, Fn, FI, Args); 2168 2169 // Create a scope with an artificial location for the body of this function. 2170 auto AL = ApplyDebugLocation::CreateArtificial(*this); 2171 2172 CharUnits Offset; 2173 Address BufAddr = makeNaturalAddressForPointer( 2174 Builder.CreateLoad(GetAddrOfLocalVar(Args[0]), "buf"), Ctx.VoidTy, 2175 BufferAlignment); 2176 Builder.CreateStore(Builder.getInt8(Layout.getSummaryByte()), 2177 Builder.CreateConstByteGEP(BufAddr, Offset++, "summary")); 2178 Builder.CreateStore(Builder.getInt8(Layout.getNumArgsByte()), 2179 Builder.CreateConstByteGEP(BufAddr, Offset++, "numArgs")); 2180 2181 unsigned I = 1; 2182 for (const auto &Item : Layout.Items) { 2183 Builder.CreateStore( 2184 Builder.getInt8(Item.getDescriptorByte()), 2185 Builder.CreateConstByteGEP(BufAddr, Offset++, "argDescriptor")); 2186 Builder.CreateStore( 2187 Builder.getInt8(Item.getSizeByte()), 2188 Builder.CreateConstByteGEP(BufAddr, Offset++, "argSize")); 2189 2190 CharUnits Size = Item.size(); 2191 if (!Size.getQuantity()) 2192 continue; 2193 2194 Address Arg = GetAddrOfLocalVar(Args[I]); 2195 Address Addr = Builder.CreateConstByteGEP(BufAddr, Offset, "argData"); 2196 Addr = Addr.withElementType(Arg.getElementType()); 2197 Builder.CreateStore(Builder.CreateLoad(Arg), Addr); 2198 Offset += Size; 2199 ++I; 2200 } 2201 2202 FinishFunction(); 2203 2204 return Fn; 2205 } 2206 2207 RValue CodeGenFunction::emitBuiltinOSLogFormat(const CallExpr &E) { 2208 assert(E.getNumArgs() >= 2 && 2209 "__builtin_os_log_format takes at least 2 arguments"); 2210 ASTContext &Ctx = getContext(); 2211 analyze_os_log::OSLogBufferLayout Layout; 2212 analyze_os_log::computeOSLogBufferLayout(Ctx, &E, Layout); 2213 Address BufAddr = EmitPointerWithAlignment(E.getArg(0)); 2214 2215 // Ignore argument 1, the format string. It is not currently used. 2216 CallArgList Args; 2217 Args.add(RValue::get(BufAddr.emitRawPointer(*this)), Ctx.VoidPtrTy); 2218 2219 for (const auto &Item : Layout.Items) { 2220 int Size = Item.getSizeByte(); 2221 if (!Size) 2222 continue; 2223 2224 llvm::Value *ArgVal; 2225 2226 if (Item.getKind() == analyze_os_log::OSLogBufferItem::MaskKind) { 2227 uint64_t Val = 0; 2228 for (unsigned I = 0, E = Item.getMaskType().size(); I < E; ++I) 2229 Val |= ((uint64_t)Item.getMaskType()[I]) << I * 8; 2230 ArgVal = llvm::Constant::getIntegerValue(Int64Ty, llvm::APInt(64, Val)); 2231 } else if (const Expr *TheExpr = Item.getExpr()) { 2232 ArgVal = EmitScalarExpr(TheExpr, /*Ignore*/ false); 2233 2234 // If a temporary object that requires destruction after the full 2235 // expression is passed, push a lifetime-extended cleanup to extend its 2236 // lifetime to the end of the enclosing block scope. 2237 auto LifetimeExtendObject = [&](const Expr *E) { 2238 E = E->IgnoreParenCasts(); 2239 // Extend lifetimes of objects returned by function calls and message 2240 // sends. 2241 2242 // FIXME: We should do this in other cases in which temporaries are 2243 // created including arguments of non-ARC types (e.g., C++ 2244 // temporaries). 2245 if (isa<CallExpr>(E) || isa<ObjCMessageExpr>(E)) 2246 return true; 2247 return false; 2248 }; 2249 2250 if (TheExpr->getType()->isObjCRetainableType() && 2251 getLangOpts().ObjCAutoRefCount && LifetimeExtendObject(TheExpr)) { 2252 assert(getEvaluationKind(TheExpr->getType()) == TEK_Scalar && 2253 "Only scalar can be a ObjC retainable type"); 2254 if (!isa<Constant>(ArgVal)) { 2255 CleanupKind Cleanup = getARCCleanupKind(); 2256 QualType Ty = TheExpr->getType(); 2257 RawAddress Alloca = RawAddress::invalid(); 2258 RawAddress Addr = CreateMemTemp(Ty, "os.log.arg", &Alloca); 2259 ArgVal = EmitARCRetain(Ty, ArgVal); 2260 Builder.CreateStore(ArgVal, Addr); 2261 pushLifetimeExtendedDestroy(Cleanup, Alloca, Ty, 2262 CodeGenFunction::destroyARCStrongPrecise, 2263 Cleanup & EHCleanup); 2264 2265 // Push a clang.arc.use call to ensure ARC optimizer knows that the 2266 // argument has to be alive. 2267 if (CGM.getCodeGenOpts().OptimizationLevel != 0) 2268 pushCleanupAfterFullExpr<CallObjCArcUse>(Cleanup, ArgVal); 2269 } 2270 } 2271 } else { 2272 ArgVal = Builder.getInt32(Item.getConstValue().getQuantity()); 2273 } 2274 2275 unsigned ArgValSize = 2276 CGM.getDataLayout().getTypeSizeInBits(ArgVal->getType()); 2277 llvm::IntegerType *IntTy = llvm::Type::getIntNTy(getLLVMContext(), 2278 ArgValSize); 2279 ArgVal = Builder.CreateBitOrPointerCast(ArgVal, IntTy); 2280 CanQualType ArgTy = getOSLogArgType(Ctx, Size); 2281 // If ArgVal has type x86_fp80, zero-extend ArgVal. 2282 ArgVal = Builder.CreateZExtOrBitCast(ArgVal, ConvertType(ArgTy)); 2283 Args.add(RValue::get(ArgVal), ArgTy); 2284 } 2285 2286 const CGFunctionInfo &FI = 2287 CGM.getTypes().arrangeBuiltinFunctionCall(Ctx.VoidTy, Args); 2288 llvm::Function *F = CodeGenFunction(CGM).generateBuiltinOSLogHelperFunction( 2289 Layout, BufAddr.getAlignment()); 2290 EmitCall(FI, CGCallee::forDirect(F), ReturnValueSlot(), Args); 2291 return RValue::get(BufAddr, *this); 2292 } 2293 2294 static bool isSpecialUnsignedMultiplySignedResult( 2295 unsigned BuiltinID, WidthAndSignedness Op1Info, WidthAndSignedness Op2Info, 2296 WidthAndSignedness ResultInfo) { 2297 return BuiltinID == Builtin::BI__builtin_mul_overflow && 2298 Op1Info.Width == Op2Info.Width && Op2Info.Width == ResultInfo.Width && 2299 !Op1Info.Signed && !Op2Info.Signed && ResultInfo.Signed; 2300 } 2301 2302 static RValue EmitCheckedUnsignedMultiplySignedResult( 2303 CodeGenFunction &CGF, const clang::Expr *Op1, WidthAndSignedness Op1Info, 2304 const clang::Expr *Op2, WidthAndSignedness Op2Info, 2305 const clang::Expr *ResultArg, QualType ResultQTy, 2306 WidthAndSignedness ResultInfo) { 2307 assert(isSpecialUnsignedMultiplySignedResult( 2308 Builtin::BI__builtin_mul_overflow, Op1Info, Op2Info, ResultInfo) && 2309 "Cannot specialize this multiply"); 2310 2311 llvm::Value *V1 = CGF.EmitScalarExpr(Op1); 2312 llvm::Value *V2 = CGF.EmitScalarExpr(Op2); 2313 2314 llvm::Value *HasOverflow; 2315 llvm::Value *Result = EmitOverflowIntrinsic( 2316 CGF, Intrinsic::umul_with_overflow, V1, V2, HasOverflow); 2317 2318 // The intrinsic call will detect overflow when the value is > UINT_MAX, 2319 // however, since the original builtin had a signed result, we need to report 2320 // an overflow when the result is greater than INT_MAX. 2321 auto IntMax = llvm::APInt::getSignedMaxValue(ResultInfo.Width); 2322 llvm::Value *IntMaxValue = llvm::ConstantInt::get(Result->getType(), IntMax); 2323 2324 llvm::Value *IntMaxOverflow = CGF.Builder.CreateICmpUGT(Result, IntMaxValue); 2325 HasOverflow = CGF.Builder.CreateOr(HasOverflow, IntMaxOverflow); 2326 2327 bool isVolatile = 2328 ResultArg->getType()->getPointeeType().isVolatileQualified(); 2329 Address ResultPtr = CGF.EmitPointerWithAlignment(ResultArg); 2330 CGF.Builder.CreateStore(CGF.EmitToMemory(Result, ResultQTy), ResultPtr, 2331 isVolatile); 2332 return RValue::get(HasOverflow); 2333 } 2334 2335 /// Determine if a binop is a checked mixed-sign multiply we can specialize. 2336 static bool isSpecialMixedSignMultiply(unsigned BuiltinID, 2337 WidthAndSignedness Op1Info, 2338 WidthAndSignedness Op2Info, 2339 WidthAndSignedness ResultInfo) { 2340 return BuiltinID == Builtin::BI__builtin_mul_overflow && 2341 std::max(Op1Info.Width, Op2Info.Width) >= ResultInfo.Width && 2342 Op1Info.Signed != Op2Info.Signed; 2343 } 2344 2345 /// Emit a checked mixed-sign multiply. This is a cheaper specialization of 2346 /// the generic checked-binop irgen. 2347 static RValue 2348 EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1, 2349 WidthAndSignedness Op1Info, const clang::Expr *Op2, 2350 WidthAndSignedness Op2Info, 2351 const clang::Expr *ResultArg, QualType ResultQTy, 2352 WidthAndSignedness ResultInfo) { 2353 assert(isSpecialMixedSignMultiply(Builtin::BI__builtin_mul_overflow, Op1Info, 2354 Op2Info, ResultInfo) && 2355 "Not a mixed-sign multipliction we can specialize"); 2356 2357 // Emit the signed and unsigned operands. 2358 const clang::Expr *SignedOp = Op1Info.Signed ? Op1 : Op2; 2359 const clang::Expr *UnsignedOp = Op1Info.Signed ? Op2 : Op1; 2360 llvm::Value *Signed = CGF.EmitScalarExpr(SignedOp); 2361 llvm::Value *Unsigned = CGF.EmitScalarExpr(UnsignedOp); 2362 unsigned SignedOpWidth = Op1Info.Signed ? Op1Info.Width : Op2Info.Width; 2363 unsigned UnsignedOpWidth = Op1Info.Signed ? Op2Info.Width : Op1Info.Width; 2364 2365 // One of the operands may be smaller than the other. If so, [s|z]ext it. 2366 if (SignedOpWidth < UnsignedOpWidth) 2367 Signed = CGF.Builder.CreateSExt(Signed, Unsigned->getType(), "op.sext"); 2368 if (UnsignedOpWidth < SignedOpWidth) 2369 Unsigned = CGF.Builder.CreateZExt(Unsigned, Signed->getType(), "op.zext"); 2370 2371 llvm::Type *OpTy = Signed->getType(); 2372 llvm::Value *Zero = llvm::Constant::getNullValue(OpTy); 2373 Address ResultPtr = CGF.EmitPointerWithAlignment(ResultArg); 2374 llvm::Type *ResTy = CGF.getTypes().ConvertType(ResultQTy); 2375 unsigned OpWidth = std::max(Op1Info.Width, Op2Info.Width); 2376 2377 // Take the absolute value of the signed operand. 2378 llvm::Value *IsNegative = CGF.Builder.CreateICmpSLT(Signed, Zero); 2379 llvm::Value *AbsOfNegative = CGF.Builder.CreateSub(Zero, Signed); 2380 llvm::Value *AbsSigned = 2381 CGF.Builder.CreateSelect(IsNegative, AbsOfNegative, Signed); 2382 2383 // Perform a checked unsigned multiplication. 2384 llvm::Value *UnsignedOverflow; 2385 llvm::Value *UnsignedResult = 2386 EmitOverflowIntrinsic(CGF, Intrinsic::umul_with_overflow, AbsSigned, 2387 Unsigned, UnsignedOverflow); 2388 2389 llvm::Value *Overflow, *Result; 2390 if (ResultInfo.Signed) { 2391 // Signed overflow occurs if the result is greater than INT_MAX or lesser 2392 // than INT_MIN, i.e when |Result| > (INT_MAX + IsNegative). 2393 auto IntMax = 2394 llvm::APInt::getSignedMaxValue(ResultInfo.Width).zext(OpWidth); 2395 llvm::Value *MaxResult = 2396 CGF.Builder.CreateAdd(llvm::ConstantInt::get(OpTy, IntMax), 2397 CGF.Builder.CreateZExt(IsNegative, OpTy)); 2398 llvm::Value *SignedOverflow = 2399 CGF.Builder.CreateICmpUGT(UnsignedResult, MaxResult); 2400 Overflow = CGF.Builder.CreateOr(UnsignedOverflow, SignedOverflow); 2401 2402 // Prepare the signed result (possibly by negating it). 2403 llvm::Value *NegativeResult = CGF.Builder.CreateNeg(UnsignedResult); 2404 llvm::Value *SignedResult = 2405 CGF.Builder.CreateSelect(IsNegative, NegativeResult, UnsignedResult); 2406 Result = CGF.Builder.CreateTrunc(SignedResult, ResTy); 2407 } else { 2408 // Unsigned overflow occurs if the result is < 0 or greater than UINT_MAX. 2409 llvm::Value *Underflow = CGF.Builder.CreateAnd( 2410 IsNegative, CGF.Builder.CreateIsNotNull(UnsignedResult)); 2411 Overflow = CGF.Builder.CreateOr(UnsignedOverflow, Underflow); 2412 if (ResultInfo.Width < OpWidth) { 2413 auto IntMax = 2414 llvm::APInt::getMaxValue(ResultInfo.Width).zext(OpWidth); 2415 llvm::Value *TruncOverflow = CGF.Builder.CreateICmpUGT( 2416 UnsignedResult, llvm::ConstantInt::get(OpTy, IntMax)); 2417 Overflow = CGF.Builder.CreateOr(Overflow, TruncOverflow); 2418 } 2419 2420 // Negate the product if it would be negative in infinite precision. 2421 Result = CGF.Builder.CreateSelect( 2422 IsNegative, CGF.Builder.CreateNeg(UnsignedResult), UnsignedResult); 2423 2424 Result = CGF.Builder.CreateTrunc(Result, ResTy); 2425 } 2426 assert(Overflow && Result && "Missing overflow or result"); 2427 2428 bool isVolatile = 2429 ResultArg->getType()->getPointeeType().isVolatileQualified(); 2430 CGF.Builder.CreateStore(CGF.EmitToMemory(Result, ResultQTy), ResultPtr, 2431 isVolatile); 2432 return RValue::get(Overflow); 2433 } 2434 2435 static bool 2436 TypeRequiresBuiltinLaunderImp(const ASTContext &Ctx, QualType Ty, 2437 llvm::SmallPtrSetImpl<const Decl *> &Seen) { 2438 if (const auto *Arr = Ctx.getAsArrayType(Ty)) 2439 Ty = Ctx.getBaseElementType(Arr); 2440 2441 const auto *Record = Ty->getAsCXXRecordDecl(); 2442 if (!Record) 2443 return false; 2444 2445 // We've already checked this type, or are in the process of checking it. 2446 if (!Seen.insert(Record).second) 2447 return false; 2448 2449 assert(Record->hasDefinition() && 2450 "Incomplete types should already be diagnosed"); 2451 2452 if (Record->isDynamicClass()) 2453 return true; 2454 2455 for (FieldDecl *F : Record->fields()) { 2456 if (TypeRequiresBuiltinLaunderImp(Ctx, F->getType(), Seen)) 2457 return true; 2458 } 2459 return false; 2460 } 2461 2462 /// Determine if the specified type requires laundering by checking if it is a 2463 /// dynamic class type or contains a subobject which is a dynamic class type. 2464 static bool TypeRequiresBuiltinLaunder(CodeGenModule &CGM, QualType Ty) { 2465 if (!CGM.getCodeGenOpts().StrictVTablePointers) 2466 return false; 2467 llvm::SmallPtrSet<const Decl *, 16> Seen; 2468 return TypeRequiresBuiltinLaunderImp(CGM.getContext(), Ty, Seen); 2469 } 2470 2471 RValue CodeGenFunction::emitRotate(const CallExpr *E, bool IsRotateRight) { 2472 llvm::Value *Src = EmitScalarExpr(E->getArg(0)); 2473 llvm::Value *ShiftAmt = EmitScalarExpr(E->getArg(1)); 2474 2475 // The builtin's shift arg may have a different type than the source arg and 2476 // result, but the LLVM intrinsic uses the same type for all values. 2477 llvm::Type *Ty = Src->getType(); 2478 ShiftAmt = Builder.CreateIntCast(ShiftAmt, Ty, false); 2479 2480 // Rotate is a special case of LLVM funnel shift - 1st 2 args are the same. 2481 unsigned IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl; 2482 Function *F = CGM.getIntrinsic(IID, Ty); 2483 return RValue::get(Builder.CreateCall(F, { Src, Src, ShiftAmt })); 2484 } 2485 2486 // Map math builtins for long-double to f128 version. 2487 static unsigned mutateLongDoubleBuiltin(unsigned BuiltinID) { 2488 switch (BuiltinID) { 2489 #define MUTATE_LDBL(func) \ 2490 case Builtin::BI__builtin_##func##l: \ 2491 return Builtin::BI__builtin_##func##f128; 2492 MUTATE_LDBL(sqrt) 2493 MUTATE_LDBL(cbrt) 2494 MUTATE_LDBL(fabs) 2495 MUTATE_LDBL(log) 2496 MUTATE_LDBL(log2) 2497 MUTATE_LDBL(log10) 2498 MUTATE_LDBL(log1p) 2499 MUTATE_LDBL(logb) 2500 MUTATE_LDBL(exp) 2501 MUTATE_LDBL(exp2) 2502 MUTATE_LDBL(expm1) 2503 MUTATE_LDBL(fdim) 2504 MUTATE_LDBL(hypot) 2505 MUTATE_LDBL(ilogb) 2506 MUTATE_LDBL(pow) 2507 MUTATE_LDBL(fmin) 2508 MUTATE_LDBL(fmax) 2509 MUTATE_LDBL(ceil) 2510 MUTATE_LDBL(trunc) 2511 MUTATE_LDBL(rint) 2512 MUTATE_LDBL(nearbyint) 2513 MUTATE_LDBL(round) 2514 MUTATE_LDBL(floor) 2515 MUTATE_LDBL(lround) 2516 MUTATE_LDBL(llround) 2517 MUTATE_LDBL(lrint) 2518 MUTATE_LDBL(llrint) 2519 MUTATE_LDBL(fmod) 2520 MUTATE_LDBL(modf) 2521 MUTATE_LDBL(nan) 2522 MUTATE_LDBL(nans) 2523 MUTATE_LDBL(inf) 2524 MUTATE_LDBL(fma) 2525 MUTATE_LDBL(sin) 2526 MUTATE_LDBL(cos) 2527 MUTATE_LDBL(tan) 2528 MUTATE_LDBL(sinh) 2529 MUTATE_LDBL(cosh) 2530 MUTATE_LDBL(tanh) 2531 MUTATE_LDBL(asin) 2532 MUTATE_LDBL(acos) 2533 MUTATE_LDBL(atan) 2534 MUTATE_LDBL(asinh) 2535 MUTATE_LDBL(acosh) 2536 MUTATE_LDBL(atanh) 2537 MUTATE_LDBL(atan2) 2538 MUTATE_LDBL(erf) 2539 MUTATE_LDBL(erfc) 2540 MUTATE_LDBL(ldexp) 2541 MUTATE_LDBL(frexp) 2542 MUTATE_LDBL(huge_val) 2543 MUTATE_LDBL(copysign) 2544 MUTATE_LDBL(nextafter) 2545 MUTATE_LDBL(nexttoward) 2546 MUTATE_LDBL(remainder) 2547 MUTATE_LDBL(remquo) 2548 MUTATE_LDBL(scalbln) 2549 MUTATE_LDBL(scalbn) 2550 MUTATE_LDBL(tgamma) 2551 MUTATE_LDBL(lgamma) 2552 #undef MUTATE_LDBL 2553 default: 2554 return BuiltinID; 2555 } 2556 } 2557 2558 static Value *tryUseTestFPKind(CodeGenFunction &CGF, unsigned BuiltinID, 2559 Value *V) { 2560 if (CGF.Builder.getIsFPConstrained() && 2561 CGF.Builder.getDefaultConstrainedExcept() != fp::ebIgnore) { 2562 if (Value *Result = 2563 CGF.getTargetHooks().testFPKind(V, BuiltinID, CGF.Builder, CGF.CGM)) 2564 return Result; 2565 } 2566 return nullptr; 2567 } 2568 2569 static RValue EmitHipStdParUnsupportedBuiltin(CodeGenFunction *CGF, 2570 const FunctionDecl *FD) { 2571 auto Name = FD->getNameAsString() + "__hipstdpar_unsupported"; 2572 auto FnTy = CGF->CGM.getTypes().GetFunctionType(FD); 2573 auto UBF = CGF->CGM.getModule().getOrInsertFunction(Name, FnTy); 2574 2575 SmallVector<Value *, 16> Args; 2576 for (auto &&FormalTy : FnTy->params()) 2577 Args.push_back(llvm::PoisonValue::get(FormalTy)); 2578 2579 return RValue::get(CGF->Builder.CreateCall(UBF, Args)); 2580 } 2581 2582 RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, 2583 const CallExpr *E, 2584 ReturnValueSlot ReturnValue) { 2585 assert(!getContext().BuiltinInfo.isImmediate(BuiltinID) && 2586 "Should not codegen for consteval builtins"); 2587 2588 const FunctionDecl *FD = GD.getDecl()->getAsFunction(); 2589 // See if we can constant fold this builtin. If so, don't emit it at all. 2590 // TODO: Extend this handling to all builtin calls that we can constant-fold. 2591 Expr::EvalResult Result; 2592 if (E->isPRValue() && E->EvaluateAsRValue(Result, CGM.getContext()) && 2593 !Result.hasSideEffects()) { 2594 if (Result.Val.isInt()) 2595 return RValue::get(llvm::ConstantInt::get(getLLVMContext(), 2596 Result.Val.getInt())); 2597 if (Result.Val.isFloat()) 2598 return RValue::get(llvm::ConstantFP::get(getLLVMContext(), 2599 Result.Val.getFloat())); 2600 } 2601 2602 // If current long-double semantics is IEEE 128-bit, replace math builtins 2603 // of long-double with f128 equivalent. 2604 // TODO: This mutation should also be applied to other targets other than PPC, 2605 // after backend supports IEEE 128-bit style libcalls. 2606 if (getTarget().getTriple().isPPC64() && 2607 !getTarget().getTriple().isOSFreeBSD() && 2608 &getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad()) 2609 BuiltinID = mutateLongDoubleBuiltin(BuiltinID); 2610 2611 // If the builtin has been declared explicitly with an assembler label, 2612 // disable the specialized emitting below. Ideally we should communicate the 2613 // rename in IR, or at least avoid generating the intrinsic calls that are 2614 // likely to get lowered to the renamed library functions. 2615 const unsigned BuiltinIDIfNoAsmLabel = 2616 FD->hasAttr<AsmLabelAttr>() ? 0 : BuiltinID; 2617 2618 std::optional<bool> ErrnoOverriden; 2619 // ErrnoOverriden is true if math-errno is overriden via the 2620 // '#pragma float_control(precise, on)'. This pragma disables fast-math, 2621 // which implies math-errno. 2622 if (E->hasStoredFPFeatures()) { 2623 FPOptionsOverride OP = E->getFPFeatures(); 2624 if (OP.hasMathErrnoOverride()) 2625 ErrnoOverriden = OP.getMathErrnoOverride(); 2626 } 2627 // True if 'attribute__((optnone))' is used. This attribute overrides 2628 // fast-math which implies math-errno. 2629 bool OptNone = CurFuncDecl && CurFuncDecl->hasAttr<OptimizeNoneAttr>(); 2630 2631 // True if we are compiling at -O2 and errno has been disabled 2632 // using the '#pragma float_control(precise, off)', and 2633 // attribute opt-none hasn't been seen. 2634 bool ErrnoOverridenToFalseWithOpt = 2635 ErrnoOverriden.has_value() && !ErrnoOverriden.value() && !OptNone && 2636 CGM.getCodeGenOpts().OptimizationLevel != 0; 2637 2638 // There are LLVM math intrinsics/instructions corresponding to math library 2639 // functions except the LLVM op will never set errno while the math library 2640 // might. Also, math builtins have the same semantics as their math library 2641 // twins. Thus, we can transform math library and builtin calls to their 2642 // LLVM counterparts if the call is marked 'const' (known to never set errno). 2643 // In case FP exceptions are enabled, the experimental versions of the 2644 // intrinsics model those. 2645 bool ConstAlways = 2646 getContext().BuiltinInfo.isConst(BuiltinID); 2647 2648 // There's a special case with the fma builtins where they are always const 2649 // if the target environment is GNU or the target is OS is Windows and we're 2650 // targeting the MSVCRT.dll environment. 2651 // FIXME: This list can be become outdated. Need to find a way to get it some 2652 // other way. 2653 switch (BuiltinID) { 2654 case Builtin::BI__builtin_fma: 2655 case Builtin::BI__builtin_fmaf: 2656 case Builtin::BI__builtin_fmal: 2657 case Builtin::BI__builtin_fmaf16: 2658 case Builtin::BIfma: 2659 case Builtin::BIfmaf: 2660 case Builtin::BIfmal: { 2661 auto &Trip = CGM.getTriple(); 2662 if (Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) 2663 ConstAlways = true; 2664 break; 2665 } 2666 default: 2667 break; 2668 } 2669 2670 bool ConstWithoutErrnoAndExceptions = 2671 getContext().BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID); 2672 bool ConstWithoutExceptions = 2673 getContext().BuiltinInfo.isConstWithoutExceptions(BuiltinID); 2674 2675 // ConstAttr is enabled in fast-math mode. In fast-math mode, math-errno is 2676 // disabled. 2677 // Math intrinsics are generated only when math-errno is disabled. Any pragmas 2678 // or attributes that affect math-errno should prevent or allow math 2679 // intrinsics to be generated. Intrinsics are generated: 2680 // 1- In fast math mode, unless math-errno is overriden 2681 // via '#pragma float_control(precise, on)', or via an 2682 // 'attribute__((optnone))'. 2683 // 2- If math-errno was enabled on command line but overriden 2684 // to false via '#pragma float_control(precise, off))' and 2685 // 'attribute__((optnone))' hasn't been used. 2686 // 3- If we are compiling with optimization and errno has been disabled 2687 // via '#pragma float_control(precise, off)', and 2688 // 'attribute__((optnone))' hasn't been used. 2689 2690 bool ConstWithoutErrnoOrExceptions = 2691 ConstWithoutErrnoAndExceptions || ConstWithoutExceptions; 2692 bool GenerateIntrinsics = 2693 (ConstAlways && !OptNone) || 2694 (!getLangOpts().MathErrno && 2695 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone); 2696 if (!GenerateIntrinsics) { 2697 GenerateIntrinsics = 2698 ConstWithoutErrnoOrExceptions && !ConstWithoutErrnoAndExceptions; 2699 if (!GenerateIntrinsics) 2700 GenerateIntrinsics = 2701 ConstWithoutErrnoOrExceptions && 2702 (!getLangOpts().MathErrno && 2703 !(ErrnoOverriden.has_value() && ErrnoOverriden.value()) && !OptNone); 2704 if (!GenerateIntrinsics) 2705 GenerateIntrinsics = 2706 ConstWithoutErrnoOrExceptions && ErrnoOverridenToFalseWithOpt; 2707 } 2708 if (GenerateIntrinsics) { 2709 switch (BuiltinIDIfNoAsmLabel) { 2710 case Builtin::BIacos: 2711 case Builtin::BIacosf: 2712 case Builtin::BIacosl: 2713 case Builtin::BI__builtin_acos: 2714 case Builtin::BI__builtin_acosf: 2715 case Builtin::BI__builtin_acosf16: 2716 case Builtin::BI__builtin_acosl: 2717 case Builtin::BI__builtin_acosf128: 2718 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 2719 *this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos)); 2720 2721 case Builtin::BIasin: 2722 case Builtin::BIasinf: 2723 case Builtin::BIasinl: 2724 case Builtin::BI__builtin_asin: 2725 case Builtin::BI__builtin_asinf: 2726 case Builtin::BI__builtin_asinf16: 2727 case Builtin::BI__builtin_asinl: 2728 case Builtin::BI__builtin_asinf128: 2729 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 2730 *this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin)); 2731 2732 case Builtin::BIatan: 2733 case Builtin::BIatanf: 2734 case Builtin::BIatanl: 2735 case Builtin::BI__builtin_atan: 2736 case Builtin::BI__builtin_atanf: 2737 case Builtin::BI__builtin_atanf16: 2738 case Builtin::BI__builtin_atanl: 2739 case Builtin::BI__builtin_atanf128: 2740 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 2741 *this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan)); 2742 2743 case Builtin::BIatan2: 2744 case Builtin::BIatan2f: 2745 case Builtin::BIatan2l: 2746 case Builtin::BI__builtin_atan2: 2747 case Builtin::BI__builtin_atan2f: 2748 case Builtin::BI__builtin_atan2f16: 2749 case Builtin::BI__builtin_atan2l: 2750 case Builtin::BI__builtin_atan2f128: 2751 return RValue::get(emitBinaryMaybeConstrainedFPBuiltin( 2752 *this, E, Intrinsic::atan2, 2753 Intrinsic::experimental_constrained_atan2)); 2754 2755 case Builtin::BIceil: 2756 case Builtin::BIceilf: 2757 case Builtin::BIceill: 2758 case Builtin::BI__builtin_ceil: 2759 case Builtin::BI__builtin_ceilf: 2760 case Builtin::BI__builtin_ceilf16: 2761 case Builtin::BI__builtin_ceill: 2762 case Builtin::BI__builtin_ceilf128: 2763 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2764 Intrinsic::ceil, 2765 Intrinsic::experimental_constrained_ceil)); 2766 2767 case Builtin::BIcopysign: 2768 case Builtin::BIcopysignf: 2769 case Builtin::BIcopysignl: 2770 case Builtin::BI__builtin_copysign: 2771 case Builtin::BI__builtin_copysignf: 2772 case Builtin::BI__builtin_copysignf16: 2773 case Builtin::BI__builtin_copysignl: 2774 case Builtin::BI__builtin_copysignf128: 2775 return RValue::get( 2776 emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::copysign)); 2777 2778 case Builtin::BIcos: 2779 case Builtin::BIcosf: 2780 case Builtin::BIcosl: 2781 case Builtin::BI__builtin_cos: 2782 case Builtin::BI__builtin_cosf: 2783 case Builtin::BI__builtin_cosf16: 2784 case Builtin::BI__builtin_cosl: 2785 case Builtin::BI__builtin_cosf128: 2786 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2787 Intrinsic::cos, 2788 Intrinsic::experimental_constrained_cos)); 2789 2790 case Builtin::BIcosh: 2791 case Builtin::BIcoshf: 2792 case Builtin::BIcoshl: 2793 case Builtin::BI__builtin_cosh: 2794 case Builtin::BI__builtin_coshf: 2795 case Builtin::BI__builtin_coshf16: 2796 case Builtin::BI__builtin_coshl: 2797 case Builtin::BI__builtin_coshf128: 2798 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 2799 *this, E, Intrinsic::cosh, Intrinsic::experimental_constrained_cosh)); 2800 2801 case Builtin::BIexp: 2802 case Builtin::BIexpf: 2803 case Builtin::BIexpl: 2804 case Builtin::BI__builtin_exp: 2805 case Builtin::BI__builtin_expf: 2806 case Builtin::BI__builtin_expf16: 2807 case Builtin::BI__builtin_expl: 2808 case Builtin::BI__builtin_expf128: 2809 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2810 Intrinsic::exp, 2811 Intrinsic::experimental_constrained_exp)); 2812 2813 case Builtin::BIexp2: 2814 case Builtin::BIexp2f: 2815 case Builtin::BIexp2l: 2816 case Builtin::BI__builtin_exp2: 2817 case Builtin::BI__builtin_exp2f: 2818 case Builtin::BI__builtin_exp2f16: 2819 case Builtin::BI__builtin_exp2l: 2820 case Builtin::BI__builtin_exp2f128: 2821 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2822 Intrinsic::exp2, 2823 Intrinsic::experimental_constrained_exp2)); 2824 case Builtin::BI__builtin_exp10: 2825 case Builtin::BI__builtin_exp10f: 2826 case Builtin::BI__builtin_exp10f16: 2827 case Builtin::BI__builtin_exp10l: 2828 case Builtin::BI__builtin_exp10f128: { 2829 // TODO: strictfp support 2830 if (Builder.getIsFPConstrained()) 2831 break; 2832 return RValue::get( 2833 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::exp10)); 2834 } 2835 case Builtin::BIfabs: 2836 case Builtin::BIfabsf: 2837 case Builtin::BIfabsl: 2838 case Builtin::BI__builtin_fabs: 2839 case Builtin::BI__builtin_fabsf: 2840 case Builtin::BI__builtin_fabsf16: 2841 case Builtin::BI__builtin_fabsl: 2842 case Builtin::BI__builtin_fabsf128: 2843 return RValue::get( 2844 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::fabs)); 2845 2846 case Builtin::BIfloor: 2847 case Builtin::BIfloorf: 2848 case Builtin::BIfloorl: 2849 case Builtin::BI__builtin_floor: 2850 case Builtin::BI__builtin_floorf: 2851 case Builtin::BI__builtin_floorf16: 2852 case Builtin::BI__builtin_floorl: 2853 case Builtin::BI__builtin_floorf128: 2854 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2855 Intrinsic::floor, 2856 Intrinsic::experimental_constrained_floor)); 2857 2858 case Builtin::BIfma: 2859 case Builtin::BIfmaf: 2860 case Builtin::BIfmal: 2861 case Builtin::BI__builtin_fma: 2862 case Builtin::BI__builtin_fmaf: 2863 case Builtin::BI__builtin_fmaf16: 2864 case Builtin::BI__builtin_fmal: 2865 case Builtin::BI__builtin_fmaf128: 2866 return RValue::get(emitTernaryMaybeConstrainedFPBuiltin(*this, E, 2867 Intrinsic::fma, 2868 Intrinsic::experimental_constrained_fma)); 2869 2870 case Builtin::BIfmax: 2871 case Builtin::BIfmaxf: 2872 case Builtin::BIfmaxl: 2873 case Builtin::BI__builtin_fmax: 2874 case Builtin::BI__builtin_fmaxf: 2875 case Builtin::BI__builtin_fmaxf16: 2876 case Builtin::BI__builtin_fmaxl: 2877 case Builtin::BI__builtin_fmaxf128: 2878 return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(*this, E, 2879 Intrinsic::maxnum, 2880 Intrinsic::experimental_constrained_maxnum)); 2881 2882 case Builtin::BIfmin: 2883 case Builtin::BIfminf: 2884 case Builtin::BIfminl: 2885 case Builtin::BI__builtin_fmin: 2886 case Builtin::BI__builtin_fminf: 2887 case Builtin::BI__builtin_fminf16: 2888 case Builtin::BI__builtin_fminl: 2889 case Builtin::BI__builtin_fminf128: 2890 return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(*this, E, 2891 Intrinsic::minnum, 2892 Intrinsic::experimental_constrained_minnum)); 2893 2894 case Builtin::BIfmaximum_num: 2895 case Builtin::BIfmaximum_numf: 2896 case Builtin::BIfmaximum_numl: 2897 case Builtin::BI__builtin_fmaximum_num: 2898 case Builtin::BI__builtin_fmaximum_numf: 2899 case Builtin::BI__builtin_fmaximum_numf16: 2900 case Builtin::BI__builtin_fmaximum_numl: 2901 case Builtin::BI__builtin_fmaximum_numf128: 2902 return RValue::get( 2903 emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::maximumnum)); 2904 2905 case Builtin::BIfminimum_num: 2906 case Builtin::BIfminimum_numf: 2907 case Builtin::BIfminimum_numl: 2908 case Builtin::BI__builtin_fminimum_num: 2909 case Builtin::BI__builtin_fminimum_numf: 2910 case Builtin::BI__builtin_fminimum_numf16: 2911 case Builtin::BI__builtin_fminimum_numl: 2912 case Builtin::BI__builtin_fminimum_numf128: 2913 return RValue::get( 2914 emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::minimumnum)); 2915 2916 // fmod() is a special-case. It maps to the frem instruction rather than an 2917 // LLVM intrinsic. 2918 case Builtin::BIfmod: 2919 case Builtin::BIfmodf: 2920 case Builtin::BIfmodl: 2921 case Builtin::BI__builtin_fmod: 2922 case Builtin::BI__builtin_fmodf: 2923 case Builtin::BI__builtin_fmodf16: 2924 case Builtin::BI__builtin_fmodl: 2925 case Builtin::BI__builtin_fmodf128: 2926 case Builtin::BI__builtin_elementwise_fmod: { 2927 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 2928 Value *Arg1 = EmitScalarExpr(E->getArg(0)); 2929 Value *Arg2 = EmitScalarExpr(E->getArg(1)); 2930 return RValue::get(Builder.CreateFRem(Arg1, Arg2, "fmod")); 2931 } 2932 2933 case Builtin::BIlog: 2934 case Builtin::BIlogf: 2935 case Builtin::BIlogl: 2936 case Builtin::BI__builtin_log: 2937 case Builtin::BI__builtin_logf: 2938 case Builtin::BI__builtin_logf16: 2939 case Builtin::BI__builtin_logl: 2940 case Builtin::BI__builtin_logf128: 2941 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2942 Intrinsic::log, 2943 Intrinsic::experimental_constrained_log)); 2944 2945 case Builtin::BIlog10: 2946 case Builtin::BIlog10f: 2947 case Builtin::BIlog10l: 2948 case Builtin::BI__builtin_log10: 2949 case Builtin::BI__builtin_log10f: 2950 case Builtin::BI__builtin_log10f16: 2951 case Builtin::BI__builtin_log10l: 2952 case Builtin::BI__builtin_log10f128: 2953 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2954 Intrinsic::log10, 2955 Intrinsic::experimental_constrained_log10)); 2956 2957 case Builtin::BIlog2: 2958 case Builtin::BIlog2f: 2959 case Builtin::BIlog2l: 2960 case Builtin::BI__builtin_log2: 2961 case Builtin::BI__builtin_log2f: 2962 case Builtin::BI__builtin_log2f16: 2963 case Builtin::BI__builtin_log2l: 2964 case Builtin::BI__builtin_log2f128: 2965 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2966 Intrinsic::log2, 2967 Intrinsic::experimental_constrained_log2)); 2968 2969 case Builtin::BInearbyint: 2970 case Builtin::BInearbyintf: 2971 case Builtin::BInearbyintl: 2972 case Builtin::BI__builtin_nearbyint: 2973 case Builtin::BI__builtin_nearbyintf: 2974 case Builtin::BI__builtin_nearbyintl: 2975 case Builtin::BI__builtin_nearbyintf128: 2976 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 2977 Intrinsic::nearbyint, 2978 Intrinsic::experimental_constrained_nearbyint)); 2979 2980 case Builtin::BIpow: 2981 case Builtin::BIpowf: 2982 case Builtin::BIpowl: 2983 case Builtin::BI__builtin_pow: 2984 case Builtin::BI__builtin_powf: 2985 case Builtin::BI__builtin_powf16: 2986 case Builtin::BI__builtin_powl: 2987 case Builtin::BI__builtin_powf128: 2988 return RValue::get(emitBinaryMaybeConstrainedFPBuiltin(*this, E, 2989 Intrinsic::pow, 2990 Intrinsic::experimental_constrained_pow)); 2991 2992 case Builtin::BIrint: 2993 case Builtin::BIrintf: 2994 case Builtin::BIrintl: 2995 case Builtin::BI__builtin_rint: 2996 case Builtin::BI__builtin_rintf: 2997 case Builtin::BI__builtin_rintf16: 2998 case Builtin::BI__builtin_rintl: 2999 case Builtin::BI__builtin_rintf128: 3000 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 3001 Intrinsic::rint, 3002 Intrinsic::experimental_constrained_rint)); 3003 3004 case Builtin::BIround: 3005 case Builtin::BIroundf: 3006 case Builtin::BIroundl: 3007 case Builtin::BI__builtin_round: 3008 case Builtin::BI__builtin_roundf: 3009 case Builtin::BI__builtin_roundf16: 3010 case Builtin::BI__builtin_roundl: 3011 case Builtin::BI__builtin_roundf128: 3012 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 3013 Intrinsic::round, 3014 Intrinsic::experimental_constrained_round)); 3015 3016 case Builtin::BIroundeven: 3017 case Builtin::BIroundevenf: 3018 case Builtin::BIroundevenl: 3019 case Builtin::BI__builtin_roundeven: 3020 case Builtin::BI__builtin_roundevenf: 3021 case Builtin::BI__builtin_roundevenf16: 3022 case Builtin::BI__builtin_roundevenl: 3023 case Builtin::BI__builtin_roundevenf128: 3024 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 3025 Intrinsic::roundeven, 3026 Intrinsic::experimental_constrained_roundeven)); 3027 3028 case Builtin::BIsin: 3029 case Builtin::BIsinf: 3030 case Builtin::BIsinl: 3031 case Builtin::BI__builtin_sin: 3032 case Builtin::BI__builtin_sinf: 3033 case Builtin::BI__builtin_sinf16: 3034 case Builtin::BI__builtin_sinl: 3035 case Builtin::BI__builtin_sinf128: 3036 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 3037 Intrinsic::sin, 3038 Intrinsic::experimental_constrained_sin)); 3039 3040 case Builtin::BIsinh: 3041 case Builtin::BIsinhf: 3042 case Builtin::BIsinhl: 3043 case Builtin::BI__builtin_sinh: 3044 case Builtin::BI__builtin_sinhf: 3045 case Builtin::BI__builtin_sinhf16: 3046 case Builtin::BI__builtin_sinhl: 3047 case Builtin::BI__builtin_sinhf128: 3048 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 3049 *this, E, Intrinsic::sinh, Intrinsic::experimental_constrained_sinh)); 3050 3051 case Builtin::BI__builtin_sincospi: 3052 case Builtin::BI__builtin_sincospif: 3053 case Builtin::BI__builtin_sincospil: 3054 if (Builder.getIsFPConstrained()) 3055 break; // TODO: Emit constrained sincospi intrinsic once one exists. 3056 emitSincosBuiltin(*this, E, Intrinsic::sincospi); 3057 return RValue::get(nullptr); 3058 3059 case Builtin::BIsincos: 3060 case Builtin::BIsincosf: 3061 case Builtin::BIsincosl: 3062 case Builtin::BI__builtin_sincos: 3063 case Builtin::BI__builtin_sincosf: 3064 case Builtin::BI__builtin_sincosf16: 3065 case Builtin::BI__builtin_sincosl: 3066 case Builtin::BI__builtin_sincosf128: 3067 if (Builder.getIsFPConstrained()) 3068 break; // TODO: Emit constrained sincos intrinsic once one exists. 3069 emitSincosBuiltin(*this, E, Intrinsic::sincos); 3070 return RValue::get(nullptr); 3071 3072 case Builtin::BIsqrt: 3073 case Builtin::BIsqrtf: 3074 case Builtin::BIsqrtl: 3075 case Builtin::BI__builtin_sqrt: 3076 case Builtin::BI__builtin_sqrtf: 3077 case Builtin::BI__builtin_sqrtf16: 3078 case Builtin::BI__builtin_sqrtl: 3079 case Builtin::BI__builtin_sqrtf128: 3080 case Builtin::BI__builtin_elementwise_sqrt: { 3081 llvm::Value *Call = emitUnaryMaybeConstrainedFPBuiltin( 3082 *this, E, Intrinsic::sqrt, Intrinsic::experimental_constrained_sqrt); 3083 SetSqrtFPAccuracy(Call); 3084 return RValue::get(Call); 3085 } 3086 3087 case Builtin::BItan: 3088 case Builtin::BItanf: 3089 case Builtin::BItanl: 3090 case Builtin::BI__builtin_tan: 3091 case Builtin::BI__builtin_tanf: 3092 case Builtin::BI__builtin_tanf16: 3093 case Builtin::BI__builtin_tanl: 3094 case Builtin::BI__builtin_tanf128: 3095 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 3096 *this, E, Intrinsic::tan, Intrinsic::experimental_constrained_tan)); 3097 3098 case Builtin::BItanh: 3099 case Builtin::BItanhf: 3100 case Builtin::BItanhl: 3101 case Builtin::BI__builtin_tanh: 3102 case Builtin::BI__builtin_tanhf: 3103 case Builtin::BI__builtin_tanhf16: 3104 case Builtin::BI__builtin_tanhl: 3105 case Builtin::BI__builtin_tanhf128: 3106 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin( 3107 *this, E, Intrinsic::tanh, Intrinsic::experimental_constrained_tanh)); 3108 3109 case Builtin::BItrunc: 3110 case Builtin::BItruncf: 3111 case Builtin::BItruncl: 3112 case Builtin::BI__builtin_trunc: 3113 case Builtin::BI__builtin_truncf: 3114 case Builtin::BI__builtin_truncf16: 3115 case Builtin::BI__builtin_truncl: 3116 case Builtin::BI__builtin_truncf128: 3117 return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(*this, E, 3118 Intrinsic::trunc, 3119 Intrinsic::experimental_constrained_trunc)); 3120 3121 case Builtin::BIlround: 3122 case Builtin::BIlroundf: 3123 case Builtin::BIlroundl: 3124 case Builtin::BI__builtin_lround: 3125 case Builtin::BI__builtin_lroundf: 3126 case Builtin::BI__builtin_lroundl: 3127 case Builtin::BI__builtin_lroundf128: 3128 return RValue::get(emitMaybeConstrainedFPToIntRoundBuiltin( 3129 *this, E, Intrinsic::lround, 3130 Intrinsic::experimental_constrained_lround)); 3131 3132 case Builtin::BIllround: 3133 case Builtin::BIllroundf: 3134 case Builtin::BIllroundl: 3135 case Builtin::BI__builtin_llround: 3136 case Builtin::BI__builtin_llroundf: 3137 case Builtin::BI__builtin_llroundl: 3138 case Builtin::BI__builtin_llroundf128: 3139 return RValue::get(emitMaybeConstrainedFPToIntRoundBuiltin( 3140 *this, E, Intrinsic::llround, 3141 Intrinsic::experimental_constrained_llround)); 3142 3143 case Builtin::BIlrint: 3144 case Builtin::BIlrintf: 3145 case Builtin::BIlrintl: 3146 case Builtin::BI__builtin_lrint: 3147 case Builtin::BI__builtin_lrintf: 3148 case Builtin::BI__builtin_lrintl: 3149 case Builtin::BI__builtin_lrintf128: 3150 return RValue::get(emitMaybeConstrainedFPToIntRoundBuiltin( 3151 *this, E, Intrinsic::lrint, 3152 Intrinsic::experimental_constrained_lrint)); 3153 3154 case Builtin::BIllrint: 3155 case Builtin::BIllrintf: 3156 case Builtin::BIllrintl: 3157 case Builtin::BI__builtin_llrint: 3158 case Builtin::BI__builtin_llrintf: 3159 case Builtin::BI__builtin_llrintl: 3160 case Builtin::BI__builtin_llrintf128: 3161 return RValue::get(emitMaybeConstrainedFPToIntRoundBuiltin( 3162 *this, E, Intrinsic::llrint, 3163 Intrinsic::experimental_constrained_llrint)); 3164 case Builtin::BI__builtin_ldexp: 3165 case Builtin::BI__builtin_ldexpf: 3166 case Builtin::BI__builtin_ldexpl: 3167 case Builtin::BI__builtin_ldexpf16: 3168 case Builtin::BI__builtin_ldexpf128: { 3169 return RValue::get(emitBinaryExpMaybeConstrainedFPBuiltin( 3170 *this, E, Intrinsic::ldexp, 3171 Intrinsic::experimental_constrained_ldexp)); 3172 } 3173 default: 3174 break; 3175 } 3176 } 3177 3178 // Check NonnullAttribute/NullabilityArg and Alignment. 3179 auto EmitArgCheck = [&](TypeCheckKind Kind, Address A, const Expr *Arg, 3180 unsigned ParmNum) { 3181 Value *Val = A.emitRawPointer(*this); 3182 EmitNonNullArgCheck(RValue::get(Val), Arg->getType(), Arg->getExprLoc(), FD, 3183 ParmNum); 3184 3185 if (SanOpts.has(SanitizerKind::Alignment)) { 3186 SanitizerSet SkippedChecks; 3187 SkippedChecks.set(SanitizerKind::All); 3188 SkippedChecks.clear(SanitizerKind::Alignment); 3189 SourceLocation Loc = Arg->getExprLoc(); 3190 // Strip an implicit cast. 3191 if (auto *CE = dyn_cast<ImplicitCastExpr>(Arg)) 3192 if (CE->getCastKind() == CK_BitCast) 3193 Arg = CE->getSubExpr(); 3194 EmitTypeCheck(Kind, Loc, Val, Arg->getType(), A.getAlignment(), 3195 SkippedChecks); 3196 } 3197 }; 3198 3199 switch (BuiltinIDIfNoAsmLabel) { 3200 default: break; 3201 case Builtin::BI__builtin___CFStringMakeConstantString: 3202 case Builtin::BI__builtin___NSStringMakeConstantString: 3203 return RValue::get(ConstantEmitter(*this).emitAbstract(E, E->getType())); 3204 case Builtin::BI__builtin_stdarg_start: 3205 case Builtin::BI__builtin_va_start: 3206 case Builtin::BI__va_start: 3207 case Builtin::BI__builtin_c23_va_start: 3208 case Builtin::BI__builtin_va_end: 3209 EmitVAStartEnd(BuiltinID == Builtin::BI__va_start 3210 ? EmitScalarExpr(E->getArg(0)) 3211 : EmitVAListRef(E->getArg(0)).emitRawPointer(*this), 3212 BuiltinID != Builtin::BI__builtin_va_end); 3213 return RValue::get(nullptr); 3214 case Builtin::BI__builtin_va_copy: { 3215 Value *DstPtr = EmitVAListRef(E->getArg(0)).emitRawPointer(*this); 3216 Value *SrcPtr = EmitVAListRef(E->getArg(1)).emitRawPointer(*this); 3217 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::vacopy, {DstPtr->getType()}), 3218 {DstPtr, SrcPtr}); 3219 return RValue::get(nullptr); 3220 } 3221 case Builtin::BIabs: 3222 case Builtin::BIlabs: 3223 case Builtin::BIllabs: 3224 case Builtin::BI__builtin_abs: 3225 case Builtin::BI__builtin_labs: 3226 case Builtin::BI__builtin_llabs: { 3227 bool SanitizeOverflow = SanOpts.has(SanitizerKind::SignedIntegerOverflow); 3228 3229 Value *Result; 3230 switch (getLangOpts().getSignedOverflowBehavior()) { 3231 case LangOptions::SOB_Defined: 3232 Result = EmitAbs(*this, EmitScalarExpr(E->getArg(0)), false); 3233 break; 3234 case LangOptions::SOB_Undefined: 3235 if (!SanitizeOverflow) { 3236 Result = EmitAbs(*this, EmitScalarExpr(E->getArg(0)), true); 3237 break; 3238 } 3239 [[fallthrough]]; 3240 case LangOptions::SOB_Trapping: 3241 // TODO: Somehow handle the corner case when the address of abs is taken. 3242 Result = EmitOverflowCheckedAbs(*this, E, SanitizeOverflow); 3243 break; 3244 } 3245 return RValue::get(Result); 3246 } 3247 case Builtin::BI__builtin_complex: { 3248 Value *Real = EmitScalarExpr(E->getArg(0)); 3249 Value *Imag = EmitScalarExpr(E->getArg(1)); 3250 return RValue::getComplex({Real, Imag}); 3251 } 3252 case Builtin::BI__builtin_conj: 3253 case Builtin::BI__builtin_conjf: 3254 case Builtin::BI__builtin_conjl: 3255 case Builtin::BIconj: 3256 case Builtin::BIconjf: 3257 case Builtin::BIconjl: { 3258 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 3259 Value *Real = ComplexVal.first; 3260 Value *Imag = ComplexVal.second; 3261 Imag = Builder.CreateFNeg(Imag, "neg"); 3262 return RValue::getComplex(std::make_pair(Real, Imag)); 3263 } 3264 case Builtin::BI__builtin_creal: 3265 case Builtin::BI__builtin_crealf: 3266 case Builtin::BI__builtin_creall: 3267 case Builtin::BIcreal: 3268 case Builtin::BIcrealf: 3269 case Builtin::BIcreall: { 3270 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 3271 return RValue::get(ComplexVal.first); 3272 } 3273 3274 case Builtin::BI__builtin_preserve_access_index: { 3275 // Only enabled preserved access index region when debuginfo 3276 // is available as debuginfo is needed to preserve user-level 3277 // access pattern. 3278 if (!getDebugInfo()) { 3279 CGM.Error(E->getExprLoc(), "using builtin_preserve_access_index() without -g"); 3280 return RValue::get(EmitScalarExpr(E->getArg(0))); 3281 } 3282 3283 // Nested builtin_preserve_access_index() not supported 3284 if (IsInPreservedAIRegion) { 3285 CGM.Error(E->getExprLoc(), "nested builtin_preserve_access_index() not supported"); 3286 return RValue::get(EmitScalarExpr(E->getArg(0))); 3287 } 3288 3289 IsInPreservedAIRegion = true; 3290 Value *Res = EmitScalarExpr(E->getArg(0)); 3291 IsInPreservedAIRegion = false; 3292 return RValue::get(Res); 3293 } 3294 3295 case Builtin::BI__builtin_cimag: 3296 case Builtin::BI__builtin_cimagf: 3297 case Builtin::BI__builtin_cimagl: 3298 case Builtin::BIcimag: 3299 case Builtin::BIcimagf: 3300 case Builtin::BIcimagl: { 3301 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 3302 return RValue::get(ComplexVal.second); 3303 } 3304 3305 case Builtin::BI__builtin_clrsb: 3306 case Builtin::BI__builtin_clrsbl: 3307 case Builtin::BI__builtin_clrsbll: { 3308 // clrsb(x) -> clz(x < 0 ? ~x : x) - 1 or 3309 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3310 3311 llvm::Type *ArgType = ArgValue->getType(); 3312 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 3313 3314 llvm::Type *ResultType = ConvertType(E->getType()); 3315 Value *Zero = llvm::Constant::getNullValue(ArgType); 3316 Value *IsNeg = Builder.CreateICmpSLT(ArgValue, Zero, "isneg"); 3317 Value *Inverse = Builder.CreateNot(ArgValue, "not"); 3318 Value *Tmp = Builder.CreateSelect(IsNeg, Inverse, ArgValue); 3319 Value *Ctlz = Builder.CreateCall(F, {Tmp, Builder.getFalse()}); 3320 Value *Result = Builder.CreateSub(Ctlz, llvm::ConstantInt::get(ArgType, 1)); 3321 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 3322 "cast"); 3323 return RValue::get(Result); 3324 } 3325 case Builtin::BI__builtin_ctzs: 3326 case Builtin::BI__builtin_ctz: 3327 case Builtin::BI__builtin_ctzl: 3328 case Builtin::BI__builtin_ctzll: 3329 case Builtin::BI__builtin_ctzg: { 3330 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_ctzg && 3331 E->getNumArgs() > 1; 3332 3333 Value *ArgValue = 3334 HasFallback ? EmitScalarExpr(E->getArg(0)) 3335 : EmitCheckedArgForBuiltin(E->getArg(0), BCK_CTZPassedZero); 3336 3337 llvm::Type *ArgType = ArgValue->getType(); 3338 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 3339 3340 llvm::Type *ResultType = ConvertType(E->getType()); 3341 Value *ZeroUndef = 3342 Builder.getInt1(HasFallback || getTarget().isCLZForZeroUndef()); 3343 Value *Result = Builder.CreateCall(F, {ArgValue, ZeroUndef}); 3344 if (Result->getType() != ResultType) 3345 Result = 3346 Builder.CreateIntCast(Result, ResultType, /*isSigned*/ false, "cast"); 3347 if (!HasFallback) 3348 return RValue::get(Result); 3349 3350 Value *Zero = Constant::getNullValue(ArgType); 3351 Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero"); 3352 Value *FallbackValue = EmitScalarExpr(E->getArg(1)); 3353 Value *ResultOrFallback = 3354 Builder.CreateSelect(IsZero, FallbackValue, Result, "ctzg"); 3355 return RValue::get(ResultOrFallback); 3356 } 3357 case Builtin::BI__builtin_clzs: 3358 case Builtin::BI__builtin_clz: 3359 case Builtin::BI__builtin_clzl: 3360 case Builtin::BI__builtin_clzll: 3361 case Builtin::BI__builtin_clzg: { 3362 bool HasFallback = BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_clzg && 3363 E->getNumArgs() > 1; 3364 3365 Value *ArgValue = 3366 HasFallback ? EmitScalarExpr(E->getArg(0)) 3367 : EmitCheckedArgForBuiltin(E->getArg(0), BCK_CLZPassedZero); 3368 3369 llvm::Type *ArgType = ArgValue->getType(); 3370 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 3371 3372 llvm::Type *ResultType = ConvertType(E->getType()); 3373 Value *ZeroUndef = 3374 Builder.getInt1(HasFallback || getTarget().isCLZForZeroUndef()); 3375 Value *Result = Builder.CreateCall(F, {ArgValue, ZeroUndef}); 3376 if (Result->getType() != ResultType) 3377 Result = 3378 Builder.CreateIntCast(Result, ResultType, /*isSigned*/ false, "cast"); 3379 if (!HasFallback) 3380 return RValue::get(Result); 3381 3382 Value *Zero = Constant::getNullValue(ArgType); 3383 Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero"); 3384 Value *FallbackValue = EmitScalarExpr(E->getArg(1)); 3385 Value *ResultOrFallback = 3386 Builder.CreateSelect(IsZero, FallbackValue, Result, "clzg"); 3387 return RValue::get(ResultOrFallback); 3388 } 3389 case Builtin::BI__builtin_ffs: 3390 case Builtin::BI__builtin_ffsl: 3391 case Builtin::BI__builtin_ffsll: { 3392 // ffs(x) -> x ? cttz(x) + 1 : 0 3393 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3394 3395 llvm::Type *ArgType = ArgValue->getType(); 3396 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ArgType); 3397 3398 llvm::Type *ResultType = ConvertType(E->getType()); 3399 Value *Tmp = 3400 Builder.CreateAdd(Builder.CreateCall(F, {ArgValue, Builder.getTrue()}), 3401 llvm::ConstantInt::get(ArgType, 1)); 3402 Value *Zero = llvm::Constant::getNullValue(ArgType); 3403 Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero"); 3404 Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs"); 3405 if (Result->getType() != ResultType) 3406 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 3407 "cast"); 3408 return RValue::get(Result); 3409 } 3410 case Builtin::BI__builtin_parity: 3411 case Builtin::BI__builtin_parityl: 3412 case Builtin::BI__builtin_parityll: { 3413 // parity(x) -> ctpop(x) & 1 3414 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3415 3416 llvm::Type *ArgType = ArgValue->getType(); 3417 Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType); 3418 3419 llvm::Type *ResultType = ConvertType(E->getType()); 3420 Value *Tmp = Builder.CreateCall(F, ArgValue); 3421 Value *Result = Builder.CreateAnd(Tmp, llvm::ConstantInt::get(ArgType, 1)); 3422 if (Result->getType() != ResultType) 3423 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 3424 "cast"); 3425 return RValue::get(Result); 3426 } 3427 case Builtin::BI__lzcnt16: 3428 case Builtin::BI__lzcnt: 3429 case Builtin::BI__lzcnt64: { 3430 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3431 3432 llvm::Type *ArgType = ArgValue->getType(); 3433 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ArgType); 3434 3435 llvm::Type *ResultType = ConvertType(E->getType()); 3436 Value *Result = Builder.CreateCall(F, {ArgValue, Builder.getFalse()}); 3437 if (Result->getType() != ResultType) 3438 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 3439 "cast"); 3440 return RValue::get(Result); 3441 } 3442 case Builtin::BI__popcnt16: 3443 case Builtin::BI__popcnt: 3444 case Builtin::BI__popcnt64: 3445 case Builtin::BI__builtin_popcount: 3446 case Builtin::BI__builtin_popcountl: 3447 case Builtin::BI__builtin_popcountll: 3448 case Builtin::BI__builtin_popcountg: { 3449 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3450 3451 llvm::Type *ArgType = ArgValue->getType(); 3452 Function *F = CGM.getIntrinsic(Intrinsic::ctpop, ArgType); 3453 3454 llvm::Type *ResultType = ConvertType(E->getType()); 3455 Value *Result = Builder.CreateCall(F, ArgValue); 3456 if (Result->getType() != ResultType) 3457 Result = 3458 Builder.CreateIntCast(Result, ResultType, /*isSigned*/ false, "cast"); 3459 return RValue::get(Result); 3460 } 3461 case Builtin::BI__builtin_unpredictable: { 3462 // Always return the argument of __builtin_unpredictable. LLVM does not 3463 // handle this builtin. Metadata for this builtin should be added directly 3464 // to instructions such as branches or switches that use it. 3465 return RValue::get(EmitScalarExpr(E->getArg(0))); 3466 } 3467 case Builtin::BI__builtin_expect: { 3468 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3469 llvm::Type *ArgType = ArgValue->getType(); 3470 3471 Value *ExpectedValue = EmitScalarExpr(E->getArg(1)); 3472 // Don't generate llvm.expect on -O0 as the backend won't use it for 3473 // anything. 3474 // Note, we still IRGen ExpectedValue because it could have side-effects. 3475 if (CGM.getCodeGenOpts().OptimizationLevel == 0) 3476 return RValue::get(ArgValue); 3477 3478 Function *FnExpect = CGM.getIntrinsic(Intrinsic::expect, ArgType); 3479 Value *Result = 3480 Builder.CreateCall(FnExpect, {ArgValue, ExpectedValue}, "expval"); 3481 return RValue::get(Result); 3482 } 3483 case Builtin::BI__builtin_expect_with_probability: { 3484 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3485 llvm::Type *ArgType = ArgValue->getType(); 3486 3487 Value *ExpectedValue = EmitScalarExpr(E->getArg(1)); 3488 llvm::APFloat Probability(0.0); 3489 const Expr *ProbArg = E->getArg(2); 3490 bool EvalSucceed = ProbArg->EvaluateAsFloat(Probability, CGM.getContext()); 3491 assert(EvalSucceed && "probability should be able to evaluate as float"); 3492 (void)EvalSucceed; 3493 bool LoseInfo = false; 3494 Probability.convert(llvm::APFloat::IEEEdouble(), 3495 llvm::RoundingMode::Dynamic, &LoseInfo); 3496 llvm::Type *Ty = ConvertType(ProbArg->getType()); 3497 Constant *Confidence = ConstantFP::get(Ty, Probability); 3498 // Don't generate llvm.expect.with.probability on -O0 as the backend 3499 // won't use it for anything. 3500 // Note, we still IRGen ExpectedValue because it could have side-effects. 3501 if (CGM.getCodeGenOpts().OptimizationLevel == 0) 3502 return RValue::get(ArgValue); 3503 3504 Function *FnExpect = 3505 CGM.getIntrinsic(Intrinsic::expect_with_probability, ArgType); 3506 Value *Result = Builder.CreateCall( 3507 FnExpect, {ArgValue, ExpectedValue, Confidence}, "expval"); 3508 return RValue::get(Result); 3509 } 3510 case Builtin::BI__builtin_assume_aligned: { 3511 const Expr *Ptr = E->getArg(0); 3512 Value *PtrValue = EmitScalarExpr(Ptr); 3513 Value *OffsetValue = 3514 (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : nullptr; 3515 3516 Value *AlignmentValue = EmitScalarExpr(E->getArg(1)); 3517 ConstantInt *AlignmentCI = cast<ConstantInt>(AlignmentValue); 3518 if (AlignmentCI->getValue().ugt(llvm::Value::MaximumAlignment)) 3519 AlignmentCI = ConstantInt::get(AlignmentCI->getIntegerType(), 3520 llvm::Value::MaximumAlignment); 3521 3522 emitAlignmentAssumption(PtrValue, Ptr, 3523 /*The expr loc is sufficient.*/ SourceLocation(), 3524 AlignmentCI, OffsetValue); 3525 return RValue::get(PtrValue); 3526 } 3527 case Builtin::BI__builtin_assume_dereferenceable: { 3528 const Expr *Ptr = E->getArg(0); 3529 const Expr *Size = E->getArg(1); 3530 Value *PtrValue = EmitScalarExpr(Ptr); 3531 Value *SizeValue = EmitScalarExpr(Size); 3532 if (SizeValue->getType() != IntPtrTy) 3533 SizeValue = 3534 Builder.CreateIntCast(SizeValue, IntPtrTy, false, "casted.size"); 3535 Builder.CreateDereferenceableAssumption(PtrValue, SizeValue); 3536 return RValue::get(nullptr); 3537 } 3538 case Builtin::BI__assume: 3539 case Builtin::BI__builtin_assume: { 3540 if (E->getArg(0)->HasSideEffects(getContext())) 3541 return RValue::get(nullptr); 3542 3543 Value *ArgValue = EmitCheckedArgForAssume(E->getArg(0)); 3544 Function *FnAssume = CGM.getIntrinsic(Intrinsic::assume); 3545 Builder.CreateCall(FnAssume, ArgValue); 3546 return RValue::get(nullptr); 3547 } 3548 case Builtin::BI__builtin_assume_separate_storage: { 3549 const Expr *Arg0 = E->getArg(0); 3550 const Expr *Arg1 = E->getArg(1); 3551 3552 Value *Value0 = EmitScalarExpr(Arg0); 3553 Value *Value1 = EmitScalarExpr(Arg1); 3554 3555 Value *Values[] = {Value0, Value1}; 3556 OperandBundleDefT<Value *> OBD("separate_storage", Values); 3557 Builder.CreateAssumption(ConstantInt::getTrue(getLLVMContext()), {OBD}); 3558 return RValue::get(nullptr); 3559 } 3560 case Builtin::BI__builtin_allow_runtime_check: { 3561 StringRef Kind = 3562 cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())->getString(); 3563 LLVMContext &Ctx = CGM.getLLVMContext(); 3564 llvm::Value *Allow = Builder.CreateCall( 3565 CGM.getIntrinsic(Intrinsic::allow_runtime_check), 3566 llvm::MetadataAsValue::get(Ctx, llvm::MDString::get(Ctx, Kind))); 3567 return RValue::get(Allow); 3568 } 3569 case Builtin::BI__arithmetic_fence: { 3570 // Create the builtin call if FastMath is selected, and the target 3571 // supports the builtin, otherwise just return the argument. 3572 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3573 llvm::FastMathFlags FMF = Builder.getFastMathFlags(); 3574 bool isArithmeticFenceEnabled = 3575 FMF.allowReassoc() && 3576 getContext().getTargetInfo().checkArithmeticFenceSupported(); 3577 QualType ArgType = E->getArg(0)->getType(); 3578 if (ArgType->isComplexType()) { 3579 if (isArithmeticFenceEnabled) { 3580 QualType ElementType = ArgType->castAs<ComplexType>()->getElementType(); 3581 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 3582 Value *Real = Builder.CreateArithmeticFence(ComplexVal.first, 3583 ConvertType(ElementType)); 3584 Value *Imag = Builder.CreateArithmeticFence(ComplexVal.second, 3585 ConvertType(ElementType)); 3586 return RValue::getComplex(std::make_pair(Real, Imag)); 3587 } 3588 ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); 3589 Value *Real = ComplexVal.first; 3590 Value *Imag = ComplexVal.second; 3591 return RValue::getComplex(std::make_pair(Real, Imag)); 3592 } 3593 Value *ArgValue = EmitScalarExpr(E->getArg(0)); 3594 if (isArithmeticFenceEnabled) 3595 return RValue::get( 3596 Builder.CreateArithmeticFence(ArgValue, ConvertType(ArgType))); 3597 return RValue::get(ArgValue); 3598 } 3599 case Builtin::BI__builtin_bswap16: 3600 case Builtin::BI__builtin_bswap32: 3601 case Builtin::BI__builtin_bswap64: 3602 case Builtin::BI_byteswap_ushort: 3603 case Builtin::BI_byteswap_ulong: 3604 case Builtin::BI_byteswap_uint64: { 3605 return RValue::get( 3606 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::bswap)); 3607 } 3608 case Builtin::BI__builtin_bitreverse8: 3609 case Builtin::BI__builtin_bitreverse16: 3610 case Builtin::BI__builtin_bitreverse32: 3611 case Builtin::BI__builtin_bitreverse64: { 3612 return RValue::get( 3613 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::bitreverse)); 3614 } 3615 case Builtin::BI__builtin_rotateleft8: 3616 case Builtin::BI__builtin_rotateleft16: 3617 case Builtin::BI__builtin_rotateleft32: 3618 case Builtin::BI__builtin_rotateleft64: 3619 case Builtin::BI_rotl8: // Microsoft variants of rotate left 3620 case Builtin::BI_rotl16: 3621 case Builtin::BI_rotl: 3622 case Builtin::BI_lrotl: 3623 case Builtin::BI_rotl64: 3624 return emitRotate(E, false); 3625 3626 case Builtin::BI__builtin_rotateright8: 3627 case Builtin::BI__builtin_rotateright16: 3628 case Builtin::BI__builtin_rotateright32: 3629 case Builtin::BI__builtin_rotateright64: 3630 case Builtin::BI_rotr8: // Microsoft variants of rotate right 3631 case Builtin::BI_rotr16: 3632 case Builtin::BI_rotr: 3633 case Builtin::BI_lrotr: 3634 case Builtin::BI_rotr64: 3635 return emitRotate(E, true); 3636 3637 case Builtin::BI__builtin_constant_p: { 3638 llvm::Type *ResultType = ConvertType(E->getType()); 3639 3640 const Expr *Arg = E->getArg(0); 3641 QualType ArgType = Arg->getType(); 3642 // FIXME: The allowance for Obj-C pointers and block pointers is historical 3643 // and likely a mistake. 3644 if (!ArgType->isIntegralOrEnumerationType() && !ArgType->isFloatingType() && 3645 !ArgType->isObjCObjectPointerType() && !ArgType->isBlockPointerType()) 3646 // Per the GCC documentation, only numeric constants are recognized after 3647 // inlining. 3648 return RValue::get(ConstantInt::get(ResultType, 0)); 3649 3650 if (Arg->HasSideEffects(getContext())) 3651 // The argument is unevaluated, so be conservative if it might have 3652 // side-effects. 3653 return RValue::get(ConstantInt::get(ResultType, 0)); 3654 3655 Value *ArgValue = EmitScalarExpr(Arg); 3656 if (ArgType->isObjCObjectPointerType()) { 3657 // Convert Objective-C objects to id because we cannot distinguish between 3658 // LLVM types for Obj-C classes as they are opaque. 3659 ArgType = CGM.getContext().getObjCIdType(); 3660 ArgValue = Builder.CreateBitCast(ArgValue, ConvertType(ArgType)); 3661 } 3662 Function *F = 3663 CGM.getIntrinsic(Intrinsic::is_constant, ConvertType(ArgType)); 3664 Value *Result = Builder.CreateCall(F, ArgValue); 3665 if (Result->getType() != ResultType) 3666 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/false); 3667 return RValue::get(Result); 3668 } 3669 case Builtin::BI__builtin_dynamic_object_size: 3670 case Builtin::BI__builtin_object_size: { 3671 unsigned Type = 3672 E->getArg(1)->EvaluateKnownConstInt(getContext()).getZExtValue(); 3673 auto *ResType = cast<llvm::IntegerType>(ConvertType(E->getType())); 3674 3675 // We pass this builtin onto the optimizer so that it can figure out the 3676 // object size in more complex cases. 3677 bool IsDynamic = BuiltinID == Builtin::BI__builtin_dynamic_object_size; 3678 return RValue::get(emitBuiltinObjectSize(E->getArg(0), Type, ResType, 3679 /*EmittedE=*/nullptr, IsDynamic)); 3680 } 3681 case Builtin::BI__builtin_counted_by_ref: { 3682 // Default to returning '(void *) 0'. 3683 llvm::Value *Result = llvm::ConstantPointerNull::get( 3684 llvm::PointerType::getUnqual(getLLVMContext())); 3685 3686 const Expr *Arg = E->getArg(0)->IgnoreParenImpCasts(); 3687 3688 if (auto *UO = dyn_cast<UnaryOperator>(Arg); 3689 UO && UO->getOpcode() == UO_AddrOf) { 3690 Arg = UO->getSubExpr()->IgnoreParenImpCasts(); 3691 3692 if (auto *ASE = dyn_cast<ArraySubscriptExpr>(Arg)) 3693 Arg = ASE->getBase()->IgnoreParenImpCasts(); 3694 } 3695 3696 if (const MemberExpr *ME = dyn_cast_if_present<MemberExpr>(Arg)) { 3697 if (auto *CATy = 3698 ME->getMemberDecl()->getType()->getAs<CountAttributedType>(); 3699 CATy && CATy->getKind() == CountAttributedType::CountedBy) { 3700 const auto *FAMDecl = cast<FieldDecl>(ME->getMemberDecl()); 3701 if (const FieldDecl *CountFD = FAMDecl->findCountedByField()) 3702 Result = GetCountedByFieldExprGEP(Arg, FAMDecl, CountFD); 3703 else 3704 llvm::report_fatal_error("Cannot find the counted_by 'count' field"); 3705 } 3706 } 3707 3708 return RValue::get(Result); 3709 } 3710 case Builtin::BI__builtin_prefetch: { 3711 Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0)); 3712 // FIXME: Technically these constants should of type 'int', yes? 3713 RW = (E->getNumArgs() > 1) ? EmitScalarExpr(E->getArg(1)) : 3714 llvm::ConstantInt::get(Int32Ty, 0); 3715 Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) : 3716 llvm::ConstantInt::get(Int32Ty, 3); 3717 Value *Data = llvm::ConstantInt::get(Int32Ty, 1); 3718 Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType()); 3719 Builder.CreateCall(F, {Address, RW, Locality, Data}); 3720 return RValue::get(nullptr); 3721 } 3722 case Builtin::BI__builtin_readcyclecounter: { 3723 Function *F = CGM.getIntrinsic(Intrinsic::readcyclecounter); 3724 return RValue::get(Builder.CreateCall(F)); 3725 } 3726 case Builtin::BI__builtin_readsteadycounter: { 3727 Function *F = CGM.getIntrinsic(Intrinsic::readsteadycounter); 3728 return RValue::get(Builder.CreateCall(F)); 3729 } 3730 case Builtin::BI__builtin___clear_cache: { 3731 Value *Begin = EmitScalarExpr(E->getArg(0)); 3732 Value *End = EmitScalarExpr(E->getArg(1)); 3733 Function *F = CGM.getIntrinsic(Intrinsic::clear_cache); 3734 return RValue::get(Builder.CreateCall(F, {Begin, End})); 3735 } 3736 case Builtin::BI__builtin_trap: 3737 EmitTrapCall(Intrinsic::trap); 3738 return RValue::get(nullptr); 3739 case Builtin::BI__builtin_verbose_trap: { 3740 llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation(); 3741 if (getDebugInfo()) { 3742 TrapLocation = getDebugInfo()->CreateTrapFailureMessageFor( 3743 TrapLocation, *E->getArg(0)->tryEvaluateString(getContext()), 3744 *E->getArg(1)->tryEvaluateString(getContext())); 3745 } 3746 ApplyDebugLocation ApplyTrapDI(*this, TrapLocation); 3747 // Currently no attempt is made to prevent traps from being merged. 3748 EmitTrapCall(Intrinsic::trap); 3749 return RValue::get(nullptr); 3750 } 3751 case Builtin::BI__debugbreak: 3752 EmitTrapCall(Intrinsic::debugtrap); 3753 return RValue::get(nullptr); 3754 case Builtin::BI__builtin_unreachable: { 3755 EmitUnreachable(E->getExprLoc()); 3756 3757 // We do need to preserve an insertion point. 3758 EmitBlock(createBasicBlock("unreachable.cont")); 3759 3760 return RValue::get(nullptr); 3761 } 3762 3763 case Builtin::BI__builtin_powi: 3764 case Builtin::BI__builtin_powif: 3765 case Builtin::BI__builtin_powil: { 3766 llvm::Value *Src0 = EmitScalarExpr(E->getArg(0)); 3767 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1)); 3768 3769 if (Builder.getIsFPConstrained()) { 3770 // FIXME: llvm.powi has 2 mangling types, 3771 // llvm.experimental.constrained.powi has one. 3772 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3773 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_powi, 3774 Src0->getType()); 3775 return RValue::get(Builder.CreateConstrainedFPCall(F, { Src0, Src1 })); 3776 } 3777 3778 Function *F = CGM.getIntrinsic(Intrinsic::powi, 3779 { Src0->getType(), Src1->getType() }); 3780 return RValue::get(Builder.CreateCall(F, { Src0, Src1 })); 3781 } 3782 case Builtin::BI__builtin_frexpl: { 3783 // Linux PPC will not be adding additional PPCDoubleDouble support. 3784 // WIP to switch default to IEEE long double. Will emit libcall for 3785 // frexpl instead of legalizing this type in the BE. 3786 if (&getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble()) 3787 break; 3788 [[fallthrough]]; 3789 } 3790 case Builtin::BI__builtin_frexp: 3791 case Builtin::BI__builtin_frexpf: 3792 case Builtin::BI__builtin_frexpf128: 3793 case Builtin::BI__builtin_frexpf16: 3794 return RValue::get(emitFrexpBuiltin(*this, E, Intrinsic::frexp)); 3795 case Builtin::BImodf: 3796 case Builtin::BImodff: 3797 case Builtin::BImodfl: 3798 case Builtin::BI__builtin_modf: 3799 case Builtin::BI__builtin_modff: 3800 case Builtin::BI__builtin_modfl: 3801 if (Builder.getIsFPConstrained()) 3802 break; // TODO: Emit constrained modf intrinsic once one exists. 3803 return RValue::get(emitModfBuiltin(*this, E, Intrinsic::modf)); 3804 case Builtin::BI__builtin_isgreater: 3805 case Builtin::BI__builtin_isgreaterequal: 3806 case Builtin::BI__builtin_isless: 3807 case Builtin::BI__builtin_islessequal: 3808 case Builtin::BI__builtin_islessgreater: 3809 case Builtin::BI__builtin_isunordered: { 3810 // Ordered comparisons: we know the arguments to these are matching scalar 3811 // floating point values. 3812 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3813 Value *LHS = EmitScalarExpr(E->getArg(0)); 3814 Value *RHS = EmitScalarExpr(E->getArg(1)); 3815 3816 switch (BuiltinID) { 3817 default: llvm_unreachable("Unknown ordered comparison"); 3818 case Builtin::BI__builtin_isgreater: 3819 LHS = Builder.CreateFCmpOGT(LHS, RHS, "cmp"); 3820 break; 3821 case Builtin::BI__builtin_isgreaterequal: 3822 LHS = Builder.CreateFCmpOGE(LHS, RHS, "cmp"); 3823 break; 3824 case Builtin::BI__builtin_isless: 3825 LHS = Builder.CreateFCmpOLT(LHS, RHS, "cmp"); 3826 break; 3827 case Builtin::BI__builtin_islessequal: 3828 LHS = Builder.CreateFCmpOLE(LHS, RHS, "cmp"); 3829 break; 3830 case Builtin::BI__builtin_islessgreater: 3831 LHS = Builder.CreateFCmpONE(LHS, RHS, "cmp"); 3832 break; 3833 case Builtin::BI__builtin_isunordered: 3834 LHS = Builder.CreateFCmpUNO(LHS, RHS, "cmp"); 3835 break; 3836 } 3837 // ZExt bool to int type. 3838 return RValue::get(Builder.CreateZExt(LHS, ConvertType(E->getType()))); 3839 } 3840 3841 case Builtin::BI__builtin_isnan: { 3842 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3843 Value *V = EmitScalarExpr(E->getArg(0)); 3844 if (Value *Result = tryUseTestFPKind(*this, BuiltinID, V)) 3845 return RValue::get(Result); 3846 return RValue::get( 3847 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcNan), 3848 ConvertType(E->getType()))); 3849 } 3850 3851 case Builtin::BI__builtin_issignaling: { 3852 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3853 Value *V = EmitScalarExpr(E->getArg(0)); 3854 return RValue::get( 3855 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcSNan), 3856 ConvertType(E->getType()))); 3857 } 3858 3859 case Builtin::BI__builtin_isinf: { 3860 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3861 Value *V = EmitScalarExpr(E->getArg(0)); 3862 if (Value *Result = tryUseTestFPKind(*this, BuiltinID, V)) 3863 return RValue::get(Result); 3864 return RValue::get( 3865 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcInf), 3866 ConvertType(E->getType()))); 3867 } 3868 3869 case Builtin::BIfinite: 3870 case Builtin::BI__finite: 3871 case Builtin::BIfinitef: 3872 case Builtin::BI__finitef: 3873 case Builtin::BIfinitel: 3874 case Builtin::BI__finitel: 3875 case Builtin::BI__builtin_isfinite: { 3876 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3877 Value *V = EmitScalarExpr(E->getArg(0)); 3878 if (Value *Result = tryUseTestFPKind(*this, BuiltinID, V)) 3879 return RValue::get(Result); 3880 return RValue::get( 3881 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcFinite), 3882 ConvertType(E->getType()))); 3883 } 3884 3885 case Builtin::BI__builtin_isnormal: { 3886 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3887 Value *V = EmitScalarExpr(E->getArg(0)); 3888 return RValue::get( 3889 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcNormal), 3890 ConvertType(E->getType()))); 3891 } 3892 3893 case Builtin::BI__builtin_issubnormal: { 3894 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3895 Value *V = EmitScalarExpr(E->getArg(0)); 3896 return RValue::get( 3897 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcSubnormal), 3898 ConvertType(E->getType()))); 3899 } 3900 3901 case Builtin::BI__builtin_iszero: { 3902 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3903 Value *V = EmitScalarExpr(E->getArg(0)); 3904 return RValue::get( 3905 Builder.CreateZExt(Builder.createIsFPClass(V, FPClassTest::fcZero), 3906 ConvertType(E->getType()))); 3907 } 3908 3909 case Builtin::BI__builtin_isfpclass: { 3910 Expr::EvalResult Result; 3911 if (!E->getArg(1)->EvaluateAsInt(Result, CGM.getContext())) 3912 break; 3913 uint64_t Test = Result.Val.getInt().getLimitedValue(); 3914 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 3915 Value *V = EmitScalarExpr(E->getArg(0)); 3916 return RValue::get(Builder.CreateZExt(Builder.createIsFPClass(V, Test), 3917 ConvertType(E->getType()))); 3918 } 3919 3920 case Builtin::BI__builtin_nondeterministic_value: { 3921 llvm::Type *Ty = ConvertType(E->getArg(0)->getType()); 3922 3923 Value *Result = PoisonValue::get(Ty); 3924 Result = Builder.CreateFreeze(Result); 3925 3926 return RValue::get(Result); 3927 } 3928 3929 case Builtin::BI__builtin_elementwise_abs: { 3930 Value *Result; 3931 QualType QT = E->getArg(0)->getType(); 3932 3933 if (auto *VecTy = QT->getAs<VectorType>()) 3934 QT = VecTy->getElementType(); 3935 if (QT->isIntegerType()) 3936 Result = Builder.CreateBinaryIntrinsic( 3937 Intrinsic::abs, EmitScalarExpr(E->getArg(0)), Builder.getFalse(), 3938 nullptr, "elt.abs"); 3939 else 3940 Result = emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::fabs, 3941 "elt.abs"); 3942 3943 return RValue::get(Result); 3944 } 3945 case Builtin::BI__builtin_elementwise_acos: 3946 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3947 *this, E, Intrinsic::acos, "elt.acos")); 3948 case Builtin::BI__builtin_elementwise_asin: 3949 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3950 *this, E, Intrinsic::asin, "elt.asin")); 3951 case Builtin::BI__builtin_elementwise_atan: 3952 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3953 *this, E, Intrinsic::atan, "elt.atan")); 3954 case Builtin::BI__builtin_elementwise_atan2: 3955 return RValue::get(emitBuiltinWithOneOverloadedType<2>( 3956 *this, E, Intrinsic::atan2, "elt.atan2")); 3957 case Builtin::BI__builtin_elementwise_ceil: 3958 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3959 *this, E, Intrinsic::ceil, "elt.ceil")); 3960 case Builtin::BI__builtin_elementwise_exp: 3961 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3962 *this, E, Intrinsic::exp, "elt.exp")); 3963 case Builtin::BI__builtin_elementwise_exp2: 3964 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3965 *this, E, Intrinsic::exp2, "elt.exp2")); 3966 case Builtin::BI__builtin_elementwise_exp10: 3967 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3968 *this, E, Intrinsic::exp10, "elt.exp10")); 3969 case Builtin::BI__builtin_elementwise_log: 3970 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3971 *this, E, Intrinsic::log, "elt.log")); 3972 case Builtin::BI__builtin_elementwise_log2: 3973 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3974 *this, E, Intrinsic::log2, "elt.log2")); 3975 case Builtin::BI__builtin_elementwise_log10: 3976 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3977 *this, E, Intrinsic::log10, "elt.log10")); 3978 case Builtin::BI__builtin_elementwise_pow: { 3979 return RValue::get( 3980 emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::pow)); 3981 } 3982 case Builtin::BI__builtin_elementwise_bitreverse: 3983 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3984 *this, E, Intrinsic::bitreverse, "elt.bitreverse")); 3985 case Builtin::BI__builtin_elementwise_cos: 3986 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3987 *this, E, Intrinsic::cos, "elt.cos")); 3988 case Builtin::BI__builtin_elementwise_cosh: 3989 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3990 *this, E, Intrinsic::cosh, "elt.cosh")); 3991 case Builtin::BI__builtin_elementwise_floor: 3992 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3993 *this, E, Intrinsic::floor, "elt.floor")); 3994 case Builtin::BI__builtin_elementwise_popcount: 3995 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3996 *this, E, Intrinsic::ctpop, "elt.ctpop")); 3997 case Builtin::BI__builtin_elementwise_roundeven: 3998 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 3999 *this, E, Intrinsic::roundeven, "elt.roundeven")); 4000 case Builtin::BI__builtin_elementwise_round: 4001 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4002 *this, E, Intrinsic::round, "elt.round")); 4003 case Builtin::BI__builtin_elementwise_rint: 4004 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4005 *this, E, Intrinsic::rint, "elt.rint")); 4006 case Builtin::BI__builtin_elementwise_nearbyint: 4007 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4008 *this, E, Intrinsic::nearbyint, "elt.nearbyint")); 4009 case Builtin::BI__builtin_elementwise_sin: 4010 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4011 *this, E, Intrinsic::sin, "elt.sin")); 4012 case Builtin::BI__builtin_elementwise_sinh: 4013 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4014 *this, E, Intrinsic::sinh, "elt.sinh")); 4015 case Builtin::BI__builtin_elementwise_tan: 4016 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4017 *this, E, Intrinsic::tan, "elt.tan")); 4018 case Builtin::BI__builtin_elementwise_tanh: 4019 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4020 *this, E, Intrinsic::tanh, "elt.tanh")); 4021 case Builtin::BI__builtin_elementwise_trunc: 4022 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4023 *this, E, Intrinsic::trunc, "elt.trunc")); 4024 case Builtin::BI__builtin_elementwise_canonicalize: 4025 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4026 *this, E, Intrinsic::canonicalize, "elt.canonicalize")); 4027 case Builtin::BI__builtin_elementwise_copysign: 4028 return RValue::get( 4029 emitBuiltinWithOneOverloadedType<2>(*this, E, Intrinsic::copysign)); 4030 case Builtin::BI__builtin_elementwise_fma: 4031 return RValue::get( 4032 emitBuiltinWithOneOverloadedType<3>(*this, E, Intrinsic::fma)); 4033 case Builtin::BI__builtin_elementwise_add_sat: 4034 case Builtin::BI__builtin_elementwise_sub_sat: { 4035 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4036 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4037 Value *Result; 4038 assert(Op0->getType()->isIntOrIntVectorTy() && "integer type expected"); 4039 QualType Ty = E->getArg(0)->getType(); 4040 if (auto *VecTy = Ty->getAs<VectorType>()) 4041 Ty = VecTy->getElementType(); 4042 bool IsSigned = Ty->isSignedIntegerType(); 4043 unsigned Opc; 4044 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_elementwise_add_sat) 4045 Opc = IsSigned ? Intrinsic::sadd_sat : Intrinsic::uadd_sat; 4046 else 4047 Opc = IsSigned ? Intrinsic::ssub_sat : Intrinsic::usub_sat; 4048 Result = Builder.CreateBinaryIntrinsic(Opc, Op0, Op1, nullptr, "elt.sat"); 4049 return RValue::get(Result); 4050 } 4051 4052 case Builtin::BI__builtin_elementwise_max: { 4053 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4054 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4055 Value *Result; 4056 if (Op0->getType()->isIntOrIntVectorTy()) { 4057 QualType Ty = E->getArg(0)->getType(); 4058 if (auto *VecTy = Ty->getAs<VectorType>()) 4059 Ty = VecTy->getElementType(); 4060 Result = Builder.CreateBinaryIntrinsic( 4061 Ty->isSignedIntegerType() ? Intrinsic::smax : Intrinsic::umax, Op0, 4062 Op1, nullptr, "elt.max"); 4063 } else 4064 Result = Builder.CreateMaxNum(Op0, Op1, /*FMFSource=*/nullptr, "elt.max"); 4065 return RValue::get(Result); 4066 } 4067 case Builtin::BI__builtin_elementwise_min: { 4068 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4069 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4070 Value *Result; 4071 if (Op0->getType()->isIntOrIntVectorTy()) { 4072 QualType Ty = E->getArg(0)->getType(); 4073 if (auto *VecTy = Ty->getAs<VectorType>()) 4074 Ty = VecTy->getElementType(); 4075 Result = Builder.CreateBinaryIntrinsic( 4076 Ty->isSignedIntegerType() ? Intrinsic::smin : Intrinsic::umin, Op0, 4077 Op1, nullptr, "elt.min"); 4078 } else 4079 Result = Builder.CreateMinNum(Op0, Op1, /*FMFSource=*/nullptr, "elt.min"); 4080 return RValue::get(Result); 4081 } 4082 4083 case Builtin::BI__builtin_elementwise_maxnum: { 4084 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4085 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4086 Value *Result = Builder.CreateBinaryIntrinsic(llvm::Intrinsic::maxnum, Op0, 4087 Op1, nullptr, "elt.maxnum"); 4088 return RValue::get(Result); 4089 } 4090 4091 case Builtin::BI__builtin_elementwise_minnum: { 4092 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4093 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4094 Value *Result = Builder.CreateBinaryIntrinsic(llvm::Intrinsic::minnum, Op0, 4095 Op1, nullptr, "elt.minnum"); 4096 return RValue::get(Result); 4097 } 4098 4099 case Builtin::BI__builtin_elementwise_maximum: { 4100 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4101 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4102 Value *Result = Builder.CreateBinaryIntrinsic(Intrinsic::maximum, Op0, Op1, 4103 nullptr, "elt.maximum"); 4104 return RValue::get(Result); 4105 } 4106 4107 case Builtin::BI__builtin_elementwise_minimum: { 4108 Value *Op0 = EmitScalarExpr(E->getArg(0)); 4109 Value *Op1 = EmitScalarExpr(E->getArg(1)); 4110 Value *Result = Builder.CreateBinaryIntrinsic(Intrinsic::minimum, Op0, Op1, 4111 nullptr, "elt.minimum"); 4112 return RValue::get(Result); 4113 } 4114 4115 case Builtin::BI__builtin_reduce_max: { 4116 auto GetIntrinsicID = [this](QualType QT) { 4117 if (auto *VecTy = QT->getAs<VectorType>()) 4118 QT = VecTy->getElementType(); 4119 else if (QT->isSizelessVectorType()) 4120 QT = QT->getSizelessVectorEltType(CGM.getContext()); 4121 4122 if (QT->isSignedIntegerType()) 4123 return Intrinsic::vector_reduce_smax; 4124 if (QT->isUnsignedIntegerType()) 4125 return Intrinsic::vector_reduce_umax; 4126 assert(QT->isFloatingType() && "must have a float here"); 4127 return Intrinsic::vector_reduce_fmax; 4128 }; 4129 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4130 *this, E, GetIntrinsicID(E->getArg(0)->getType()), "rdx.min")); 4131 } 4132 4133 case Builtin::BI__builtin_reduce_min: { 4134 auto GetIntrinsicID = [this](QualType QT) { 4135 if (auto *VecTy = QT->getAs<VectorType>()) 4136 QT = VecTy->getElementType(); 4137 else if (QT->isSizelessVectorType()) 4138 QT = QT->getSizelessVectorEltType(CGM.getContext()); 4139 4140 if (QT->isSignedIntegerType()) 4141 return Intrinsic::vector_reduce_smin; 4142 if (QT->isUnsignedIntegerType()) 4143 return Intrinsic::vector_reduce_umin; 4144 assert(QT->isFloatingType() && "must have a float here"); 4145 return Intrinsic::vector_reduce_fmin; 4146 }; 4147 4148 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4149 *this, E, GetIntrinsicID(E->getArg(0)->getType()), "rdx.min")); 4150 } 4151 4152 case Builtin::BI__builtin_reduce_add: 4153 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4154 *this, E, Intrinsic::vector_reduce_add, "rdx.add")); 4155 case Builtin::BI__builtin_reduce_mul: 4156 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4157 *this, E, Intrinsic::vector_reduce_mul, "rdx.mul")); 4158 case Builtin::BI__builtin_reduce_xor: 4159 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4160 *this, E, Intrinsic::vector_reduce_xor, "rdx.xor")); 4161 case Builtin::BI__builtin_reduce_or: 4162 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4163 *this, E, Intrinsic::vector_reduce_or, "rdx.or")); 4164 case Builtin::BI__builtin_reduce_and: 4165 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4166 *this, E, Intrinsic::vector_reduce_and, "rdx.and")); 4167 case Builtin::BI__builtin_reduce_maximum: 4168 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4169 *this, E, Intrinsic::vector_reduce_fmaximum, "rdx.maximum")); 4170 case Builtin::BI__builtin_reduce_minimum: 4171 return RValue::get(emitBuiltinWithOneOverloadedType<1>( 4172 *this, E, Intrinsic::vector_reduce_fminimum, "rdx.minimum")); 4173 4174 case Builtin::BI__builtin_matrix_transpose: { 4175 auto *MatrixTy = E->getArg(0)->getType()->castAs<ConstantMatrixType>(); 4176 Value *MatValue = EmitScalarExpr(E->getArg(0)); 4177 MatrixBuilder MB(Builder); 4178 Value *Result = MB.CreateMatrixTranspose(MatValue, MatrixTy->getNumRows(), 4179 MatrixTy->getNumColumns()); 4180 return RValue::get(Result); 4181 } 4182 4183 case Builtin::BI__builtin_matrix_column_major_load: { 4184 MatrixBuilder MB(Builder); 4185 // Emit everything that isn't dependent on the first parameter type 4186 Value *Stride = EmitScalarExpr(E->getArg(3)); 4187 const auto *ResultTy = E->getType()->getAs<ConstantMatrixType>(); 4188 auto *PtrTy = E->getArg(0)->getType()->getAs<PointerType>(); 4189 assert(PtrTy && "arg0 must be of pointer type"); 4190 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified(); 4191 4192 Address Src = EmitPointerWithAlignment(E->getArg(0)); 4193 EmitNonNullArgCheck(RValue::get(Src.emitRawPointer(*this)), 4194 E->getArg(0)->getType(), E->getArg(0)->getExprLoc(), FD, 4195 0); 4196 Value *Result = MB.CreateColumnMajorLoad( 4197 Src.getElementType(), Src.emitRawPointer(*this), 4198 Align(Src.getAlignment().getQuantity()), Stride, IsVolatile, 4199 ResultTy->getNumRows(), ResultTy->getNumColumns(), "matrix"); 4200 return RValue::get(Result); 4201 } 4202 4203 case Builtin::BI__builtin_matrix_column_major_store: { 4204 MatrixBuilder MB(Builder); 4205 Value *Matrix = EmitScalarExpr(E->getArg(0)); 4206 Address Dst = EmitPointerWithAlignment(E->getArg(1)); 4207 Value *Stride = EmitScalarExpr(E->getArg(2)); 4208 4209 const auto *MatrixTy = E->getArg(0)->getType()->getAs<ConstantMatrixType>(); 4210 auto *PtrTy = E->getArg(1)->getType()->getAs<PointerType>(); 4211 assert(PtrTy && "arg1 must be of pointer type"); 4212 bool IsVolatile = PtrTy->getPointeeType().isVolatileQualified(); 4213 4214 EmitNonNullArgCheck(RValue::get(Dst.emitRawPointer(*this)), 4215 E->getArg(1)->getType(), E->getArg(1)->getExprLoc(), FD, 4216 0); 4217 Value *Result = MB.CreateColumnMajorStore( 4218 Matrix, Dst.emitRawPointer(*this), 4219 Align(Dst.getAlignment().getQuantity()), Stride, IsVolatile, 4220 MatrixTy->getNumRows(), MatrixTy->getNumColumns()); 4221 addInstToNewSourceAtom(cast<Instruction>(Result), Matrix); 4222 return RValue::get(Result); 4223 } 4224 4225 case Builtin::BI__builtin_isinf_sign: { 4226 // isinf_sign(x) -> fabs(x) == infinity ? (signbit(x) ? -1 : 1) : 0 4227 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 4228 // FIXME: for strictfp/IEEE-754 we need to not trap on SNaN here. 4229 Value *Arg = EmitScalarExpr(E->getArg(0)); 4230 Value *AbsArg = EmitFAbs(*this, Arg); 4231 Value *IsInf = Builder.CreateFCmpOEQ( 4232 AbsArg, ConstantFP::getInfinity(Arg->getType()), "isinf"); 4233 Value *IsNeg = EmitSignBit(*this, Arg); 4234 4235 llvm::Type *IntTy = ConvertType(E->getType()); 4236 Value *Zero = Constant::getNullValue(IntTy); 4237 Value *One = ConstantInt::get(IntTy, 1); 4238 Value *NegativeOne = ConstantInt::get(IntTy, -1); 4239 Value *SignResult = Builder.CreateSelect(IsNeg, NegativeOne, One); 4240 Value *Result = Builder.CreateSelect(IsInf, SignResult, Zero); 4241 return RValue::get(Result); 4242 } 4243 4244 case Builtin::BI__builtin_flt_rounds: { 4245 Function *F = CGM.getIntrinsic(Intrinsic::get_rounding); 4246 4247 llvm::Type *ResultType = ConvertType(E->getType()); 4248 Value *Result = Builder.CreateCall(F); 4249 if (Result->getType() != ResultType) 4250 Result = Builder.CreateIntCast(Result, ResultType, /*isSigned*/true, 4251 "cast"); 4252 return RValue::get(Result); 4253 } 4254 4255 case Builtin::BI__builtin_set_flt_rounds: { 4256 Function *F = CGM.getIntrinsic(Intrinsic::set_rounding); 4257 4258 Value *V = EmitScalarExpr(E->getArg(0)); 4259 Builder.CreateCall(F, V); 4260 return RValue::get(nullptr); 4261 } 4262 4263 case Builtin::BI__builtin_fpclassify: { 4264 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E); 4265 // FIXME: for strictfp/IEEE-754 we need to not trap on SNaN here. 4266 Value *V = EmitScalarExpr(E->getArg(5)); 4267 llvm::Type *Ty = ConvertType(E->getArg(5)->getType()); 4268 4269 // Create Result 4270 BasicBlock *Begin = Builder.GetInsertBlock(); 4271 BasicBlock *End = createBasicBlock("fpclassify_end", this->CurFn); 4272 Builder.SetInsertPoint(End); 4273 PHINode *Result = 4274 Builder.CreatePHI(ConvertType(E->getArg(0)->getType()), 4, 4275 "fpclassify_result"); 4276 4277 // if (V==0) return FP_ZERO 4278 Builder.SetInsertPoint(Begin); 4279 Value *IsZero = Builder.CreateFCmpOEQ(V, Constant::getNullValue(Ty), 4280 "iszero"); 4281 Value *ZeroLiteral = EmitScalarExpr(E->getArg(4)); 4282 BasicBlock *NotZero = createBasicBlock("fpclassify_not_zero", this->CurFn); 4283 Builder.CreateCondBr(IsZero, End, NotZero); 4284 Result->addIncoming(ZeroLiteral, Begin); 4285 4286 // if (V != V) return FP_NAN 4287 Builder.SetInsertPoint(NotZero); 4288 Value *IsNan = Builder.CreateFCmpUNO(V, V, "cmp"); 4289 Value *NanLiteral = EmitScalarExpr(E->getArg(0)); 4290 BasicBlock *NotNan = createBasicBlock("fpclassify_not_nan", this->CurFn); 4291 Builder.CreateCondBr(IsNan, End, NotNan); 4292 Result->addIncoming(NanLiteral, NotZero); 4293 4294 // if (fabs(V) == infinity) return FP_INFINITY 4295 Builder.SetInsertPoint(NotNan); 4296 Value *VAbs = EmitFAbs(*this, V); 4297 Value *IsInf = 4298 Builder.CreateFCmpOEQ(VAbs, ConstantFP::getInfinity(V->getType()), 4299 "isinf"); 4300 Value *InfLiteral = EmitScalarExpr(E->getArg(1)); 4301 BasicBlock *NotInf = createBasicBlock("fpclassify_not_inf", this->CurFn); 4302 Builder.CreateCondBr(IsInf, End, NotInf); 4303 Result->addIncoming(InfLiteral, NotNan); 4304 4305 // if (fabs(V) >= MIN_NORMAL) return FP_NORMAL else FP_SUBNORMAL 4306 Builder.SetInsertPoint(NotInf); 4307 APFloat Smallest = APFloat::getSmallestNormalized( 4308 getContext().getFloatTypeSemantics(E->getArg(5)->getType())); 4309 Value *IsNormal = 4310 Builder.CreateFCmpUGE(VAbs, ConstantFP::get(V->getContext(), Smallest), 4311 "isnormal"); 4312 Value *NormalResult = 4313 Builder.CreateSelect(IsNormal, EmitScalarExpr(E->getArg(2)), 4314 EmitScalarExpr(E->getArg(3))); 4315 Builder.CreateBr(End); 4316 Result->addIncoming(NormalResult, NotInf); 4317 4318 // return Result 4319 Builder.SetInsertPoint(End); 4320 return RValue::get(Result); 4321 } 4322 4323 // An alloca will always return a pointer to the alloca (stack) address 4324 // space. This address space need not be the same as the AST / Language 4325 // default (e.g. in C / C++ auto vars are in the generic address space). At 4326 // the AST level this is handled within CreateTempAlloca et al., but for the 4327 // builtin / dynamic alloca we have to handle it here. We use an explicit cast 4328 // instead of passing an AS to CreateAlloca so as to not inhibit optimisation. 4329 case Builtin::BIalloca: 4330 case Builtin::BI_alloca: 4331 case Builtin::BI__builtin_alloca_uninitialized: 4332 case Builtin::BI__builtin_alloca: { 4333 Value *Size = EmitScalarExpr(E->getArg(0)); 4334 const TargetInfo &TI = getContext().getTargetInfo(); 4335 // The alignment of the alloca should correspond to __BIGGEST_ALIGNMENT__. 4336 const Align SuitableAlignmentInBytes = 4337 CGM.getContext() 4338 .toCharUnitsFromBits(TI.getSuitableAlign()) 4339 .getAsAlign(); 4340 AllocaInst *AI = Builder.CreateAlloca(Builder.getInt8Ty(), Size); 4341 AI->setAlignment(SuitableAlignmentInBytes); 4342 if (BuiltinID != Builtin::BI__builtin_alloca_uninitialized) 4343 initializeAlloca(*this, AI, Size, SuitableAlignmentInBytes); 4344 LangAS AAS = getASTAllocaAddressSpace(); 4345 LangAS EAS = E->getType()->getPointeeType().getAddressSpace(); 4346 if (AAS != EAS) { 4347 llvm::Type *Ty = CGM.getTypes().ConvertType(E->getType()); 4348 return RValue::get( 4349 getTargetHooks().performAddrSpaceCast(*this, AI, AAS, Ty)); 4350 } 4351 return RValue::get(AI); 4352 } 4353 4354 case Builtin::BI__builtin_alloca_with_align_uninitialized: 4355 case Builtin::BI__builtin_alloca_with_align: { 4356 Value *Size = EmitScalarExpr(E->getArg(0)); 4357 Value *AlignmentInBitsValue = EmitScalarExpr(E->getArg(1)); 4358 auto *AlignmentInBitsCI = cast<ConstantInt>(AlignmentInBitsValue); 4359 unsigned AlignmentInBits = AlignmentInBitsCI->getZExtValue(); 4360 const Align AlignmentInBytes = 4361 CGM.getContext().toCharUnitsFromBits(AlignmentInBits).getAsAlign(); 4362 AllocaInst *AI = Builder.CreateAlloca(Builder.getInt8Ty(), Size); 4363 AI->setAlignment(AlignmentInBytes); 4364 if (BuiltinID != Builtin::BI__builtin_alloca_with_align_uninitialized) 4365 initializeAlloca(*this, AI, Size, AlignmentInBytes); 4366 LangAS AAS = getASTAllocaAddressSpace(); 4367 LangAS EAS = E->getType()->getPointeeType().getAddressSpace(); 4368 if (AAS != EAS) { 4369 llvm::Type *Ty = CGM.getTypes().ConvertType(E->getType()); 4370 return RValue::get( 4371 getTargetHooks().performAddrSpaceCast(*this, AI, AAS, Ty)); 4372 } 4373 return RValue::get(AI); 4374 } 4375 4376 case Builtin::BIbzero: 4377 case Builtin::BI__builtin_bzero: { 4378 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4379 Value *SizeVal = EmitScalarExpr(E->getArg(1)); 4380 EmitNonNullArgCheck(Dest, E->getArg(0)->getType(), 4381 E->getArg(0)->getExprLoc(), FD, 0); 4382 auto *I = Builder.CreateMemSet(Dest, Builder.getInt8(0), SizeVal, false); 4383 addInstToNewSourceAtom(I, nullptr); 4384 return RValue::get(nullptr); 4385 } 4386 4387 case Builtin::BIbcopy: 4388 case Builtin::BI__builtin_bcopy: { 4389 Address Src = EmitPointerWithAlignment(E->getArg(0)); 4390 Address Dest = EmitPointerWithAlignment(E->getArg(1)); 4391 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 4392 EmitNonNullArgCheck(RValue::get(Src.emitRawPointer(*this)), 4393 E->getArg(0)->getType(), E->getArg(0)->getExprLoc(), FD, 4394 0); 4395 EmitNonNullArgCheck(RValue::get(Dest.emitRawPointer(*this)), 4396 E->getArg(1)->getType(), E->getArg(1)->getExprLoc(), FD, 4397 0); 4398 auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false); 4399 addInstToNewSourceAtom(I, nullptr); 4400 return RValue::get(nullptr); 4401 } 4402 4403 case Builtin::BImemcpy: 4404 case Builtin::BI__builtin_memcpy: 4405 case Builtin::BImempcpy: 4406 case Builtin::BI__builtin_mempcpy: { 4407 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4408 Address Src = EmitPointerWithAlignment(E->getArg(1)); 4409 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 4410 EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0); 4411 EmitArgCheck(TCK_Load, Src, E->getArg(1), 1); 4412 auto *I = Builder.CreateMemCpy(Dest, Src, SizeVal, false); 4413 addInstToNewSourceAtom(I, nullptr); 4414 if (BuiltinID == Builtin::BImempcpy || 4415 BuiltinID == Builtin::BI__builtin_mempcpy) 4416 return RValue::get(Builder.CreateInBoundsGEP( 4417 Dest.getElementType(), Dest.emitRawPointer(*this), SizeVal)); 4418 else 4419 return RValue::get(Dest, *this); 4420 } 4421 4422 case Builtin::BI__builtin_memcpy_inline: { 4423 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4424 Address Src = EmitPointerWithAlignment(E->getArg(1)); 4425 uint64_t Size = 4426 E->getArg(2)->EvaluateKnownConstInt(getContext()).getZExtValue(); 4427 EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0); 4428 EmitArgCheck(TCK_Load, Src, E->getArg(1), 1); 4429 auto *I = Builder.CreateMemCpyInline(Dest, Src, Size); 4430 addInstToNewSourceAtom(I, nullptr); 4431 return RValue::get(nullptr); 4432 } 4433 4434 case Builtin::BI__builtin_char_memchr: 4435 BuiltinID = Builtin::BI__builtin_memchr; 4436 break; 4437 4438 case Builtin::BI__builtin___memcpy_chk: { 4439 // fold __builtin_memcpy_chk(x, y, cst1, cst2) to memcpy iff cst1<=cst2. 4440 Expr::EvalResult SizeResult, DstSizeResult; 4441 if (!E->getArg(2)->EvaluateAsInt(SizeResult, CGM.getContext()) || 4442 !E->getArg(3)->EvaluateAsInt(DstSizeResult, CGM.getContext())) 4443 break; 4444 llvm::APSInt Size = SizeResult.Val.getInt(); 4445 llvm::APSInt DstSize = DstSizeResult.Val.getInt(); 4446 if (Size.ugt(DstSize)) 4447 break; 4448 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4449 Address Src = EmitPointerWithAlignment(E->getArg(1)); 4450 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 4451 auto *I = Builder.CreateMemCpy(Dest, Src, SizeVal, false); 4452 addInstToNewSourceAtom(I, nullptr); 4453 return RValue::get(Dest, *this); 4454 } 4455 4456 case Builtin::BI__builtin_objc_memmove_collectable: { 4457 Address DestAddr = EmitPointerWithAlignment(E->getArg(0)); 4458 Address SrcAddr = EmitPointerWithAlignment(E->getArg(1)); 4459 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 4460 CGM.getObjCRuntime().EmitGCMemmoveCollectable(*this, 4461 DestAddr, SrcAddr, SizeVal); 4462 return RValue::get(DestAddr, *this); 4463 } 4464 4465 case Builtin::BI__builtin___memmove_chk: { 4466 // fold __builtin_memmove_chk(x, y, cst1, cst2) to memmove iff cst1<=cst2. 4467 Expr::EvalResult SizeResult, DstSizeResult; 4468 if (!E->getArg(2)->EvaluateAsInt(SizeResult, CGM.getContext()) || 4469 !E->getArg(3)->EvaluateAsInt(DstSizeResult, CGM.getContext())) 4470 break; 4471 llvm::APSInt Size = SizeResult.Val.getInt(); 4472 llvm::APSInt DstSize = DstSizeResult.Val.getInt(); 4473 if (Size.ugt(DstSize)) 4474 break; 4475 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4476 Address Src = EmitPointerWithAlignment(E->getArg(1)); 4477 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 4478 auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false); 4479 addInstToNewSourceAtom(I, nullptr); 4480 return RValue::get(Dest, *this); 4481 } 4482 4483 case Builtin::BI__builtin_trivially_relocate: 4484 case Builtin::BImemmove: 4485 case Builtin::BI__builtin_memmove: { 4486 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4487 Address Src = EmitPointerWithAlignment(E->getArg(1)); 4488 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 4489 if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_trivially_relocate) 4490 SizeVal = Builder.CreateMul( 4491 SizeVal, 4492 ConstantInt::get( 4493 SizeVal->getType(), 4494 getContext() 4495 .getTypeSizeInChars(E->getArg(0)->getType()->getPointeeType()) 4496 .getQuantity())); 4497 EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0); 4498 EmitArgCheck(TCK_Load, Src, E->getArg(1), 1); 4499 auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false); 4500 addInstToNewSourceAtom(I, nullptr); 4501 return RValue::get(Dest, *this); 4502 } 4503 case Builtin::BImemset: 4504 case Builtin::BI__builtin_memset: { 4505 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4506 Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), 4507 Builder.getInt8Ty()); 4508 Value *SizeVal = EmitScalarExpr(E->getArg(2)); 4509 EmitNonNullArgCheck(Dest, E->getArg(0)->getType(), 4510 E->getArg(0)->getExprLoc(), FD, 0); 4511 auto *I = Builder.CreateMemSet(Dest, ByteVal, SizeVal, false); 4512 addInstToNewSourceAtom(I, ByteVal); 4513 return RValue::get(Dest, *this); 4514 } 4515 case Builtin::BI__builtin_memset_inline: { 4516 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4517 Value *ByteVal = 4518 Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), Builder.getInt8Ty()); 4519 uint64_t Size = 4520 E->getArg(2)->EvaluateKnownConstInt(getContext()).getZExtValue(); 4521 EmitNonNullArgCheck(RValue::get(Dest.emitRawPointer(*this)), 4522 E->getArg(0)->getType(), E->getArg(0)->getExprLoc(), FD, 4523 0); 4524 auto *I = Builder.CreateMemSetInline(Dest, ByteVal, Size); 4525 addInstToNewSourceAtom(I, nullptr); 4526 return RValue::get(nullptr); 4527 } 4528 case Builtin::BI__builtin___memset_chk: { 4529 // fold __builtin_memset_chk(x, y, cst1, cst2) to memset iff cst1<=cst2. 4530 Expr::EvalResult SizeResult, DstSizeResult; 4531 if (!E->getArg(2)->EvaluateAsInt(SizeResult, CGM.getContext()) || 4532 !E->getArg(3)->EvaluateAsInt(DstSizeResult, CGM.getContext())) 4533 break; 4534 llvm::APSInt Size = SizeResult.Val.getInt(); 4535 llvm::APSInt DstSize = DstSizeResult.Val.getInt(); 4536 if (Size.ugt(DstSize)) 4537 break; 4538 Address Dest = EmitPointerWithAlignment(E->getArg(0)); 4539 Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)), 4540 Builder.getInt8Ty()); 4541 Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size); 4542 auto *I = Builder.CreateMemSet(Dest, ByteVal, SizeVal, false); 4543 addInstToNewSourceAtom(I, nullptr); 4544 return RValue::get(Dest, *this); 4545 } 4546 case Builtin::BI__builtin_wmemchr: { 4547 // The MSVC runtime library does not provide a definition of wmemchr, so we 4548 // need an inline implementation. 4549 if (!getTarget().getTriple().isOSMSVCRT()) 4550 break; 4551 4552 llvm::Type *WCharTy = ConvertType(getContext().WCharTy); 4553 Value *Str = EmitScalarExpr(E->getArg(0)); 4554 Value *Chr = EmitScalarExpr(E->getArg(1)); 4555 Value *Size = EmitScalarExpr(E->getArg(2)); 4556 4557 BasicBlock *Entry = Builder.GetInsertBlock(); 4558 BasicBlock *CmpEq = createBasicBlock("wmemchr.eq"); 4559 BasicBlock *Next = createBasicBlock("wmemchr.next"); 4560 BasicBlock *Exit = createBasicBlock("wmemchr.exit"); 4561 Value *SizeEq0 = Builder.CreateICmpEQ(Size, ConstantInt::get(SizeTy, 0)); 4562 Builder.CreateCondBr(SizeEq0, Exit, CmpEq); 4563 4564 EmitBlock(CmpEq); 4565 PHINode *StrPhi = Builder.CreatePHI(Str->getType(), 2); 4566 StrPhi->addIncoming(Str, Entry); 4567 PHINode *SizePhi = Builder.CreatePHI(SizeTy, 2); 4568 SizePhi->addIncoming(Size, Entry); 4569 CharUnits WCharAlign = 4570 getContext().getTypeAlignInChars(getContext().WCharTy); 4571 Value *StrCh = Builder.CreateAlignedLoad(WCharTy, StrPhi, WCharAlign); 4572 Value *FoundChr = Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 0); 4573 Value *StrEqChr = Builder.CreateICmpEQ(StrCh, Chr); 4574 Builder.CreateCondBr(StrEqChr, Exit, Next); 4575 4576 EmitBlock(Next); 4577 Value *NextStr = Builder.CreateConstInBoundsGEP1_32(WCharTy, StrPhi, 1); 4578 Value *NextSize = Builder.CreateSub(SizePhi, ConstantInt::get(SizeTy, 1)); 4579 Value *NextSizeEq0 = 4580 Builder.CreateICmpEQ(NextSize, ConstantInt::get(SizeTy, 0)); 4581 Builder.CreateCondBr(NextSizeEq0, Exit, CmpEq); 4582 StrPhi->addIncoming(NextStr, Next); 4583 SizePhi->addIncoming(NextSize, Next); 4584 4585 EmitBlock(Exit); 4586 PHINode *Ret = Builder.CreatePHI(Str->getType(), 3); 4587 Ret->addIncoming(llvm::Constant::getNullValue(Str->getType()), Entry); 4588 Ret->addIncoming(llvm::Constant::getNullValue(Str->getType()), Next); 4589 Ret->addIncoming(FoundChr, CmpEq); 4590 return RValue::get(Ret); 4591 } 4592 case Builtin::BI__builtin_wmemcmp: { 4593 // The MSVC runtime library does not provide a definition of wmemcmp, so we 4594 // need an inline implementation. 4595 if (!getTarget().getTriple().isOSMSVCRT()) 4596 break; 4597 4598 llvm::Type *WCharTy = ConvertType(getContext().WCharTy); 4599 4600 Value *Dst = EmitScalarExpr(E->getArg(0)); 4601 Value *Src = EmitScalarExpr(E->getArg(1)); 4602 Value *Size = EmitScalarExpr(E->getArg(2)); 4603 4604 BasicBlock *Entry = Builder.GetInsertBlock(); 4605 BasicBlock *CmpGT = createBasicBlock("wmemcmp.gt"); 4606 BasicBlock *CmpLT = createBasicBlock("wmemcmp.lt"); 4607 BasicBlock *Next = createBasicBlock("wmemcmp.next"); 4608 BasicBlock *Exit = createBasicBlock("wmemcmp.exit"); 4609 Value *SizeEq0 = Builder.CreateICmpEQ(Size, ConstantInt::get(SizeTy, 0)); 4610 Builder.CreateCondBr(SizeEq0, Exit, CmpGT); 4611 4612 EmitBlock(CmpGT); 4613 PHINode *DstPhi = Builder.CreatePHI(Dst->getType(), 2); 4614 DstPhi->addIncoming(Dst, Entry); 4615 PHINode *SrcPhi = Builder.CreatePHI(Src->getType(), 2); 4616 SrcPhi->addIncoming(Src, Entry); 4617 PHINode *SizePhi = Builder.CreatePHI(SizeTy, 2); 4618 SizePhi->addIncoming(Size, Entry); 4619 CharUnits WCharAlign = 4620 getContext().getTypeAlignInChars(getContext().WCharTy); 4621 Value *DstCh = Builder.CreateAlignedLoad(WCharTy, DstPhi, WCharAlign); 4622 Value *SrcCh = Builder.CreateAlignedLoad(WCharTy, SrcPhi, WCharAlign); 4623 Value *DstGtSrc = Builder.CreateICmpUGT(DstCh, SrcCh); 4624 Builder.CreateCondBr(DstGtSrc, Exit, CmpLT); 4625 4626 EmitBlock(CmpLT); 4627 Value *DstLtSrc = Builder.CreateICmpULT(DstCh, SrcCh); 4628 Builder.CreateCondBr(DstLtSrc, Exit, Next); 4629 4630 EmitBlock(Next); 4631 Value *NextDst = Builder.CreateConstInBoundsGEP1_32(WCharTy, DstPhi, 1); 4632 Value *NextSrc = Builder.CreateConstInBoundsGEP1_32(WCharTy, SrcPhi, 1); 4633 Value *NextSize = Builder.CreateSub(SizePhi, ConstantInt::get(SizeTy, 1)); 4634 Value *NextSizeEq0 = 4635 Builder.CreateICmpEQ(NextSize, ConstantInt::get(SizeTy, 0)); 4636 Builder.CreateCondBr(NextSizeEq0, Exit, CmpGT); 4637 DstPhi->addIncoming(NextDst, Next); 4638 SrcPhi->addIncoming(NextSrc, Next); 4639 SizePhi->addIncoming(NextSize, Next); 4640 4641 EmitBlock(Exit); 4642 PHINode *Ret = Builder.CreatePHI(IntTy, 4); 4643 Ret->addIncoming(ConstantInt::get(IntTy, 0), Entry); 4644 Ret->addIncoming(ConstantInt::get(IntTy, 1), CmpGT); 4645 Ret->addIncoming(ConstantInt::get(IntTy, -1), CmpLT); 4646 Ret->addIncoming(ConstantInt::get(IntTy, 0), Next); 4647 return RValue::get(Ret); 4648 } 4649 case Builtin::BI__builtin_dwarf_cfa: { 4650 // The offset in bytes from the first argument to the CFA. 4651 // 4652 // Why on earth is this in the frontend? Is there any reason at 4653 // all that the backend can't reasonably determine this while 4654 // lowering llvm.eh.dwarf.cfa()? 4655 // 4656 // TODO: If there's a satisfactory reason, add a target hook for 4657 // this instead of hard-coding 0, which is correct for most targets. 4658 int32_t Offset = 0; 4659 4660 Function *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa); 4661 return RValue::get(Builder.CreateCall(F, 4662 llvm::ConstantInt::get(Int32Ty, Offset))); 4663 } 4664 case Builtin::BI__builtin_return_address: { 4665 Value *Depth = ConstantEmitter(*this).emitAbstract(E->getArg(0), 4666 getContext().UnsignedIntTy); 4667 Function *F = CGM.getIntrinsic(Intrinsic::returnaddress); 4668 return RValue::get(Builder.CreateCall(F, Depth)); 4669 } 4670 case Builtin::BI_ReturnAddress: { 4671 Function *F = CGM.getIntrinsic(Intrinsic::returnaddress); 4672 return RValue::get(Builder.CreateCall(F, Builder.getInt32(0))); 4673 } 4674 case Builtin::BI__builtin_frame_address: { 4675 Value *Depth = ConstantEmitter(*this).emitAbstract(E->getArg(0), 4676 getContext().UnsignedIntTy); 4677 Function *F = CGM.getIntrinsic(Intrinsic::frameaddress, AllocaInt8PtrTy); 4678 return RValue::get(Builder.CreateCall(F, Depth)); 4679 } 4680 case Builtin::BI__builtin_extract_return_addr: { 4681 Value *Address = EmitScalarExpr(E->getArg(0)); 4682 Value *Result = getTargetHooks().decodeReturnAddress(*this, Address); 4683 return RValue::get(Result); 4684 } 4685 case Builtin::BI__builtin_frob_return_addr: { 4686 Value *Address = EmitScalarExpr(E->getArg(0)); 4687 Value *Result = getTargetHooks().encodeReturnAddress(*this, Address); 4688 return RValue::get(Result); 4689 } 4690 case Builtin::BI__builtin_dwarf_sp_column: { 4691 llvm::IntegerType *Ty 4692 = cast<llvm::IntegerType>(ConvertType(E->getType())); 4693 int Column = getTargetHooks().getDwarfEHStackPointer(CGM); 4694 if (Column == -1) { 4695 CGM.ErrorUnsupported(E, "__builtin_dwarf_sp_column"); 4696 return RValue::get(llvm::UndefValue::get(Ty)); 4697 } 4698 return RValue::get(llvm::ConstantInt::get(Ty, Column, true)); 4699 } 4700 case Builtin::BI__builtin_init_dwarf_reg_size_table: { 4701 Value *Address = EmitScalarExpr(E->getArg(0)); 4702 if (getTargetHooks().initDwarfEHRegSizeTable(*this, Address)) 4703 CGM.ErrorUnsupported(E, "__builtin_init_dwarf_reg_size_table"); 4704 return RValue::get(llvm::UndefValue::get(ConvertType(E->getType()))); 4705 } 4706 case Builtin::BI__builtin_eh_return: { 4707 Value *Int = EmitScalarExpr(E->getArg(0)); 4708 Value *Ptr = EmitScalarExpr(E->getArg(1)); 4709 4710 llvm::IntegerType *IntTy = cast<llvm::IntegerType>(Int->getType()); 4711 assert((IntTy->getBitWidth() == 32 || IntTy->getBitWidth() == 64) && 4712 "LLVM's __builtin_eh_return only supports 32- and 64-bit variants"); 4713 Function *F = 4714 CGM.getIntrinsic(IntTy->getBitWidth() == 32 ? Intrinsic::eh_return_i32 4715 : Intrinsic::eh_return_i64); 4716 Builder.CreateCall(F, {Int, Ptr}); 4717 Builder.CreateUnreachable(); 4718 4719 // We do need to preserve an insertion point. 4720 EmitBlock(createBasicBlock("builtin_eh_return.cont")); 4721 4722 return RValue::get(nullptr); 4723 } 4724 case Builtin::BI__builtin_unwind_init: { 4725 Function *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init); 4726 Builder.CreateCall(F); 4727 return RValue::get(nullptr); 4728 } 4729 case Builtin::BI__builtin_extend_pointer: { 4730 // Extends a pointer to the size of an _Unwind_Word, which is 4731 // uint64_t on all platforms. Generally this gets poked into a 4732 // register and eventually used as an address, so if the 4733 // addressing registers are wider than pointers and the platform 4734 // doesn't implicitly ignore high-order bits when doing 4735 // addressing, we need to make sure we zext / sext based on 4736 // the platform's expectations. 4737 // 4738 // See: http://gcc.gnu.org/ml/gcc-bugs/2002-02/msg00237.html 4739 4740 // Cast the pointer to intptr_t. 4741 Value *Ptr = EmitScalarExpr(E->getArg(0)); 4742 Value *Result = Builder.CreatePtrToInt(Ptr, IntPtrTy, "extend.cast"); 4743 4744 // If that's 64 bits, we're done. 4745 if (IntPtrTy->getBitWidth() == 64) 4746 return RValue::get(Result); 4747 4748 // Otherwise, ask the codegen data what to do. 4749 if (getTargetHooks().extendPointerWithSExt()) 4750 return RValue::get(Builder.CreateSExt(Result, Int64Ty, "extend.sext")); 4751 else 4752 return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext")); 4753 } 4754 case Builtin::BI__builtin_setjmp: { 4755 // Buffer is a void**. 4756 Address Buf = EmitPointerWithAlignment(E->getArg(0)); 4757 4758 if (getTarget().getTriple().getArch() == llvm::Triple::systemz) { 4759 // On this target, the back end fills in the context buffer completely. 4760 // It doesn't really matter if the frontend stores to the buffer before 4761 // calling setjmp, the back-end is going to overwrite them anyway. 4762 Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp); 4763 return RValue::get(Builder.CreateCall(F, Buf.emitRawPointer(*this))); 4764 } 4765 4766 // Store the frame pointer to the setjmp buffer. 4767 Value *FrameAddr = Builder.CreateCall( 4768 CGM.getIntrinsic(Intrinsic::frameaddress, AllocaInt8PtrTy), 4769 ConstantInt::get(Int32Ty, 0)); 4770 Builder.CreateStore(FrameAddr, Buf); 4771 4772 // Store the stack pointer to the setjmp buffer. 4773 Value *StackAddr = Builder.CreateStackSave(); 4774 assert(Buf.emitRawPointer(*this)->getType() == StackAddr->getType()); 4775 4776 Address StackSaveSlot = Builder.CreateConstInBoundsGEP(Buf, 2); 4777 Builder.CreateStore(StackAddr, StackSaveSlot); 4778 4779 // Call LLVM's EH setjmp, which is lightweight. 4780 Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp); 4781 return RValue::get(Builder.CreateCall(F, Buf.emitRawPointer(*this))); 4782 } 4783 case Builtin::BI__builtin_longjmp: { 4784 Value *Buf = EmitScalarExpr(E->getArg(0)); 4785 4786 // Call LLVM's EH longjmp, which is lightweight. 4787 Builder.CreateCall(CGM.getIntrinsic(Intrinsic::eh_sjlj_longjmp), Buf); 4788 4789 // longjmp doesn't return; mark this as unreachable. 4790 Builder.CreateUnreachable(); 4791 4792 // We do need to preserve an insertion point. 4793 EmitBlock(createBasicBlock("longjmp.cont")); 4794 4795 return RValue::get(nullptr); 4796 } 4797 case Builtin::BI__builtin_launder: { 4798 const Expr *Arg = E->getArg(0); 4799 QualType ArgTy = Arg->getType()->getPointeeType(); 4800 Value *Ptr = EmitScalarExpr(Arg); 4801 if (TypeRequiresBuiltinLaunder(CGM, ArgTy)) 4802 Ptr = Builder.CreateLaunderInvariantGroup(Ptr); 4803 4804 return RValue::get(Ptr); 4805 } 4806 case Builtin::BI__sync_fetch_and_add: 4807 case Builtin::BI__sync_fetch_and_sub: 4808 case Builtin::BI__sync_fetch_and_or: 4809 case Builtin::BI__sync_fetch_and_and: 4810 case Builtin::BI__sync_fetch_and_xor: 4811 case Builtin::BI__sync_fetch_and_nand: 4812 case Builtin::BI__sync_add_and_fetch: 4813 case Builtin::BI__sync_sub_and_fetch: 4814 case Builtin::BI__sync_and_and_fetch: 4815 case Builtin::BI__sync_or_and_fetch: 4816 case Builtin::BI__sync_xor_and_fetch: 4817 case Builtin::BI__sync_nand_and_fetch: 4818 case Builtin::BI__sync_val_compare_and_swap: 4819 case Builtin::BI__sync_bool_compare_and_swap: 4820 case Builtin::BI__sync_lock_test_and_set: 4821 case Builtin::BI__sync_lock_release: 4822 case Builtin::BI__sync_swap: 4823 llvm_unreachable("Shouldn't make it through sema"); 4824 case Builtin::BI__sync_fetch_and_add_1: 4825 case Builtin::BI__sync_fetch_and_add_2: 4826 case Builtin::BI__sync_fetch_and_add_4: 4827 case Builtin::BI__sync_fetch_and_add_8: 4828 case Builtin::BI__sync_fetch_and_add_16: 4829 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Add, E); 4830 case Builtin::BI__sync_fetch_and_sub_1: 4831 case Builtin::BI__sync_fetch_and_sub_2: 4832 case Builtin::BI__sync_fetch_and_sub_4: 4833 case Builtin::BI__sync_fetch_and_sub_8: 4834 case Builtin::BI__sync_fetch_and_sub_16: 4835 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Sub, E); 4836 case Builtin::BI__sync_fetch_and_or_1: 4837 case Builtin::BI__sync_fetch_and_or_2: 4838 case Builtin::BI__sync_fetch_and_or_4: 4839 case Builtin::BI__sync_fetch_and_or_8: 4840 case Builtin::BI__sync_fetch_and_or_16: 4841 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Or, E); 4842 case Builtin::BI__sync_fetch_and_and_1: 4843 case Builtin::BI__sync_fetch_and_and_2: 4844 case Builtin::BI__sync_fetch_and_and_4: 4845 case Builtin::BI__sync_fetch_and_and_8: 4846 case Builtin::BI__sync_fetch_and_and_16: 4847 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::And, E); 4848 case Builtin::BI__sync_fetch_and_xor_1: 4849 case Builtin::BI__sync_fetch_and_xor_2: 4850 case Builtin::BI__sync_fetch_and_xor_4: 4851 case Builtin::BI__sync_fetch_and_xor_8: 4852 case Builtin::BI__sync_fetch_and_xor_16: 4853 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xor, E); 4854 case Builtin::BI__sync_fetch_and_nand_1: 4855 case Builtin::BI__sync_fetch_and_nand_2: 4856 case Builtin::BI__sync_fetch_and_nand_4: 4857 case Builtin::BI__sync_fetch_and_nand_8: 4858 case Builtin::BI__sync_fetch_and_nand_16: 4859 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Nand, E); 4860 4861 // Clang extensions: not overloaded yet. 4862 case Builtin::BI__sync_fetch_and_min: 4863 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Min, E); 4864 case Builtin::BI__sync_fetch_and_max: 4865 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Max, E); 4866 case Builtin::BI__sync_fetch_and_umin: 4867 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMin, E); 4868 case Builtin::BI__sync_fetch_and_umax: 4869 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::UMax, E); 4870 4871 case Builtin::BI__sync_add_and_fetch_1: 4872 case Builtin::BI__sync_add_and_fetch_2: 4873 case Builtin::BI__sync_add_and_fetch_4: 4874 case Builtin::BI__sync_add_and_fetch_8: 4875 case Builtin::BI__sync_add_and_fetch_16: 4876 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Add, E, 4877 llvm::Instruction::Add); 4878 case Builtin::BI__sync_sub_and_fetch_1: 4879 case Builtin::BI__sync_sub_and_fetch_2: 4880 case Builtin::BI__sync_sub_and_fetch_4: 4881 case Builtin::BI__sync_sub_and_fetch_8: 4882 case Builtin::BI__sync_sub_and_fetch_16: 4883 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Sub, E, 4884 llvm::Instruction::Sub); 4885 case Builtin::BI__sync_and_and_fetch_1: 4886 case Builtin::BI__sync_and_and_fetch_2: 4887 case Builtin::BI__sync_and_and_fetch_4: 4888 case Builtin::BI__sync_and_and_fetch_8: 4889 case Builtin::BI__sync_and_and_fetch_16: 4890 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::And, E, 4891 llvm::Instruction::And); 4892 case Builtin::BI__sync_or_and_fetch_1: 4893 case Builtin::BI__sync_or_and_fetch_2: 4894 case Builtin::BI__sync_or_and_fetch_4: 4895 case Builtin::BI__sync_or_and_fetch_8: 4896 case Builtin::BI__sync_or_and_fetch_16: 4897 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Or, E, 4898 llvm::Instruction::Or); 4899 case Builtin::BI__sync_xor_and_fetch_1: 4900 case Builtin::BI__sync_xor_and_fetch_2: 4901 case Builtin::BI__sync_xor_and_fetch_4: 4902 case Builtin::BI__sync_xor_and_fetch_8: 4903 case Builtin::BI__sync_xor_and_fetch_16: 4904 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Xor, E, 4905 llvm::Instruction::Xor); 4906 case Builtin::BI__sync_nand_and_fetch_1: 4907 case Builtin::BI__sync_nand_and_fetch_2: 4908 case Builtin::BI__sync_nand_and_fetch_4: 4909 case Builtin::BI__sync_nand_and_fetch_8: 4910 case Builtin::BI__sync_nand_and_fetch_16: 4911 return EmitBinaryAtomicPost(*this, llvm::AtomicRMWInst::Nand, E, 4912 llvm::Instruction::And, true); 4913 4914 case Builtin::BI__sync_val_compare_and_swap_1: 4915 case Builtin::BI__sync_val_compare_and_swap_2: 4916 case Builtin::BI__sync_val_compare_and_swap_4: 4917 case Builtin::BI__sync_val_compare_and_swap_8: 4918 case Builtin::BI__sync_val_compare_and_swap_16: 4919 return RValue::get(MakeAtomicCmpXchgValue(*this, E, false)); 4920 4921 case Builtin::BI__sync_bool_compare_and_swap_1: 4922 case Builtin::BI__sync_bool_compare_and_swap_2: 4923 case Builtin::BI__sync_bool_compare_and_swap_4: 4924 case Builtin::BI__sync_bool_compare_and_swap_8: 4925 case Builtin::BI__sync_bool_compare_and_swap_16: 4926 return RValue::get(MakeAtomicCmpXchgValue(*this, E, true)); 4927 4928 case Builtin::BI__sync_swap_1: 4929 case Builtin::BI__sync_swap_2: 4930 case Builtin::BI__sync_swap_4: 4931 case Builtin::BI__sync_swap_8: 4932 case Builtin::BI__sync_swap_16: 4933 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E); 4934 4935 case Builtin::BI__sync_lock_test_and_set_1: 4936 case Builtin::BI__sync_lock_test_and_set_2: 4937 case Builtin::BI__sync_lock_test_and_set_4: 4938 case Builtin::BI__sync_lock_test_and_set_8: 4939 case Builtin::BI__sync_lock_test_and_set_16: 4940 return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E); 4941 4942 case Builtin::BI__sync_lock_release_1: 4943 case Builtin::BI__sync_lock_release_2: 4944 case Builtin::BI__sync_lock_release_4: 4945 case Builtin::BI__sync_lock_release_8: 4946 case Builtin::BI__sync_lock_release_16: { 4947 Address Ptr = CheckAtomicAlignment(*this, E); 4948 QualType ElTy = E->getArg(0)->getType()->getPointeeType(); 4949 4950 llvm::Type *ITy = llvm::IntegerType::get(getLLVMContext(), 4951 getContext().getTypeSize(ElTy)); 4952 llvm::StoreInst *Store = 4953 Builder.CreateStore(llvm::Constant::getNullValue(ITy), Ptr); 4954 Store->setAtomic(llvm::AtomicOrdering::Release); 4955 return RValue::get(nullptr); 4956 } 4957 4958 case Builtin::BI__sync_synchronize: { 4959 // We assume this is supposed to correspond to a C++0x-style 4960 // sequentially-consistent fence (i.e. this is only usable for 4961 // synchronization, not device I/O or anything like that). This intrinsic 4962 // is really badly designed in the sense that in theory, there isn't 4963 // any way to safely use it... but in practice, it mostly works 4964 // to use it with non-atomic loads and stores to get acquire/release 4965 // semantics. 4966 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent); 4967 return RValue::get(nullptr); 4968 } 4969 4970 case Builtin::BI__builtin_nontemporal_load: 4971 return RValue::get(EmitNontemporalLoad(*this, E)); 4972 case Builtin::BI__builtin_nontemporal_store: 4973 return RValue::get(EmitNontemporalStore(*this, E)); 4974 case Builtin::BI__c11_atomic_is_lock_free: 4975 case Builtin::BI__atomic_is_lock_free: { 4976 // Call "bool __atomic_is_lock_free(size_t size, void *ptr)". For the 4977 // __c11 builtin, ptr is 0 (indicating a properly-aligned object), since 4978 // _Atomic(T) is always properly-aligned. 4979 const char *LibCallName = "__atomic_is_lock_free"; 4980 CallArgList Args; 4981 Args.add(RValue::get(EmitScalarExpr(E->getArg(0))), 4982 getContext().getSizeType()); 4983 if (BuiltinID == Builtin::BI__atomic_is_lock_free) 4984 Args.add(RValue::get(EmitScalarExpr(E->getArg(1))), 4985 getContext().VoidPtrTy); 4986 else 4987 Args.add(RValue::get(llvm::Constant::getNullValue(VoidPtrTy)), 4988 getContext().VoidPtrTy); 4989 const CGFunctionInfo &FuncInfo = 4990 CGM.getTypes().arrangeBuiltinFunctionCall(E->getType(), Args); 4991 llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FuncInfo); 4992 llvm::FunctionCallee Func = CGM.CreateRuntimeFunction(FTy, LibCallName); 4993 return EmitCall(FuncInfo, CGCallee::forDirect(Func), 4994 ReturnValueSlot(), Args); 4995 } 4996 4997 case Builtin::BI__atomic_thread_fence: 4998 case Builtin::BI__atomic_signal_fence: 4999 case Builtin::BI__c11_atomic_thread_fence: 5000 case Builtin::BI__c11_atomic_signal_fence: { 5001 llvm::SyncScope::ID SSID; 5002 if (BuiltinID == Builtin::BI__atomic_signal_fence || 5003 BuiltinID == Builtin::BI__c11_atomic_signal_fence) 5004 SSID = llvm::SyncScope::SingleThread; 5005 else 5006 SSID = llvm::SyncScope::System; 5007 Value *Order = EmitScalarExpr(E->getArg(0)); 5008 if (isa<llvm::ConstantInt>(Order)) { 5009 int ord = cast<llvm::ConstantInt>(Order)->getZExtValue(); 5010 switch (ord) { 5011 case 0: // memory_order_relaxed 5012 default: // invalid order 5013 break; 5014 case 1: // memory_order_consume 5015 case 2: // memory_order_acquire 5016 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID); 5017 break; 5018 case 3: // memory_order_release 5019 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID); 5020 break; 5021 case 4: // memory_order_acq_rel 5022 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID); 5023 break; 5024 case 5: // memory_order_seq_cst 5025 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID); 5026 break; 5027 } 5028 return RValue::get(nullptr); 5029 } 5030 5031 llvm::BasicBlock *AcquireBB, *ReleaseBB, *AcqRelBB, *SeqCstBB; 5032 AcquireBB = createBasicBlock("acquire", CurFn); 5033 ReleaseBB = createBasicBlock("release", CurFn); 5034 AcqRelBB = createBasicBlock("acqrel", CurFn); 5035 SeqCstBB = createBasicBlock("seqcst", CurFn); 5036 llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn); 5037 5038 Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false); 5039 llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB); 5040 5041 Builder.SetInsertPoint(AcquireBB); 5042 Builder.CreateFence(llvm::AtomicOrdering::Acquire, SSID); 5043 Builder.CreateBr(ContBB); 5044 SI->addCase(Builder.getInt32(1), AcquireBB); 5045 SI->addCase(Builder.getInt32(2), AcquireBB); 5046 5047 Builder.SetInsertPoint(ReleaseBB); 5048 Builder.CreateFence(llvm::AtomicOrdering::Release, SSID); 5049 Builder.CreateBr(ContBB); 5050 SI->addCase(Builder.getInt32(3), ReleaseBB); 5051 5052 Builder.SetInsertPoint(AcqRelBB); 5053 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, SSID); 5054 Builder.CreateBr(ContBB); 5055 SI->addCase(Builder.getInt32(4), AcqRelBB); 5056 5057 Builder.SetInsertPoint(SeqCstBB); 5058 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, SSID); 5059 Builder.CreateBr(ContBB); 5060 SI->addCase(Builder.getInt32(5), SeqCstBB); 5061 5062 Builder.SetInsertPoint(ContBB); 5063 return RValue::get(nullptr); 5064 } 5065 case Builtin::BI__scoped_atomic_thread_fence: { 5066 auto ScopeModel = AtomicScopeModel::create(AtomicScopeModelKind::Generic); 5067 5068 Value *Order = EmitScalarExpr(E->getArg(0)); 5069 Value *Scope = EmitScalarExpr(E->getArg(1)); 5070 auto Ord = dyn_cast<llvm::ConstantInt>(Order); 5071 auto Scp = dyn_cast<llvm::ConstantInt>(Scope); 5072 if (Ord && Scp) { 5073 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue()) 5074 ? ScopeModel->map(Scp->getZExtValue()) 5075 : ScopeModel->map(ScopeModel->getFallBackValue()); 5076 switch (Ord->getZExtValue()) { 5077 case 0: // memory_order_relaxed 5078 default: // invalid order 5079 break; 5080 case 1: // memory_order_consume 5081 case 2: // memory_order_acquire 5082 Builder.CreateFence( 5083 llvm::AtomicOrdering::Acquire, 5084 getTargetHooks().getLLVMSyncScopeID(getLangOpts(), SS, 5085 llvm::AtomicOrdering::Acquire, 5086 getLLVMContext())); 5087 break; 5088 case 3: // memory_order_release 5089 Builder.CreateFence( 5090 llvm::AtomicOrdering::Release, 5091 getTargetHooks().getLLVMSyncScopeID(getLangOpts(), SS, 5092 llvm::AtomicOrdering::Release, 5093 getLLVMContext())); 5094 break; 5095 case 4: // memory_order_acq_rel 5096 Builder.CreateFence(llvm::AtomicOrdering::AcquireRelease, 5097 getTargetHooks().getLLVMSyncScopeID( 5098 getLangOpts(), SS, 5099 llvm::AtomicOrdering::AcquireRelease, 5100 getLLVMContext())); 5101 break; 5102 case 5: // memory_order_seq_cst 5103 Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent, 5104 getTargetHooks().getLLVMSyncScopeID( 5105 getLangOpts(), SS, 5106 llvm::AtomicOrdering::SequentiallyConsistent, 5107 getLLVMContext())); 5108 break; 5109 } 5110 return RValue::get(nullptr); 5111 } 5112 5113 llvm::BasicBlock *ContBB = createBasicBlock("atomic.scope.continue", CurFn); 5114 5115 llvm::SmallVector<std::pair<llvm::BasicBlock *, llvm::AtomicOrdering>> 5116 OrderBBs; 5117 if (Ord) { 5118 switch (Ord->getZExtValue()) { 5119 case 0: // memory_order_relaxed 5120 default: // invalid order 5121 ContBB->eraseFromParent(); 5122 return RValue::get(nullptr); 5123 case 1: // memory_order_consume 5124 case 2: // memory_order_acquire 5125 OrderBBs.emplace_back(Builder.GetInsertBlock(), 5126 llvm::AtomicOrdering::Acquire); 5127 break; 5128 case 3: // memory_order_release 5129 OrderBBs.emplace_back(Builder.GetInsertBlock(), 5130 llvm::AtomicOrdering::Release); 5131 break; 5132 case 4: // memory_order_acq_rel 5133 OrderBBs.emplace_back(Builder.GetInsertBlock(), 5134 llvm::AtomicOrdering::AcquireRelease); 5135 break; 5136 case 5: // memory_order_seq_cst 5137 OrderBBs.emplace_back(Builder.GetInsertBlock(), 5138 llvm::AtomicOrdering::SequentiallyConsistent); 5139 break; 5140 } 5141 } else { 5142 llvm::BasicBlock *AcquireBB = createBasicBlock("acquire", CurFn); 5143 llvm::BasicBlock *ReleaseBB = createBasicBlock("release", CurFn); 5144 llvm::BasicBlock *AcqRelBB = createBasicBlock("acqrel", CurFn); 5145 llvm::BasicBlock *SeqCstBB = createBasicBlock("seqcst", CurFn); 5146 5147 Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false); 5148 llvm::SwitchInst *SI = Builder.CreateSwitch(Order, ContBB); 5149 SI->addCase(Builder.getInt32(1), AcquireBB); 5150 SI->addCase(Builder.getInt32(2), AcquireBB); 5151 SI->addCase(Builder.getInt32(3), ReleaseBB); 5152 SI->addCase(Builder.getInt32(4), AcqRelBB); 5153 SI->addCase(Builder.getInt32(5), SeqCstBB); 5154 5155 OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire); 5156 OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release); 5157 OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease); 5158 OrderBBs.emplace_back(SeqCstBB, 5159 llvm::AtomicOrdering::SequentiallyConsistent); 5160 } 5161 5162 for (auto &[OrderBB, Ordering] : OrderBBs) { 5163 Builder.SetInsertPoint(OrderBB); 5164 if (Scp) { 5165 SyncScope SS = ScopeModel->isValid(Scp->getZExtValue()) 5166 ? ScopeModel->map(Scp->getZExtValue()) 5167 : ScopeModel->map(ScopeModel->getFallBackValue()); 5168 Builder.CreateFence(Ordering, 5169 getTargetHooks().getLLVMSyncScopeID( 5170 getLangOpts(), SS, Ordering, getLLVMContext())); 5171 Builder.CreateBr(ContBB); 5172 } else { 5173 llvm::DenseMap<unsigned, llvm::BasicBlock *> BBs; 5174 for (unsigned Scp : ScopeModel->getRuntimeValues()) 5175 BBs[Scp] = createBasicBlock(getAsString(ScopeModel->map(Scp)), CurFn); 5176 5177 auto *SC = Builder.CreateIntCast(Scope, Builder.getInt32Ty(), false); 5178 llvm::SwitchInst *SI = Builder.CreateSwitch(SC, ContBB); 5179 for (unsigned Scp : ScopeModel->getRuntimeValues()) { 5180 auto *B = BBs[Scp]; 5181 SI->addCase(Builder.getInt32(Scp), B); 5182 5183 Builder.SetInsertPoint(B); 5184 Builder.CreateFence(Ordering, getTargetHooks().getLLVMSyncScopeID( 5185 getLangOpts(), ScopeModel->map(Scp), 5186 Ordering, getLLVMContext())); 5187 Builder.CreateBr(ContBB); 5188 } 5189 } 5190 } 5191 5192 Builder.SetInsertPoint(ContBB); 5193 return RValue::get(nullptr); 5194 } 5195 5196 case Builtin::BI__builtin_signbit: 5197 case Builtin::BI__builtin_signbitf: 5198 case Builtin::BI__builtin_signbitl: { 5199 return RValue::get( 5200 Builder.CreateZExt(EmitSignBit(*this, EmitScalarExpr(E->getArg(0))), 5201 ConvertType(E->getType()))); 5202 } 5203 case Builtin::BI__warn_memset_zero_len: 5204 return RValue::getIgnored(); 5205 case Builtin::BI__annotation: { 5206 // Re-encode each wide string to UTF8 and make an MDString. 5207 SmallVector<Metadata *, 1> Strings; 5208 for (const Expr *Arg : E->arguments()) { 5209 const auto *Str = cast<StringLiteral>(Arg->IgnoreParenCasts()); 5210 assert(Str->getCharByteWidth() == 2); 5211 StringRef WideBytes = Str->getBytes(); 5212 std::string StrUtf8; 5213 if (!convertUTF16ToUTF8String( 5214 ArrayRef(WideBytes.data(), WideBytes.size()), StrUtf8)) { 5215 CGM.ErrorUnsupported(E, "non-UTF16 __annotation argument"); 5216 continue; 5217 } 5218 Strings.push_back(llvm::MDString::get(getLLVMContext(), StrUtf8)); 5219 } 5220 5221 // Build and MDTuple of MDStrings and emit the intrinsic call. 5222 llvm::Function *F = CGM.getIntrinsic(Intrinsic::codeview_annotation, {}); 5223 MDTuple *StrTuple = MDTuple::get(getLLVMContext(), Strings); 5224 Builder.CreateCall(F, MetadataAsValue::get(getLLVMContext(), StrTuple)); 5225 return RValue::getIgnored(); 5226 } 5227 case Builtin::BI__builtin_annotation: { 5228 llvm::Value *AnnVal = EmitScalarExpr(E->getArg(0)); 5229 llvm::Function *F = CGM.getIntrinsic( 5230 Intrinsic::annotation, {AnnVal->getType(), CGM.ConstGlobalsPtrTy}); 5231 5232 // Get the annotation string, go through casts. Sema requires this to be a 5233 // non-wide string literal, potentially casted, so the cast<> is safe. 5234 const Expr *AnnotationStrExpr = E->getArg(1)->IgnoreParenCasts(); 5235 StringRef Str = cast<StringLiteral>(AnnotationStrExpr)->getString(); 5236 return RValue::get( 5237 EmitAnnotationCall(F, AnnVal, Str, E->getExprLoc(), nullptr)); 5238 } 5239 case Builtin::BI__builtin_addcb: 5240 case Builtin::BI__builtin_addcs: 5241 case Builtin::BI__builtin_addc: 5242 case Builtin::BI__builtin_addcl: 5243 case Builtin::BI__builtin_addcll: 5244 case Builtin::BI__builtin_subcb: 5245 case Builtin::BI__builtin_subcs: 5246 case Builtin::BI__builtin_subc: 5247 case Builtin::BI__builtin_subcl: 5248 case Builtin::BI__builtin_subcll: { 5249 5250 // We translate all of these builtins from expressions of the form: 5251 // int x = ..., y = ..., carryin = ..., carryout, result; 5252 // result = __builtin_addc(x, y, carryin, &carryout); 5253 // 5254 // to LLVM IR of the form: 5255 // 5256 // %tmp1 = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %x, i32 %y) 5257 // %tmpsum1 = extractvalue {i32, i1} %tmp1, 0 5258 // %carry1 = extractvalue {i32, i1} %tmp1, 1 5259 // %tmp2 = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %tmpsum1, 5260 // i32 %carryin) 5261 // %result = extractvalue {i32, i1} %tmp2, 0 5262 // %carry2 = extractvalue {i32, i1} %tmp2, 1 5263 // %tmp3 = or i1 %carry1, %carry2 5264 // %tmp4 = zext i1 %tmp3 to i32 5265 // store i32 %tmp4, i32* %carryout 5266 5267 // Scalarize our inputs. 5268 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 5269 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 5270 llvm::Value *Carryin = EmitScalarExpr(E->getArg(2)); 5271 Address CarryOutPtr = EmitPointerWithAlignment(E->getArg(3)); 5272 5273 // Decide if we are lowering to a uadd.with.overflow or usub.with.overflow. 5274 Intrinsic::ID IntrinsicId; 5275 switch (BuiltinID) { 5276 default: llvm_unreachable("Unknown multiprecision builtin id."); 5277 case Builtin::BI__builtin_addcb: 5278 case Builtin::BI__builtin_addcs: 5279 case Builtin::BI__builtin_addc: 5280 case Builtin::BI__builtin_addcl: 5281 case Builtin::BI__builtin_addcll: 5282 IntrinsicId = Intrinsic::uadd_with_overflow; 5283 break; 5284 case Builtin::BI__builtin_subcb: 5285 case Builtin::BI__builtin_subcs: 5286 case Builtin::BI__builtin_subc: 5287 case Builtin::BI__builtin_subcl: 5288 case Builtin::BI__builtin_subcll: 5289 IntrinsicId = Intrinsic::usub_with_overflow; 5290 break; 5291 } 5292 5293 // Construct our resulting LLVM IR expression. 5294 llvm::Value *Carry1; 5295 llvm::Value *Sum1 = EmitOverflowIntrinsic(*this, IntrinsicId, 5296 X, Y, Carry1); 5297 llvm::Value *Carry2; 5298 llvm::Value *Sum2 = EmitOverflowIntrinsic(*this, IntrinsicId, 5299 Sum1, Carryin, Carry2); 5300 llvm::Value *CarryOut = Builder.CreateZExt(Builder.CreateOr(Carry1, Carry2), 5301 X->getType()); 5302 Builder.CreateStore(CarryOut, CarryOutPtr); 5303 return RValue::get(Sum2); 5304 } 5305 5306 case Builtin::BI__builtin_add_overflow: 5307 case Builtin::BI__builtin_sub_overflow: 5308 case Builtin::BI__builtin_mul_overflow: { 5309 const clang::Expr *LeftArg = E->getArg(0); 5310 const clang::Expr *RightArg = E->getArg(1); 5311 const clang::Expr *ResultArg = E->getArg(2); 5312 5313 clang::QualType ResultQTy = 5314 ResultArg->getType()->castAs<PointerType>()->getPointeeType(); 5315 5316 WidthAndSignedness LeftInfo = 5317 getIntegerWidthAndSignedness(CGM.getContext(), LeftArg->getType()); 5318 WidthAndSignedness RightInfo = 5319 getIntegerWidthAndSignedness(CGM.getContext(), RightArg->getType()); 5320 WidthAndSignedness ResultInfo = 5321 getIntegerWidthAndSignedness(CGM.getContext(), ResultQTy); 5322 5323 // Handle mixed-sign multiplication as a special case, because adding 5324 // runtime or backend support for our generic irgen would be too expensive. 5325 if (isSpecialMixedSignMultiply(BuiltinID, LeftInfo, RightInfo, ResultInfo)) 5326 return EmitCheckedMixedSignMultiply(*this, LeftArg, LeftInfo, RightArg, 5327 RightInfo, ResultArg, ResultQTy, 5328 ResultInfo); 5329 5330 if (isSpecialUnsignedMultiplySignedResult(BuiltinID, LeftInfo, RightInfo, 5331 ResultInfo)) 5332 return EmitCheckedUnsignedMultiplySignedResult( 5333 *this, LeftArg, LeftInfo, RightArg, RightInfo, ResultArg, ResultQTy, 5334 ResultInfo); 5335 5336 WidthAndSignedness EncompassingInfo = 5337 EncompassingIntegerType({LeftInfo, RightInfo, ResultInfo}); 5338 5339 llvm::Type *EncompassingLLVMTy = 5340 llvm::IntegerType::get(CGM.getLLVMContext(), EncompassingInfo.Width); 5341 5342 llvm::Type *ResultLLVMTy = CGM.getTypes().ConvertType(ResultQTy); 5343 5344 Intrinsic::ID IntrinsicId; 5345 switch (BuiltinID) { 5346 default: 5347 llvm_unreachable("Unknown overflow builtin id."); 5348 case Builtin::BI__builtin_add_overflow: 5349 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::sadd_with_overflow 5350 : Intrinsic::uadd_with_overflow; 5351 break; 5352 case Builtin::BI__builtin_sub_overflow: 5353 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::ssub_with_overflow 5354 : Intrinsic::usub_with_overflow; 5355 break; 5356 case Builtin::BI__builtin_mul_overflow: 5357 IntrinsicId = EncompassingInfo.Signed ? Intrinsic::smul_with_overflow 5358 : Intrinsic::umul_with_overflow; 5359 break; 5360 } 5361 5362 llvm::Value *Left = EmitScalarExpr(LeftArg); 5363 llvm::Value *Right = EmitScalarExpr(RightArg); 5364 Address ResultPtr = EmitPointerWithAlignment(ResultArg); 5365 5366 // Extend each operand to the encompassing type. 5367 Left = Builder.CreateIntCast(Left, EncompassingLLVMTy, LeftInfo.Signed); 5368 Right = Builder.CreateIntCast(Right, EncompassingLLVMTy, RightInfo.Signed); 5369 5370 // Perform the operation on the extended values. 5371 llvm::Value *Overflow, *Result; 5372 Result = EmitOverflowIntrinsic(*this, IntrinsicId, Left, Right, Overflow); 5373 5374 if (EncompassingInfo.Width > ResultInfo.Width) { 5375 // The encompassing type is wider than the result type, so we need to 5376 // truncate it. 5377 llvm::Value *ResultTrunc = Builder.CreateTrunc(Result, ResultLLVMTy); 5378 5379 // To see if the truncation caused an overflow, we will extend 5380 // the result and then compare it to the original result. 5381 llvm::Value *ResultTruncExt = Builder.CreateIntCast( 5382 ResultTrunc, EncompassingLLVMTy, ResultInfo.Signed); 5383 llvm::Value *TruncationOverflow = 5384 Builder.CreateICmpNE(Result, ResultTruncExt); 5385 5386 Overflow = Builder.CreateOr(Overflow, TruncationOverflow); 5387 Result = ResultTrunc; 5388 } 5389 5390 // Finally, store the result using the pointer. 5391 bool isVolatile = 5392 ResultArg->getType()->getPointeeType().isVolatileQualified(); 5393 Builder.CreateStore(EmitToMemory(Result, ResultQTy), ResultPtr, isVolatile); 5394 5395 return RValue::get(Overflow); 5396 } 5397 5398 case Builtin::BI__builtin_uadd_overflow: 5399 case Builtin::BI__builtin_uaddl_overflow: 5400 case Builtin::BI__builtin_uaddll_overflow: 5401 case Builtin::BI__builtin_usub_overflow: 5402 case Builtin::BI__builtin_usubl_overflow: 5403 case Builtin::BI__builtin_usubll_overflow: 5404 case Builtin::BI__builtin_umul_overflow: 5405 case Builtin::BI__builtin_umull_overflow: 5406 case Builtin::BI__builtin_umulll_overflow: 5407 case Builtin::BI__builtin_sadd_overflow: 5408 case Builtin::BI__builtin_saddl_overflow: 5409 case Builtin::BI__builtin_saddll_overflow: 5410 case Builtin::BI__builtin_ssub_overflow: 5411 case Builtin::BI__builtin_ssubl_overflow: 5412 case Builtin::BI__builtin_ssubll_overflow: 5413 case Builtin::BI__builtin_smul_overflow: 5414 case Builtin::BI__builtin_smull_overflow: 5415 case Builtin::BI__builtin_smulll_overflow: { 5416 5417 // We translate all of these builtins directly to the relevant llvm IR node. 5418 5419 // Scalarize our inputs. 5420 llvm::Value *X = EmitScalarExpr(E->getArg(0)); 5421 llvm::Value *Y = EmitScalarExpr(E->getArg(1)); 5422 Address SumOutPtr = EmitPointerWithAlignment(E->getArg(2)); 5423 5424 // Decide which of the overflow intrinsics we are lowering to: 5425 Intrinsic::ID IntrinsicId; 5426 switch (BuiltinID) { 5427 default: llvm_unreachable("Unknown overflow builtin id."); 5428 case Builtin::BI__builtin_uadd_overflow: 5429 case Builtin::BI__builtin_uaddl_overflow: 5430 case Builtin::BI__builtin_uaddll_overflow: 5431 IntrinsicId = Intrinsic::uadd_with_overflow; 5432 break; 5433 case Builtin::BI__builtin_usub_overflow: 5434 case Builtin::BI__builtin_usubl_overflow: 5435 case Builtin::BI__builtin_usubll_overflow: 5436 IntrinsicId = Intrinsic::usub_with_overflow; 5437 break; 5438 case Builtin::BI__builtin_umul_overflow: 5439 case Builtin::BI__builtin_umull_overflow: 5440 case Builtin::BI__builtin_umulll_overflow: 5441 IntrinsicId = Intrinsic::umul_with_overflow; 5442 break; 5443 case Builtin::BI__builtin_sadd_overflow: 5444 case Builtin::BI__builtin_saddl_overflow: 5445 case Builtin::BI__builtin_saddll_overflow: 5446 IntrinsicId = Intrinsic::sadd_with_overflow; 5447 break; 5448 case Builtin::BI__builtin_ssub_overflow: 5449 case Builtin::BI__builtin_ssubl_overflow: 5450 case Builtin::BI__builtin_ssubll_overflow: 5451 IntrinsicId = Intrinsic::ssub_with_overflow; 5452 break; 5453 case Builtin::BI__builtin_smul_overflow: 5454 case Builtin::BI__builtin_smull_overflow: 5455 case Builtin::BI__builtin_smulll_overflow: 5456 IntrinsicId = Intrinsic::smul_with_overflow; 5457 break; 5458 } 5459 5460 5461 llvm::Value *Carry; 5462 llvm::Value *Sum = EmitOverflowIntrinsic(*this, IntrinsicId, X, Y, Carry); 5463 Builder.CreateStore(Sum, SumOutPtr); 5464 5465 return RValue::get(Carry); 5466 } 5467 case Builtin::BIaddressof: 5468 case Builtin::BI__addressof: 5469 case Builtin::BI__builtin_addressof: 5470 return RValue::get(EmitLValue(E->getArg(0)).getPointer(*this)); 5471 case Builtin::BI__builtin_function_start: 5472 return RValue::get(CGM.GetFunctionStart( 5473 E->getArg(0)->getAsBuiltinConstantDeclRef(CGM.getContext()))); 5474 case Builtin::BI__builtin_operator_new: 5475 return EmitBuiltinNewDeleteCall( 5476 E->getCallee()->getType()->castAs<FunctionProtoType>(), E, false); 5477 case Builtin::BI__builtin_operator_delete: 5478 EmitBuiltinNewDeleteCall( 5479 E->getCallee()->getType()->castAs<FunctionProtoType>(), E, true); 5480 return RValue::get(nullptr); 5481 5482 case Builtin::BI__builtin_is_aligned: 5483 return EmitBuiltinIsAligned(E); 5484 case Builtin::BI__builtin_align_up: 5485 return EmitBuiltinAlignTo(E, true); 5486 case Builtin::BI__builtin_align_down: 5487 return EmitBuiltinAlignTo(E, false); 5488 5489 case Builtin::BI__noop: 5490 // __noop always evaluates to an integer literal zero. 5491 return RValue::get(ConstantInt::get(IntTy, 0)); 5492 case Builtin::BI__builtin_call_with_static_chain: { 5493 const CallExpr *Call = cast<CallExpr>(E->getArg(0)); 5494 const Expr *Chain = E->getArg(1); 5495 return EmitCall(Call->getCallee()->getType(), 5496 EmitCallee(Call->getCallee()), Call, ReturnValue, 5497 EmitScalarExpr(Chain)); 5498 } 5499 case Builtin::BI_InterlockedExchange8: 5500 case Builtin::BI_InterlockedExchange16: 5501 case Builtin::BI_InterlockedExchange: 5502 case Builtin::BI_InterlockedExchangePointer: 5503 return RValue::get( 5504 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E)); 5505 case Builtin::BI_InterlockedCompareExchangePointer: 5506 return RValue::get( 5507 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange, E)); 5508 case Builtin::BI_InterlockedCompareExchangePointer_nf: 5509 return RValue::get( 5510 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_nf, E)); 5511 case Builtin::BI_InterlockedCompareExchange8: 5512 case Builtin::BI_InterlockedCompareExchange16: 5513 case Builtin::BI_InterlockedCompareExchange: 5514 case Builtin::BI_InterlockedCompareExchange64: 5515 return RValue::get(EmitAtomicCmpXchgForMSIntrin(*this, E)); 5516 case Builtin::BI_InterlockedIncrement16: 5517 case Builtin::BI_InterlockedIncrement: 5518 return RValue::get( 5519 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E)); 5520 case Builtin::BI_InterlockedDecrement16: 5521 case Builtin::BI_InterlockedDecrement: 5522 return RValue::get( 5523 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E)); 5524 case Builtin::BI_InterlockedAnd8: 5525 case Builtin::BI_InterlockedAnd16: 5526 case Builtin::BI_InterlockedAnd: 5527 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E)); 5528 case Builtin::BI_InterlockedExchangeAdd8: 5529 case Builtin::BI_InterlockedExchangeAdd16: 5530 case Builtin::BI_InterlockedExchangeAdd: 5531 return RValue::get( 5532 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E)); 5533 case Builtin::BI_InterlockedExchangeSub8: 5534 case Builtin::BI_InterlockedExchangeSub16: 5535 case Builtin::BI_InterlockedExchangeSub: 5536 return RValue::get( 5537 EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E)); 5538 case Builtin::BI_InterlockedOr8: 5539 case Builtin::BI_InterlockedOr16: 5540 case Builtin::BI_InterlockedOr: 5541 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E)); 5542 case Builtin::BI_InterlockedXor8: 5543 case Builtin::BI_InterlockedXor16: 5544 case Builtin::BI_InterlockedXor: 5545 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E)); 5546 5547 case Builtin::BI_bittest64: 5548 case Builtin::BI_bittest: 5549 case Builtin::BI_bittestandcomplement64: 5550 case Builtin::BI_bittestandcomplement: 5551 case Builtin::BI_bittestandreset64: 5552 case Builtin::BI_bittestandreset: 5553 case Builtin::BI_bittestandset64: 5554 case Builtin::BI_bittestandset: 5555 case Builtin::BI_interlockedbittestandreset: 5556 case Builtin::BI_interlockedbittestandreset64: 5557 case Builtin::BI_interlockedbittestandreset64_acq: 5558 case Builtin::BI_interlockedbittestandreset64_rel: 5559 case Builtin::BI_interlockedbittestandreset64_nf: 5560 case Builtin::BI_interlockedbittestandset64: 5561 case Builtin::BI_interlockedbittestandset64_acq: 5562 case Builtin::BI_interlockedbittestandset64_rel: 5563 case Builtin::BI_interlockedbittestandset64_nf: 5564 case Builtin::BI_interlockedbittestandset: 5565 case Builtin::BI_interlockedbittestandset_acq: 5566 case Builtin::BI_interlockedbittestandset_rel: 5567 case Builtin::BI_interlockedbittestandset_nf: 5568 case Builtin::BI_interlockedbittestandreset_acq: 5569 case Builtin::BI_interlockedbittestandreset_rel: 5570 case Builtin::BI_interlockedbittestandreset_nf: 5571 return RValue::get(EmitBitTestIntrinsic(*this, BuiltinID, E)); 5572 5573 // These builtins exist to emit regular volatile loads and stores not 5574 // affected by the -fms-volatile setting. 5575 case Builtin::BI__iso_volatile_load8: 5576 case Builtin::BI__iso_volatile_load16: 5577 case Builtin::BI__iso_volatile_load32: 5578 case Builtin::BI__iso_volatile_load64: 5579 return RValue::get(EmitISOVolatileLoad(*this, E)); 5580 case Builtin::BI__iso_volatile_store8: 5581 case Builtin::BI__iso_volatile_store16: 5582 case Builtin::BI__iso_volatile_store32: 5583 case Builtin::BI__iso_volatile_store64: 5584 return RValue::get(EmitISOVolatileStore(*this, E)); 5585 5586 case Builtin::BI__builtin_ptrauth_sign_constant: 5587 return RValue::get(ConstantEmitter(*this).emitAbstract(E, E->getType())); 5588 5589 case Builtin::BI__builtin_ptrauth_auth: 5590 case Builtin::BI__builtin_ptrauth_auth_and_resign: 5591 case Builtin::BI__builtin_ptrauth_blend_discriminator: 5592 case Builtin::BI__builtin_ptrauth_sign_generic_data: 5593 case Builtin::BI__builtin_ptrauth_sign_unauthenticated: 5594 case Builtin::BI__builtin_ptrauth_strip: { 5595 // Emit the arguments. 5596 SmallVector<llvm::Value *, 5> Args; 5597 for (auto argExpr : E->arguments()) 5598 Args.push_back(EmitScalarExpr(argExpr)); 5599 5600 // Cast the value to intptr_t, saving its original type. 5601 llvm::Type *OrigValueType = Args[0]->getType(); 5602 if (OrigValueType->isPointerTy()) 5603 Args[0] = Builder.CreatePtrToInt(Args[0], IntPtrTy); 5604 5605 switch (BuiltinID) { 5606 case Builtin::BI__builtin_ptrauth_auth_and_resign: 5607 if (Args[4]->getType()->isPointerTy()) 5608 Args[4] = Builder.CreatePtrToInt(Args[4], IntPtrTy); 5609 [[fallthrough]]; 5610 5611 case Builtin::BI__builtin_ptrauth_auth: 5612 case Builtin::BI__builtin_ptrauth_sign_unauthenticated: 5613 if (Args[2]->getType()->isPointerTy()) 5614 Args[2] = Builder.CreatePtrToInt(Args[2], IntPtrTy); 5615 break; 5616 5617 case Builtin::BI__builtin_ptrauth_sign_generic_data: 5618 if (Args[1]->getType()->isPointerTy()) 5619 Args[1] = Builder.CreatePtrToInt(Args[1], IntPtrTy); 5620 break; 5621 5622 case Builtin::BI__builtin_ptrauth_blend_discriminator: 5623 case Builtin::BI__builtin_ptrauth_strip: 5624 break; 5625 } 5626 5627 // Call the intrinsic. 5628 auto IntrinsicID = [&]() -> unsigned { 5629 switch (BuiltinID) { 5630 case Builtin::BI__builtin_ptrauth_auth: 5631 return Intrinsic::ptrauth_auth; 5632 case Builtin::BI__builtin_ptrauth_auth_and_resign: 5633 return Intrinsic::ptrauth_resign; 5634 case Builtin::BI__builtin_ptrauth_blend_discriminator: 5635 return Intrinsic::ptrauth_blend; 5636 case Builtin::BI__builtin_ptrauth_sign_generic_data: 5637 return Intrinsic::ptrauth_sign_generic; 5638 case Builtin::BI__builtin_ptrauth_sign_unauthenticated: 5639 return Intrinsic::ptrauth_sign; 5640 case Builtin::BI__builtin_ptrauth_strip: 5641 return Intrinsic::ptrauth_strip; 5642 } 5643 llvm_unreachable("bad ptrauth intrinsic"); 5644 }(); 5645 auto Intrinsic = CGM.getIntrinsic(IntrinsicID); 5646 llvm::Value *Result = EmitRuntimeCall(Intrinsic, Args); 5647 5648 if (BuiltinID != Builtin::BI__builtin_ptrauth_sign_generic_data && 5649 BuiltinID != Builtin::BI__builtin_ptrauth_blend_discriminator && 5650 OrigValueType->isPointerTy()) { 5651 Result = Builder.CreateIntToPtr(Result, OrigValueType); 5652 } 5653 return RValue::get(Result); 5654 } 5655 5656 case Builtin::BI__builtin_get_vtable_pointer: { 5657 const Expr *Target = E->getArg(0); 5658 QualType TargetType = Target->getType(); 5659 const CXXRecordDecl *Decl = TargetType->getPointeeCXXRecordDecl(); 5660 assert(Decl); 5661 auto ThisAddress = EmitPointerWithAlignment(Target); 5662 assert(ThisAddress.isValid()); 5663 llvm::Value *VTablePointer = 5664 GetVTablePtr(ThisAddress, Int8PtrTy, Decl, VTableAuthMode::MustTrap); 5665 return RValue::get(VTablePointer); 5666 } 5667 5668 case Builtin::BI__exception_code: 5669 case Builtin::BI_exception_code: 5670 return RValue::get(EmitSEHExceptionCode()); 5671 case Builtin::BI__exception_info: 5672 case Builtin::BI_exception_info: 5673 return RValue::get(EmitSEHExceptionInfo()); 5674 case Builtin::BI__abnormal_termination: 5675 case Builtin::BI_abnormal_termination: 5676 return RValue::get(EmitSEHAbnormalTermination()); 5677 case Builtin::BI_setjmpex: 5678 if (getTarget().getTriple().isOSMSVCRT() && E->getNumArgs() == 1 && 5679 E->getArg(0)->getType()->isPointerType()) 5680 return EmitMSVCRTSetJmp(*this, MSVCSetJmpKind::_setjmpex, E); 5681 break; 5682 case Builtin::BI_setjmp: 5683 if (getTarget().getTriple().isOSMSVCRT() && E->getNumArgs() == 1 && 5684 E->getArg(0)->getType()->isPointerType()) { 5685 if (getTarget().getTriple().getArch() == llvm::Triple::x86) 5686 return EmitMSVCRTSetJmp(*this, MSVCSetJmpKind::_setjmp3, E); 5687 else if (getTarget().getTriple().getArch() == llvm::Triple::aarch64) 5688 return EmitMSVCRTSetJmp(*this, MSVCSetJmpKind::_setjmpex, E); 5689 return EmitMSVCRTSetJmp(*this, MSVCSetJmpKind::_setjmp, E); 5690 } 5691 break; 5692 5693 // C++ std:: builtins. 5694 case Builtin::BImove: 5695 case Builtin::BImove_if_noexcept: 5696 case Builtin::BIforward: 5697 case Builtin::BIforward_like: 5698 case Builtin::BIas_const: 5699 return RValue::get(EmitLValue(E->getArg(0)).getPointer(*this)); 5700 case Builtin::BI__GetExceptionInfo: { 5701 if (llvm::GlobalVariable *GV = 5702 CGM.getCXXABI().getThrowInfo(FD->getParamDecl(0)->getType())) 5703 return RValue::get(GV); 5704 break; 5705 } 5706 5707 case Builtin::BI__fastfail: 5708 return RValue::get(EmitMSVCBuiltinExpr(MSVCIntrin::__fastfail, E)); 5709 5710 case Builtin::BI__builtin_coro_id: 5711 return EmitCoroutineIntrinsic(E, Intrinsic::coro_id); 5712 case Builtin::BI__builtin_coro_promise: 5713 return EmitCoroutineIntrinsic(E, Intrinsic::coro_promise); 5714 case Builtin::BI__builtin_coro_resume: 5715 EmitCoroutineIntrinsic(E, Intrinsic::coro_resume); 5716 return RValue::get(nullptr); 5717 case Builtin::BI__builtin_coro_frame: 5718 return EmitCoroutineIntrinsic(E, Intrinsic::coro_frame); 5719 case Builtin::BI__builtin_coro_noop: 5720 return EmitCoroutineIntrinsic(E, Intrinsic::coro_noop); 5721 case Builtin::BI__builtin_coro_free: 5722 return EmitCoroutineIntrinsic(E, Intrinsic::coro_free); 5723 case Builtin::BI__builtin_coro_destroy: 5724 EmitCoroutineIntrinsic(E, Intrinsic::coro_destroy); 5725 return RValue::get(nullptr); 5726 case Builtin::BI__builtin_coro_done: 5727 return EmitCoroutineIntrinsic(E, Intrinsic::coro_done); 5728 case Builtin::BI__builtin_coro_alloc: 5729 return EmitCoroutineIntrinsic(E, Intrinsic::coro_alloc); 5730 case Builtin::BI__builtin_coro_begin: 5731 return EmitCoroutineIntrinsic(E, Intrinsic::coro_begin); 5732 case Builtin::BI__builtin_coro_end: 5733 return EmitCoroutineIntrinsic(E, Intrinsic::coro_end); 5734 case Builtin::BI__builtin_coro_suspend: 5735 return EmitCoroutineIntrinsic(E, Intrinsic::coro_suspend); 5736 case Builtin::BI__builtin_coro_size: 5737 return EmitCoroutineIntrinsic(E, Intrinsic::coro_size); 5738 case Builtin::BI__builtin_coro_align: 5739 return EmitCoroutineIntrinsic(E, Intrinsic::coro_align); 5740 5741 // OpenCL v2.0 s6.13.16.2, Built-in pipe read and write functions 5742 case Builtin::BIread_pipe: 5743 case Builtin::BIwrite_pipe: { 5744 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 5745 *Arg1 = EmitScalarExpr(E->getArg(1)); 5746 CGOpenCLRuntime OpenCLRT(CGM); 5747 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 5748 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 5749 5750 // Type of the generic packet parameter. 5751 unsigned GenericAS = 5752 getContext().getTargetAddressSpace(LangAS::opencl_generic); 5753 llvm::Type *I8PTy = llvm::PointerType::get(getLLVMContext(), GenericAS); 5754 5755 // Testing which overloaded version we should generate the call for. 5756 if (2U == E->getNumArgs()) { 5757 const char *Name = (BuiltinID == Builtin::BIread_pipe) ? "__read_pipe_2" 5758 : "__write_pipe_2"; 5759 // Creating a generic function type to be able to call with any builtin or 5760 // user defined type. 5761 llvm::Type *ArgTys[] = {Arg0->getType(), I8PTy, Int32Ty, Int32Ty}; 5762 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 5763 Value *ACast = Builder.CreateAddrSpaceCast(Arg1, I8PTy); 5764 return RValue::get( 5765 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5766 {Arg0, ACast, PacketSize, PacketAlign})); 5767 } else { 5768 assert(4 == E->getNumArgs() && 5769 "Illegal number of parameters to pipe function"); 5770 const char *Name = (BuiltinID == Builtin::BIread_pipe) ? "__read_pipe_4" 5771 : "__write_pipe_4"; 5772 5773 llvm::Type *ArgTys[] = {Arg0->getType(), Arg1->getType(), Int32Ty, I8PTy, 5774 Int32Ty, Int32Ty}; 5775 Value *Arg2 = EmitScalarExpr(E->getArg(2)), 5776 *Arg3 = EmitScalarExpr(E->getArg(3)); 5777 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 5778 Value *ACast = Builder.CreateAddrSpaceCast(Arg3, I8PTy); 5779 // We know the third argument is an integer type, but we may need to cast 5780 // it to i32. 5781 if (Arg2->getType() != Int32Ty) 5782 Arg2 = Builder.CreateZExtOrTrunc(Arg2, Int32Ty); 5783 return RValue::get( 5784 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5785 {Arg0, Arg1, Arg2, ACast, PacketSize, PacketAlign})); 5786 } 5787 } 5788 // OpenCL v2.0 s6.13.16 ,s9.17.3.5 - Built-in pipe reserve read and write 5789 // functions 5790 case Builtin::BIreserve_read_pipe: 5791 case Builtin::BIreserve_write_pipe: 5792 case Builtin::BIwork_group_reserve_read_pipe: 5793 case Builtin::BIwork_group_reserve_write_pipe: 5794 case Builtin::BIsub_group_reserve_read_pipe: 5795 case Builtin::BIsub_group_reserve_write_pipe: { 5796 // Composing the mangled name for the function. 5797 const char *Name; 5798 if (BuiltinID == Builtin::BIreserve_read_pipe) 5799 Name = "__reserve_read_pipe"; 5800 else if (BuiltinID == Builtin::BIreserve_write_pipe) 5801 Name = "__reserve_write_pipe"; 5802 else if (BuiltinID == Builtin::BIwork_group_reserve_read_pipe) 5803 Name = "__work_group_reserve_read_pipe"; 5804 else if (BuiltinID == Builtin::BIwork_group_reserve_write_pipe) 5805 Name = "__work_group_reserve_write_pipe"; 5806 else if (BuiltinID == Builtin::BIsub_group_reserve_read_pipe) 5807 Name = "__sub_group_reserve_read_pipe"; 5808 else 5809 Name = "__sub_group_reserve_write_pipe"; 5810 5811 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 5812 *Arg1 = EmitScalarExpr(E->getArg(1)); 5813 llvm::Type *ReservedIDTy = ConvertType(getContext().OCLReserveIDTy); 5814 CGOpenCLRuntime OpenCLRT(CGM); 5815 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 5816 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 5817 5818 // Building the generic function prototype. 5819 llvm::Type *ArgTys[] = {Arg0->getType(), Int32Ty, Int32Ty, Int32Ty}; 5820 llvm::FunctionType *FTy = 5821 llvm::FunctionType::get(ReservedIDTy, ArgTys, false); 5822 // We know the second argument is an integer type, but we may need to cast 5823 // it to i32. 5824 if (Arg1->getType() != Int32Ty) 5825 Arg1 = Builder.CreateZExtOrTrunc(Arg1, Int32Ty); 5826 return RValue::get(EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5827 {Arg0, Arg1, PacketSize, PacketAlign})); 5828 } 5829 // OpenCL v2.0 s6.13.16, s9.17.3.5 - Built-in pipe commit read and write 5830 // functions 5831 case Builtin::BIcommit_read_pipe: 5832 case Builtin::BIcommit_write_pipe: 5833 case Builtin::BIwork_group_commit_read_pipe: 5834 case Builtin::BIwork_group_commit_write_pipe: 5835 case Builtin::BIsub_group_commit_read_pipe: 5836 case Builtin::BIsub_group_commit_write_pipe: { 5837 const char *Name; 5838 if (BuiltinID == Builtin::BIcommit_read_pipe) 5839 Name = "__commit_read_pipe"; 5840 else if (BuiltinID == Builtin::BIcommit_write_pipe) 5841 Name = "__commit_write_pipe"; 5842 else if (BuiltinID == Builtin::BIwork_group_commit_read_pipe) 5843 Name = "__work_group_commit_read_pipe"; 5844 else if (BuiltinID == Builtin::BIwork_group_commit_write_pipe) 5845 Name = "__work_group_commit_write_pipe"; 5846 else if (BuiltinID == Builtin::BIsub_group_commit_read_pipe) 5847 Name = "__sub_group_commit_read_pipe"; 5848 else 5849 Name = "__sub_group_commit_write_pipe"; 5850 5851 Value *Arg0 = EmitScalarExpr(E->getArg(0)), 5852 *Arg1 = EmitScalarExpr(E->getArg(1)); 5853 CGOpenCLRuntime OpenCLRT(CGM); 5854 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 5855 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 5856 5857 // Building the generic function prototype. 5858 llvm::Type *ArgTys[] = {Arg0->getType(), Arg1->getType(), Int32Ty, Int32Ty}; 5859 llvm::FunctionType *FTy = llvm::FunctionType::get( 5860 llvm::Type::getVoidTy(getLLVMContext()), ArgTys, false); 5861 5862 return RValue::get(EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5863 {Arg0, Arg1, PacketSize, PacketAlign})); 5864 } 5865 // OpenCL v2.0 s6.13.16.4 Built-in pipe query functions 5866 case Builtin::BIget_pipe_num_packets: 5867 case Builtin::BIget_pipe_max_packets: { 5868 const char *BaseName; 5869 const auto *PipeTy = E->getArg(0)->getType()->castAs<PipeType>(); 5870 if (BuiltinID == Builtin::BIget_pipe_num_packets) 5871 BaseName = "__get_pipe_num_packets"; 5872 else 5873 BaseName = "__get_pipe_max_packets"; 5874 std::string Name = std::string(BaseName) + 5875 std::string(PipeTy->isReadOnly() ? "_ro" : "_wo"); 5876 5877 // Building the generic function prototype. 5878 Value *Arg0 = EmitScalarExpr(E->getArg(0)); 5879 CGOpenCLRuntime OpenCLRT(CGM); 5880 Value *PacketSize = OpenCLRT.getPipeElemSize(E->getArg(0)); 5881 Value *PacketAlign = OpenCLRT.getPipeElemAlign(E->getArg(0)); 5882 llvm::Type *ArgTys[] = {Arg0->getType(), Int32Ty, Int32Ty}; 5883 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 5884 5885 return RValue::get(EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5886 {Arg0, PacketSize, PacketAlign})); 5887 } 5888 5889 // OpenCL v2.0 s6.13.9 - Address space qualifier functions. 5890 case Builtin::BIto_global: 5891 case Builtin::BIto_local: 5892 case Builtin::BIto_private: { 5893 auto Arg0 = EmitScalarExpr(E->getArg(0)); 5894 auto NewArgT = llvm::PointerType::get( 5895 getLLVMContext(), 5896 CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); 5897 auto NewRetT = llvm::PointerType::get( 5898 getLLVMContext(), 5899 CGM.getContext().getTargetAddressSpace( 5900 E->getType()->getPointeeType().getAddressSpace())); 5901 auto FTy = llvm::FunctionType::get(NewRetT, {NewArgT}, false); 5902 llvm::Value *NewArg; 5903 if (Arg0->getType()->getPointerAddressSpace() != 5904 NewArgT->getPointerAddressSpace()) 5905 NewArg = Builder.CreateAddrSpaceCast(Arg0, NewArgT); 5906 else 5907 NewArg = Builder.CreateBitOrPointerCast(Arg0, NewArgT); 5908 auto NewName = std::string("__") + E->getDirectCallee()->getName().str(); 5909 auto NewCall = 5910 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, NewName), {NewArg}); 5911 return RValue::get(Builder.CreateBitOrPointerCast(NewCall, 5912 ConvertType(E->getType()))); 5913 } 5914 5915 // OpenCL v2.0, s6.13.17 - Enqueue kernel function. 5916 // Table 6.13.17.1 specifies four overload forms of enqueue_kernel. 5917 // The code below expands the builtin call to a call to one of the following 5918 // functions that an OpenCL runtime library will have to provide: 5919 // __enqueue_kernel_basic 5920 // __enqueue_kernel_varargs 5921 // __enqueue_kernel_basic_events 5922 // __enqueue_kernel_events_varargs 5923 case Builtin::BIenqueue_kernel: { 5924 StringRef Name; // Generated function call name 5925 unsigned NumArgs = E->getNumArgs(); 5926 5927 llvm::Type *QueueTy = ConvertType(getContext().OCLQueueTy); 5928 llvm::Type *GenericVoidPtrTy = Builder.getPtrTy( 5929 getContext().getTargetAddressSpace(LangAS::opencl_generic)); 5930 5931 llvm::Value *Queue = EmitScalarExpr(E->getArg(0)); 5932 llvm::Value *Flags = EmitScalarExpr(E->getArg(1)); 5933 LValue NDRangeL = EmitAggExprToLValue(E->getArg(2)); 5934 llvm::Value *Range = NDRangeL.getAddress().emitRawPointer(*this); 5935 5936 // FIXME: Look through the addrspacecast which may exist to the stack 5937 // temporary as a hack. 5938 // 5939 // This is hardcoding the assumed ABI of the target function. This assumes 5940 // direct passing for every argument except NDRange, which is assumed to be 5941 // byval or byref indirect passed. 5942 // 5943 // This should be fixed to query a signature from CGOpenCLRuntime, and go 5944 // through EmitCallArgs to get the correct target ABI. 5945 Range = Range->stripPointerCasts(); 5946 5947 llvm::Type *RangePtrTy = Range->getType(); 5948 5949 if (NumArgs == 4) { 5950 // The most basic form of the call with parameters: 5951 // queue_t, kernel_enqueue_flags_t, ndrange_t, block(void) 5952 Name = "__enqueue_kernel_basic"; 5953 llvm::Type *ArgTys[] = {QueueTy, Int32Ty, RangePtrTy, GenericVoidPtrTy, 5954 GenericVoidPtrTy}; 5955 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 5956 5957 auto Info = 5958 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(3)); 5959 llvm::Value *Kernel = 5960 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 5961 llvm::Value *Block = 5962 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 5963 5964 auto RTCall = EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), 5965 {Queue, Flags, Range, Kernel, Block}); 5966 return RValue::get(RTCall); 5967 } 5968 assert(NumArgs >= 5 && "Invalid enqueue_kernel signature"); 5969 5970 // Create a temporary array to hold the sizes of local pointer arguments 5971 // for the block. \p First is the position of the first size argument. 5972 auto CreateArrayForSizeVar = [=](unsigned First) 5973 -> std::tuple<llvm::Value *, llvm::Value *, llvm::Value *> { 5974 llvm::APInt ArraySize(32, NumArgs - First); 5975 QualType SizeArrayTy = getContext().getConstantArrayType( 5976 getContext().getSizeType(), ArraySize, nullptr, 5977 ArraySizeModifier::Normal, 5978 /*IndexTypeQuals=*/0); 5979 auto Tmp = CreateMemTemp(SizeArrayTy, "block_sizes"); 5980 llvm::Value *TmpPtr = Tmp.getPointer(); 5981 // The EmitLifetime* pair expect a naked Alloca as their last argument, 5982 // however for cases where the default AS is not the Alloca AS, Tmp is 5983 // actually the Alloca ascasted to the default AS, hence the 5984 // stripPointerCasts() 5985 llvm::Value *Alloca = TmpPtr->stripPointerCasts(); 5986 llvm::Value *TmpSize = EmitLifetimeStart( 5987 CGM.getDataLayout().getTypeAllocSize(Tmp.getElementType()), Alloca); 5988 llvm::Value *ElemPtr; 5989 // Each of the following arguments specifies the size of the corresponding 5990 // argument passed to the enqueued block. 5991 auto *Zero = llvm::ConstantInt::get(IntTy, 0); 5992 for (unsigned I = First; I < NumArgs; ++I) { 5993 auto *Index = llvm::ConstantInt::get(IntTy, I - First); 5994 auto *GEP = 5995 Builder.CreateGEP(Tmp.getElementType(), Alloca, {Zero, Index}); 5996 if (I == First) 5997 ElemPtr = GEP; 5998 auto *V = 5999 Builder.CreateZExtOrTrunc(EmitScalarExpr(E->getArg(I)), SizeTy); 6000 Builder.CreateAlignedStore( 6001 V, GEP, CGM.getDataLayout().getPrefTypeAlign(SizeTy)); 6002 } 6003 // Return the Alloca itself rather than a potential ascast as this is only 6004 // used by the paired EmitLifetimeEnd. 6005 return {ElemPtr, TmpSize, Alloca}; 6006 }; 6007 6008 // Could have events and/or varargs. 6009 if (E->getArg(3)->getType()->isBlockPointerType()) { 6010 // No events passed, but has variadic arguments. 6011 Name = "__enqueue_kernel_varargs"; 6012 auto Info = 6013 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(3)); 6014 llvm::Value *Kernel = 6015 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 6016 auto *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 6017 auto [ElemPtr, TmpSize, TmpPtr] = CreateArrayForSizeVar(4); 6018 6019 // Create a vector of the arguments, as well as a constant value to 6020 // express to the runtime the number of variadic arguments. 6021 llvm::Value *const Args[] = {Queue, Flags, 6022 Range, Kernel, 6023 Block, ConstantInt::get(IntTy, NumArgs - 4), 6024 ElemPtr}; 6025 llvm::Type *const ArgTys[] = { 6026 QueueTy, IntTy, RangePtrTy, GenericVoidPtrTy, 6027 GenericVoidPtrTy, IntTy, ElemPtr->getType()}; 6028 6029 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 6030 auto Call = RValue::get( 6031 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Args)); 6032 if (TmpSize) 6033 EmitLifetimeEnd(TmpSize, TmpPtr); 6034 return Call; 6035 } 6036 // Any calls now have event arguments passed. 6037 if (NumArgs >= 7) { 6038 llvm::PointerType *PtrTy = llvm::PointerType::get( 6039 CGM.getLLVMContext(), 6040 CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); 6041 6042 llvm::Value *NumEvents = 6043 Builder.CreateZExtOrTrunc(EmitScalarExpr(E->getArg(3)), Int32Ty); 6044 6045 // Since SemaOpenCLBuiltinEnqueueKernel allows fifth and sixth arguments 6046 // to be a null pointer constant (including `0` literal), we can take it 6047 // into account and emit null pointer directly. 6048 llvm::Value *EventWaitList = nullptr; 6049 if (E->getArg(4)->isNullPointerConstant( 6050 getContext(), Expr::NPC_ValueDependentIsNotNull)) { 6051 EventWaitList = llvm::ConstantPointerNull::get(PtrTy); 6052 } else { 6053 EventWaitList = 6054 E->getArg(4)->getType()->isArrayType() 6055 ? EmitArrayToPointerDecay(E->getArg(4)).emitRawPointer(*this) 6056 : EmitScalarExpr(E->getArg(4)); 6057 // Convert to generic address space. 6058 EventWaitList = Builder.CreatePointerCast(EventWaitList, PtrTy); 6059 } 6060 llvm::Value *EventRet = nullptr; 6061 if (E->getArg(5)->isNullPointerConstant( 6062 getContext(), Expr::NPC_ValueDependentIsNotNull)) { 6063 EventRet = llvm::ConstantPointerNull::get(PtrTy); 6064 } else { 6065 EventRet = 6066 Builder.CreatePointerCast(EmitScalarExpr(E->getArg(5)), PtrTy); 6067 } 6068 6069 auto Info = 6070 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(6)); 6071 llvm::Value *Kernel = 6072 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 6073 llvm::Value *Block = 6074 Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 6075 6076 std::vector<llvm::Type *> ArgTys = { 6077 QueueTy, Int32Ty, RangePtrTy, Int32Ty, 6078 PtrTy, PtrTy, GenericVoidPtrTy, GenericVoidPtrTy}; 6079 6080 std::vector<llvm::Value *> Args = {Queue, Flags, Range, 6081 NumEvents, EventWaitList, EventRet, 6082 Kernel, Block}; 6083 6084 if (NumArgs == 7) { 6085 // Has events but no variadics. 6086 Name = "__enqueue_kernel_basic_events"; 6087 llvm::FunctionType *FTy = 6088 llvm::FunctionType::get(Int32Ty, ArgTys, false); 6089 return RValue::get( 6090 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Args)); 6091 } 6092 // Has event info and variadics 6093 // Pass the number of variadics to the runtime function too. 6094 Args.push_back(ConstantInt::get(Int32Ty, NumArgs - 7)); 6095 ArgTys.push_back(Int32Ty); 6096 Name = "__enqueue_kernel_events_varargs"; 6097 6098 auto [ElemPtr, TmpSize, TmpPtr] = CreateArrayForSizeVar(7); 6099 Args.push_back(ElemPtr); 6100 ArgTys.push_back(ElemPtr->getType()); 6101 6102 llvm::FunctionType *FTy = llvm::FunctionType::get(Int32Ty, ArgTys, false); 6103 auto Call = RValue::get( 6104 EmitRuntimeCall(CGM.CreateRuntimeFunction(FTy, Name), Args)); 6105 if (TmpSize) 6106 EmitLifetimeEnd(TmpSize, TmpPtr); 6107 return Call; 6108 } 6109 llvm_unreachable("Unexpected enqueue_kernel signature"); 6110 } 6111 // OpenCL v2.0 s6.13.17.6 - Kernel query functions need bitcast of block 6112 // parameter. 6113 case Builtin::BIget_kernel_work_group_size: { 6114 llvm::Type *GenericVoidPtrTy = Builder.getPtrTy( 6115 getContext().getTargetAddressSpace(LangAS::opencl_generic)); 6116 auto Info = 6117 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(0)); 6118 Value *Kernel = 6119 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 6120 Value *Arg = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 6121 return RValue::get(EmitRuntimeCall( 6122 CGM.CreateRuntimeFunction( 6123 llvm::FunctionType::get(IntTy, {GenericVoidPtrTy, GenericVoidPtrTy}, 6124 false), 6125 "__get_kernel_work_group_size_impl"), 6126 {Kernel, Arg})); 6127 } 6128 case Builtin::BIget_kernel_preferred_work_group_size_multiple: { 6129 llvm::Type *GenericVoidPtrTy = Builder.getPtrTy( 6130 getContext().getTargetAddressSpace(LangAS::opencl_generic)); 6131 auto Info = 6132 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(0)); 6133 Value *Kernel = 6134 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 6135 Value *Arg = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 6136 return RValue::get(EmitRuntimeCall( 6137 CGM.CreateRuntimeFunction( 6138 llvm::FunctionType::get(IntTy, {GenericVoidPtrTy, GenericVoidPtrTy}, 6139 false), 6140 "__get_kernel_preferred_work_group_size_multiple_impl"), 6141 {Kernel, Arg})); 6142 } 6143 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange: 6144 case Builtin::BIget_kernel_sub_group_count_for_ndrange: { 6145 llvm::Type *GenericVoidPtrTy = Builder.getPtrTy( 6146 getContext().getTargetAddressSpace(LangAS::opencl_generic)); 6147 LValue NDRangeL = EmitAggExprToLValue(E->getArg(0)); 6148 llvm::Value *NDRange = NDRangeL.getAddress().emitRawPointer(*this); 6149 auto Info = 6150 CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(1)); 6151 Value *Kernel = 6152 Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); 6153 Value *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); 6154 const char *Name = 6155 BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange 6156 ? "__get_kernel_max_sub_group_size_for_ndrange_impl" 6157 : "__get_kernel_sub_group_count_for_ndrange_impl"; 6158 return RValue::get(EmitRuntimeCall( 6159 CGM.CreateRuntimeFunction( 6160 llvm::FunctionType::get( 6161 IntTy, {NDRange->getType(), GenericVoidPtrTy, GenericVoidPtrTy}, 6162 false), 6163 Name), 6164 {NDRange, Kernel, Block})); 6165 } 6166 case Builtin::BI__builtin_store_half: 6167 case Builtin::BI__builtin_store_halff: { 6168 Value *Val = EmitScalarExpr(E->getArg(0)); 6169 Address Address = EmitPointerWithAlignment(E->getArg(1)); 6170 Value *HalfVal = Builder.CreateFPTrunc(Val, Builder.getHalfTy()); 6171 Builder.CreateStore(HalfVal, Address); 6172 return RValue::get(nullptr); 6173 } 6174 case Builtin::BI__builtin_load_half: { 6175 Address Address = EmitPointerWithAlignment(E->getArg(0)); 6176 Value *HalfVal = Builder.CreateLoad(Address); 6177 return RValue::get(Builder.CreateFPExt(HalfVal, Builder.getDoubleTy())); 6178 } 6179 case Builtin::BI__builtin_load_halff: { 6180 Address Address = EmitPointerWithAlignment(E->getArg(0)); 6181 Value *HalfVal = Builder.CreateLoad(Address); 6182 return RValue::get(Builder.CreateFPExt(HalfVal, Builder.getFloatTy())); 6183 } 6184 case Builtin::BI__builtin_printf: 6185 case Builtin::BIprintf: 6186 if (getTarget().getTriple().isNVPTX() || 6187 getTarget().getTriple().isAMDGCN() || 6188 (getTarget().getTriple().isSPIRV() && 6189 getTarget().getTriple().getVendor() == Triple::VendorType::AMD)) { 6190 if (getTarget().getTriple().isNVPTX()) 6191 return EmitNVPTXDevicePrintfCallExpr(E); 6192 if ((getTarget().getTriple().isAMDGCN() || 6193 getTarget().getTriple().isSPIRV()) && 6194 getLangOpts().HIP) 6195 return EmitAMDGPUDevicePrintfCallExpr(E); 6196 } 6197 6198 break; 6199 case Builtin::BI__builtin_canonicalize: 6200 case Builtin::BI__builtin_canonicalizef: 6201 case Builtin::BI__builtin_canonicalizef16: 6202 case Builtin::BI__builtin_canonicalizel: 6203 return RValue::get( 6204 emitBuiltinWithOneOverloadedType<1>(*this, E, Intrinsic::canonicalize)); 6205 6206 case Builtin::BI__builtin_thread_pointer: { 6207 if (!getContext().getTargetInfo().isTLSSupported()) 6208 CGM.ErrorUnsupported(E, "__builtin_thread_pointer"); 6209 6210 return RValue::get(Builder.CreateIntrinsic(llvm::Intrinsic::thread_pointer, 6211 {GlobalsInt8PtrTy}, {})); 6212 } 6213 case Builtin::BI__builtin_os_log_format: 6214 return emitBuiltinOSLogFormat(*E); 6215 6216 case Builtin::BI__xray_customevent: { 6217 if (!ShouldXRayInstrumentFunction()) 6218 return RValue::getIgnored(); 6219 6220 if (!CGM.getCodeGenOpts().XRayInstrumentationBundle.has( 6221 XRayInstrKind::Custom)) 6222 return RValue::getIgnored(); 6223 6224 if (const auto *XRayAttr = CurFuncDecl->getAttr<XRayInstrumentAttr>()) 6225 if (XRayAttr->neverXRayInstrument() && !AlwaysEmitXRayCustomEvents()) 6226 return RValue::getIgnored(); 6227 6228 Function *F = CGM.getIntrinsic(Intrinsic::xray_customevent); 6229 auto FTy = F->getFunctionType(); 6230 auto Arg0 = E->getArg(0); 6231 auto Arg0Val = EmitScalarExpr(Arg0); 6232 auto Arg0Ty = Arg0->getType(); 6233 auto PTy0 = FTy->getParamType(0); 6234 if (PTy0 != Arg0Val->getType()) { 6235 if (Arg0Ty->isArrayType()) 6236 Arg0Val = EmitArrayToPointerDecay(Arg0).emitRawPointer(*this); 6237 else 6238 Arg0Val = Builder.CreatePointerCast(Arg0Val, PTy0); 6239 } 6240 auto Arg1 = EmitScalarExpr(E->getArg(1)); 6241 auto PTy1 = FTy->getParamType(1); 6242 if (PTy1 != Arg1->getType()) 6243 Arg1 = Builder.CreateTruncOrBitCast(Arg1, PTy1); 6244 return RValue::get(Builder.CreateCall(F, {Arg0Val, Arg1})); 6245 } 6246 6247 case Builtin::BI__xray_typedevent: { 6248 // TODO: There should be a way to always emit events even if the current 6249 // function is not instrumented. Losing events in a stream can cripple 6250 // a trace. 6251 if (!ShouldXRayInstrumentFunction()) 6252 return RValue::getIgnored(); 6253 6254 if (!CGM.getCodeGenOpts().XRayInstrumentationBundle.has( 6255 XRayInstrKind::Typed)) 6256 return RValue::getIgnored(); 6257 6258 if (const auto *XRayAttr = CurFuncDecl->getAttr<XRayInstrumentAttr>()) 6259 if (XRayAttr->neverXRayInstrument() && !AlwaysEmitXRayTypedEvents()) 6260 return RValue::getIgnored(); 6261 6262 Function *F = CGM.getIntrinsic(Intrinsic::xray_typedevent); 6263 auto FTy = F->getFunctionType(); 6264 auto Arg0 = EmitScalarExpr(E->getArg(0)); 6265 auto PTy0 = FTy->getParamType(0); 6266 if (PTy0 != Arg0->getType()) 6267 Arg0 = Builder.CreateTruncOrBitCast(Arg0, PTy0); 6268 auto Arg1 = E->getArg(1); 6269 auto Arg1Val = EmitScalarExpr(Arg1); 6270 auto Arg1Ty = Arg1->getType(); 6271 auto PTy1 = FTy->getParamType(1); 6272 if (PTy1 != Arg1Val->getType()) { 6273 if (Arg1Ty->isArrayType()) 6274 Arg1Val = EmitArrayToPointerDecay(Arg1).emitRawPointer(*this); 6275 else 6276 Arg1Val = Builder.CreatePointerCast(Arg1Val, PTy1); 6277 } 6278 auto Arg2 = EmitScalarExpr(E->getArg(2)); 6279 auto PTy2 = FTy->getParamType(2); 6280 if (PTy2 != Arg2->getType()) 6281 Arg2 = Builder.CreateTruncOrBitCast(Arg2, PTy2); 6282 return RValue::get(Builder.CreateCall(F, {Arg0, Arg1Val, Arg2})); 6283 } 6284 6285 case Builtin::BI__builtin_ms_va_start: 6286 case Builtin::BI__builtin_ms_va_end: 6287 return RValue::get( 6288 EmitVAStartEnd(EmitMSVAListRef(E->getArg(0)).emitRawPointer(*this), 6289 BuiltinID == Builtin::BI__builtin_ms_va_start)); 6290 6291 case Builtin::BI__builtin_ms_va_copy: { 6292 // Lower this manually. We can't reliably determine whether or not any 6293 // given va_copy() is for a Win64 va_list from the calling convention 6294 // alone, because it's legal to do this from a System V ABI function. 6295 // With opaque pointer types, we won't have enough information in LLVM 6296 // IR to determine this from the argument types, either. Best to do it 6297 // now, while we have enough information. 6298 Address DestAddr = EmitMSVAListRef(E->getArg(0)); 6299 Address SrcAddr = EmitMSVAListRef(E->getArg(1)); 6300 6301 DestAddr = DestAddr.withElementType(Int8PtrTy); 6302 SrcAddr = SrcAddr.withElementType(Int8PtrTy); 6303 6304 Value *ArgPtr = Builder.CreateLoad(SrcAddr, "ap.val"); 6305 return RValue::get(Builder.CreateStore(ArgPtr, DestAddr)); 6306 } 6307 6308 case Builtin::BI__builtin_get_device_side_mangled_name: { 6309 auto Name = CGM.getCUDARuntime().getDeviceSideName( 6310 cast<DeclRefExpr>(E->getArg(0)->IgnoreImpCasts())->getDecl()); 6311 auto Str = CGM.GetAddrOfConstantCString(Name, ""); 6312 return RValue::get(Str.getPointer()); 6313 } 6314 } 6315 6316 // If this is an alias for a lib function (e.g. __builtin_sin), emit 6317 // the call using the normal call path, but using the unmangled 6318 // version of the function name. 6319 const auto &BI = getContext().BuiltinInfo; 6320 if (!shouldEmitBuiltinAsIR(BuiltinID, BI, *this) && 6321 BI.isLibFunction(BuiltinID)) 6322 return emitLibraryCall(*this, FD, E, 6323 CGM.getBuiltinLibFunction(FD, BuiltinID)); 6324 6325 // If this is a predefined lib function (e.g. malloc), emit the call 6326 // using exactly the normal call path. 6327 if (BI.isPredefinedLibFunction(BuiltinID)) 6328 return emitLibraryCall(*this, FD, E, CGM.getRawFunctionPointer(FD)); 6329 6330 // Check that a call to a target specific builtin has the correct target 6331 // features. 6332 // This is down here to avoid non-target specific builtins, however, if 6333 // generic builtins start to require generic target features then we 6334 // can move this up to the beginning of the function. 6335 checkTargetFeatures(E, FD); 6336 6337 if (unsigned VectorWidth = getContext().BuiltinInfo.getRequiredVectorWidth(BuiltinID)) 6338 LargestVectorWidth = std::max(LargestVectorWidth, VectorWidth); 6339 6340 // See if we have a target specific intrinsic. 6341 std::string Name = getContext().BuiltinInfo.getName(BuiltinID); 6342 Intrinsic::ID IntrinsicID = Intrinsic::not_intrinsic; 6343 StringRef Prefix = 6344 llvm::Triple::getArchTypePrefix(getTarget().getTriple().getArch()); 6345 if (!Prefix.empty()) { 6346 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin(Prefix.data(), Name); 6347 if (IntrinsicID == Intrinsic::not_intrinsic && Prefix == "spv" && 6348 getTarget().getTriple().getOS() == llvm::Triple::OSType::AMDHSA) 6349 IntrinsicID = Intrinsic::getIntrinsicForClangBuiltin("amdgcn", Name); 6350 // NOTE we don't need to perform a compatibility flag check here since the 6351 // intrinsics are declared in Builtins*.def via LANGBUILTIN which filter the 6352 // MS builtins via ALL_MS_LANGUAGES and are filtered earlier. 6353 if (IntrinsicID == Intrinsic::not_intrinsic) 6354 IntrinsicID = Intrinsic::getIntrinsicForMSBuiltin(Prefix.data(), Name); 6355 } 6356 6357 if (IntrinsicID != Intrinsic::not_intrinsic) { 6358 SmallVector<Value*, 16> Args; 6359 6360 // Find out if any arguments are required to be integer constant 6361 // expressions. 6362 unsigned ICEArguments = 0; 6363 ASTContext::GetBuiltinTypeError Error; 6364 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments); 6365 assert(Error == ASTContext::GE_None && "Should not codegen an error"); 6366 6367 Function *F = CGM.getIntrinsic(IntrinsicID); 6368 llvm::FunctionType *FTy = F->getFunctionType(); 6369 6370 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 6371 Value *ArgValue = EmitScalarOrConstFoldImmArg(ICEArguments, i, E); 6372 // If the intrinsic arg type is different from the builtin arg type 6373 // we need to do a bit cast. 6374 llvm::Type *PTy = FTy->getParamType(i); 6375 if (PTy != ArgValue->getType()) { 6376 // XXX - vector of pointers? 6377 if (auto *PtrTy = dyn_cast<llvm::PointerType>(PTy)) { 6378 if (PtrTy->getAddressSpace() != 6379 ArgValue->getType()->getPointerAddressSpace()) { 6380 ArgValue = Builder.CreateAddrSpaceCast( 6381 ArgValue, llvm::PointerType::get(getLLVMContext(), 6382 PtrTy->getAddressSpace())); 6383 } 6384 } 6385 6386 // Cast vector type (e.g., v256i32) to x86_amx, this only happen 6387 // in amx intrinsics. 6388 if (PTy->isX86_AMXTy()) 6389 ArgValue = Builder.CreateIntrinsic(Intrinsic::x86_cast_vector_to_tile, 6390 {ArgValue->getType()}, {ArgValue}); 6391 else 6392 ArgValue = Builder.CreateBitCast(ArgValue, PTy); 6393 } 6394 6395 Args.push_back(ArgValue); 6396 } 6397 6398 Value *V = Builder.CreateCall(F, Args); 6399 QualType BuiltinRetType = E->getType(); 6400 6401 llvm::Type *RetTy = VoidTy; 6402 if (!BuiltinRetType->isVoidType()) 6403 RetTy = ConvertType(BuiltinRetType); 6404 6405 if (RetTy != V->getType()) { 6406 // XXX - vector of pointers? 6407 if (auto *PtrTy = dyn_cast<llvm::PointerType>(RetTy)) { 6408 if (PtrTy->getAddressSpace() != V->getType()->getPointerAddressSpace()) { 6409 V = Builder.CreateAddrSpaceCast( 6410 V, llvm::PointerType::get(getLLVMContext(), 6411 PtrTy->getAddressSpace())); 6412 } 6413 } 6414 6415 // Cast x86_amx to vector type (e.g., v256i32), this only happen 6416 // in amx intrinsics. 6417 if (V->getType()->isX86_AMXTy()) 6418 V = Builder.CreateIntrinsic(Intrinsic::x86_cast_tile_to_vector, {RetTy}, 6419 {V}); 6420 else 6421 V = Builder.CreateBitCast(V, RetTy); 6422 } 6423 6424 if (RetTy->isVoidTy()) 6425 return RValue::get(nullptr); 6426 6427 return RValue::get(V); 6428 } 6429 6430 // Some target-specific builtins can have aggregate return values, e.g. 6431 // __builtin_arm_mve_vld2q_u32. So if the result is an aggregate, force 6432 // ReturnValue to be non-null, so that the target-specific emission code can 6433 // always just emit into it. 6434 TypeEvaluationKind EvalKind = getEvaluationKind(E->getType()); 6435 if (EvalKind == TEK_Aggregate && ReturnValue.isNull()) { 6436 Address DestPtr = CreateMemTemp(E->getType(), "agg.tmp"); 6437 ReturnValue = ReturnValueSlot(DestPtr, false); 6438 } 6439 6440 // Now see if we can emit a target-specific builtin. 6441 if (Value *V = EmitTargetBuiltinExpr(BuiltinID, E, ReturnValue)) { 6442 switch (EvalKind) { 6443 case TEK_Scalar: 6444 if (V->getType()->isVoidTy()) 6445 return RValue::get(nullptr); 6446 return RValue::get(V); 6447 case TEK_Aggregate: 6448 return RValue::getAggregate(ReturnValue.getAddress(), 6449 ReturnValue.isVolatile()); 6450 case TEK_Complex: 6451 llvm_unreachable("No current target builtin returns complex"); 6452 } 6453 llvm_unreachable("Bad evaluation kind in EmitBuiltinExpr"); 6454 } 6455 6456 // EmitHLSLBuiltinExpr will check getLangOpts().HLSL 6457 if (Value *V = EmitHLSLBuiltinExpr(BuiltinID, E, ReturnValue)) { 6458 switch (EvalKind) { 6459 case TEK_Scalar: 6460 if (V->getType()->isVoidTy()) 6461 return RValue::get(nullptr); 6462 return RValue::get(V); 6463 case TEK_Aggregate: 6464 return RValue::getAggregate(ReturnValue.getAddress(), 6465 ReturnValue.isVolatile()); 6466 case TEK_Complex: 6467 llvm_unreachable("No current hlsl builtin returns complex"); 6468 } 6469 llvm_unreachable("Bad evaluation kind in EmitBuiltinExpr"); 6470 } 6471 6472 if (getLangOpts().HIPStdPar && getLangOpts().CUDAIsDevice) 6473 return EmitHipStdParUnsupportedBuiltin(this, FD); 6474 6475 ErrorUnsupported(E, "builtin function"); 6476 6477 // Unknown builtin, for now just dump it out and return undef. 6478 return GetUndefRValue(E->getType()); 6479 } 6480 6481 namespace { 6482 struct BuiltinAlignArgs { 6483 llvm::Value *Src = nullptr; 6484 llvm::Type *SrcType = nullptr; 6485 llvm::Value *Alignment = nullptr; 6486 llvm::Value *Mask = nullptr; 6487 llvm::IntegerType *IntType = nullptr; 6488 6489 BuiltinAlignArgs(const CallExpr *E, CodeGenFunction &CGF) { 6490 QualType AstType = E->getArg(0)->getType(); 6491 if (AstType->isArrayType()) 6492 Src = CGF.EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(CGF); 6493 else 6494 Src = CGF.EmitScalarExpr(E->getArg(0)); 6495 SrcType = Src->getType(); 6496 if (SrcType->isPointerTy()) { 6497 IntType = IntegerType::get( 6498 CGF.getLLVMContext(), 6499 CGF.CGM.getDataLayout().getIndexTypeSizeInBits(SrcType)); 6500 } else { 6501 assert(SrcType->isIntegerTy()); 6502 IntType = cast<llvm::IntegerType>(SrcType); 6503 } 6504 Alignment = CGF.EmitScalarExpr(E->getArg(1)); 6505 Alignment = CGF.Builder.CreateZExtOrTrunc(Alignment, IntType, "alignment"); 6506 auto *One = llvm::ConstantInt::get(IntType, 1); 6507 Mask = CGF.Builder.CreateSub(Alignment, One, "mask"); 6508 } 6509 }; 6510 } // namespace 6511 6512 /// Generate (x & (y-1)) == 0. 6513 RValue CodeGenFunction::EmitBuiltinIsAligned(const CallExpr *E) { 6514 BuiltinAlignArgs Args(E, *this); 6515 llvm::Value *SrcAddress = Args.Src; 6516 if (Args.SrcType->isPointerTy()) 6517 SrcAddress = 6518 Builder.CreateBitOrPointerCast(Args.Src, Args.IntType, "src_addr"); 6519 return RValue::get(Builder.CreateICmpEQ( 6520 Builder.CreateAnd(SrcAddress, Args.Mask, "set_bits"), 6521 llvm::Constant::getNullValue(Args.IntType), "is_aligned")); 6522 } 6523 6524 /// Generate (x & ~(y-1)) to align down or ((x+(y-1)) & ~(y-1)) to align up. 6525 /// Note: For pointer types we can avoid ptrtoint/inttoptr pairs by using the 6526 /// llvm.ptrmask intrinsic (with a GEP before in the align_up case). 6527 RValue CodeGenFunction::EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp) { 6528 BuiltinAlignArgs Args(E, *this); 6529 llvm::Value *SrcForMask = Args.Src; 6530 if (AlignUp) { 6531 // When aligning up we have to first add the mask to ensure we go over the 6532 // next alignment value and then align down to the next valid multiple. 6533 // By adding the mask, we ensure that align_up on an already aligned 6534 // value will not change the value. 6535 if (Args.Src->getType()->isPointerTy()) { 6536 if (getLangOpts().PointerOverflowDefined) 6537 SrcForMask = 6538 Builder.CreateGEP(Int8Ty, SrcForMask, Args.Mask, "over_boundary"); 6539 else 6540 SrcForMask = EmitCheckedInBoundsGEP(Int8Ty, SrcForMask, Args.Mask, 6541 /*SignedIndices=*/true, 6542 /*isSubtraction=*/false, 6543 E->getExprLoc(), "over_boundary"); 6544 } else { 6545 SrcForMask = Builder.CreateAdd(SrcForMask, Args.Mask, "over_boundary"); 6546 } 6547 } 6548 // Invert the mask to only clear the lower bits. 6549 llvm::Value *InvertedMask = Builder.CreateNot(Args.Mask, "inverted_mask"); 6550 llvm::Value *Result = nullptr; 6551 if (Args.Src->getType()->isPointerTy()) { 6552 Result = Builder.CreateIntrinsic( 6553 Intrinsic::ptrmask, {Args.SrcType, Args.IntType}, 6554 {SrcForMask, InvertedMask}, nullptr, "aligned_result"); 6555 } else { 6556 Result = Builder.CreateAnd(SrcForMask, InvertedMask, "aligned_result"); 6557 } 6558 assert(Result->getType() == Args.SrcType); 6559 return RValue::get(Result); 6560 } 6561