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