Index: include/llvm/CodeGen/MIRYamlMapping.h =================================================================== --- include/llvm/CodeGen/MIRYamlMapping.h +++ include/llvm/CodeGen/MIRYamlMapping.h @@ -310,9 +310,11 @@ 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 @@ YamlIO.mapRequired("id", Constant.ID); YamlIO.mapOptional("value", Constant.Value, StringValue()); YamlIO.mapOptional("alignment", Constant.Alignment, (unsigned)0); + YamlIO.mapOptional("isTargetSpecific", Constant.IsTargetSpecific); } }; Index: lib/CodeGen/MIRParser/MIRParser.cpp =================================================================== --- lib/CodeGen/MIRParser/MIRParser.cpp +++ lib/CodeGen/MIRParser/MIRParser.cpp @@ -719,6 +719,10 @@ 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( parseConstantValue(YamlConstant.Value.Value, Error, M)); if (!Value) Index: lib/CodeGen/MIRPrinter.cpp =================================================================== --- lib/CodeGen/MIRPrinter.cpp +++ lib/CodeGen/MIRPrinter.cpp @@ -458,17 +458,20 @@ 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); } } Index: test/CodeGen/MIR/ARM/target-constant-pools-error.mir =================================================================== --- /dev/null +++ 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 + +... Index: test/CodeGen/MIR/X86/constant-pool.mir =================================================================== --- test/CodeGen/MIR/X86/constant-pool.mir +++ 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 @@ # 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 @@ # 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