@@ -822,6 +822,33 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
822822  return  Result;
823823}
824824
825+ #ifdef  LLVM_RUSTLLVM
826+ //  These values **must** match debuginfo::ShortBacktrace! They also *happen*
827+ //  to match LLVM, but that isn't required as we do giant sets of
828+ //  matching below. The value shouldn't be directly passed to LLVM.
829+ enum  class  LLVMRustShortBacktrace  {
830+   SkipFrame,
831+   StartShortBacktrace,
832+   EndShortBacktrace,
833+   None,
834+ };
835+ 
836+ static  std::optional<ShortBacktraceAttr> shortBacktraceFromRust (LLVMRustShortBacktrace backtrace) {
837+   switch  (backtrace) {
838+     case  LLVMRustShortBacktrace::SkipFrame:
839+       return  ShortBacktraceAttr::SkipFrame;
840+     case  LLVMRustShortBacktrace::StartShortBacktrace:
841+       return  ShortBacktraceAttr::StartShortBacktrace;
842+     case  LLVMRustShortBacktrace::EndShortBacktrace:
843+       return  ShortBacktraceAttr::EndShortBacktrace;
844+     case  LLVMRustShortBacktrace::None:
845+       return  std::nullopt ;
846+     default :
847+       report_fatal_error (" bad ShortBacktraceAttr." 
848+   }
849+ }
850+ #endif 
851+ 
825852enum  class  LLVMRustDebugEmissionKind  {
826853  NoDebug,
827854  FullDebug,
@@ -1016,6 +1043,9 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
10161043    size_t  NameLen, const  char  *LinkageName, size_t  LinkageNameLen,
10171044    LLVMMetadataRef File, unsigned  LineNo, LLVMMetadataRef Ty,
10181045    unsigned  ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1046+ #ifdef  LLVM_RUSTLLVM
1047+     LLVMRustShortBacktrace shortBacktrace,
1048+ #endif 
10191049    LLVMValueRef MaybeFn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
10201050  DITemplateParameterArray TParams =
10211051      DITemplateParameterArray (unwrap<MDTuple>(TParam));
@@ -1025,6 +1055,9 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
10251055      unwrapDI<DIScope>(Scope), StringRef (Name, NameLen),
10261056      StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
10271057      unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags, llvmSPFlags,
1058+ #ifdef  LLVM_RUSTLLVM
1059+       shortBacktraceFromRust (shortBacktrace),
1060+ #endif 
10281061      TParams, unwrapDIPtr<DISubprogram>(Decl));
10291062  if  (MaybeFn)
10301063    unwrap<Function>(MaybeFn)->setSubprogram (Sub);
@@ -1035,7 +1068,11 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10351068    LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const  char  *Name,
10361069    size_t  NameLen, const  char  *LinkageName, size_t  LinkageNameLen,
10371070    LLVMMetadataRef File, unsigned  LineNo, LLVMMetadataRef Ty,
1038-     LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMMetadataRef TParam) {
1071+     LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1072+ #ifdef  LLVM_RUSTLLVM
1073+     LLVMRustShortBacktrace shortBacktrace,
1074+ #endif 
1075+     LLVMMetadataRef TParam) {
10391076  DITemplateParameterArray TParams =
10401077      DITemplateParameterArray (unwrap<MDTuple>(TParam));
10411078  DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
@@ -1045,7 +1082,11 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10451082      StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
10461083      unwrapDI<DISubroutineType>(Ty), 0 , 0 ,
10471084      nullptr , //  VTable params aren't used
1048-       llvmFlags, llvmSPFlags, TParams);
1085+       llvmFlags, llvmSPFlags,
1086+ #ifdef  LLVM_RUSTLLVM
1087+       shortBacktraceFromRust (shortBacktrace),
1088+ #endif 
1089+       TParams);
10491090  return  wrap (Sub);
10501091}
10511092
0 commit comments