@@ -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,
@@ -1015,7 +1040,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
10151040 LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
10161041 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
10171042 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1018- unsigned ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1043+ unsigned ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMRustShortBacktrace shortBacktrace,
10191044 LLVMValueRef MaybeFn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
10201045 DITemplateParameterArray TParams =
10211046 DITemplateParameterArray (unwrap<MDTuple>(TParam));
@@ -1024,7 +1049,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
10241049 DISubprogram *Sub = Builder->createFunction (
10251050 unwrapDI<DIScope>(Scope), StringRef (Name, NameLen),
10261051 StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
1027- unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags, llvmSPFlags,
1052+ unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags, llvmSPFlags, shortBacktraceFromRust (shortBacktrace),
10281053 TParams, unwrapDIPtr<DISubprogram>(Decl));
10291054 if (MaybeFn)
10301055 unwrap<Function>(MaybeFn)->setSubprogram (Sub);
@@ -1035,7 +1060,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10351060 LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
10361061 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
10371062 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1038- LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMMetadataRef TParam) {
1063+ LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMRustShortBacktrace shortBacktrace, LLVMMetadataRef TParam) {
10391064 DITemplateParameterArray TParams =
10401065 DITemplateParameterArray (unwrap<MDTuple>(TParam));
10411066 DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
@@ -1045,7 +1070,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
10451070 StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
10461071 unwrapDI<DISubroutineType>(Ty), 0 , 0 ,
10471072 nullptr , // VTable params aren't used
1048- llvmFlags, llvmSPFlags, TParams);
1073+ llvmFlags, llvmSPFlags, shortBacktraceFromRust (shortBacktrace), TParams);
10491074 return wrap (Sub);
10501075}
10511076
0 commit comments