Index: llvm/trunk/lib/CodeGen/StackProtector.cpp =================================================================== --- llvm/trunk/lib/CodeGen/StackProtector.cpp +++ llvm/trunk/lib/CodeGen/StackProtector.cpp @@ -24,6 +24,7 @@ #include "llvm/IR/Attributes.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DebugInfo.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalValue.h" @@ -447,6 +448,7 @@ LLVMContext &Context = F->getContext(); BasicBlock *FailBB = BasicBlock::Create(Context, "CallStackCheckFailBlk", F); IRBuilder<> B(FailBB); + B.SetCurrentDebugLocation(DebugLoc::get(0, 0, F->getSubprogram())); if (Trip.isOSOpenBSD()) { Constant *StackChkFail = M->getOrInsertFunction("__stack_smash_handler", Index: llvm/trunk/test/CodeGen/X86/stack-protector.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/stack-protector.ll +++ llvm/trunk/test/CodeGen/X86/stack-protector.ll @@ -3880,6 +3880,17 @@ ret i32 %call } +define void @__stack_chk_fail() #1 !dbg !6 { +entry: + ret void +} + +define void @test32() #1 !dbg !7 { +entry: + %0 = alloca [5 x i8], align 1 + ret void +} + declare double @testi_aux() declare i8* @strcpy(i8*, i8*) declare i32 @printf(i8*, ...) @@ -3899,3 +3910,16 @@ attributes #3 = { ssp "stack-protector-buffer-size"="33" } attributes #4 = { ssp "stack-protector-buffer-size"="5" } attributes #5 = { ssp "stack-protector-buffer-size"="6" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} +!llvm.ident = !{!5} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1) +!1 = !DIFile(filename: "test.c", directory: "/tmp") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{!"clang version x.y.z"} +!6 = distinct !DISubprogram(name: "__stack_chk_fail", scope: !1, unit: !0) +!7 = distinct !DISubprogram(name: "foo", scope: !1, unit: !0)