]> granicus.if.org Git - llvm/commitdiff
[MIR] Print target-specific constant pools
authorDiana Picus <diana.picus@linaro.org>
Wed, 2 Aug 2017 11:09:30 +0000 (11:09 +0000)
committerDiana Picus <diana.picus@linaro.org>
Wed, 2 Aug 2017 11:09:30 +0000 (11:09 +0000)
This should enable us to test the generation of target-specific constant
pools, e.g. for ARM:

constants:
 - id:              0
   value:           'g(GOT_PREL)-(LPC0+8-.)'
   alignment:       4
   isTargetSpecific: true

I intend to use this to test PIC support in GlobalISel for ARM.

This is difficult to test outside of that context, since the existing
MIR tests usually rely on parser support as well, and that seems a bit
trickier to add. We could try to add a unit test, but the setup for that
seems rather convoluted and overkill.

We do test however that the parser reports a nice error when
encountering a target-specific constant pool.

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

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

include/llvm/CodeGen/MIRYamlMapping.h
lib/CodeGen/MIRParser/MIRParser.cpp
lib/CodeGen/MIRPrinter.cpp
test/CodeGen/MIR/ARM/target-constant-pools-error.mir [new file with mode: 0644]
test/CodeGen/MIR/X86/constant-pool.mir

index cbd94f1c41765cbf89df2c70b968098bbe7ccddc..8e2c6149a827109f698ff71a47a36d6f0c8dadf5 100644 (file)
@@ -310,9 +310,11 @@ struct MachineConstantPoolValue {
   UnsignedValue ID;
   StringValue Value;
   unsigned Alignment = 0;
+  bool IsTargetSpecific = false;
   bool operator==(const MachineConstantPoolValue &Other) const {
     return ID == Other.ID && Value == Other.Value &&
-           Alignment == Other.Alignment;
+           Alignment == Other.Alignment &&
+           IsTargetSpecific == Other.IsTargetSpecific;
   }
 };
 
@@ -321,6 +323,7 @@ template <> struct MappingTraits<MachineConstantPoolValue> {
     YamlIO.mapRequired("id", Constant.ID);
     YamlIO.mapOptional("value", Constant.Value, StringValue());
     YamlIO.mapOptional("alignment", Constant.Alignment, (unsigned)0);
+    YamlIO.mapOptional("isTargetSpecific", Constant.IsTargetSpecific, false);
   }
 };
 
index d0b46c4668be93fa1592dbceaab568d4809d9fd2..5df8dbce36a4cfe508998b9973b4cd80d84b101e 100644 (file)
@@ -719,6 +719,10 @@ bool MIRParserImpl::initializeConstantPool(PerFunctionMIParsingState &PFS,
   const auto &M = *MF.getFunction()->getParent();
   SMDiagnostic Error;
   for (const auto &YamlConstant : YamlMF.Constants) {
+    if (YamlConstant.IsTargetSpecific)
+      // FIXME: Support target-specific constant pools
+      return error(YamlConstant.Value.SourceRange.Start,
+                   "Can't parse target-specific constant pool entries yet");
     const Constant *Value = dyn_cast_or_null<Constant>(
         parseConstantValue(YamlConstant.Value.Value, Error, M));
     if (!Value)
index b9281b1e5e1577c0465c53859edc91d79be1ada1..db9ccef8a365c2a98629339c8db16c63456cc986 100644 (file)
@@ -458,17 +458,20 @@ void MIRPrinter::convert(yaml::MachineFunction &MF,
                          const MachineConstantPool &ConstantPool) {
   unsigned ID = 0;
   for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
-    // TODO: Serialize target specific constant pool entries.
-    if (Constant.isMachineConstantPoolEntry())
-      llvm_unreachable("Can't print target specific constant pool entries yet");
-
-    yaml::MachineConstantPoolValue YamlConstant;
     std::string Str;
     raw_string_ostream StrOS(Str);
-    Constant.Val.ConstVal->printAsOperand(StrOS);
+    if (Constant.isMachineConstantPoolEntry()) {
+      Constant.Val.MachineCPVal->print(StrOS);
+    } else {
+      Constant.Val.ConstVal->printAsOperand(StrOS);
+    }
+
+    yaml::MachineConstantPoolValue YamlConstant;
     YamlConstant.ID = ID++;
     YamlConstant.Value = StrOS.str();
     YamlConstant.Alignment = Constant.getAlignment();
+    YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
+
     MF.Constants.push_back(YamlConstant);
   }
 }
diff --git a/test/CodeGen/MIR/ARM/target-constant-pools-error.mir b/test/CodeGen/MIR/ARM/target-constant-pools-error.mir
new file mode 100644 (file)
index 0000000..4fc7ea1
--- /dev/null
@@ -0,0 +1,27 @@
+# RUN: not llc -mtriple arm-unknown -run-pass none -o /dev/null %s 2>&1 | FileCheck %s
+--- |
+  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+
+  @g = private global i32 4
+  define void @target_constant_pool() { ret void }
+...
+---
+name:            target_constant_pool
+tracksRegLiveness: true
+registers:
+  - { id: 0, class: gpr, preferred-register: '' }
+  - { id: 1, class: gpr, preferred-register: '' }
+constants:
+  - id:              0
+  # CHECK: [[@LINE+1]]:22: Can't parse target-specific constant pool entries yet
+    value:           'g-(LPC0+8)'
+    alignment:       4
+    isTargetSpecific: true
+body:             |
+  bb.0.entry:
+    %0 = LDRi12 %const.0, 0, 14, _ :: (load 4 from constant-pool)
+    %1 = PICLDR killed %0, 0, 14, _ :: (dereferenceable load 4 from @g)
+    %r0 = COPY %1
+    BX_RET 14, _, implicit %r0
+
+...
index 3312e6f67bde087a868871f79533582515b52154..60e12d3ddcd979038ea662ddc0c8efcf6acd9ccf 100644 (file)
 # CHECK-NEXT: - id: 0
 # CHECK-NEXT:   value: 'double 3.250000e+00'
 # CHECK-NEXT:   alignment: 8
+# CHECK-NEXT:   isTargetSpecific: false
 # CHECK-NEXT: - id: 1
 # CHECK-NEXT:   value: 'float 6.250000e+00'
 # CHECK-NEXT:   alignment: 4
+# CHECK-NEXT:   isTargetSpecific: false
 name:            test
 constants:
   - id:          0
@@ -74,9 +76,11 @@ body: |
 # CHECK-NEXT: - id: 0
 # CHECK-NEXT:   value: 'double 3.250000e+00'
 # CHECK-NEXT:   alignment: 8
+# CHECK-NEXT:   isTargetSpecific: false
 # CHECK-NEXT: - id: 1
 # CHECK-NEXT:   value: 'float 6.250000e+00'
 # CHECK-NEXT:   alignment: 4
+# CHECK-NEXT:   isTargetSpecific: false
 name:            test2
 constants:
   - id:          0
@@ -98,9 +102,11 @@ body: |
 # CHECK-NEXT: - id: 0
 # CHECK-NEXT:   value: 'double 3.250000e+00'
 # CHECK-NEXT:   alignment: 128
+# CHECK-NEXT:   isTargetSpecific: false
 # CHECK-NEXT: - id: 1
 # CHECK-NEXT:   value: 'float 6.250000e+00'
 # CHECK-NEXT:   alignment: 1
+# CHECK-NEXT:   isTargetSpecific: false
 name:            test3
 constants:
   - id:          0