From ed837e205f3e67c4ae112f544cfe486ca3cc8455 Mon Sep 17 00:00:00 2001 From: Mukund Keshava Date: Thu, 15 May 2025 14:45:43 +0530 Subject: Rename 'main' on some backends (#7105) * Rename 'main' on some backednds Fixes #5542 Some backends like cuda, metal, cpu do not allow 'main' as the entry point. This commit adds a new warning that is emitted when a program uses main as the entry point. In addition to emitting the warning, it internally renames the entry point to "main_". It also adds a test to check these for the three backends. * format code * move test to diagnostics * rename test to diagnostic * generate unique name --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- source/slang/slang-diagnostic-defs.h | 6 ++++++ source/slang/slang-emit-c-like.cpp | 18 +++++++++++++++++- source/slang/slang-emit-c-like.h | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index dbd4da588..808d867b6 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -2765,6 +2765,12 @@ DIAGNOSTIC( noBlocksOrIntrinsic, "no blocks found for function definition, is there a '$0' intrinsic missing?") +DIAGNOSTIC( + 40100, + Warning, + mainEntryPointRenamed, + "entry point '$0' is not allowed, and has been renamed to '$1'") + // // Ray tracing // diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 141a843f2..b2dc9b014 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -1109,9 +1109,25 @@ void CLikeSourceEmitter::appendScrubbedName(const UnownedStringSlice& name, Stri } } +inline String CLikeSourceEmitter::maybeMakeEntryPointNameValid(String name, DiagnosticSink* sink) +{ + if (isCPUTarget(getTargetReq()) || isCUDATarget(getTargetReq()) || + isMetalTarget(getTargetReq())) + { + if (name == "main") + { + String newName = _generateUniqueName(name.getUnownedSlice()); + sink->diagnose(SourceLoc(), Diagnostics::mainEntryPointRenamed, name, newName); + return newName; + } + } + return name; +} + String CLikeSourceEmitter::generateEntryPointNameImpl(IREntryPointDecoration* entryPointDecor) { - return entryPointDecor->getName()->getStringSlice(); + String name = entryPointDecor->getName()->getStringSlice(); + return maybeMakeEntryPointNameValid(name, getSink()); } String CLikeSourceEmitter::_generateUniqueName(const UnownedStringSlice& name) diff --git a/source/slang/slang-emit-c-like.h b/source/slang/slang-emit-c-like.h index f38158c0a..78793f655 100644 --- a/source/slang/slang-emit-c-like.h +++ b/source/slang/slang-emit-c-like.h @@ -739,6 +739,9 @@ protected: Dictionary m_builtinPreludes; + // Rename entry point if target doesn't allow the name (e.g., 'main') + virtual String maybeMakeEntryPointNameValid(String name, DiagnosticSink* sink); + // Indicates if we are emiting for DXC cooperative vector POC. bool isCoopvecPoc = false; }; -- cgit v1.2.3