@@ -451,7 +451,7 @@ class IRGenSILFunction :
451451 llvm::DenseMap<SILInstruction *, llvm::SmallVector<StackPackAlloc, 2 >>
452452 StackPackAllocs;
453453
454- IRGenSILFunction (IRGenModule &IGM, SILFunction *f);
454+ IRGenSILFunction (IRGenModule &IGM, SILFunction *f, llvm::Function *llvmF );
455455 ~IRGenSILFunction ();
456456
457457 // / Generate IR for the SIL Function.
@@ -1887,10 +1887,9 @@ llvm::Value *LoweredValue::getSingletonExplosion(IRGenFunction &IGF,
18871887 llvm_unreachable (" bad kind" );
18881888}
18891889
1890- IRGenSILFunction::IRGenSILFunction (IRGenModule &IGM, SILFunction *f)
1891- : IRGenFunction(IGM,
1892- IGM.getAddrOfSILFunction(f, ForDefinition,
1893- f->isDynamicallyReplaceable ()),
1890+ IRGenSILFunction::IRGenSILFunction (IRGenModule &IGM, SILFunction *f,
1891+ llvm::Function *llvmF)
1892+ : IRGenFunction(IGM, llvmF,
18941893 f->isPerformanceConstraint (),
18951894 f->getOptimizationMode(), f->getDebugScope(),
18961895 f->getLocation()),
@@ -2558,7 +2557,17 @@ void IRGenModule::emitSILFunction(SILFunction *f) {
25582557 noteUseOfMetadataByCXXInterop (IRGen, f, TypeExpansionContext (*f));
25592558
25602559 PrettyStackTraceSILFunction stackTrace (" emitting IR" , f);
2561- IRGenSILFunction (*this , f).emitSILFunction ();
2560+
2561+ // Get the LLVM function we will emit. If it has already been defined, error.
2562+ auto llvmF = getAddrOfSILFunction (f, ForDefinition,
2563+ f->isDynamicallyReplaceable ());
2564+ if (!llvmF->empty ()) {
2565+ auto &diags = Context.Diags ;
2566+ diags.diagnose (f->getLocation ().getSourceLoc (), diag::ir_function_redefinition_external, llvmF->getName ());
2567+ return ;
2568+ }
2569+
2570+ IRGenSILFunction (*this , f, llvmF).emitSILFunction ();
25622571}
25632572
25642573void IRGenSILFunction::emitSILFunction () {
0 commit comments