aot compiler halts when there exists an infinite loop in clinit()

Ioi Lam ioi.lam at oracle.com
Wed Apr 19 23:17:24 UTC 2017


Does AOT run the class initializers during compilation? What if the class initializer has undesirable side effects such as calling System.exit or delete files in the current directory, etc?

Ioi

> Vladimir Kozlov <vladimir.kozlov at oracle.com> 於 2017年4月20日 上午12:59 寫道:
> 
> Graal do report it in some cases (JDK-8178796):
> 
> Error: Failed compilation: compiler.calls.common.InvokeSpecial.caller()V: org.graalvm.compiler.common.RetryableBailoutException: Compilation exceeded 300 seconds during CFG traversal
> 
> But timeout in <clinit> may be hard to catch since it is done in JVM runtime and not in compiler.
> 
> Also I don't know if we should spend time on your case. If an application depends on such class it will never be able to execute. Should we care about such case?
> 
> Vladimir
> 
>> On 4/19/17 9:47 AM, Yuting Chen wrote:
>> The compiler can itself be a jvm, :)
>> 
>> I'd expect that some timeout messages will be reported (a quick
>> patch?). I compiled some pieces of bytecode and waited for the whole
>> night...
>> 
>> Regards,
>> Yuting
>> 
>>> On Wed, Apr 19, 2017 at 2:23 AM, Peter Levart <peter.levart at gmail.com> wrote:
>>> <joke-mode>
>>> Assuming your hunch is correct, I would call this a feature, not a bug.
>>> Isn't it better when compilation of a program loops infinitely than when the
>>> program loops infinitely at runtime? :-)
>>> </joke-mode>
>>> 
>>> Regards, Peter
>>> 
>>> 
>>>> On 04/18/2017 03:14 AM, Yuting Chen wrote:
>>>> 
>>>> Hi, I recently met a problem: when I tried to compile a class whose
>>>> clinit method contains an infinite loop, the aotc waits and fails to
>>>> response....
>>>> 
>>>> It seems that the aotc performs some static analysis before the
>>>> compilation, while the analysis may not stop (when an infinite loop is
>>>> there).
>>>> 
>>>> The bytecode is shown as follows:
>>>> 
>>>> public class Vector1
>>>>   minor version: 0
>>>>   major version: 52
>>>>   flags: ACC_PUBLIC, ACC_SUPER
>>>> Constant pool:
>>>>    #1 = Utf8               Vector1
>>>>    #2 = Class              #1             // Vector1
>>>>    #3 = Utf8               java/lang/Object
>>>>    #4 = Class              #3             // java/lang/Object
>>>>    #5 = Utf8               serialVersionUID
>>>>    #6 = Utf8               J
>>>>    #7 = Long               -2767605614048989439l
>>>>    #9 = Utf8               <clinit>
>>>>   #10 = Utf8               ()V
>>>>   #11 = NameAndType        #5:#6          // serialVersionUID:J
>>>>   #12 = Fieldref           #2.#11         // Vector1.serialVersionUID:J
>>>>   #13 = Utf8               main
>>>>   #14 = Utf8               ([Ljava/lang/String;)V
>>>>   #15 = Utf8               ConstantValue
>>>>   #16 = Utf8               Code
>>>>   #17 = Utf8               StackMapTable
>>>> {
>>>>   public static {};
>>>>     descriptor: ()V
>>>>     flags: ACC_PUBLIC, ACC_STATIC
>>>>     Code:
>>>>       stack=2, locals=0, args_size=0
>>>>          0: ldc2_w        #7                  // long
>>>> -2767605614048989439l
>>>>          3: putstatic     #12                 // Field serialVersionUID:J
>>>>          6: iconst_1
>>>>          7: iconst_m1
>>>>          8: iadd
>>>>          9: ifge          0
>>>>         12: return
>>>>       StackMapTable: number_of_entries = 1
>>>>         frame_type = 0 /* same */
>>>> 
>>>>   public static void main(java.lang.String[]);
>>>>     descriptor: ([Ljava/lang/String;)V
>>>>     flags: ACC_PUBLIC, ACC_STATIC
>>>>     Code:
>>>>       stack=0, locals=1, args_size=1
>>>>          0: return
>>>> }
>>> 
>>> 



More information about the jdk9-dev mailing list