@@ -294,7 +294,7 @@ extern "C" void LLVMRustSetHasUnsafeAlgebra(LLVMValueRef V) {
294
294
extern " C" LLVMValueRef
295
295
LLVMRustBuildAtomicLoad (LLVMBuilderRef B, LLVMValueRef Source, const char *Name,
296
296
LLVMAtomicOrdering Order) {
297
- LoadInst *LI = new LoadInst (unwrap (Source), 0 );
297
+ LoadInst *LI = new LoadInst (unwrap (Source));
298
298
LI->setAtomic (fromRust (Order));
299
299
return wrap (unwrap (B)->Insert (LI, Name));
300
300
}
@@ -511,6 +511,71 @@ static DINode::DIFlags fromRust(LLVMRustDIFlags Flags) {
511
511
return Result;
512
512
}
513
513
514
+ // These values **must** match debuginfo::DISPFlags! They also *happen*
515
+ // to match LLVM, but that isn't required as we do giant sets of
516
+ // matching below. The value shouldn't be directly passed to LLVM.
517
+ enum class LLVMRustDISPFlags : uint32_t {
518
+ SPFlagZero = 0 ,
519
+ SPFlagVirtual = 1 ,
520
+ SPFlagPureVirtual = 2 ,
521
+ SPFlagLocalToUnit = (1 << 2 ),
522
+ SPFlagDefinition = (1 << 3 ),
523
+ SPFlagOptimized = (1 << 4 ),
524
+ // Do not add values that are not supported by the minimum LLVM
525
+ // version we support! see llvm/include/llvm/IR/DebugInfoFlags.def
526
+ // (In LLVM < 8, createFunction supported these as separate bool arguments.)
527
+ };
528
+
529
+ inline LLVMRustDISPFlags operator &(LLVMRustDISPFlags A, LLVMRustDISPFlags B) {
530
+ return static_cast <LLVMRustDISPFlags>(static_cast <uint32_t >(A) &
531
+ static_cast <uint32_t >(B));
532
+ }
533
+
534
+ inline LLVMRustDISPFlags operator |(LLVMRustDISPFlags A, LLVMRustDISPFlags B) {
535
+ return static_cast <LLVMRustDISPFlags>(static_cast <uint32_t >(A) |
536
+ static_cast <uint32_t >(B));
537
+ }
538
+
539
+ inline LLVMRustDISPFlags &operator |=(LLVMRustDISPFlags &A, LLVMRustDISPFlags B) {
540
+ return A = A | B;
541
+ }
542
+
543
+ inline bool isSet (LLVMRustDISPFlags F) { return F != LLVMRustDISPFlags::SPFlagZero; }
544
+
545
+ inline LLVMRustDISPFlags virtuality (LLVMRustDISPFlags F) {
546
+ return static_cast <LLVMRustDISPFlags>(static_cast <uint32_t >(F) & 0x3 );
547
+ }
548
+
549
+ #if LLVM_VERSION_GE(8, 0)
550
+ static DISubprogram::DISPFlags fromRust (LLVMRustDISPFlags SPFlags) {
551
+ DISubprogram::DISPFlags Result = DISubprogram::DISPFlags::SPFlagZero;
552
+
553
+ switch (virtuality (SPFlags)) {
554
+ case LLVMRustDISPFlags::SPFlagVirtual:
555
+ Result |= DISubprogram::DISPFlags::SPFlagVirtual;
556
+ break ;
557
+ case LLVMRustDISPFlags::SPFlagPureVirtual:
558
+ Result |= DISubprogram::DISPFlags::SPFlagPureVirtual;
559
+ break ;
560
+ default :
561
+ // The rest are handled below
562
+ break ;
563
+ }
564
+
565
+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagLocalToUnit)) {
566
+ Result |= DISubprogram::DISPFlags::SPFlagLocalToUnit;
567
+ }
568
+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagDefinition)) {
569
+ Result |= DISubprogram::DISPFlags::SPFlagDefinition;
570
+ }
571
+ if (isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized)) {
572
+ Result |= DISubprogram::DISPFlags::SPFlagOptimized;
573
+ }
574
+
575
+ return Result;
576
+ }
577
+ #endif
578
+
514
579
extern " C" uint32_t LLVMRustDebugMetadataVersion () {
515
580
return DEBUG_METADATA_VERSION;
516
581
}
@@ -575,16 +640,26 @@ LLVMRustDIBuilderCreateSubroutineType(LLVMRustDIBuilderRef Builder,
575
640
extern " C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction (
576
641
LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
577
642
const char *LinkageName, LLVMMetadataRef File, unsigned LineNo,
578
- LLVMMetadataRef Ty, bool IsLocalToUnit, bool IsDefinition ,
579
- unsigned ScopeLine, LLVMRustDIFlags Flags, bool IsOptimized ,
580
- LLVMValueRef Fn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
643
+ LLVMMetadataRef Ty, unsigned ScopeLine, LLVMRustDIFlags Flags ,
644
+ LLVMRustDISPFlags SPFlags, LLVMValueRef Fn, LLVMMetadataRef TParam ,
645
+ LLVMMetadataRef Decl) {
581
646
DITemplateParameterArray TParams =
582
647
DITemplateParameterArray (unwrap<MDTuple>(TParam));
648
+ #if LLVM_VERSION_GE(8, 0)
649
+ DISubprogram *Sub = Builder->createFunction (
650
+ unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
651
+ LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine, fromRust (Flags),
652
+ fromRust (SPFlags), TParams, unwrapDIPtr<DISubprogram>(Decl));
653
+ #else
654
+ bool IsLocalToUnit = isSet (SPFlags & LLVMRustDISPFlags::SPFlagLocalToUnit);
655
+ bool IsDefinition = isSet (SPFlags & LLVMRustDISPFlags::SPFlagDefinition);
656
+ bool IsOptimized = isSet (SPFlags & LLVMRustDISPFlags::SPFlagOptimized);
583
657
DISubprogram *Sub = Builder->createFunction (
584
658
unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
585
659
LineNo, unwrapDI<DISubroutineType>(Ty), IsLocalToUnit, IsDefinition,
586
660
ScopeLine, fromRust (Flags), IsOptimized, TParams,
587
661
unwrapDIPtr<DISubprogram>(Decl));
662
+ #endif
588
663
unwrap<Function>(Fn)->setSubprogram (Sub);
589
664
return wrap (Sub);
590
665
}
@@ -773,14 +848,14 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateEnumerationType(
773
848
LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
774
849
LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
775
850
uint32_t AlignInBits, LLVMMetadataRef Elements,
776
- LLVMMetadataRef ClassTy, bool IsFixed ) {
851
+ LLVMMetadataRef ClassTy, bool IsScoped ) {
777
852
#if LLVM_VERSION_GE(7, 0)
778
853
return wrap (Builder->createEnumerationType (
779
854
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), LineNumber,
780
855
SizeInBits, AlignInBits, DINodeArray (unwrapDI<MDTuple>(Elements)),
781
- unwrapDI<DIType>(ClassTy), " " , IsFixed ));
856
+ unwrapDI<DIType>(ClassTy), " " , IsScoped ));
782
857
#else
783
- // Ignore IsFixed on older LLVM.
858
+ // Ignore IsScoped on older LLVM.
784
859
return wrap (Builder->createEnumerationType (
785
860
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), LineNumber,
786
861
SizeInBits, AlignInBits, DINodeArray (unwrapDI<MDTuple>(Elements)),
@@ -920,7 +995,11 @@ extern "C" void LLVMRustUnpackOptimizationDiagnostic(
920
995
if (loc.isValid ()) {
921
996
*Line = loc.getLine ();
922
997
*Column = loc.getColumn ();
998
+ #if LLVM_VERSION_GE(8, 0)
999
+ FilenameOS << loc.getAbsolutePath ();
1000
+ #else
923
1001
FilenameOS << loc.getFilename ();
1002
+ #endif
924
1003
}
925
1004
926
1005
RawRustStringOstream MessageOS (MessageOut);
0 commit comments