summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/MIRYamlMapping.h5
-rw-r--r--lib/CodeGen/MIRParser/MIRParser.cpp4
-rw-r--r--lib/CodeGen/MIRPrinter.cpp15
-rw-r--r--test/CodeGen/MIR/ARM/target-constant-pools-error.mir27
-rw-r--r--test/CodeGen/MIR/X86/constant-pool.mir6
5 files changed, 50 insertions, 7 deletions
diff --git a/include/llvm/CodeGen/MIRYamlMapping.h b/include/llvm/CodeGen/MIRYamlMapping.h
index cbd94f1c417..8e2c6149a82 100644
--- a/include/llvm/CodeGen/MIRYamlMapping.h
+++ b/include/llvm/CodeGen/MIRYamlMapping.h
@@ -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);
}
};
diff --git a/lib/CodeGen/MIRParser/MIRParser.cpp b/lib/CodeGen/MIRParser/MIRParser.cpp
index d0b46c4668b..5df8dbce36a 100644
--- a/lib/CodeGen/MIRParser/MIRParser.cpp
+++ b/lib/CodeGen/MIRParser/MIRParser.cpp
@@ -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)
diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp
index b9281b1e5e1..db9ccef8a36 100644
--- a/lib/CodeGen/MIRPrinter.cpp
+++ b/lib/CodeGen/MIRPrinter.cpp
@@ -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
index 00000000000..4fc7ea1f3cd
--- /dev/null
+++ b/test/CodeGen/MIR/ARM/target-constant-pools-error.mir
@@ -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
+
+...
diff --git a/test/CodeGen/MIR/X86/constant-pool.mir b/test/CodeGen/MIR/X86/constant-pool.mir
index 3312e6f67bd..60e12d3ddcd 100644
--- a/test/CodeGen/MIR/X86/constant-pool.mir
+++ b/test/CodeGen/MIR/X86/constant-pool.mir
@@ -46,9 +46,11 @@
# 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