@@ -822,6 +822,33 @@ static DISubprogram::DISPFlags fromRust(LLVMRustDISPFlags SPFlags) {
822
822
return Result;
823
823
}
824
824
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
+
825
852
enum class LLVMRustDebugEmissionKind {
826
853
NoDebug,
827
854
FullDebug,
@@ -1016,6 +1043,9 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
1016
1043
size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1017
1044
LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1018
1045
unsigned ScopeLine, LLVMRustDIFlags Flags, LLVMRustDISPFlags SPFlags,
1046
+ #ifdef LLVM_RUSTLLVM
1047
+ LLVMRustShortBacktrace shortBacktrace,
1048
+ #endif
1019
1049
LLVMValueRef MaybeFn, LLVMMetadataRef TParam, LLVMMetadataRef Decl) {
1020
1050
DITemplateParameterArray TParams =
1021
1051
DITemplateParameterArray (unwrap<MDTuple>(TParam));
@@ -1025,6 +1055,9 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateFunction(
1025
1055
unwrapDI<DIScope>(Scope), StringRef (Name, NameLen),
1026
1056
StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
1027
1057
unwrapDI<DISubroutineType>(Ty), ScopeLine, llvmFlags, llvmSPFlags,
1058
+ #ifdef LLVM_RUSTLLVM
1059
+ shortBacktraceFromRust (shortBacktrace),
1060
+ #endif
1028
1061
TParams, unwrapDIPtr<DISubprogram>(Decl));
1029
1062
if (MaybeFn)
1030
1063
unwrap<Function>(MaybeFn)->setSubprogram (Sub);
@@ -1035,7 +1068,11 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
1035
1068
LLVMRustDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1036
1069
size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1037
1070
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) {
1039
1076
DITemplateParameterArray TParams =
1040
1077
DITemplateParameterArray (unwrap<MDTuple>(TParam));
1041
1078
DISubprogram::DISPFlags llvmSPFlags = fromRust (SPFlags);
@@ -1045,7 +1082,11 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateMethod(
1045
1082
StringRef (LinkageName, LinkageNameLen), unwrapDI<DIFile>(File), LineNo,
1046
1083
unwrapDI<DISubroutineType>(Ty), 0 , 0 ,
1047
1084
nullptr , // VTable params aren't used
1048
- llvmFlags, llvmSPFlags, TParams);
1085
+ llvmFlags, llvmSPFlags,
1086
+ #ifdef LLVM_RUSTLLVM
1087
+ shortBacktraceFromRust (shortBacktrace),
1088
+ #endif
1089
+ TParams);
1049
1090
return wrap (Sub);
1050
1091
}
1051
1092
0 commit comments