--- Reverse-merging r80147 into '.':
[oota-llvm.git] / lib / CodeGen / AsmPrinter / AsmPrinter.cpp
index c8099c8b18880dfe92e9aca5f1df66efcbe278f7..6b773c2e0208f91f8702962d60eadbdafdd51602 100644 (file)
@@ -604,6 +604,186 @@ void AsmPrinter::EOL(const char* Comment) const {
   O << '\n';
 }
 
+static const char *GetDataFormatName(unsigned DataFormat) {
+#ifndef HAVE_DESIGNATED_INITIALIZERS
+#define HAVE_DESIGNATED_INITIALIZERS                \
+  ((!defined(__cplusplus) && (GCC_VERSION >= 2007)) \
+   || (__STDC_VERSION__ >= 199901L))
+#endif
+
+#if HAVE_DESIGNATED_INITIALIZERS
+#define S(p, v)  [p] = v,
+#else
+#define S(p, v)  case p: return v;
+#endif
+
+#if HAVE_DESIGNATED_INITIALIZERS
+  __extension__ static const char * const FormatNames[256] = {
+#else
+  switch (DataFormat) {
+#endif
+
+  S(dwarf::DW_EH_PE_absptr,  "absolute")
+  S(dwarf::DW_EH_PE_omit,    "omit")
+  S(dwarf::DW_EH_PE_aligned, "aligned absolute")
+
+  S(dwarf::DW_EH_PE_uleb128, "uleb128")
+  S(dwarf::DW_EH_PE_udata2,  "udata2")
+  S(dwarf::DW_EH_PE_udata4,  "udata4")
+  S(dwarf::DW_EH_PE_udata8,  "udata8")
+  S(dwarf::DW_EH_PE_sleb128, "sleb128")
+  S(dwarf::DW_EH_PE_sdata2,  "sdata2")
+  S(dwarf::DW_EH_PE_sdata4,  "sdata4")
+  S(dwarf::DW_EH_PE_sdata8,  "sdata8")
+
+  S(dwarf::DW_EH_PE_absptr  | dwarf::DW_EH_PE_pcrel,   "pcrel")
+  S(dwarf::DW_EH_PE_uleb128 | dwarf::DW_EH_PE_pcrel,   "pcrel uleb128")
+  S(dwarf::DW_EH_PE_udata2  | dwarf::DW_EH_PE_pcrel,   "pcrel udata2")
+  S(dwarf::DW_EH_PE_udata4  | dwarf::DW_EH_PE_pcrel,   "pcrel udata4")
+  S(dwarf::DW_EH_PE_udata8  | dwarf::DW_EH_PE_pcrel,   "pcrel udata8")
+  S(dwarf::DW_EH_PE_sleb128 | dwarf::DW_EH_PE_pcrel,   "pcrel sleb128")
+  S(dwarf::DW_EH_PE_sdata2  | dwarf::DW_EH_PE_pcrel,   "pcrel sdata2")
+  S(dwarf::DW_EH_PE_sdata4  | dwarf::DW_EH_PE_pcrel,   "pcrel sdata4")
+  S(dwarf::DW_EH_PE_sdata8  | dwarf::DW_EH_PE_pcrel,   "pcrel sdata8")
+
+  S(dwarf::DW_EH_PE_absptr  | dwarf::DW_EH_PE_textrel, "textrel")
+  S(dwarf::DW_EH_PE_uleb128 | dwarf::DW_EH_PE_textrel, "textrel uleb128")
+  S(dwarf::DW_EH_PE_udata2  | dwarf::DW_EH_PE_textrel, "textrel udata2")
+  S(dwarf::DW_EH_PE_udata4  | dwarf::DW_EH_PE_textrel, "textrel udata4")
+  S(dwarf::DW_EH_PE_udata8  | dwarf::DW_EH_PE_textrel, "textrel udata8")
+  S(dwarf::DW_EH_PE_sleb128 | dwarf::DW_EH_PE_textrel, "textrel sleb128")
+  S(dwarf::DW_EH_PE_sdata2  | dwarf::DW_EH_PE_textrel, "textrel sdata2")
+  S(dwarf::DW_EH_PE_sdata4  | dwarf::DW_EH_PE_textrel, "textrel sdata4")
+  S(dwarf::DW_EH_PE_sdata8  | dwarf::DW_EH_PE_textrel, "textrel sdata8")
+
+  S(dwarf::DW_EH_PE_absptr  | dwarf::DW_EH_PE_datarel, "datarel")
+  S(dwarf::DW_EH_PE_uleb128 | dwarf::DW_EH_PE_datarel, "datarel uleb128")
+  S(dwarf::DW_EH_PE_udata2  | dwarf::DW_EH_PE_datarel, "datarel udata2")
+  S(dwarf::DW_EH_PE_udata4  | dwarf::DW_EH_PE_datarel, "datarel udata4")
+  S(dwarf::DW_EH_PE_udata8  | dwarf::DW_EH_PE_datarel, "datarel udata8")
+  S(dwarf::DW_EH_PE_sleb128 | dwarf::DW_EH_PE_datarel, "datarel sleb128")
+  S(dwarf::DW_EH_PE_sdata2  | dwarf::DW_EH_PE_datarel, "datarel sdata2")
+  S(dwarf::DW_EH_PE_sdata4  | dwarf::DW_EH_PE_datarel, "datarel sdata4")
+  S(dwarf::DW_EH_PE_sdata8  | dwarf::DW_EH_PE_datarel, "datarel sdata8")
+
+  S(dwarf::DW_EH_PE_absptr  | dwarf::DW_EH_PE_funcrel, "funcrel")
+  S(dwarf::DW_EH_PE_uleb128 | dwarf::DW_EH_PE_funcrel, "funcrel uleb128")
+  S(dwarf::DW_EH_PE_udata2  | dwarf::DW_EH_PE_funcrel, "funcrel udata2")
+  S(dwarf::DW_EH_PE_udata4  | dwarf::DW_EH_PE_funcrel, "funcrel udata4")
+  S(dwarf::DW_EH_PE_udata8  | dwarf::DW_EH_PE_funcrel, "funcrel udata8")
+  S(dwarf::DW_EH_PE_sleb128 | dwarf::DW_EH_PE_funcrel, "funcrel sleb128")
+  S(dwarf::DW_EH_PE_sdata2  | dwarf::DW_EH_PE_funcrel, "funcrel sdata2")
+  S(dwarf::DW_EH_PE_sdata4  | dwarf::DW_EH_PE_funcrel, "funcrel sdata4")
+  S(dwarf::DW_EH_PE_sdata8  | dwarf::DW_EH_PE_funcrel, "funcrel sdata8")
+
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_absptr  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_uleb128 |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel uleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata2  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel udata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata4  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel udata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata8  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel udata8")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sleb128 |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel sleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata2  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel sdata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata4  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel sdata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata8  |dwarf::DW_EH_PE_pcrel,
+    "indirect pcrel sdata8")
+
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_absptr  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_uleb128 |dwarf::DW_EH_PE_textrel,
+    "indirect textrel uleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata2  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel udata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata4  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel udata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata8  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel udata8")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sleb128 |dwarf::DW_EH_PE_textrel,
+    "indirect textrel sleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata2  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel sdata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata4  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel sdata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata8  |dwarf::DW_EH_PE_textrel,
+    "indirect textrel sdata8")
+
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_absptr  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_uleb128 |dwarf::DW_EH_PE_datarel,
+    "indirect datarel uleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata2  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel udata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata4  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel udata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata8  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel udata8")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sleb128 |dwarf::DW_EH_PE_datarel,
+    "indirect datarel sleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata2  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel sdata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata4  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel sdata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata8  |dwarf::DW_EH_PE_datarel,
+    "indirect datarel sdata8")
+
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_absptr  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_uleb128 |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel uleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata2  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel udata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata4  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel udata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_udata8  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel udata8")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sleb128 |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel sleb128")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata2  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel sdata2")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata4  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel sdata4")
+  S(dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_sdata8  |dwarf::DW_EH_PE_funcrel,
+    "indirect funcrel sdata8")
+
+#if HAVE_DESIGNATED_INITIALIZERS
+  };
+
+  assert(DataFormat >= 0 && DataFormat < 0x100 && FormatNames[DataFormat] &&
+         "Invalid DWARF data format!");
+  return FormatNames[DataFormat];
+#else
+  }
+  llvm_unreachable("Invalid DWARF data format!");
+  return 0;
+#endif
+#undef HAVE_DESIGNATED_INITIALIZERS
+}
+
+void AsmPrinter::EOL(const std::string &Comment, unsigned DataFormat) const {
+  if (VerboseAsm && !Comment.empty()) {
+    O.PadToColumn(MAI->getCommentColumn());
+    O << MAI->getCommentString()
+      << ' ' << Comment << " (" << GetDataFormatName(DataFormat) << ')'; 
+  }
+  O << '\n';
+}
+
+void AsmPrinter::EOL(const char* Comment, unsigned DataFormat) const {
+  if (VerboseAsm && *Comment) {
+    O.PadToColumn(MAI->getCommentColumn());
+    O << MAI->getCommentString()
+      << ' ' << Comment << " (" << GetDataFormatName(DataFormat) << ')'; 
+  }
+  O << '\n';
+}
+
 /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
 /// unsigned leb128 value.
 void AsmPrinter::EmitULEB128Bytes(unsigned Value) const {