@@ -822,6 +822,31 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
822822  return  Result;
823823}
824824
825+ //  These values **must** match debuginfo::ShortBacktrace! They also *happen*
826+ //  to match LLVM, but that isn't required as we do giant sets of
827+ //  matching below. The value shouldn't be directly passed to LLVM.
828+ enum  class  LLVMRustShortBacktrace  {
829+   SkipFrame,
830+   StartShortBacktrace,
831+   EndShortBacktrace,
832+   None,
833+ };
834+ 
835+ static  std::optional<ShortBacktraceAttr> shortBacktraceFromRust (LLVMRustShortBacktrace backtrace) {
836+   switch  (backtrace) {
837+     case  LLVMRustShortBacktrace::SkipFrame:
838+       return  ShortBacktraceAttr::SkipFrame;
839+     case  LLVMRustShortBacktrace::StartShortBacktrace:
840+       return  ShortBacktraceAttr::StartShortBacktrace;
841+     case  LLVMRustShortBacktrace::EndShortBacktrace:
842+       return  ShortBacktraceAttr::EndShortBacktrace;
843+     case  LLVMRustShortBacktrace::None:
844+       return  std::nullopt ;
845+     default :
846+       report_fatal_error (" bad ShortBacktraceAttr." 
847+   }
848+ }
849+ 
825850enum  class  LLVMRustDebugEmissionKind  {
826851  NoDebug,
827852  FullDebug,
@@ -1016,16 +1041,18 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
10161041    size_t  NameLen, const  char  *LinkageName, size_t  LinkageNameLen,
10171042    LLVMMetadataRef File, unsigned  LineNo, LLVMMetadataRef Ty,
10181043    unsigned  ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1019-     LLVMValueRef MaybeFn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
1044+     LLVMRustShortBacktrace shortBacktrace, LLVMValueRef MaybeFn, LLVMMetadataRef TParam,
1045+     LLVMMetadataRef Decl) {
10201046  DITemplateParameterArray TParams =
10211047      DITemplateParameterArray (unwrap<MDTuple>(TParam));
10221048  DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
10231049  DINode::DIFlags llvmFlags = fromRust (Flags);
10241050  DISubprogram *Sub = Builder->createFunction (
10251051      unwrapDI<DIScope>(Scope), StringRef (Name, NameLen),
10261052      StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
1027-       unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags, llvmSPFlags,
1028-       TParams, unwrapDIPtr<DISubprogram>(Decl));
1053+       unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags,
1054+       llvmSPFlags, shortBacktraceFromRust (shortBacktrace), TParams,
1055+       unwrapDIPtr<DISubprogram>(Decl));
10291056  if  (MaybeFn)
10301057    unwrap<Function>(MaybeFn)->setSubprogram (Sub);
10311058  return  wrap (Sub);
@@ -1035,7 +1062,8 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10351062    LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const  char  *Name,
10361063    size_t  NameLen, const  char  *LinkageName, size_t  LinkageNameLen,
10371064    LLVMMetadataRef File, unsigned  LineNo, LLVMMetadataRef Ty,
1038-     LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMMetadataRef TParam) {
1065+     LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMRustShortBacktrace shortBacktrace,
1066+     LLVMMetadataRef TParam) {
10391067  DITemplateParameterArray TParams =
10401068      DITemplateParameterArray (unwrap<MDTuple>(TParam));
10411069  DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
@@ -1045,7 +1073,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10451073      StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
10461074      unwrapDI<DISubroutineType>(Ty), 0 , 0 ,
10471075      nullptr , //  VTable params aren't used
1048-       llvmFlags, llvmSPFlags, TParams);
1076+       llvmFlags, llvmSPFlags, shortBacktraceFromRust (shortBacktrace),  TParams);
10491077  return  wrap (Sub);
10501078}
10511079
0 commit comments