@@ -822,6 +822,31 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
822
822
return Result;
823
823
}
824
824
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
+
825
850
enum class LLVMRustDebugEmissionKind {
826
851
NoDebug,
827
852
FullDebug,
@@ -1016,16 +1041,18 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
1016
1041
size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1017
1042
LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1018
1043
unsigned ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1019
- LLVMValueRef MaybeFn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
1044
+ LLVMRustShortBacktrace shortBacktrace, LLVMValueRef MaybeFn, LLVMMetadataRef TParam,
1045
+ LLVMMetadataRef Decl) {
1020
1046
DITemplateParameterArray TParams =
1021
1047
DITemplateParameterArray (unwrap<MDTuple>(TParam));
1022
1048
DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
1023
1049
DINode::DIFlags llvmFlags = fromRust (Flags);
1024
1050
DISubprogram *Sub = Builder->createFunction (
1025
1051
unwrapDI<DIScope>(Scope), StringRef (Name, NameLen),
1026
1052
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));
1029
1056
if (MaybeFn)
1030
1057
unwrap<Function>(MaybeFn)->setSubprogram (Sub);
1031
1058
return wrap (Sub);
@@ -1035,7 +1062,8 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
1035
1062
LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1036
1063
size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1037
1064
LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1038
- LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMMetadataRef TParam) {
1065
+ LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags, LLVMRustShortBacktrace shortBacktrace,
1066
+ LLVMMetadataRef TParam) {
1039
1067
DITemplateParameterArray TParams =
1040
1068
DITemplateParameterArray (unwrap<MDTuple>(TParam));
1041
1069
DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
@@ -1045,7 +1073,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
1045
1073
StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
1046
1074
unwrapDI<DISubroutineType>(Ty), 0 , 0 ,
1047
1075
nullptr , // VTable params aren't used
1048
- llvmFlags, llvmSPFlags, TParams);
1076
+ llvmFlags, llvmSPFlags, shortBacktraceFromRust (shortBacktrace), TParams);
1049
1077
return wrap (Sub);
1050
1078
}
1051
1079
0 commit comments