]> granicus.if.org Git - llvm/commitdiff
[codeview] make DbgVariableLocation::extractFromMachineInstruction use Optional
authorBob Haarman <llvm@inglorion.net>
Wed, 30 Aug 2017 17:50:21 +0000 (17:50 +0000)
committerBob Haarman <llvm@inglorion.net>
Wed, 30 Aug 2017 17:50:21 +0000 (17:50 +0000)
Summary:
DbgVariableLocation::extractFromMachineInstruction originally
returned a boolean indicating success. This change makes it return
an Optional<DbgVariableLocation> so we cannot try to access the fields
of the struct if they aren't valid.

Reviewers: aprantl, rnk, zturner

Subscribers: llvm-commits, hiraditya

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312143 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
lib/CodeGen/AsmPrinter/DebugHandlerBase.h

index 0b7fdfdda2a6ce6c2ec6156a6e7b651b7a9e20a4..e0f11714b84ceccf759898822129db43c00dadfa 100644 (file)
@@ -960,11 +960,9 @@ void CodeViewDebug::calculateRanges(
     assert(DVInst->isDebugValue() && "Invalid History entry");
     // FIXME: Find a way to represent constant variables, since they are
     // relatively common.
-    DbgVariableLocation Location;
-    bool Supported =
-        DbgVariableLocation::extractFromMachineInstruction(Location, *DVInst);
-    // If not Supported, don't even look at Location because it's invalid.
-    if (!Supported)
+    Optional<DbgVariableLocation> Location =
+        DbgVariableLocation::extractFromMachineInstruction(*DVInst);
+    if (!Location)
       continue;
 
     // Because we cannot express DW_OP_deref in CodeView directly,
@@ -975,13 +973,13 @@ void CodeViewDebug::calculateRanges(
       // we need to remove a level of indirection from incoming locations.
       // E.g. [RSP+8] with DW_OP_deref becomes [RSP+8],
       // and [RCX+0] without DW_OP_deref becomes RCX.
-      if (!Location.Deref) {
-        if (Location.InMemory)
-          Location.InMemory = false;
+      if (!Location->Deref) {
+        if (Location->InMemory)
+          Location->InMemory = false;
         else
-          Supported = false;
+          continue;
       }
-    } else if (Location.Deref) {
+    } else if (Location->Deref) {
       // We've encountered a Deref range when we had not applied the
       // reference encoding. Start over using reference encoding.
       Var.Deref = true;
@@ -991,19 +989,18 @@ void CodeViewDebug::calculateRanges(
     }
 
     // If we don't know how to handle this range, skip past it.
-    if (!Supported || Location.Register == 0 ||
-        (Location.Offset && !Location.InMemory))
+    if (Location->Register == 0 || (Location->Offset && !Location->InMemory))
       continue;
 
     // Handle the two cases we can handle: indirect in memory and in register.
     {
       LocalVarDefRange DR;
-      DR.CVRegister = TRI->getCodeViewRegNum(Location.Register);
-      DR.InMemory = Location.InMemory;
-      DR.DataOffset = Location.Offset;
-      if (Location.FragmentInfo) {
+      DR.CVRegister = TRI->getCodeViewRegNum(Location->Register);
+      DR.InMemory = Location->InMemory;
+      DR.DataOffset = Location->Offset;
+      if (Location->FragmentInfo) {
         DR.IsSubfield = true;
-        DR.StructOffset = Location.FragmentInfo->OffsetInBits / 8;
+        DR.StructOffset = Location->FragmentInfo->OffsetInBits / 8;
       } else {
         DR.IsSubfield = false;
         DR.StructOffset = 0;
index 2a3c0d7e4c4152a97d08afe6013b5c44d5875311..ee8b38f6502a03d0b579a80b1d9a2e1b1abbe5dd 100644 (file)
@@ -13,6 +13,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "DebugHandlerBase.h"
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineInstr.h"
 
 using namespace llvm;
 
-bool DbgVariableLocation::extractFromMachineInstruction(
-    DbgVariableLocation &Location, const MachineInstr &Instruction) {
+Optional<DbgVariableLocation>
+DbgVariableLocation::extractFromMachineInstruction(
+    const MachineInstr &Instruction) {
+  DbgVariableLocation Location;
   if (!Instruction.isDebugValue())
-    return false;
+    return None;
   if (!Instruction.getOperand(0).isReg())
-    return false;
+    return None;
   Location.Register = Instruction.getOperand(0).getReg();
   Location.InMemory = Instruction.getOperand(1).isImm();
   Location.Deref = false;
@@ -66,13 +70,13 @@ bool DbgVariableLocation::extractFromMachineInstruction(
       Location.Deref = true;
       break;
     default:
-      return false;
+      return None;
     }
     ++Op;
   }
 
   Location.Offset = Offset;
-  return true;
+  return Location;
 }
 
 DebugHandlerBase::DebugHandlerBase(AsmPrinter *A) : Asm(A), MMI(Asm->MMI) {}
index 670300cd7a61996ec20a7564e9e5ceac6ca98d51..90f8287e76e7be19ce60f062b3c554e3d5ad0731 100644 (file)
@@ -47,12 +47,13 @@ struct DbgVariableLocation {
   /// Present if the location is part of a larger variable.
   llvm::Optional<llvm::DIExpression::FragmentInfo> FragmentInfo;
 
-  /// Extract a VariableLocation from a MachineInstr.  The struct passed in as
-  /// Location is populated.  The MachineInstr must be a debug value
-  /// instruction.
-  /// @return true if successful and false if not.
-  static bool extractFromMachineInstruction(DbgVariableLocation &Location,
-                                            const MachineInstr &Instruction);
+  /// Extract a VariableLocation from a MachineInstr.
+  /// This will only work if Instruction is a debug value instruction
+  /// and the associated DIExpression is in one of the supported forms.
+  /// If these requirements are not met, the returned Optional will not
+  /// have a value.
+  static Optional<DbgVariableLocation>
+  extractFromMachineInstruction(const MachineInstr &Instruction);
 };
 
 /// Base class for debug information backends. Common functionality related to