LLVM: lib/IR/RuntimeLibcalls.cpp Source File (original) (raw)

34

35

36

37

39 ExceptionModel = TT.getDefaultExceptionHandling();

40

41 initLibcalls(TT, ExceptionModel, FloatABI, EABIVersion, ABIName);

42

43

44 switch (VecLib) {

46 for (RTLIB::LibcallImpl Impl :

47 {RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,

48 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,

49 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,

50 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,

51 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,

52 RTLIB::impl__ZGVsNxvl4l4_sincospif,

53 RTLIB::impl__ZGVsNxvl8l8_sincospi})

55 break;

57 for (RTLIB::LibcallImpl Impl :

58 {RTLIB::impl_armpl_vmodfq_f64, RTLIB::impl_armpl_vmodfq_f32,

59 RTLIB::impl_armpl_svmodf_f64_x, RTLIB::impl_armpl_svmodf_f32_x,

60 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,

61 RTLIB::impl_armpl_svsincos_f64_x, RTLIB::impl_armpl_svsincos_f32_x,

62 RTLIB::impl_armpl_vsincospiq_f32, RTLIB::impl_armpl_vsincospiq_f64,

63 RTLIB::impl_armpl_svsincospi_f32_x,

64 RTLIB::impl_armpl_svsincospi_f64_x})

66

67 for (RTLIB::LibcallImpl Impl :

68 {RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32})

70

71 break;

72 default:

73 break;

74 }

75}

137 return DL.getIndexType(Ctx, 0);

138}

143 RTLIB::LibcallImpl LibcallImpl) const {

144

146 Attribute::MustProgress, Attribute::NoCallback, Attribute::NoFree,

147 Attribute::NoSync, Attribute::NoUnwind, Attribute::WillReturn};

149 Attribute::MustProgress, Attribute::NoUnwind, Attribute::WillReturn};

151 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};

152

153 switch (LibcallImpl) {

154 case RTLIB::impl___sincos_stret:

155 case RTLIB::impl___sincosf_stret: {

156 if (!darwinHasSinCosStret(TT))

157 return {};

158

159 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret

162

163 AttrBuilder FuncAttrBuilder(Ctx);

165 FuncAttrBuilder.addAttribute(Attr);

166

167 const bool UseSret =

168 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&

170

173

174 AttributeList Attrs;

175 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

176

177 if (UseSret) {

178 AttrBuilder AttrBuilder(Ctx);

180 AttrBuilder.addStructRetAttr(StructTy);

181 AttrBuilder.addAlignmentAttr(DL.getABITypeAlign(StructTy));

183 Type::getVoidTy(Ctx), {DL.getAllocaPtrType(Ctx), ScalarTy}, false);

184

185 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};

186 }

187

188 Type *RetTy =

189 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()

192

194 }

195 case RTLIB::impl_malloc:

196 case RTLIB::impl_calloc: {

197 AttrBuilder FuncAttrBuilder(Ctx);

199 FuncAttrBuilder.addAttribute(Attr);

200 FuncAttrBuilder.addAttribute(Attribute::NoFree);

201

203 if (LibcallImpl == RTLIB::impl_malloc)

205

206

207 FuncAttrBuilder.addAllocKindAttr(AllocKind);

208 FuncAttrBuilder.addAttribute("alloc-family", "malloc");

209 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc

210 ? std::nullopt

211 : std::make_optional(1));

212

213 AttributeList Attrs;

214 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

215

216 {

217 AttrBuilder ArgAttrBuilder(Ctx);

219 ArgAttrBuilder.addAttribute(AK);

220

221 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);

222 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);

223 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);

224 if (LibcallImpl == RTLIB::impl_calloc)

225 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);

226 }

227

231 if (LibcallImpl == RTLIB::impl_calloc)

233

235 }

236 case RTLIB::impl_free: {

237

238 AttrBuilder FuncAttrBuilder(Ctx);

240 FuncAttrBuilder.addAttribute(Attr);

241

243 FuncAttrBuilder.addAttribute("alloc-family", "malloc");

244

245 AttributeList Attrs;

246 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

247

248 {

249 AttrBuilder ArgAttrBuilder(Ctx);

250 ArgAttrBuilder.addAttribute(Attribute::NoUndef);

251 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);

253 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);

254 }

255

257 false),

258 Attrs};

259 }

260 case RTLIB::impl_sqrtf:

261 case RTLIB::impl_sqrt: {

262 AttrBuilder FuncAttrBuilder(Ctx);

263

265 FuncAttrBuilder.addAttribute(Attr);

267

268 AttributeList Attrs;

269 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

270

274

275 Attrs = Attrs.addRetAttribute(

278 return {FuncTy, Attrs};

279 }

280 case RTLIB::impl__ZGVnN2vl8_modf:

281 case RTLIB::impl__ZGVnN4vl4_modff:

282 case RTLIB::impl__ZGVsNxvl8_modf:

283 case RTLIB::impl__ZGVsNxvl4_modff:

284 case RTLIB::impl_armpl_vmodfq_f64:

285 case RTLIB::impl_armpl_vmodfq_f32:

286 case RTLIB::impl_armpl_svmodf_f64_x:

287 case RTLIB::impl_armpl_svmodf_f32_x: {

288 AttrBuilder FuncAttrBuilder(Ctx);

289

290 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||

291 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||

292 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||

293 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;

294

295 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||

296 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||

297 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||

298 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;

299

301 unsigned EC = IsF32 ? 4 : 2;

303

305 FuncAttrBuilder.addAttribute(Attr);

307

308 AttributeList Attrs;

309 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

310

311 {

312 AttrBuilder ArgAttrBuilder(Ctx);

314 ArgAttrBuilder.addAttribute(AK);

315 ArgAttrBuilder.addAlignmentAttr(DL.getABITypeAlign(VecTy));

316 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);

317 }

318

323

325 }

326 case RTLIB::impl__ZGVnN2vl8l8_sincos:

327 case RTLIB::impl__ZGVnN4vl4l4_sincosf:

328 case RTLIB::impl__ZGVsNxvl8l8_sincos:

329 case RTLIB::impl__ZGVsNxvl4l4_sincosf:

330 case RTLIB::impl_armpl_vsincosq_f64:

331 case RTLIB::impl_armpl_vsincosq_f32:

332 case RTLIB::impl_armpl_svsincos_f64_x:

333 case RTLIB::impl_armpl_svsincos_f32_x:

334 case RTLIB::impl__ZGVnN4vl4l4_sincospif:

335 case RTLIB::impl__ZGVnN2vl8l8_sincospi:

336 case RTLIB::impl__ZGVsNxvl4l4_sincospif:

337 case RTLIB::impl__ZGVsNxvl8l8_sincospi:

338 case RTLIB::impl_armpl_vsincospiq_f32:

339 case RTLIB::impl_armpl_vsincospiq_f64:

340 case RTLIB::impl_armpl_svsincospi_f32_x:

341 case RTLIB::impl_armpl_svsincospi_f64_x: {

342 AttrBuilder FuncAttrBuilder(Ctx);

343

344 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||

345 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||

346 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||

347 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||

348 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||

349 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||

350 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||

351 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;

352

354 unsigned EC = IsF32 ? 4 : 2;

355

356 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||

357 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||

358 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||

359 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||

360 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||

361 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||

362 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||

363 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;

365

367 FuncAttrBuilder.addAttribute(Attr);

369

370 AttributeList Attrs;

371 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

372

373 {

374 AttrBuilder ArgAttrBuilder(Ctx);

376 ArgAttrBuilder.addAttribute(AK);

377 ArgAttrBuilder.addAlignmentAttr(DL.getABITypeAlign(VecTy));

378 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);

379 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);

380 }

381

386

388 }

389 default:

390 return {};

391 }

392

393 return {};

394}

397

398

399 switch (Impl) {

400 case RTLIB::impl_armpl_svmodf_f64_x:

401 case RTLIB::impl_armpl_svmodf_f32_x:

402 case RTLIB::impl_armpl_svsincos_f32_x:

403 case RTLIB::impl_armpl_svsincos_f64_x:

404 case RTLIB::impl_armpl_svsincospi_f32_x:

405 case RTLIB::impl_armpl_svsincospi_f64_x:

406 return true;

407 default:

408 return false;

409 }

410}