]> git.saurik.com Git - apple/ld64.git/blobdiff - src/ld/passes/tlvp.cpp
ld64-264.3.102.tar.gz
[apple/ld64.git] / src / ld / passes / tlvp.cpp
index eed532e6daab753c2d0df450872c68cb0f4b26a6..aec956271d3aa074ab1af8ab719ea296c22061f5 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <vector>
 #include <map>
-#include <ext/hash_map>
 
 #include "ld.hpp"
 #include "tlvp.h"
@@ -49,7 +48,7 @@ public:
                                                        symbolTableNotIn, false, false, false, ld::Atom::Alignment(3)), 
                                _fixup(0, ld::Fixup::k1of1, ld::Fixup::kindStoreTargetAddressLittleEndian64, target),
                                _target(target)
-                                       { _fixup.weakImport = weakImport; internal.addAtom(*this); }
+                                       {       _fixup.weakImport = weakImport; internal.addAtom(*this); }
 
        virtual const ld::File*                                 file() const                                    { return NULL; }
        virtual const char*                                             name() const                                    { return _target->name(); }
@@ -143,6 +142,10 @@ void doPass(const Options& opts, ld::Internal& internal)
                                        case ld::Fixup::kindStoreTargetAddressX86Abs32TLVLoad:
                                        case ld::Fixup::kindStoreX86PCRel32TLVLoad:
                                        case ld::Fixup::kindStoreX86Abs32TLVLoad:
+#if SUPPORT_ARCH_arm64
+                                       case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPage21:
+                                       case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPageOff12:
+#endif
                                                ref.fixupWithTLVStore = fit;
                                                break;
                                        default:
@@ -231,6 +234,14 @@ void doPass(const Options& opts, ld::Internal& internal)
                                case ld::Fixup::kindStoreX86Abs32TLVLoad:
                                        it->fixupWithTLVStore->kind = ld::Fixup::kindStoreX86Abs32TLVLoadNowLEA;
                                        break;
+#if SUPPORT_ARCH_arm64
+                               case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPage21:
+                                       it->fixupWithTLVStore->kind = ld::Fixup::kindStoreTargetAddressARM64TLVPLoadNowLeaPage21;
+                                       break;
+                               case ld::Fixup::kindStoreTargetAddressARM64TLVPLoadPageOff12:
+                                       it->fixupWithTLVStore->kind = ld::Fixup::kindStoreTargetAddressARM64TLVPLoadNowLeaPageOff12;
+                                       break;
+#endif
                                default:
                                        assert(0 && "bad store kind for TLV optimization");
                        }
@@ -254,6 +265,9 @@ void doPass(const Options& opts, ld::Internal& internal)
                        continue;
                for (std::vector<const ld::Atom*>::iterator ait=sect->atoms.begin();  ait != sect->atoms.end(); ++ait) {
                        const ld::Atom* atom = *ait;
+                       if ( ! opts.canUseThreadLocalVariables() ) {
+                               throwf("targeted OS version does not support use of thread local variables in %s", atom->name());
+                       }
                        for (ld::Fixup::iterator fit = atom->fixupsBegin(), end=atom->fixupsEnd(); fit != end; ++fit) {
                                if ( fit->offsetInAtom != 0 ) {
                                        assert(fit->binding == ld::Fixup::bindingDirectlyBound && "thread variable def contains pointer to global");