Skip to content

Commit b8a75be

Browse files
committed
Use LLVM intrinsic name as mangled name.
If the mangled name is viewed as the name emitted into IR code then the mangled name of an intrinsic is the intrinsic's name. The name is unique because of the `llvm.` prefix. The only point is that overloaded intrinsics must be resolved earlier. This commit moves the resolution of oveloaded intrinsics into the semantic analysis pass. The
1 parent d6569c4 commit b8a75be

File tree

4 files changed

+15
-24
lines changed

4 files changed

+15
-24
lines changed

dmd2/builtin.c

-16
Original file line numberDiff line numberDiff line change
@@ -353,30 +353,26 @@ void builtin_init()
353353

354354
#if IN_LLVM
355355
// intrinsic llvm.bswap.i16/i32/i64/i128
356-
add_builtin("llvm.bswap.i#", &eval_bswap);
357356
add_builtin("llvm.bswap.i16", &eval_bswap);
358357
add_builtin("llvm.bswap.i32", &eval_bswap);
359358
add_builtin("llvm.bswap.i64", &eval_bswap);
360359
add_builtin("llvm.bswap.i128", &eval_bswap);
361360

362361
// intrinsic llvm.cttz.i8/i16/i32/i64/i128
363-
add_builtin("llvm.cttz.i#", &eval_cttz);
364362
add_builtin("llvm.cttz.i8", &eval_cttz);
365363
add_builtin("llvm.cttz.i16", &eval_cttz);
366364
add_builtin("llvm.cttz.i32", &eval_cttz);
367365
add_builtin("llvm.cttz.i64", &eval_cttz);
368366
add_builtin("llvm.cttz.i128", &eval_cttz);
369367

370368
// intrinsic llvm.ctlz.i8/i16/i32/i64/i128
371-
add_builtin("llvm.ctlz.i#", &eval_ctlz);
372369
add_builtin("llvm.ctlz.i8", &eval_ctlz);
373370
add_builtin("llvm.ctlz.i16", &eval_ctlz);
374371
add_builtin("llvm.ctlz.i32", &eval_ctlz);
375372
add_builtin("llvm.ctlz.i64", &eval_ctlz);
376373
add_builtin("llvm.ctlz.i128", &eval_ctlz);
377374

378375
// intrinsic llvm.ctpop.i8/i16/i32/i64/i128
379-
add_builtin("llvm.ctpop.i#", &eval_ctpop);
380376
add_builtin("llvm.ctpop.i8", &eval_ctpop);
381377
add_builtin("llvm.ctpop.i16", &eval_ctpop);
382378
add_builtin("llvm.ctpop.i32", &eval_ctpop);
@@ -404,13 +400,7 @@ BUILTIN FuncDeclaration::isBuiltin()
404400
{
405401
if (builtin == BUILTINunknown)
406402
{
407-
#if IN_LLVM
408-
const char *name = llvmInternal == LLVMintrinsic ? intrinsicName.c_str()
409-
: mangleExact();
410-
builtin_fp fp = builtin_lookup(name);
411-
#else
412403
builtin_fp fp = builtin_lookup(mangleExact());
413-
#endif
414404
builtin = fp ? BUILTINyes : BUILTINno;
415405
}
416406
return builtin;
@@ -425,13 +415,7 @@ Expression *eval_builtin(Loc loc, FuncDeclaration *fd, Expressions *arguments)
425415
{
426416
if (fd->builtin == BUILTINyes)
427417
{
428-
#if IN_LLVM
429-
const char *name = fd->llvmInternal == LLVMintrinsic ? fd->intrinsicName.c_str()
430-
: fd->mangleExact();
431-
builtin_fp fp = builtin_lookup(name);
432-
#else
433418
builtin_fp fp = builtin_lookup(fd->mangleExact());
434-
#endif
435419
assert(fp);
436420
return fp(loc, fd, arguments);
437421
}

dmd2/template.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
#include "id.h"
3535
#include "attrib.h"
3636

37+
#if IN_LLVM
38+
#include "gen/pragma.h"
39+
void DtoOverloadedIntrinsicName(TemplateInstance* ti, TemplateDeclaration* td, std::string& name);
40+
#endif
41+
3742
#define LOG 0
3843

3944
#define IDX_NOTFOUND (0x12345678) // index is not found
@@ -5575,7 +5580,12 @@ void TemplateInstance::semantic(Scope *sc, Expressions *fargs)
55755580
if (tempdecl->llvmInternal) {
55765581
s->llvmInternal = tempdecl->llvmInternal;
55775582
if (FuncDeclaration* fd = s->isFuncDeclaration()) {
5578-
fd->intrinsicName = tempdecl->intrinsicName;
5583+
if (fd->llvmInternal == LLVMintrinsic) {
5584+
DtoOverloadedIntrinsicName(this, tempdecl, fd->intrinsicName);
5585+
fd->mangleOverride = strdup(fd->intrinsicName.c_str());
5586+
}
5587+
else
5588+
fd->intrinsicName = tempdecl->intrinsicName;
55795589
}
55805590
}
55815591
#endif

gen/functions.cpp

+3-7
Original file line numberDiff line numberDiff line change
@@ -550,8 +550,8 @@ void DtoResolveFunction(FuncDeclaration* fdecl)
550550
else if (tempdecl->llvmInternal == LLVMintrinsic)
551551
{
552552
Logger::println("overloaded intrinsic found");
553-
fdecl->llvmInternal = LLVMintrinsic;
554-
DtoOverloadedIntrinsicName(tinst, tempdecl, fdecl->intrinsicName);
553+
assert(fdecl->llvmInternal == LLVMintrinsic);
554+
assert(fdecl->mangleOverride);
555555
}
556556
else if (tempdecl->llvmInternal == LLVMinline_asm)
557557
{
@@ -788,11 +788,7 @@ void DtoDeclareFunction(FuncDeclaration* fdecl)
788788
}
789789

790790
// mangled name
791-
std::string mangledName;
792-
if (fdecl->llvmInternal == LLVMintrinsic)
793-
mangledName = fdecl->intrinsicName;
794-
else
795-
mangledName = fdecl->mangleExact();
791+
std::string mangledName(fdecl->mangleExact());
796792
mangledName = gABI->mangleForLLVM(mangledName, link);
797793

798794
// construct function

gen/pragma.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ void DtoCheckPragma(PragmaDeclaration *decl, Dsymbol *s,
324324
{
325325
fd->llvmInternal = llvm_internal;
326326
fd->intrinsicName = arg1str;
327+
fd->mangleOverride = strdup(fd->intrinsicName.c_str());
327328
}
328329
else if (TemplateDeclaration* td = s->isTemplateDeclaration())
329330
{

0 commit comments

Comments
 (0)