使用带有-O4(LTO)的FlasCC编译的C ++程序在虚拟调用时挂起

时间:2013-04-05 12:01:37

标签: c++ flash llvm flascc lto

我在FlasCC中遇到LTO优化问题。

使用-O1编译时,生成的swf运行正常。

但是使用-O4它首先运行正常,但是突然挂起特定的虚函数调用时间超过15秒,然后Flash停止它。

我已经添加了printfs来跟踪使用Flash日志挂起的确切位置。

它挂在printf(“Program_Step:vis init”),从未进入真正的Initialize()实现。指针声明为IGameVisualizer * m_pVisualizer;

代码:

   virtual void Program_Step( IProgramStep & step )
    {
        if ( !m_init )
        {
            if ( m_initCounter > 0 )
            {
                printf( "\n Program_Step : Later... %d skips left", m_initCounter );
                --m_initCounter;
                return;
            }

            printf( "\n Program_Step : Init" );
            m_init = true;
            m_pVisualizer = Create_SlotsVisualizer_V1();
            printf( "\n Program_Step : m_pLogic" );
            m_pLogic = Create_SlotsLogic_Test();

            if ( m_pVisualizer )
            {
                printf( "\n Program_Step : vis init" );
                m_pVisualizer->Initialize();
            }

            if ( m_pLogic )
            {
                printf( "\n Program_Step : logic init" );
                m_pLogic->Initialize( *this );
            }

            printf( "\n Program_Step : after inits" );
        }

        int dt = step.GetTimeDeltaMsec();

        ProcessControls( dt );

        if ( m_pLogic )
            m_pLogic->Process( dt, *this );

        if ( m_pVisualizer )
            m_pVisualizer->Process( dt );
    }

1 个答案:

答案 0 :(得分:0)

好的,我已经确定了原因:

1)即使在fflush()

之后,printf()也没有显示真实的位置

2)其中一个库使用-O1编译,但其部分类代码位于公共内联方法中,并使用-O4作为另一个库的一部分进行编译=>显然那两个不兼容,这导致解析二进制流的无限循环......