tberghammer created this revision.
tberghammer added a reviewer: clayborg.
tberghammer added a subscriber: lldb-commits.
Herald added a subscriber: aemerson.

Introduce new address class eAddressClassDataIntermixedCode

It is used for marking data what is intermixed into the code section
on arm/aarch64. It is used during opcode load address calculation to
treat these addresses as code locations.

Treating these addresses as code required because of the following
edge case:

bx <addr>   // Non-tail call in a no return function
[data-pool] // Marked with $d mapping symbol

The return address of the function call will point to the data pool but
we have to treat it as code so the StackFrame can calculate the symbols
correctly.

Note: Other possible solution is to ignore the mapping symbols and decide the 
address class only based on the LSB of the symbol names. It will solve this 
issue, but will throw away some data what might be useful (e.g. to disable 
breakpoint setting in an address section)

http://reviews.llvm.org/D12556

Files:
  include/lldb/lldb-enumerations.h
  source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
  source/Target/Target.cpp

Index: source/Target/Target.cpp
===================================================================
--- source/Target/Target.cpp
+++ source/Target/Target.cpp
@@ -2084,6 +2084,7 @@
         case eAddressClassCode:
         case eAddressClassCodeAlternateISA:
         case eAddressClassRuntime:
+        case eAddressClassDataIntermixedCode:
             // Check if bit zero it no set?
             if ((code_addr & 1ull) == 0)
             {
@@ -2129,6 +2130,7 @@
         case eAddressClassCode:
         case eAddressClassCodeAlternateISA:
         case eAddressClassRuntime:
+        case eAddressClassDataIntermixedCode:
             opcode_addr &= ~(1ull);
             break;
         }
Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
===================================================================
--- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2000,7 +2000,7 @@
                         else if (symbol_name_ref == "$d" || 
symbol_name_ref.startswith("$d."))
                         {
                             // $d[.<any>]* - marks a data item sequence (e.g. 
lit pool)
-                            m_address_class_map[symbol.st_value] = 
eAddressClassData;
+                            m_address_class_map[symbol.st_value] = 
eAddressClassDataIntermixedCode;
                         }
                     }
                     continue;
@@ -2024,7 +2024,7 @@
                         else if (symbol_name_ref == "$d" || 
symbol_name_ref.startswith("$d."))
                         {
                             // $d[.<any>]* - marks a data item sequence (e.g. 
lit pool)
-                            m_address_class_map[symbol.st_value] = 
eAddressClassData;
+                            m_address_class_map[symbol.st_value] = 
eAddressClassDataIntermixedCode;
                         }
                     }
 
Index: include/lldb/lldb-enumerations.h
===================================================================
--- include/lldb/lldb-enumerations.h
+++ include/lldb/lldb-enumerations.h
@@ -781,6 +781,7 @@
         eAddressClassCode,
         eAddressClassCodeAlternateISA,
         eAddressClassData,
+        eAddressClassDataIntermixedCode,
         eAddressClassDebug,
         eAddressClassRuntime
     };


Index: source/Target/Target.cpp
===================================================================
--- source/Target/Target.cpp
+++ source/Target/Target.cpp
@@ -2084,6 +2084,7 @@
         case eAddressClassCode:
         case eAddressClassCodeAlternateISA:
         case eAddressClassRuntime:
+        case eAddressClassDataIntermixedCode:
             // Check if bit zero it no set?
             if ((code_addr & 1ull) == 0)
             {
@@ -2129,6 +2130,7 @@
         case eAddressClassCode:
         case eAddressClassCodeAlternateISA:
         case eAddressClassRuntime:
+        case eAddressClassDataIntermixedCode:
             opcode_addr &= ~(1ull);
             break;
         }
Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
===================================================================
--- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2000,7 +2000,7 @@
                         else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
                         {
                             // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
-                            m_address_class_map[symbol.st_value] = eAddressClassData;
+                            m_address_class_map[symbol.st_value] = eAddressClassDataIntermixedCode;
                         }
                     }
                     continue;
@@ -2024,7 +2024,7 @@
                         else if (symbol_name_ref == "$d" || symbol_name_ref.startswith("$d."))
                         {
                             // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
-                            m_address_class_map[symbol.st_value] = eAddressClassData;
+                            m_address_class_map[symbol.st_value] = eAddressClassDataIntermixedCode;
                         }
                     }
 
Index: include/lldb/lldb-enumerations.h
===================================================================
--- include/lldb/lldb-enumerations.h
+++ include/lldb/lldb-enumerations.h
@@ -781,6 +781,7 @@
         eAddressClassCode,
         eAddressClassCodeAlternateISA,
         eAddressClassData,
+        eAddressClassDataIntermixedCode,
         eAddressClassDebug,
         eAddressClassRuntime
     };
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to