1 // PR rtl-optimization/56999
3 // { dg-options "-O2" }
4 // { dg-additional-options "-fpic" { target fpic } }
5 // { dg-additional-options "-march=i686 -mtune=atom" { target ia32 } }
6 // { dg-require-visibility "" }
8 extern "C" void abort (void);
9 extern "C" void exit (int);
10 volatile bool do_exit = true;
12 struct JITScript { int i; };
13 #pragma GCC visibility push(hidden)
14 typedef struct JSCompartment JSCompartment;
15 typedef struct JSContext JSContext;
18 struct ContextFriendFields
20 JSCompartment *compartment;
22 struct TempAllocPolicy
29 T *begin () { return mBegin; }
30 T & operator[] (unsigned i) { return begin ()[i]; }
32 __attribute__((noinline, noclone))
33 bool append (U) { asm volatile ("" : : : "memory"); if (do_exit) abort (); return false; }
37 struct TypeCompartment;
50 enum Kind { MethodJIT, ParallelIon };
53 bool constructing : 1;
55 bool pendingRecompilation : 1;
56 Kind kind () const { return static_cast <Kind> (kindInt); }
57 bool isValid () const;
62 CompilerOutput *compilerOutput (TypeCompartment & types) const;
63 CompilerOutput *compilerOutput (JSContext *cx) const;
65 struct TypeCompartment
67 Vector <CompilerOutput> *constrainedOutputs;
68 Vector <RecompileInfo> *pendingRecompiles;
69 void addPendingRecompile (JSContext *cx, const RecompileInfo & info);
75 struct JITScriptHandle
77 static volatile JITScript *UNJITTABLE __attribute__((visibility ("default")));
79 bool isValid () { return value != UNJITTABLE; }
80 JITScript *getValid () { return value; }
84 JITScriptHandle jitHandleNormal, jitHandleNormalBarriered;
85 JITScriptHandle jitHandleCtor, jitHandleCtorBarriered;
86 JITScriptHandle jitNull1, jitNull2;
88 JITScriptSet *mJITInfo;
90 JITScriptHandle *jitHandle (bool constructing, bool barriers)
92 return constructing ? (barriers ? &mJITInfo->jitHandleCtorBarriered
93 : &mJITInfo->jitHandleCtor)
94 : (barriers ? &mJITInfo->jitHandleNormalBarriered
95 : &mJITInfo->jitHandleNormal);
97 JITScript *getJIT (bool constructing, bool barriers)
99 JITScriptHandle *jith = jitHandle (constructing, barriers);
100 return jith->isValid () ? jith->getValid () : __null;
103 struct JSContext : js::ContextFriendFields
108 __attribute__((noinline, noclone))
109 void CancelOffThreadIonCompile (JSCompartment *, JSScript *)
117 js::types::TypeCompartment types;
123 inline bool CompilerOutput::isValid () const
131 JITScript *jit = script->getJIT (constructing, barriers);
140 inline CompilerOutput *RecompileInfo::compilerOutput (TypeCompartment & types) const
142 return &(*types.constrainedOutputs)[outputIndex];
144 inline CompilerOutput *RecompileInfo::compilerOutput (JSContext *cx) const
146 return compilerOutput (cx->compartment->types);
150 using namespace js::types;
151 __attribute__((noinline, noclone)) void
152 TypeCompartment::addPendingRecompile (JSContext *cx, const RecompileInfo & info)
154 CompilerOutput *co = info.compilerOutput (cx);
155 if (co->pendingRecompilation)
157 CancelOffThreadIonCompile (cx->compartment, co->script);
159 pendingRecompiles->append (info);
161 volatile JITScript *JSScript::JITScriptHandle::UNJITTABLE;
168 cx.compartment = &com;
169 info.outputIndex = 0;
170 js::Vector<CompilerOutput> v;
172 JSScript::JITScriptSet set;
173 __builtin_memset (&set, 0, sizeof set);
174 set.jitHandleCtor.value = &js;
179 co.constructing = true;
181 co.pendingRecompilation = true;
184 com.types.constrainedOutputs = &v;
185 com.types.pendingRecompiles = __null;
186 com.types.addPendingRecompile (&cx, info);