@@ -268,10 +268,6 @@ Expected<DataLayout> DataLayout::parse(StringRef LayoutString) {
268
268
return Layout;
269
269
}
270
270
271
- static Error reportError (const Twine &Message) {
272
- return createStringError (inconvertibleErrorCode (), Message);
273
- }
274
-
275
271
static Error createSpecFormatError (Twine Format) {
276
272
return createStringError (" malformed specification, must be of the form \" " +
277
273
Format + " \" " );
@@ -336,46 +332,6 @@ static Error parseAlignment(StringRef Str, Align &Alignment, StringRef Name,
336
332
return Error::success ();
337
333
}
338
334
339
- // / Checked version of split, to ensure mandatory subparts.
340
- static Error split (StringRef Str, char Separator,
341
- std::pair<StringRef, StringRef> &Split) {
342
- assert (!Str.empty () && " parse error, string can't be empty here" );
343
- Split = Str.split (Separator);
344
- if (Split.second .empty () && Split.first != Str)
345
- return reportError (" Trailing separator in datalayout string" );
346
- if (!Split.second .empty () && Split.first .empty ())
347
- return reportError (" Expected token before separator in datalayout string" );
348
- return Error::success ();
349
- }
350
-
351
- // / Get an unsigned integer, including error checks.
352
- template <typename IntTy> static Error getInt (StringRef R, IntTy &Result) {
353
- bool error = R.getAsInteger (10 , Result); (void )error;
354
- if (error)
355
- return reportError (" not a number, or does not fit in an unsigned int" );
356
- return Error::success ();
357
- }
358
-
359
- // / Get an unsigned integer representing the number of bits and convert it into
360
- // / bytes. Error out of not a byte width multiple.
361
- template <typename IntTy>
362
- static Error getIntInBytes (StringRef R, IntTy &Result) {
363
- if (Error Err = getInt<IntTy>(R, Result))
364
- return Err;
365
- if (Result % 8 )
366
- return reportError (" number of bits must be a byte width multiple" );
367
- Result /= 8 ;
368
- return Error::success ();
369
- }
370
-
371
- static Error getAddrSpace (StringRef R, unsigned &AddrSpace) {
372
- if (Error Err = getInt (R, AddrSpace))
373
- return Err;
374
- if (!isUInt<24 >(AddrSpace))
375
- return reportError (" Invalid address space, must be a 24-bit integer" );
376
- return Error::success ();
377
- }
378
-
379
335
Error DataLayout::parsePrimitiveSpec (StringRef Spec) {
380
336
// [ifv]<size>:<abi>[:<pref>]
381
337
SmallVector<StringRef, 3 > Components;
@@ -536,100 +492,90 @@ Error DataLayout::parseSpecification(StringRef Spec) {
536
492
if (Specifier == ' p' )
537
493
return parsePointerSpec (Spec);
538
494
539
- // Split at ':'.
540
- std::pair<StringRef, StringRef> Split;
541
- if (Error Err = ::split (Spec, ' :' , Split))
542
- return Err;
543
-
544
- // Aliases used below.
545
- StringRef &Tok = Split.first ; // Current token.
546
- StringRef &Rest = Split.second ; // The rest of the string.
547
-
548
- char SpecifierChar = Tok.front ();
549
- Tok = Tok.substr (1 );
550
-
551
- switch (SpecifierChar) {
495
+ StringRef Rest = Spec.drop_front ();
496
+ switch (Specifier) {
552
497
case ' s' :
553
498
// Deprecated, but ignoring here to preserve loading older textual llvm
554
499
// ASM file
555
500
break ;
556
- case ' E' :
557
- BigEndian = true ;
558
- break ;
559
501
case ' e' :
560
- BigEndian = false ;
502
+ case ' E' :
503
+ if (!Rest.empty ())
504
+ return createStringError (
505
+ " malformed specification, must be just 'e' or 'E'" );
506
+ BigEndian = Specifier == ' E' ;
561
507
break ;
562
508
case ' n' : // Native integer types.
563
- while (true ) {
564
- unsigned Width;
565
- if (Error Err = getInt (Tok, Width))
566
- return Err;
567
- if (Width == 0 )
568
- return reportError (
569
- " Zero width native integer type in datalayout string" );
570
- LegalIntWidths.push_back (Width);
571
- if (Rest.empty ())
572
- break ;
573
- if (Error Err = ::split (Rest, ' :' , Split))
509
+ // n<size>[:<size>]...
510
+ for (StringRef Str : split (Rest, ' :' )) {
511
+ unsigned BitWidth;
512
+ if (Error Err = parseSize (Str, BitWidth))
574
513
return Err;
514
+ LegalIntWidths.push_back (BitWidth);
575
515
}
576
516
break ;
577
517
case ' S' : { // Stack natural alignment.
578
- uint64_t Alignment;
579
- if (Error Err = getIntInBytes (Tok, Alignment))
518
+ // S<size>
519
+ if (Rest.empty ())
520
+ return createSpecFormatError (" S<size>" );
521
+ Align Alignment;
522
+ if (Error Err = parseAlignment (Rest, Alignment, " stack natural" ))
580
523
return Err;
581
- if (Alignment != 0 && !llvm::isPowerOf2_64 (Alignment))
582
- return reportError (" Alignment is neither 0 nor a power of 2" );
583
- StackNaturalAlign = MaybeAlign (Alignment);
524
+ StackNaturalAlign = Alignment;
584
525
break ;
585
526
}
586
527
case ' F' : {
587
- switch (Tok.front ()) {
528
+ // F<type><abi>
529
+ if (Rest.empty ())
530
+ return createSpecFormatError (" F<type><abi>" );
531
+ char Type = Rest.front ();
532
+ Rest = Rest.drop_front ();
533
+ switch (Type) {
588
534
case ' i' :
589
535
TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
590
536
break ;
591
537
case ' n' :
592
538
TheFunctionPtrAlignType = FunctionPtrAlignType::MultipleOfFunctionAlign;
593
539
break ;
594
540
default :
595
- return reportError ( " Unknown function pointer alignment type in "
596
- " datalayout string " );
541
+ return createStringError ( " unknown function pointer alignment type ' " +
542
+ Twine (Type) + " ' " );
597
543
}
598
- Tok = Tok.substr (1 );
599
- uint64_t Alignment;
600
- if (Error Err = getIntInBytes (Tok, Alignment))
544
+ Align Alignment;
545
+ if (Error Err = parseAlignment (Rest, Alignment, " ABI" ))
601
546
return Err;
602
- if (Alignment != 0 && !llvm::isPowerOf2_64 (Alignment))
603
- return reportError (" Alignment is neither 0 nor a power of 2" );
604
- FunctionPtrAlign = MaybeAlign (Alignment);
547
+ FunctionPtrAlign = Alignment;
605
548
break ;
606
549
}
607
550
case ' P' : { // Function address space.
608
- if (Error Err = getAddrSpace (Tok, ProgramAddrSpace))
551
+ if (Rest.empty ())
552
+ return createSpecFormatError (" P<address space>" );
553
+ if (Error Err = parseAddrSpace (Rest, ProgramAddrSpace))
609
554
return Err;
610
555
break ;
611
556
}
612
557
case ' A' : { // Default stack/alloca address space.
613
- if (Error Err = getAddrSpace (Tok, AllocaAddrSpace))
558
+ if (Rest.empty ())
559
+ return createSpecFormatError (" A<address space>" );
560
+ if (Error Err = parseAddrSpace (Rest, AllocaAddrSpace))
614
561
return Err;
615
562
break ;
616
563
}
617
564
case ' G' : { // Default address space for global variables.
618
- if (Error Err = getAddrSpace (Tok, DefaultGlobalsAddrSpace))
565
+ if (Rest.empty ())
566
+ return createSpecFormatError (" G<address space>" );
567
+ if (Error Err = parseAddrSpace (Rest, DefaultGlobalsAddrSpace))
619
568
return Err;
620
569
break ;
621
570
}
622
571
case ' m' :
623
- if (!Tok.empty ())
624
- return reportError (" Unexpected trailing characters after mangling "
625
- " specifier in datalayout string" );
626
- if (Rest.empty ())
627
- return reportError (" Expected mangling specifier in datalayout string" );
572
+ if (!Rest.consume_front (" :" ) || Rest.empty ())
573
+ return createSpecFormatError (" m:<mangling>" );
628
574
if (Rest.size () > 1 )
629
- return reportError ( " Unknown mangling specifier in datalayout string " );
575
+ return createStringError ( " unknown mangling mode " );
630
576
switch (Rest[0 ]) {
631
577
default :
632
- return reportError ( " Unknown mangling in datalayout string " );
578
+ return createStringError ( " unknown mangling mode " );
633
579
case ' e' :
634
580
ManglingMode = MM_ELF;
635
581
break ;
@@ -654,7 +600,7 @@ Error DataLayout::parseSpecification(StringRef Spec) {
654
600
}
655
601
break ;
656
602
default :
657
- return reportError ( " Unknown specifier in datalayout string " );
603
+ return createStringError ( " unknown specifier ' " + Twine (Specifier) + " ' " );
658
604
}
659
605
660
606
return Error::success ();
0 commit comments