8
8
9
9
#include " AMDKernelCodeT.h"
10
10
#include " MCTargetDesc/AMDGPUMCExpr.h"
11
+ #include " MCTargetDesc/AMDGPUMCKernelDescriptor.h"
11
12
#include " MCTargetDesc/AMDGPUMCTargetDesc.h"
12
13
#include " MCTargetDesc/AMDGPUTargetStreamer.h"
13
14
#include " SIDefines.h"
@@ -5417,7 +5418,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5417
5418
if (getParser ().parseIdentifier (KernelName))
5418
5419
return true ;
5419
5420
5420
- kernel_descriptor_t KD =
5421
+ AMDGPU::MCKernelDescriptor KD =
5421
5422
getDefaultAmdhsaKernelDescriptor (&getSTI (), getContext ());
5422
5423
5423
5424
StringSet<> Seen;
@@ -5476,11 +5477,13 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5476
5477
#define PARSE_BITS_ENTRY (FIELD, ENTRY, VALUE, RANGE ) \
5477
5478
if (!isUInt<ENTRY##_WIDTH>(Val)) \
5478
5479
return OutOfRangeError (RANGE); \
5479
- kernel_descriptor_t:: bits_set (FIELD, VALUE, ENTRY##_SHIFT, ENTRY, \
5480
- getContext ());
5480
+ AMDGPU::MCKernelDescriptor:: bits_set (FIELD, VALUE, ENTRY##_SHIFT, ENTRY, \
5481
+ getContext ());
5481
5482
5482
- #define EXPR_SHOULD_RESOLVE () \
5483
- if (!EvaluatableExpr) \
5483
+ // Some fields use the parsed value immediately which requires the expression to
5484
+ // be solvable.
5485
+ #define EXPR_RESOLVE_OR_ERROR (RESOLVED ) \
5486
+ if (!(RESOLVED)) \
5484
5487
return Error (IDRange.Start , " directive should have resolvable expression" , \
5485
5488
IDRange);
5486
5489
@@ -5497,10 +5500,10 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5497
5500
return OutOfRangeError (ValRange);
5498
5501
KD.kernarg_size = ExprVal;
5499
5502
} else if (ID == " .amdhsa_user_sgpr_count" ) {
5500
- EXPR_SHOULD_RESOLVE ( );
5503
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5501
5504
ExplicitUserSGPRCount = Val;
5502
5505
} else if (ID == " .amdhsa_user_sgpr_private_segment_buffer" ) {
5503
- EXPR_SHOULD_RESOLVE ( );
5506
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5504
5507
if (hasArchitectedFlatScratch ())
5505
5508
return Error (IDRange.Start ,
5506
5509
" directive is not supported with architected flat scratch" ,
@@ -5511,7 +5514,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5511
5514
if (Val)
5512
5515
ImpliedUserSGPRCount += 4 ;
5513
5516
} else if (ID == " .amdhsa_user_sgpr_kernarg_preload_length" ) {
5514
- EXPR_SHOULD_RESOLVE ( );
5517
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5515
5518
if (!hasKernargPreload ())
5516
5519
return Error (IDRange.Start , " directive requires gfx90a+" , IDRange);
5517
5520
@@ -5524,7 +5527,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5524
5527
PreloadLength = Val;
5525
5528
}
5526
5529
} else if (ID == " .amdhsa_user_sgpr_kernarg_preload_offset" ) {
5527
- EXPR_SHOULD_RESOLVE ( );
5530
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5528
5531
if (!hasKernargPreload ())
5529
5532
return Error (IDRange.Start , " directive requires gfx90a+" , IDRange);
5530
5533
@@ -5535,28 +5538,28 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5535
5538
if (Val)
5536
5539
PreloadOffset = Val;
5537
5540
} else if (ID == " .amdhsa_user_sgpr_dispatch_ptr" ) {
5538
- EXPR_SHOULD_RESOLVE ( );
5541
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5539
5542
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5540
5543
KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR, ExprVal,
5541
5544
ValRange);
5542
5545
if (Val)
5543
5546
ImpliedUserSGPRCount += 2 ;
5544
5547
} else if (ID == " .amdhsa_user_sgpr_queue_ptr" ) {
5545
- EXPR_SHOULD_RESOLVE ( );
5548
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5546
5549
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5547
5550
KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR, ExprVal,
5548
5551
ValRange);
5549
5552
if (Val)
5550
5553
ImpliedUserSGPRCount += 2 ;
5551
5554
} else if (ID == " .amdhsa_user_sgpr_kernarg_segment_ptr" ) {
5552
- EXPR_SHOULD_RESOLVE ( );
5555
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5553
5556
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5554
5557
KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR,
5555
5558
ExprVal, ValRange);
5556
5559
if (Val)
5557
5560
ImpliedUserSGPRCount += 2 ;
5558
5561
} else if (ID == " .amdhsa_user_sgpr_dispatch_id" ) {
5559
- EXPR_SHOULD_RESOLVE ( );
5562
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5560
5563
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5561
5564
KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID, ExprVal,
5562
5565
ValRange);
@@ -5567,21 +5570,21 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5567
5570
return Error (IDRange.Start ,
5568
5571
" directive is not supported with architected flat scratch" ,
5569
5572
IDRange);
5570
- EXPR_SHOULD_RESOLVE ( );
5573
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5571
5574
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5572
5575
KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT,
5573
5576
ExprVal, ValRange);
5574
5577
if (Val)
5575
5578
ImpliedUserSGPRCount += 2 ;
5576
5579
} else if (ID == " .amdhsa_user_sgpr_private_segment_size" ) {
5577
- EXPR_SHOULD_RESOLVE ( );
5580
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5578
5581
PARSE_BITS_ENTRY (KD.kernel_code_properties ,
5579
5582
KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE,
5580
5583
ExprVal, ValRange);
5581
5584
if (Val)
5582
5585
ImpliedUserSGPRCount += 1 ;
5583
5586
} else if (ID == " .amdhsa_wavefront_size32" ) {
5584
- EXPR_SHOULD_RESOLVE ( );
5587
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5585
5588
if (IVersion.Major < 10 )
5586
5589
return Error (IDRange.Start , " directive requires gfx10+" , IDRange);
5587
5590
EnableWavefrontSize32 = Val;
@@ -5630,25 +5633,25 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5630
5633
COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID, ExprVal,
5631
5634
ValRange);
5632
5635
} else if (ID == " .amdhsa_next_free_vgpr" ) {
5633
- EXPR_SHOULD_RESOLVE ( );
5636
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5634
5637
VGPRRange = ValRange;
5635
5638
NextFreeVGPR = Val;
5636
5639
} else if (ID == " .amdhsa_next_free_sgpr" ) {
5637
- EXPR_SHOULD_RESOLVE ( );
5640
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5638
5641
SGPRRange = ValRange;
5639
5642
NextFreeSGPR = Val;
5640
5643
} else if (ID == " .amdhsa_accum_offset" ) {
5641
5644
if (!isGFX90A ())
5642
5645
return Error (IDRange.Start , " directive requires gfx90a+" , IDRange);
5643
- EXPR_SHOULD_RESOLVE ( );
5646
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5644
5647
AccumOffset = Val;
5645
5648
} else if (ID == " .amdhsa_reserve_vcc" ) {
5646
- EXPR_SHOULD_RESOLVE ( );
5649
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5647
5650
if (!isUInt<1 >(Val))
5648
5651
return OutOfRangeError (ValRange);
5649
5652
ReserveVCC = Val;
5650
5653
} else if (ID == " .amdhsa_reserve_flat_scratch" ) {
5651
- EXPR_SHOULD_RESOLVE ( );
5654
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5652
5655
if (IVersion.Major < 7 )
5653
5656
return Error (IDRange.Start , " directive requires gfx7+" , IDRange);
5654
5657
if (hasArchitectedFlatScratch ())
@@ -5724,7 +5727,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5724
5727
COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS, ExprVal,
5725
5728
ValRange);
5726
5729
} else if (ID == " .amdhsa_shared_vgpr_count" ) {
5727
- EXPR_SHOULD_RESOLVE ( );
5730
+ EXPR_RESOLVE_OR_ERROR (EvaluatableExpr );
5728
5731
if (IVersion.Major < 10 || IVersion.Major >= 12 )
5729
5732
return Error (IDRange.Start , " directive requires gfx10 or gfx11" ,
5730
5733
IDRange);
@@ -5793,15 +5796,15 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5793
5796
if (!isUInt<COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_WIDTH>(
5794
5797
VGPRBlocks))
5795
5798
return OutOfRangeError (VGPRRange);
5796
- kernel_descriptor_t ::bits_set (
5799
+ AMDGPU::MCKernelDescriptor ::bits_set (
5797
5800
KD.compute_pgm_rsrc1 , MCConstantExpr::create (VGPRBlocks, getContext ()),
5798
5801
COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT,
5799
5802
COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT, getContext ());
5800
5803
5801
5804
if (!isUInt<COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_WIDTH>(
5802
5805
SGPRBlocks))
5803
5806
return OutOfRangeError (SGPRRange);
5804
- kernel_descriptor_t ::bits_set (
5807
+ AMDGPU::MCKernelDescriptor ::bits_set (
5805
5808
KD.compute_pgm_rsrc1 , MCConstantExpr::create (SGPRBlocks, getContext ()),
5806
5809
COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT,
5807
5810
COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT, getContext ());
@@ -5815,7 +5818,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5815
5818
5816
5819
if (!isUInt<COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_WIDTH>(UserSGPRCount))
5817
5820
return TokError (" too many user SGPRs enabled" );
5818
- kernel_descriptor_t ::bits_set (
5821
+ AMDGPU::MCKernelDescriptor ::bits_set (
5819
5822
KD.compute_pgm_rsrc2 , MCConstantExpr::create (UserSGPRCount, getContext ()),
5820
5823
COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_SHIFT,
5821
5824
COMPUTE_PGM_RSRC2_USER_SGPR_COUNT, getContext ());
@@ -5837,7 +5840,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDHSAKernel() {
5837
5840
" increments of 4" );
5838
5841
if (AccumOffset > alignTo (std::max ((uint64_t )1 , NextFreeVGPR), 4 ))
5839
5842
return TokError (" accum_offset exceeds total VGPR allocation" );
5840
- kernel_descriptor_t ::bits_set (
5843
+ MCKernelDescriptor ::bits_set (
5841
5844
KD.compute_pgm_rsrc3 ,
5842
5845
MCConstantExpr::create (AccumOffset / 4 - 1 , getContext ()),
5843
5846
COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT,
0 commit comments