Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: lib/Basic/Targets.cpp

Issue 184973004: Prep for merging 3.4: Undo changes from 3.3 branch (Closed) Base URL: http://git.chromium.org/native_client/pnacl-clang.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/clang/Sema/Template.h ('k') | lib/CodeGen/CGException.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===--- Targets.cpp - Implement -arch option and targets -----------------===// 1 //===--- Targets.cpp - Implement -arch option and targets -----------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements construction of a TargetInfo object from a 10 // This file implements construction of a TargetInfo object from a
(...skipping 3511 matching lines...) Expand 10 before | Expand all | Expand 10 after
3522 3522
3523 unsigned IsAAPCS : 1; 3523 unsigned IsAAPCS : 1;
3524 unsigned IsThumb : 1; 3524 unsigned IsThumb : 1;
3525 3525
3526 // Initialized via features. 3526 // Initialized via features.
3527 unsigned SoftFloat : 1; 3527 unsigned SoftFloat : 1;
3528 unsigned SoftFloatABI : 1; 3528 unsigned SoftFloatABI : 1;
3529 3529
3530 static const Builtin::Info BuiltinInfo[]; 3530 static const Builtin::Info BuiltinInfo[];
3531 3531
3532 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3533 // On linux, binaries targeting old cpus call functions in libgcc to
3534 // perform atomic operations. The implementation in libgcc then calls into
3535 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3536 // is that if we assume the kernel is at least as recent as the hardware,
3537 // it is safe to use atomic instructions on armv6 and newer.
3538 if (T.getOS() != llvm::Triple::Linux)
3539 return false;
3540 StringRef ArchName = T.getArchName();
3541 if (T.getArch() == llvm::Triple::arm) {
3542 if (!ArchName.startswith("armv"))
3543 return false;
3544 StringRef VersionStr = ArchName.substr(4);
3545 unsigned Version;
3546 if (VersionStr.getAsInteger(10, Version))
3547 return false;
3548 return Version >= 6;
3549 }
3550 assert(T.getArch() == llvm::Triple::thumb);
3551 if (!ArchName.startswith("thumbv"))
3552 return false;
3553 StringRef VersionStr = ArchName.substr(6);
3554 unsigned Version;
3555 if (VersionStr.getAsInteger(10, Version))
3556 return false;
3557 return Version >= 7;
3558 }
3559
3560 public: 3532 public:
3561 ARMTargetInfo(const std::string &TripleStr) 3533 ARMTargetInfo(const std::string &TripleStr)
3562 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true ) 3534 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true )
3563 { 3535 {
3564 BigEndian = false; 3536 BigEndian = false;
3565 SizeType = UnsignedInt; 3537 SizeType = UnsignedInt;
3566 PtrDiffType = SignedInt; 3538 PtrDiffType = SignedInt;
3567 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 3539 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3568 WCharType = UnsignedInt; 3540 WCharType = UnsignedInt;
3569 3541
(...skipping 12 matching lines...) Expand all
3582 } else { 3554 } else {
3583 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3555 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3584 "i64:64:64-f32:32:32-f64:64:64-" 3556 "i64:64:64-f32:32:32-f64:64:64-"
3585 "v64:64:64-v128:64:128-a0:0:64-n32-S64"); 3557 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
3586 } 3558 }
3587 3559
3588 // ARM targets default to using the ARM C++ ABI. 3560 // ARM targets default to using the ARM C++ ABI.
3589 TheCXXABI.set(TargetCXXABI::GenericARM); 3561 TheCXXABI.set(TargetCXXABI::GenericARM);
3590 3562
3591 // ARM has atomics up to 8 bytes 3563 // ARM has atomics up to 8 bytes
3564 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3592 MaxAtomicPromoteWidth = 64; 3565 MaxAtomicPromoteWidth = 64;
3593 if (shouldUseInlineAtomic(getTriple()))
3594 MaxAtomicInlineWidth = 64;
3595 3566
3596 // Do force alignment of members that follow zero length bitfields. If 3567 // Do force alignment of members that follow zero length bitfields. If
3597 // the alignment of the zero-length bitfield is greater than the member 3568 // the alignment of the zero-length bitfield is greater than the member
3598 // that follows it, `bar', `bar' will be aligned as the type of the 3569 // that follows it, `bar', `bar' will be aligned as the type of the
3599 // zero length bitfield. 3570 // zero length bitfield.
3600 UseZeroLengthBitfieldAlignment = true; 3571 UseZeroLengthBitfieldAlignment = true;
3601 } 3572 }
3602 virtual const char *getABI() const { return ABI.c_str(); } 3573 virtual const char *getABI() const { return ABI.c_str(); }
3603 virtual bool setABI(const std::string &Name) { 3574 virtual bool setABI(const std::string &Name) {
3604 ABI = Name; 3575 ABI = Name;
(...skipping 1977 matching lines...) Expand 10 before | Expand all | Expand 10 after
5582 // FIXME: If we are completely confident that we have the right set, we only 5553 // FIXME: If we are completely confident that we have the right set, we only
5583 // need to pass the minuses. 5554 // need to pass the minuses.
5584 Opts->Features.clear(); 5555 Opts->Features.clear();
5585 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), 5556 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5586 ie = Features.end(); it != ie; ++it) 5557 ie = Features.end(); it != ie; ++it)
5587 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str()); 5558 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5588 Target->HandleTargetFeatures(Opts->Features); 5559 Target->HandleTargetFeatures(Opts->Features);
5589 5560
5590 return Target.take(); 5561 return Target.take();
5591 } 5562 }
OLDNEW
« no previous file with comments | « include/clang/Sema/Template.h ('k') | lib/CodeGen/CGException.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698