[llvm] 4a983b2 - [MC][DWARF] Corrected handling of is_stmt flag in .loc directives

Dmitry Preobrazhensky via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 20 04:00:11 PDT 2020


Author: Dmitry Preobrazhensky
Date: 2020-04-20T13:57:49+03:00
New Revision: 4a983b25bf224b47cd56a53a5f4cbe139dc7a648

URL: https://github.com/llvm/llvm-project/commit/4a983b25bf224b47cd56a53a5f4cbe139dc7a648
DIFF: https://github.com/llvm/llvm-project/commit/4a983b25bf224b47cd56a53a5f4cbe139dc7a648.diff

LOG: [MC][DWARF] Corrected handling of is_stmt flag in .loc directives

According to DWARF standard, is_stmt is a global flag; when set or cleared it should affect subsequent .loc directives.

However llvm assembler handled is_stmt differently: it forced all locations to have is_stmt=1 unless is_stmt was specified explicitly as 0.

The fix utilizes current DWARF state flags to compute correct is_stmt values.

See https://bugs.llvm.org/show_bug.cgi?id=45529 for a detailed issue description.

Reviewers: arsenm, probinson, enderby

Differential Revision: https://reviews.llvm.org/D78102

Added: 
    llvm/test/MC/AsmParser/directive_loc_2.s

Modified: 
    llvm/lib/MC/MCParser/AsmParser.cpp
    llvm/lib/MC/MCParser/MasmParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index 1a38806f1e97..3ae43488e818 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -3528,7 +3528,8 @@ bool AsmParser::parseDirectiveLoc() {
     Lex();
   }
 
-  unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
+  auto PrevFlags = getContext().getCurrentDwarfLoc().getFlags();
+  unsigned Flags = PrevFlags & DWARF2_FLAG_IS_STMT;
   unsigned Isa = 0;
   int64_t Discriminator = 0;
 

diff  --git a/llvm/lib/MC/MCParser/MasmParser.cpp b/llvm/lib/MC/MCParser/MasmParser.cpp
index f1614c41297d..1ef848dd9959 100644
--- a/llvm/lib/MC/MCParser/MasmParser.cpp
+++ b/llvm/lib/MC/MCParser/MasmParser.cpp
@@ -3235,7 +3235,8 @@ bool MasmParser::parseDirectiveLoc() {
     Lex();
   }
 
-  unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
+  auto PrevFlags = getContext().getCurrentDwarfLoc().getFlags();
+  unsigned Flags = PrevFlags & DWARF2_FLAG_IS_STMT;
   unsigned Isa = 0;
   int64_t Discriminator = 0;
 

diff  --git a/llvm/test/MC/AsmParser/directive_loc_2.s b/llvm/test/MC/AsmParser/directive_loc_2.s
new file mode 100644
index 000000000000..aca1e7039e37
--- /dev/null
+++ b/llvm/test/MC/AsmParser/directive_loc_2.s
@@ -0,0 +1,25 @@
+# RUN: llvm-mc -triple i386-unknown-unknown -filetype=obj %s -o %t
+# RUN: llvm-dwarfdump -debug-line %t | FileCheck %s
+
+        .file 1 "test.c"
+        .loc 1 2
+        nop
+        .loc 1 4 is_stmt 0
+        nop
+        .loc 1 6
+        nop
+        .loc 1 8 is_stmt 1
+        nop
+        .loc 1 10
+        nop
+
+# CHECK: .debug_line
+# CHECK: file_names[ 1]:
+# CHECK-NEXT: name: "test.c"
+# CHECK-NEXT: dir_index: 0
+# CHECK: 0x{{0+}}0 2 0 1 0 0 is_stmt
+# CHECK: 0x{{0+}}1 4 0 1 0 0 {{$}}
+# CHECK: 0x{{0+}}2 6 0 1 0 0 {{$}}
+# CHECK: 0x{{0+}}3 8 0 1 0 0 is_stmt
+# CHECK: 0x{{0+}}4 10 0 1 0 0 is_stmt
+# CHECK: 0x{{0+}}5 10 0 1 0 0 is_stmt end_sequence


        


More information about the llvm-commits mailing list