From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26369 invoked by alias); 9 Jul 2002 17:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 26349 invoked by uid 71); 9 Jul 2002 17:26:01 -0000 Resent-Date: 9 Jul 2002 17:26:01 -0000 Resent-Message-ID: <20020709172601.26348.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, gawrilow@math.tu-berlin.de Received: (qmail 24501 invoked by uid 61); 9 Jul 2002 17:17:22 -0000 Message-Id: <20020709171722.24500.qmail@sources.redhat.com> Date: Tue, 09 Jul 2002 10:26:00 -0000 From: gawrilow@math.tu-berlin.de Reply-To: gawrilow@math.tu-berlin.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/7247: copy constructor missing when inlining enabled for i386 X-SW-Source: 2002-07/txt/msg00270.txt.bz2 List-Id: >Number: 7247 >Category: optimization >Synopsis: copy constructor missing when inlining enabled for i386 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Tue Jul 09 10:26:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Ewgenij Gawrilow, TU Berlin, Dept. of Math >Release: 3.1 >Organization: >Environment: Reading specs from /usr/site-local/experimental/lib/gcc-lib/i686-pc-linux-gnu/3.1/specs Configured with: ../gcc-3.1/configure --prefix=/usr/site-local/experimental --with-local-prefix=/usr/site-local --with-gxx-include-dir=/usr/site-local/share/include/g++ --enable-shared --enable-libgcj --enable-languages=c++,java --with-cpu=athlon Thread model: single gcc version 3.1 >Description: A copy constructor for a class is not called at the bottom of a complex expression involving many small inlined functions. The class in question is "double_zero", defined at line 121. It does not matter whether the constructor is defined explicitly or by compiler itself. The place its copy contructor ought to be called is the constructor of "modified_container_base" (line 91), instantiated from "TransformedContainer" (line 156), instantiated in its turn from "IncidenceMatrix" (line 293). Sorry for a lengthy example; if I would simplify the code a bit further, the bug would disappear. The original program had over 60K lines. The bug disappears when inlining is disabled, but also when the function "attach_operation" (line 165) is made more fat by inserting "dump_op(op);" at its beginning. Surprisingly, the whole expression remains inlined, but the resulting code is suddenly correct! On a UltraSPARC platform (Solaris 8), this bug does not occur at all, in any setting. gcc 3.0.4 seems to be free of this bug on both platforms. >How-To-Repeat: compile the attached program with -O3 and run it. If the generated code is correct, both lines printed will contain the same number, 1e-5. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="bad_inline.cc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bad_inline.cc" I2lmICNjcHUoaTM4NikKZXh0ZXJuICJDIiB7CnR5cGVkZWYgc3RydWN0IF9JT19GSUxFIEZJTEU7 CmV4dGVybiBGSUxFICpzdGRlcnI7CmV4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqX19yZXN0cmlj dCBfX3N0cmVhbSwKICAgICAgICAgICAgICAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19mb3JtYXQsIC4uLikgdGhyb3cgKCk7Cn0KI2VuZGlmCgpuYW1lc3BhY2UgcG0gewoKdGVtcGxh dGUgPHR5cGVuYW1lIFRvcD4KY2xhc3MgR2VuZXJpYyB7CnByb3RlY3RlZDoKICAgR2VuZXJpYygp IHsgfQogICBHZW5lcmljKGNvbnN0IEdlbmVyaWMmKSB7IH0KcHVibGljOgogICBjb25zdCBUb3Am IHRvcCgpIGNvbnN0IHsKICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBUb3AqPih0aGlz KTsKICAgfQogICBUb3AmIHRvcCgpIHsKICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxUb3AqPih0 aGlzKTsKICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRvcCwgdHlwZW5hbWUgQ29udGFpbmVy PgpjbGFzcyBtb2RpZmllZF9jb250YWluZXJfZWxlbV9hY2Nlc3M7Cgp0ZW1wbGF0ZSA8dHlwZW5h bWUgVG9wLCB0eXBlbmFtZSBDb250YWluZXI9dHlwZW5hbWUgVG9wOjpjb250YWluZXI+CmNsYXNz IG1vZGlmaWVkX2NvbnRhaW5lcl9pbXBsCiAgIDogcHVibGljIEdlbmVyaWM8VG9wPiwKICAgICBw dWJsaWMgbW9kaWZpZWRfY29udGFpbmVyX2VsZW1fYWNjZXNzPFRvcCxDb250YWluZXI+IHsKcHVi bGljOgogICB0eXBlZGVmIENvbnRhaW5lciBjb250YWluZXI7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5h bWUgVG9wLCB0eXBlbmFtZSBDb250YWluZXI+CmNsYXNzIG1vZGlmaWVkX2NvbnRhaW5lcl9lbGVt X2FjY2VzcyB7CnByb3RlY3RlZDoKICAgbW9kaWZpZWRfY29udGFpbmVyX2ltcGw8VG9wLENvbnRh aW5lcj4mIG1hc3RlcigpIHsKICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxtb2RpZmllZF9jb250 YWluZXJfaW1wbDxUb3AsQ29udGFpbmVyPio+KHRoaXMpOwogICB9CiAgIGNvbnN0IG1vZGlmaWVk X2NvbnRhaW5lcl9pbXBsPFRvcCxDb250YWluZXI+JiBtYXN0ZXIoKSBjb25zdCB7CiAgICAgIHJl dHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgbW9kaWZpZWRfY29udGFpbmVyX2ltcGw8VG9wLENvbnRh aW5lcj4qPih0aGlzKTsKICAgfQpwdWJsaWM6CiAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4g bWFzdGVyKCkudG9wKCkuZ2V0X2NvbnRhaW5lcigpLnNpemUoKTsgfQp9OwoKdGVtcGxhdGUgPHR5 cGVuYW1lIFRvcCwgdHlwZW5hbWUgQ29udGFpbmVyMT10eXBlbmFtZSBUb3A6OmNvbnRhaW5lcjEs IHR5cGVuYW1lIENvbnRhaW5lcjI9dHlwZW5hbWUgVG9wOjpjb250YWluZXIyPgpjbGFzcyBjb250 YWluZXJfcGFpcl9pbXBsCiAgIDogcHVibGljIEdlbmVyaWM8VG9wPiB7CnB1YmxpYzoKICAgdHlw ZWRlZiBDb250YWluZXIxIGNvbnRhaW5lcjE7CiAgIHR5cGVkZWYgQ29udGFpbmVyMiBjb250YWlu ZXIyOwogICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHRvcCgpLmdldF9jb250YWluZXIxKCku c2l6ZSgpOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9wLCB0eXBlbmFtZSBDb250YWluZXIx LCB0eXBlbmFtZSBDb250YWluZXIyPgpjbGFzcyBtb2RpZmllZF9jb250YWluZXJfcGFpcl9lbGVt X2FjY2VzczsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUb3AsIHR5cGVuYW1lIENvbnRhaW5lcjE9dHlw ZW5hbWUgVG9wOjpjb250YWluZXIxLCB0eXBlbmFtZSBDb250YWluZXIyPXR5cGVuYW1lIFRvcDo6 Y29udGFpbmVyMj4KY2xhc3MgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfaW1wbAogICA6IHB1Ymxp YyBHZW5lcmljPFRvcD4sCiAgICAgcHVibGljIG1vZGlmaWVkX2NvbnRhaW5lcl9wYWlyX2VsZW1f YWNjZXNzPFRvcCxDb250YWluZXIxLENvbnRhaW5lcjI+IHsKcHVibGljOgogICB0eXBlZGVmIENv bnRhaW5lcjEgY29udGFpbmVyMTsKICAgdHlwZWRlZiBDb250YWluZXIyIGNvbnRhaW5lcjI7Cn07 Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9wLCB0eXBlbmFtZSBDb250YWluZXIxLCB0eXBlbmFtZSBD b250YWluZXIyPgpjbGFzcyBtb2RpZmllZF9jb250YWluZXJfcGFpcl9lbGVtX2FjY2VzcyB7CnBy b3RlY3RlZDoKICAgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfaW1wbDxUb3AsIENvbnRhaW5lcjEs IENvbnRhaW5lcjI+JiBtYXN0ZXIoKSB7CiAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8bW9kaWZp ZWRfY29udGFpbmVyX3BhaXJfaW1wbDxUb3AsIENvbnRhaW5lcjEsIENvbnRhaW5lcjI+Kj4odGhp cyk7CiAgIH0KICAgY29uc3QgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfaW1wbDxUb3AsIENvbnRh aW5lcjEsIENvbnRhaW5lcjI+JiBtYXN0ZXIoKSBjb25zdCB7CiAgICAgIHJldHVybiAqc3RhdGlj X2Nhc3Q8Y29uc3QgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfaW1wbDxUb3AsIENvbnRhaW5lcjEs IENvbnRhaW5lcjI+Kj4odGhpcyk7CiAgIH0KcHVibGljOgogICBpbnQgc2l6ZSgpIGNvbnN0IHsg cmV0dXJuIG1hc3RlcigpLnRvcCgpLmdldF9jb250YWluZXIxKCkuc2l6ZSgpOyB9Cn07Cgp0ZW1w bGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBPcGVyYXRpb24+CmNsYXNzIG1vZGlm aWVkX2NvbnRhaW5lcl9iYXNlIHsKcHJvdGVjdGVkOgogICBjb25zdCBDb250YWluZXIqIHNyYzsK ICAgT3BlcmF0aW9uIG9wOwpwdWJsaWM6CgogICBtb2RpZmllZF9jb250YWluZXJfYmFzZShjb25z dCBDb250YWluZXImIHNyY19hcmcsIGNvbnN0IE9wZXJhdGlvbiYgb3BfYXJnKQogICAgICA6IHNy Yygmc3JjX2FyZyksIG9wKG9wX2FyZykgeyB9CgogICBjb25zdCBDb250YWluZXImIGdldF9jb250 YWluZXIoKSBjb25zdCB7IHJldHVybiAqc3JjOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29u dGFpbmVyMSwgdHlwZW5hbWUgQ29udGFpbmVyMj4KY2xhc3MgY29udGFpbmVyX3BhaXJfYmFzZSB7 CnByb3RlY3RlZDoKICAgY29uc3QgQ29udGFpbmVyMSAqc3JjMTsKICAgY29uc3QgQ29udGFpbmVy MiAqc3JjMjsKcHVibGljOgogICBjb250YWluZXJfcGFpcl9iYXNlKGNvbnN0IENvbnRhaW5lcjEm IHNyYzFfYXJnLCBjb25zdCBDb250YWluZXIyJiBzcmMyX2FyZykKICAgICAgOiBzcmMxKCZzcmMx X2FyZyksIHNyYzIoJnNyYzJfYXJnKSB7IH0KCiAgIGNvbnN0IENvbnRhaW5lcjEmIGdldF9jb250 YWluZXIxKCkgY29uc3QgeyByZXR1cm4gKnNyYzE7IH0KICAgY29uc3QgQ29udGFpbmVyMiYgZ2V0 X2NvbnRhaW5lcjIoKSBjb25zdCB7IHJldHVybiAqc3JjMjsgfQp9OwoKdGVtcGxhdGUgPHR5cGVu YW1lIENvbnRhaW5lcjEsIHR5cGVuYW1lIENvbnRhaW5lcjIsIHR5cGVuYW1lIE9wZXJhdGlvbj4K Y2xhc3MgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfYmFzZQogICA6IHB1YmxpYyBjb250YWluZXJf cGFpcl9iYXNlPENvbnRhaW5lcjEsIENvbnRhaW5lcjI+IHsKICAgdHlwZWRlZiBjb250YWluZXJf cGFpcl9iYXNlPENvbnRhaW5lcjEsIENvbnRhaW5lcjI+IF9zdXBlcjsKcHJvdGVjdGVkOgogICBP cGVyYXRpb24gb3A7CnB1YmxpYzoKICAgbW9kaWZpZWRfY29udGFpbmVyX3BhaXJfYmFzZShjb25z dCBDb250YWluZXIxJiBzcmMxX2FyZywgY29uc3QgQ29udGFpbmVyMiYgc3JjMl9hcmcsIGNvbnN0 IE9wZXJhdGlvbiYgb3BfYXJnKQogICAgICA6IF9zdXBlcihzcmMxX2FyZyxzcmMyX2FyZyksIG9w KG9wX2FyZykgeyB9Cn07CgpzdHJ1Y3QgZG91YmxlX3plcm8gewogICBjb25zdCBkb3VibGUgZXBz aWxvbjsKCiAgIHR5cGVkZWYgZG91YmxlIGFyZ3VtZW50X3R5cGU7CiAgIHR5cGVkZWYgYm9vbCBy ZXN1bHRfdHlwZTsKCiAgIGRvdWJsZV96ZXJvKGNvbnN0IGRvdWJsZSYgZXBzaWxvbl9hcmc9MWUt OCkgOiBlcHNpbG9uKGVwc2lsb25fYXJnKSB7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpj bGFzcyBTZXJpZXMgIHsKcHJvdGVjdGVkOgogICBFIF9zdGFydDsKICAgaW50IF9zaXplOwogICBF IF9zdGVwOwpwdWJsaWM6CiAgIFNlcmllcygpIDogX3N0YXJ0KDApLCBfc2l6ZSgwKSwgX3N0ZXAo MCkgeyB9CgogICBTZXJpZXMoY29uc3QgRSYgc3RhcnRfYXJnLCBpbnQgc2l6ZV9hcmcsIGNvbnN0 IEUmIHN0ZXBfYXJnKQogICAgICA6IF9zdGFydChzdGFydF9hcmcpLCBfc2l6ZShzaXplX2FyZyks IF9zdGVwKHN0ZXBfYXJnKSB7IH0KCiAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7 IH0KfTsKCnZvaWQgZHVtcF9vcChjb25zdCBkb3VibGVfemVybyYgb3ApIHsKICAgZnByaW50Zihz dGRlcnIsICIlbHg6JWVcbiIsICh1bnNpZ25lZCBsb25nKSZvcCwgb3AuZXBzaWxvbik7Cn0KCnRl bXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIE9wZXJhdGlvbj4KY2xhc3MgVHJh bnNmb3JtZWRDb250YWluZXIKICAgOiBwdWJsaWMgbW9kaWZpZWRfY29udGFpbmVyX2Jhc2U8Q29u dGFpbmVyLCBPcGVyYXRpb24+LAogICAgIHB1YmxpYyBtb2RpZmllZF9jb250YWluZXJfaW1wbDwg VHJhbnNmb3JtZWRDb250YWluZXI8Q29udGFpbmVyLE9wZXJhdGlvbj4sCgkJCQkgICAgIENvbnRh aW5lciA+IHsKICAgdHlwZWRlZiBtb2RpZmllZF9jb250YWluZXJfYmFzZTxDb250YWluZXIsIE9w ZXJhdGlvbj4gX2Jhc2U7CnB1YmxpYzoKICAgVHJhbnNmb3JtZWRDb250YWluZXIoY29uc3QgQ29u dGFpbmVyJiBzcmNfYXJnLCBjb25zdCBPcGVyYXRpb24mIG9wX2FyZz1PcGVyYXRpb24oKSkKICAg ICAgOiBfYmFzZShzcmNfYXJnLCBvcF9hcmcpIHsKICAgICAgZHVtcF9vcChvcF9hcmcpOwogICAg ICBkdW1wX29wKG9wKTsKICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lciwgdHlw ZW5hbWUgT3BlcmF0aW9uPiBpbmxpbmUKVHJhbnNmb3JtZWRDb250YWluZXI8Q29udGFpbmVyLCBP cGVyYXRpb24+CmF0dGFjaF9vcGVyYXRpb24oY29uc3QgQ29udGFpbmVyJiBzcmMsIGNvbnN0IE9w ZXJhdGlvbiYgb3ApIHsKICAgcmV0dXJuIFRyYW5zZm9ybWVkQ29udGFpbmVyPENvbnRhaW5lciwg T3BlcmF0aW9uPiAoc3JjLG9wKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcjEsIHR5 cGVuYW1lIENvbnRhaW5lcjIsIHR5cGVuYW1lIE9wZXJhdGlvbj4KY2xhc3MgQ29udGFpbmVyUHJv ZHVjdAogICA6IHB1YmxpYyBtb2RpZmllZF9jb250YWluZXJfcGFpcl9iYXNlPENvbnRhaW5lcjEs Q29udGFpbmVyMixPcGVyYXRpb24+LAogICAgIHB1YmxpYyBtb2RpZmllZF9jb250YWluZXJfcGFp cl9pbXBsPCBDb250YWluZXJQcm9kdWN0PENvbnRhaW5lcjEsQ29udGFpbmVyMixPcGVyYXRpb24+ LAoJCQkJCSAgQ29udGFpbmVyMSwgQ29udGFpbmVyMiA+IHsKICAgdHlwZWRlZiBtb2RpZmllZF9j b250YWluZXJfcGFpcl9iYXNlPENvbnRhaW5lcjEsQ29udGFpbmVyMixPcGVyYXRpb24+IF9iYXNl OwpwdWJsaWM6CiAgIENvbnRhaW5lclByb2R1Y3QoY29uc3QgQ29udGFpbmVyMSYgc3JjMV9hcmcs IGNvbnN0IENvbnRhaW5lcjImIHNyYzJfYXJnLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IE9w ZXJhdGlvbiYgb3BfYXJnPU9wZXJhdGlvbigpKQogICAgICA6IF9iYXNlKHNyYzFfYXJnLCBzcmMy X2FyZywgb3BfYXJnKSB7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIxLCB0eXBl bmFtZSBDb250YWluZXIyLCB0eXBlbmFtZSBPcGVyYXRpb24+IGlubGluZQpDb250YWluZXJQcm9k dWN0PENvbnRhaW5lcjEsIENvbnRhaW5lcjIsIE9wZXJhdGlvbj4KcHJvZHVjdChjb25zdCBDb250 YWluZXIxJiBjMSwgY29uc3QgQ29udGFpbmVyMiYgYzIsIE9wZXJhdGlvbiBvcCkgewogICByZXR1 cm4gQ29udGFpbmVyUHJvZHVjdDxDb250YWluZXIxLCBDb250YWluZXIyLCBPcGVyYXRpb24+IChj MSxjMixvcCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUb3AsIHR5cGVuYW1lIENvbnRhaW5lcjE9 dHlwZW5hbWUgVG9wOjpjb250YWluZXIxLCB0eXBlbmFtZSBDb250YWluZXIyPXR5cGVuYW1lIFRv cDo6Y29udGFpbmVyMj4KY2xhc3MgaW5kZXhlZF9zdWJzZXRfaW1wbAogICA6IHB1YmxpYyBHZW5l cmljPFRvcD4gewpwdWJsaWM6CiAgIHR5cGVkZWYgQ29udGFpbmVyMSBjb250YWluZXIxOwogICB0 eXBlZGVmIENvbnRhaW5lcjIgY29udGFpbmVyMjsKICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVy biB0b3AoKS5nZXRfY29udGFpbmVyMigpLnNpemUoKTsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1l IF9NYXRyaXg+IGNsYXNzIFJvd3M7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9wPgpjbGFzcyBtYXRy aXhfcm93X21ldGhvZHMgewpwdWJsaWM6CiAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gcG06 OnJvd3Moc3RhdGljX2Nhc3Q8Y29uc3QgVG9wJj4oKnRoaXMpKS5zaXplKCk7IH0KfTsKdGVtcGxh dGUgPHR5cGVuYW1lIF9NYXRyaXg+IGNsYXNzIFNlcmlhbGl6ZWQ7Cgp0ZW1wbGF0ZSA8dHlwZW5h bWUgRT4gY2xhc3MgTWF0cml4Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9wLCB0eXBlbmFtZSBFPXR5 cGVuYW1lIFRvcDo6ZWxlbWVudF90eXBlPgpjbGFzcyBHZW5lcmljTWF0cml4CiAgIDogcHVibGlj IEdlbmVyaWM8VG9wPiwgcHVibGljIG1hdHJpeF9yb3dfbWV0aG9kczxUb3A+IHsKcHJvdGVjdGVk OgogICBHZW5lcmljTWF0cml4KCkgeyB9CiAgIEdlbmVyaWNNYXRyaXgoY29uc3QgR2VuZXJpY01h dHJpeCYpIHsgfQpwdWJsaWM6CiAgIHR5cGVkZWYgR2VuZXJpY01hdHJpeCBnZW5lcmljX3R5cGU7 CiAgIHR5cGVkZWYgRSBlbGVtZW50X3R5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgX01hdHJp eD4gaW5saW5lCmNvbnN0IFJvd3M8X01hdHJpeD4mIHJvd3MoY29uc3QgR2VuZXJpY01hdHJpeDxf TWF0cml4PiYgbSkgewogICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSb3dzPF9NYXRy aXg+Jj4obS50b3AoKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpjbGFzcyBNYXRyaXggOiBw dWJsaWMgR2VuZXJpY01hdHJpeDxNYXRyaXg8RT4sIEU+IHsKcHJvdGVjdGVkOgogICBpbnQgZGlt ciwgZGltYzsKICAgRSogZGF0YTsKcHVibGljOgogICBNYXRyaXgoaW50IHIsIGludCBjKSA6IGRp bXIociksIGRpbWMoYyksIGRhdGEobmV3IEVbcipjXSkgeyB9CiAgIGludCByb3dzKCkgY29uc3Qg eyByZXR1cm4gZGltcjsgfQogICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIGRpbWM7IH0KCiAg IGZyaWVuZCBjbGFzcyBTZXJpYWxpemVkPE1hdHJpeD47CiAgIGZyaWVuZCBjbGFzcyBHZW5lcmlj TWF0cml4PE1hdHJpeD47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KY2xhc3MgU2VyaWFsaXpl ZDwgTWF0cml4PEU+ID4gewpwdWJsaWM6CiAgIGNvbnN0IE1hdHJpeDxFPiYgaGlkZGVuKCkgY29u c3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4PEU+Kj4odGhpcyk7IH0K ICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBoaWRkZW4oKS5kaW1yICogaGlkZGVuKCkuZGlt YzsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEU+CmNsYXNzIE1hdHJpeF9maXJzdF9saW5lCiAg IDogcHVibGljIGluZGV4ZWRfc3Vic2V0X2ltcGw8IE1hdHJpeF9maXJzdF9saW5lPEU+LAoJCQkJ IFNlcmlhbGl6ZWQ8IE1hdHJpeDxFPiA+LCBTZXJpZXM8aW50PiA+IHsKICAgY29uc3QgTWF0cml4 PEU+JiBoaWRkZW4oKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJp eDxFPiY+KCp0aGlzKTsgfQogICB0eXBlZGVmIGluZGV4ZWRfc3Vic2V0X2ltcGw8TWF0cml4X2Zp cnN0X2xpbmU+IF9zdXBlcjsKcHJvdGVjdGVkOgogICB+TWF0cml4X2ZpcnN0X2xpbmUoKTsKcHVi bGljOgogICB0eXBlbmFtZSBfc3VwZXI6OmNvbnRhaW5lcjEmIGdldF9jb250YWluZXIxKCkgewog ICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBfc3VwZXI6OmNvbnRhaW5lcjEm PihoaWRkZW4oKSk7CiAgIH0KICAgY29uc3QgdHlwZW5hbWUgX3N1cGVyOjpjb250YWluZXIxJiBn ZXRfY29udGFpbmVyMSgpIGNvbnN0IHsKICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u c3QgdHlwZW5hbWUgX3N1cGVyOjpjb250YWluZXIxJj4oaGlkZGVuKCkpOwogICB9CgogICB0eXBl bmFtZSBfc3VwZXI6OmNvbnRhaW5lcjIgZ2V0X2NvbnRhaW5lcjIoKSBjb25zdCB7CiAgICAgIHJl dHVybiBjb250YWluZXIyKDAsIGhpZGRlbigpLnJvd3MoKSwgaGlkZGVuKCkuY29scygpKTsKICAg fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEU+CmNsYXNzIFJvd3M8IE1hdHJpeDxFPiA+CiAgIDog cHVibGljIG1vZGlmaWVkX2NvbnRhaW5lcl9pbXBsPCBSb3dzPCBNYXRyaXg8RT4gPiwgTWF0cml4 X2ZpcnN0X2xpbmU8RT4gPiB7CiAgIHR5cGVkZWYgbW9kaWZpZWRfY29udGFpbmVyX2ltcGw8Um93 cz4gX3N1cGVyOwpwcm90ZWN0ZWQ6CiAgIH5Sb3dzKCk7CnB1YmxpYzoKICAgY29uc3QgdHlwZW5h bWUgX3N1cGVyOjpjb250YWluZXImIGdldF9jb250YWluZXIoKSBjb25zdCB7CiAgICAgIHJldHVy biByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIF9zdXBlcjo6Y29udGFpbmVyJj4oKnRo aXMpOwogICB9Cn07Cgp0ZW1wbGF0ZSA8Ym9vbCBzeW1tZXRyaWM9ZmFsc2U+CmNsYXNzIEluY2lk ZW5jZU1hdHJpeCAgewogICBpbnQgczsKcHVibGljOgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4K ICAgSW5jaWRlbmNlTWF0cml4KGludCBtLCBpbnQgbiwgY29uc3QgVCYgc3JjKSA6IHMoc3JjLnNp emUoKSkgeyB9CgogICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHM7IH0KfTsKCnN0cnVjdCB2 ZWNfbXVsIHsgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFLCB0eXBlbmFtZSBUb3AxLCB0eXBlbmFt ZSBUb3AyPgpJbmNpZGVuY2VNYXRyaXg8PgppbmNpZGVuY2VfbWF0cml4KGNvbnN0IEdlbmVyaWNN YXRyaXg8VG9wMSxFPiYgbTEsIGNvbnN0IEdlbmVyaWNNYXRyaXg8VG9wMixFPiYgbTIsCiAgICAg ICAgICAgICAgICAgY29uc3QgZG91YmxlX3plcm8mIHByZWQpIHsKICAgcmV0dXJuIEluY2lkZW5j ZU1hdHJpeDw+IChtMS5yb3dzKCksIG0yLnJvd3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhdHRhY2hfb3BlcmF0aW9uKHByb2R1Y3Qocm93cyhtMSksIHJvd3MobTIpLCB2ZWNfbXVs KCkpLCBwcmVkKSk7Cn0KCn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAg IGNvbnN0IGRvdWJsZSBlcHNpbG9uPSAxZS01OwogICBjb25zdCBwbTo6TWF0cml4PGRvdWJsZT4g UigyLDIpLCBDKDIsMik7CgogICBjb25zdCBwbTo6SW5jaWRlbmNlTWF0cml4PD4gVklGPWluY2lk ZW5jZV9tYXRyaXgoUiwgQywgcG06OmRvdWJsZV96ZXJvKGVwc2lsb24pKTsKCiAgIHJldHVybiBW SUYuc2l6ZSgpOwp9Cg==