@@ -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