labath added a comment.

I like the solution with multiple value_regs.

However, I am wondering if instead of the various piecemeal maps we couldn't 
just have one uber-map to rule them all. I'm imagining something like

  enum (class?) RegKind { GPR, FPR, XMM, ...};
  struct RegData {
    size_t index;
    StringRef name;
    SmallVector<StringRef> subregs;
  };
  
  map<pair<RegKind, unsigned>, RegData> reg_map = makeRegMap(); // whichever 
kind of a map
  // or possibly, map<RegKind, map<unsigned, RegData>> = ...
  
  for (const auto &kv : reg_map)
    subreg_name_set.insert(kv.second.subregs.begin(), kv.second.subregs.end());
  
  for (const auto &x : llvm::enumerate(regs)) {
    llvm::StringRef reg_name = x.value().name.GetStringRef();
    if (llvm::is_contained(subreg_name_set, reg_name))
      return;
    if (Optional<pair<RegKind, size_t>> reg = get_reg(reg_name))
      reg_map[reg].index = x.index(); 
  }
  
  ...

This would allow us to factor out two tedious jobs (constructing the register 
map and identifying registers) into separate functions, leaving only the only 
(simplified, I hope) core logic for the main function. The `get_reg` function 
could use whichever method is easiest for the translation of register names, or 
even a combination of methods (a StringSwitch for gprs and some consume_fronts 
for the regularly-named registers).

WDYT?



================
Comment at: lldb/source/Plugins/ABI/X86/ABIX86.cpp:171
+      "xmm14",
+      "xmm15",
+  }};
----------------
For a simple list like this, I'd probably remove the trailing comma to have 
clang-format format it more succinctly.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D108937/new/

https://reviews.llvm.org/D108937

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to