@@ -117,7 +117,11 @@ extern "C" LLVMValueRef LLVMRustGetOrInsertFunction(LLVMModuleRef M,
117117 const char *Name,
118118 LLVMTypeRef FunctionTy) {
119119 return wrap (
120- unwrap (M)->getOrInsertFunction (Name, unwrap<FunctionType>(FunctionTy)));
120+ unwrap (M)->getOrInsertFunction (Name, unwrap<FunctionType>(FunctionTy))
121+ #if LLVM_VERSION_GE(9, 0)
122+ .getCallee ()
123+ #endif
124+ );
121125}
122126
123127extern " C" LLVMValueRef
@@ -417,7 +421,6 @@ enum class LLVMRustDIFlags : uint32_t {
417421 FlagIntroducedVirtual = (1 << 18 ),
418422 FlagBitField = (1 << 19 ),
419423 FlagNoReturn = (1 << 20 ),
420- FlagMainSubprogram = (1 << 21 ),
421424 // Do not add values that are not supported by the minimum LLVM
422425 // version we support! see llvm/include/llvm/IR/DebugInfoFlags.def
423426};
@@ -508,9 +511,6 @@ static DINode::DIFlags fromRust(LLVMRustDIFlags Flags) {
508511 if (isSet (Flags & LLVMRustDIFlags::FlagNoReturn)) {
509512 Result |= DINode::DIFlags::FlagNoReturn;
510513 }
511- if (isSet (Flags & LLVMRustDIFlags::FlagMainSubprogram)) {
512- Result |= DINode::DIFlags::FlagMainSubprogram;
513- }
514514
515515 return Result;
516516}
@@ -525,6 +525,7 @@ enum class LLVMRustDISPFlags : uint32_t {
525525 SPFlagLocalToUnit = (1 << 2 ),
526526 SPFlagDefinition = (1 << 3 ),
527527 SPFlagOptimized = (1 << 4 ),
528+ SPFlagMainSubprogram = (1 << 5 ),
528529 // Do not add values that are not supported by the minimum LLVM
529530 // version we support! see llvm/include/llvm/IR/DebugInfoFlags.def
530531 // (In LLVM < 8, createFunction supported these as separate bool arguments.)
@@ -575,6 +576,11 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
575576 if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized)) {
576577 Result |= DISubprogram::DISPFlags::SPFlagOptimized;
577578 }
579+ #if LLVM_VERSION_GE(9, 0)
580+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagMainSubprogram)) {
581+ Result |= DISubprogram::DISPFlags::SPFlagMainSubprogram;
582+ }
583+ #endif
578584
579585 return Result;
580586}
@@ -671,18 +677,27 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
671677 DITemplateParameterArray TParams =
672678 DITemplateParameterArray (unwrap<MDTuple>(TParam));
673679#if LLVM_VERSION_GE(8, 0)
680+ DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
681+ DINode::DIFlags llvmFlags = fromRust (Flags);
682+ #if LLVM_VERSION_LT(9, 0)
683+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagMainSubprogram))
684+ llvmFlags |= DINode::DIFlags::FlagMainSubprogram;
685+ #endif
674686 DISubprogram *Sub = Builder->createFunction (
675687 unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
676- LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine, fromRust (Flags) ,
677- fromRust (SPFlags) , TParams, unwrapDIPtr<DISubprogram>(Decl));
688+ LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags ,
689+ llvmSPFlags , TParams, unwrapDIPtr<DISubprogram>(Decl));
678690#else
679691 bool IsLocalToUnit = isSet (SPFlags & LLVMRustDISPFlags::SPFlagLocalToUnit);
680692 bool IsDefinition = isSet (SPFlags & LLVMRustDISPFlags::SPFlagDefinition);
681693 bool IsOptimized = isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized);
694+ DINode::DIFlags llvmFlags = fromRust (Flags);
695+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagMainSubprogram))
696+ llvmFlags |= DINode::DIFlags::FlagMainSubprogram;
682697 DISubprogram *Sub = Builder->createFunction (
683698 unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
684699 LineNo, unwrapDI<DISubroutineType>(Ty), IsLocalToUnit, IsDefinition,
685- ScopeLine, fromRust (Flags) , IsOptimized, TParams,
700+ ScopeLine, llvmFlags , IsOptimized, TParams,
686701 unwrapDIPtr<DISubprogram>(Decl));
687702#endif
688703 unwrap<Function>(Fn)->setSubprogram (Sub);
0 commit comments