@@ -117,7 +117,11 @@ extern "C" LLVMValueRef LLVMRustGetOrInsertFunction(LLVMModuleRef M,
117
117
const char *Name,
118
118
LLVMTypeRef FunctionTy) {
119
119
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
+ );
121
125
}
122
126
123
127
extern " C" LLVMValueRef
@@ -417,7 +421,6 @@ enum class LLVMRustDIFlags : uint32_t {
417
421
FlagIntroducedVirtual = (1 << 18 ),
418
422
FlagBitField = (1 << 19 ),
419
423
FlagNoReturn = (1 << 20 ),
420
- FlagMainSubprogram = (1 << 21 ),
421
424
// Do not add values that are not supported by the minimum LLVM
422
425
// version we support! see llvm/include/llvm/IR/DebugInfoFlags.def
423
426
};
@@ -508,9 +511,6 @@ static DINode::DIFlags fromRust(LLVMRustDIFlags Flags) {
508
511
if (isSet (Flags & LLVMRustDIFlags::FlagNoReturn)) {
509
512
Result |= DINode::DIFlags::FlagNoReturn;
510
513
}
511
- if (isSet (Flags & LLVMRustDIFlags::FlagMainSubprogram)) {
512
- Result |= DINode::DIFlags::FlagMainSubprogram;
513
- }
514
514
515
515
return Result;
516
516
}
@@ -525,6 +525,7 @@ enum class LLVMRustDISPFlags : uint32_t {
525
525
SPFlagLocalToUnit = (1 << 2 ),
526
526
SPFlagDefinition = (1 << 3 ),
527
527
SPFlagOptimized = (1 << 4 ),
528
+ SPFlagMainSubprogram = (1 << 5 ),
528
529
// Do not add values that are not supported by the minimum LLVM
529
530
// version we support! see llvm/include/llvm/IR/DebugInfoFlags.def
530
531
// (In LLVM < 8, createFunction supported these as separate bool arguments.)
@@ -575,6 +576,11 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
575
576
if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized)) {
576
577
Result |= DISubprogram::DISPFlags::SPFlagOptimized;
577
578
}
579
+ #if LLVM_VERSION_GE(9, 0)
580
+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagMainSubprogram)) {
581
+ Result |= DISubprogram::DISPFlags::SPFlagMainSubprogram;
582
+ }
583
+ #endif
578
584
579
585
return Result;
580
586
}
@@ -671,18 +677,27 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
671
677
DITemplateParameterArray TParams =
672
678
DITemplateParameterArray (unwrap<MDTuple>(TParam));
673
679
#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
674
686
DISubprogram *Sub = Builder->createFunction (
675
687
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));
678
690
#else
679
691
bool IsLocalToUnit = isSet (SPFlags & LLVMRustDISPFlags::SPFlagLocalToUnit);
680
692
bool IsDefinition = isSet (SPFlags & LLVMRustDISPFlags::SPFlagDefinition);
681
693
bool IsOptimized = isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized);
694
+ DINode::DIFlags llvmFlags = fromRust (Flags);
695
+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagMainSubprogram))
696
+ llvmFlags |= DINode::DIFlags::FlagMainSubprogram;
682
697
DISubprogram *Sub = Builder->createFunction (
683
698
unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
684
699
LineNo, unwrapDI<DISubroutineType>(Ty), IsLocalToUnit, IsDefinition,
685
- ScopeLine, fromRust (Flags) , IsOptimized, TParams,
700
+ ScopeLine, llvmFlags , IsOptimized, TParams,
686
701
unwrapDIPtr<DISubprogram>(Decl));
687
702
#endif
688
703
unwrap<Function>(Fn)->setSubprogram (Sub);
0 commit comments