mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[MIR] Print target-specific constant pools
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 llvm-svn: 309806
This commit is contained in:
parent
5fb3ff85de
commit
cba6da467a
@ -310,9 +310,11 @@ struct MachineConstantPoolValue {
|
|||||||
UnsignedValue ID;
|
UnsignedValue ID;
|
||||||
StringValue Value;
|
StringValue Value;
|
||||||
unsigned Alignment = 0;
|
unsigned Alignment = 0;
|
||||||
|
bool IsTargetSpecific = false;
|
||||||
bool operator==(const MachineConstantPoolValue &Other) const {
|
bool operator==(const MachineConstantPoolValue &Other) const {
|
||||||
return ID == Other.ID && Value == Other.Value &&
|
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.mapRequired("id", Constant.ID);
|
||||||
YamlIO.mapOptional("value", Constant.Value, StringValue());
|
YamlIO.mapOptional("value", Constant.Value, StringValue());
|
||||||
YamlIO.mapOptional("alignment", Constant.Alignment, (unsigned)0);
|
YamlIO.mapOptional("alignment", Constant.Alignment, (unsigned)0);
|
||||||
|
YamlIO.mapOptional("isTargetSpecific", Constant.IsTargetSpecific, false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -719,6 +719,10 @@ bool MIRParserImpl::initializeConstantPool(PerFunctionMIParsingState &PFS,
|
|||||||
const auto &M = *MF.getFunction()->getParent();
|
const auto &M = *MF.getFunction()->getParent();
|
||||||
SMDiagnostic Error;
|
SMDiagnostic Error;
|
||||||
for (const auto &YamlConstant : YamlMF.Constants) {
|
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>(
|
const Constant *Value = dyn_cast_or_null<Constant>(
|
||||||
parseConstantValue(YamlConstant.Value.Value, Error, M));
|
parseConstantValue(YamlConstant.Value.Value, Error, M));
|
||||||
if (!Value)
|
if (!Value)
|
||||||
|
@ -458,17 +458,20 @@ void MIRPrinter::convert(yaml::MachineFunction &MF,
|
|||||||
const MachineConstantPool &ConstantPool) {
|
const MachineConstantPool &ConstantPool) {
|
||||||
unsigned ID = 0;
|
unsigned ID = 0;
|
||||||
for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
|
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;
|
std::string Str;
|
||||||
raw_string_ostream StrOS(Str);
|
raw_string_ostream StrOS(Str);
|
||||||
|
if (Constant.isMachineConstantPoolEntry()) {
|
||||||
|
Constant.Val.MachineCPVal->print(StrOS);
|
||||||
|
} else {
|
||||||
Constant.Val.ConstVal->printAsOperand(StrOS);
|
Constant.Val.ConstVal->printAsOperand(StrOS);
|
||||||
|
}
|
||||||
|
|
||||||
|
yaml::MachineConstantPoolValue YamlConstant;
|
||||||
YamlConstant.ID = ID++;
|
YamlConstant.ID = ID++;
|
||||||
YamlConstant.Value = StrOS.str();
|
YamlConstant.Value = StrOS.str();
|
||||||
YamlConstant.Alignment = Constant.getAlignment();
|
YamlConstant.Alignment = Constant.getAlignment();
|
||||||
|
YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
|
||||||
|
|
||||||
MF.Constants.push_back(YamlConstant);
|
MF.Constants.push_back(YamlConstant);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
test/CodeGen/MIR/ARM/target-constant-pools-error.mir
Normal file
27
test/CodeGen/MIR/ARM/target-constant-pools-error.mir
Normal file
@ -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
|
||||||
|
|
||||||
|
...
|
@ -46,9 +46,11 @@
|
|||||||
# CHECK-NEXT: - id: 0
|
# CHECK-NEXT: - id: 0
|
||||||
# CHECK-NEXT: value: 'double 3.250000e+00'
|
# CHECK-NEXT: value: 'double 3.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 8
|
# CHECK-NEXT: alignment: 8
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
# CHECK-NEXT: - id: 1
|
# CHECK-NEXT: - id: 1
|
||||||
# CHECK-NEXT: value: 'float 6.250000e+00'
|
# CHECK-NEXT: value: 'float 6.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 4
|
# CHECK-NEXT: alignment: 4
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
name: test
|
name: test
|
||||||
constants:
|
constants:
|
||||||
- id: 0
|
- id: 0
|
||||||
@ -74,9 +76,11 @@ body: |
|
|||||||
# CHECK-NEXT: - id: 0
|
# CHECK-NEXT: - id: 0
|
||||||
# CHECK-NEXT: value: 'double 3.250000e+00'
|
# CHECK-NEXT: value: 'double 3.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 8
|
# CHECK-NEXT: alignment: 8
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
# CHECK-NEXT: - id: 1
|
# CHECK-NEXT: - id: 1
|
||||||
# CHECK-NEXT: value: 'float 6.250000e+00'
|
# CHECK-NEXT: value: 'float 6.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 4
|
# CHECK-NEXT: alignment: 4
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
name: test2
|
name: test2
|
||||||
constants:
|
constants:
|
||||||
- id: 0
|
- id: 0
|
||||||
@ -98,9 +102,11 @@ body: |
|
|||||||
# CHECK-NEXT: - id: 0
|
# CHECK-NEXT: - id: 0
|
||||||
# CHECK-NEXT: value: 'double 3.250000e+00'
|
# CHECK-NEXT: value: 'double 3.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 128
|
# CHECK-NEXT: alignment: 128
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
# CHECK-NEXT: - id: 1
|
# CHECK-NEXT: - id: 1
|
||||||
# CHECK-NEXT: value: 'float 6.250000e+00'
|
# CHECK-NEXT: value: 'float 6.250000e+00'
|
||||||
# CHECK-NEXT: alignment: 1
|
# CHECK-NEXT: alignment: 1
|
||||||
|
# CHECK-NEXT: isTargetSpecific: false
|
||||||
name: test3
|
name: test3
|
||||||
constants:
|
constants:
|
||||||
- id: 0
|
- id: 0
|
||||||
|
Loading…
Reference in New Issue
Block a user