{"id":2223088,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2223088/?format=json","project":{"id":41,"url":"http://patchwork.ozlabs.org/api/1.0/projects/41/?format=json","name":"GNU C Library","link_name":"glibc","list_id":"libc-alpha.sourceware.org","list_email":"libc-alpha@sourceware.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260414122311.173644-3-claudiu.zissulescu-ianculescu@oracle.com>","date":"2026-04-14T12:23:11","name":"[2/2] sframe: add v3 FLEX FDE unwind support and tests","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"200e3f8ef8251250fb391588fba638d3497740ca","submitter":{"id":90509,"url":"http://patchwork.ozlabs.org/api/1.0/people/90509/?format=json","name":"Claudiu Zissulescu","email":"claudiu.zissulescu-ianculescu@oracle.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/glibc/patch/20260414122311.173644-3-claudiu.zissulescu-ianculescu@oracle.com/mbox/","series":[{"id":499827,"url":"http://patchwork.ozlabs.org/api/1.0/series/499827/?format=json","date":"2026-04-14T12:23:09","name":"sframe: Add SFrame V3 stack backtracing support","version":1,"mbox":"http://patchwork.ozlabs.org/series/499827/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2223088/checks/","tags":{},"headers":{"Return-Path":"<libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org>","X-Original-To":["incoming@patchwork.ozlabs.org","libc-alpha@sourceware.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","libc-alpha@sourceware.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oracle.com header.i=@oracle.com header.a=rsa-sha256\n header.s=corp-2025-04-25 header.b=ZzV4wE5J;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com\n header.a=rsa-sha256 header.s=selector2-oracle-onmicrosoft-com\n header.b=wIAYE3Qe;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=oracle.com header.i=@oracle.com header.a=rsa-sha256\n header.s=corp-2025-04-25 header.b=ZzV4wE5J;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com\n header.a=rsa-sha256 header.s=selector2-oracle-onmicrosoft-com\n header.b=wIAYE3Qe","sourceware.org;\n dmarc=pass (p=reject dis=none) header.from=oracle.com","sourceware.org; spf=pass smtp.mailfrom=oracle.com","server2.sourceware.org;\n arc=pass smtp.remote-ip=205.220.177.32"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fw3Nd4sKHz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 22:24:01 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id A56014BA23DB\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 12:23:59 +0000 (GMT)","from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com\n [205.220.177.32])\n by sourceware.org (Postfix) with ESMTPS id DF0CE4BA23CF\n for <libc-alpha@sourceware.org>; Tue, 14 Apr 2026 12:23:32 +0000 (GMT)","from pps.filterd (m0246632.ppops.net [127.0.0.1])\n by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63EACmmx1751255\n for <libc-alpha@sourceware.org>; Tue, 14 Apr 2026 12:23:32 GMT","from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com\n (phxpaimrmta03.appoci.oracle.com [138.1.37.129])\n by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4dh8682bk8-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK)\n for <libc-alpha@sourceware.org>; Tue, 14 Apr 2026 12:23:31 +0000 (GMT)","from pps.filterd\n (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1])\n by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7)\n with ESMTP id 63ECJa9J036372\n for <libc-alpha@sourceware.org>; Tue, 14 Apr 2026 12:23:30 GMT","from sn4pr2101cu001.outbound.protection.outlook.com\n (mail-southcentralusazon11012000.outbound.protection.outlook.com\n [40.93.195.0])\n by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id\n 4dh9jp4u8p-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK)\n for <libc-alpha@sourceware.org>; Tue, 14 Apr 2026 12:23:30 +0000 (GMT)","from CY5PR10MB6011.namprd10.prod.outlook.com (2603:10b6:930:28::16)\n by MN2PR10MB4285.namprd10.prod.outlook.com (2603:10b6:208:198::18)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.48; Tue, 14 Apr\n 2026 12:23:24 +0000","from CY5PR10MB6011.namprd10.prod.outlook.com\n ([fe80::c792:6d38:1377:61cc]) by CY5PR10MB6011.namprd10.prod.outlook.com\n ([fe80::c792:6d38:1377:61cc%4]) with mapi id 15.20.9769.046; Tue, 14 Apr 2026\n 12:23:24 +0000"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org A56014BA23DB","OpenDKIM Filter v2.11.0 sourceware.org DF0CE4BA23CF"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org DF0CE4BA23CF","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org DF0CE4BA23CF","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1776169413; cv=pass;\n b=OBnNv88b91M2j6Li1hMKEoMa1hg8Sq4YQ+o9HVw4gXDGSDlE71J0jFiG0a952pDiyngxQEnuNAkSs9hkWokOdrcgJQpMSKsfP2b01scECf0k8jC43lS6b30IvI3FjwClP4gkvF8Eh7Ay8Kx8gJyNcX/lwDhLZDUDPscWRzP8t5E=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=UAHdQePFrYRaN4lbP/YN9QJWdtnF3+oT3RThiNiRtS537z5WQMsL0cgQHSol/4ysbNDMa9rO1KDDAq2eB0n1F36rbI+vUw0zEwRJryLSxw7YSG/wkZD+sJE9QO2ag1M0ArAULnMGHu6Bnw6XEOZBT6wcGadcvlZv784Nn/+fwW9oxhPcxJJPhPL+OUDEzNWIAd5ceBs5VKPC91738my6wPvu1k1oJ4CwpUvUpnLxKBG9PhTLZyoan2kutITtqqMGvzf5mvSn2d4TXc8Mr4PpY4FRiX5sIyx+8cUxjf6fDD0gPgxXgprTmZyqjUhBwQXWRWNOk0J6MHO1TOwgzu8olw=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776169413; c=relaxed/simple;\n bh=z7TvUJcq+6dly9CZyN3piz5c6q7f0zY4ggDQVDvcIko=;\n h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID:\n MIME-Version;\n b=ZX01uoLD6UXY/t2HgaDVrensClVXpYxQqDPJQXlRZIXtbHc99N1lIpwW32JVZ13VzlNEmyJIsgMAOkLkKESTNFy/Ssx4oT2YrMSrTCnB1QNrbOq+X4NjkBPwtsY0lhSHJbfjjade88D7YsJyDGV3zlXPe1P/F3fVuNQKXuHltOM=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=HdIrGmPS+DPYh+3kayGyHh8lluVFTRKoP0Jnp4pI1Ts=;\n b=kJUgas8lJ+UA766p+X7ycko1up9Gx416gbh6pEWGmhwxoIPgXaGsyAX+v9tP+7fvp0wmELRWek6bLtJBqsWNyLu5+qbCHDAM96/3XrFt1wyQ4ug5KwciWgUcktVTfCTwg3VbYEtQwFkCjak8wv+ja/s+Lj/FImuLplRGiql/FOxlJs/TgtKbnc2WcAOKir9e3MGjJrXnN03tDFDx0JLOcUawIoLsm0UTOqyBm6GENbT4B2ZFzVPKGsmIOD0E23Ce5rPDFekkQSp2RfBid0V1ku6e5zDHy0u+kNphIwEdtkenT1GJQLRn21IefS7p/3d57SOCKDdC+j150PlmHKLbGQ=="],"ARC-Authentication-Results":["i=2; server2.sourceware.org","i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com;\n dkim=pass header.d=oracle.com; arc=none"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc\n :content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=\n corp-2025-04-25; bh=HdIrGmPS+DPYh+3kayGyHh8lluVFTRKoP0Jnp4pI1Ts=; b=\n ZzV4wE5Jkn1p9Y5+M1YxIq+qAqrO+bLXkIWX0inMv0mwBIrYqAyYeuxBd9I5Jwbw\n PWRsfPFeRdndyCg1uy5I35oSHVKKtTvR6s1XajqZNcuFM2SFwU8VdImLzwUnoYrv\n AUFF1hMglWJmGFFwF6Wl8LeO3YEsgmqf1GO/KdKu2TF4KVtPUVCXJeCyRN179Xs4\n PW2LA8Lkj+7ZA6d0yfy7KWVzgggNklkiqbpV5MJb5mCUyiuFdPRbh9jC9Vomj74N\n 6KUpOeVf0KB0yr/gCGvGZmYBYMsSLZgbzhtYJSuQ67Kpz6DpbPbjBgi/EbixeP8W\n 4PpxQ9turH1YQtMZhcF/6Q==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=HdIrGmPS+DPYh+3kayGyHh8lluVFTRKoP0Jnp4pI1Ts=;\n b=wIAYE3QeDKUXvQ+xyega1jM3RaLLTELkk1K8q/QcMLMBhIC2X6dS/ksAmYq1CmbUhO6C8q2Rk6wJXetUbol1RkqBk3Uslc+U9teRZ0p64ZnqzHc7aUVB4iI4Gg/bDZQj6jV5vZeK3ePuQ1VMN3V8uEvrpzQLBP6KBPwD6kMLTCA="],"From":"claudiu.zissulescu-ianculescu@oracle.com","To":"libc-alpha@sourceware.org","Cc":"elena.zannoni@oracle.com, jose.marchesi@oracle.com","Subject":"[PATCH 2/2] sframe: add v3 FLEX FDE unwind support and tests","Date":"Tue, 14 Apr 2026 15:23:11 +0300","Message-ID":"<20260414122311.173644-3-claudiu.zissulescu-ianculescu@oracle.com>","X-Mailer":"git-send-email 2.53.0","In-Reply-To":"\n <20260414122311.173644-1-claudiu.zissulescu-ianculescu@oracle.com>","References":"<20260414122311.173644-1-claudiu.zissulescu-ianculescu@oracle.com>","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"VI1PR04CA0054.eurprd04.prod.outlook.com\n (2603:10a6:802:2::25) To CY5PR10MB6011.namprd10.prod.outlook.com\n (2603:10b6:930:28::16)","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"CY5PR10MB6011:EE_|MN2PR10MB4285:EE_","X-MS-Office365-Filtering-Correlation-Id":"04c7ec65-6ec3-44c1-2865-08de9a209fe3","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|1800799024|376014|366016|56012099003|22082099003|18002099003;","X-Microsoft-Antispam-Message-Info":"\n g8b01pC/hH0zDNTAEfwnVkjWe+/l++bPNNQtr63sLdZIVBLm2NTv7oF+9Og1CRf9GMUL79MIu/8sKbWmIaXJP+FogrWzW0qsuGc+uvcrHjN02wai+mwu+a69PQaokL4g4UTmSM05gh+Yp8uVg/Q/8cdGv8xlH6PjvcEI9ITjqa7ZwzfYiaTQjcS5ga5nih81aWRKezdrmRFkgrnExA1i+hOFigYNjeGLFhTY8WjKpVIUZ9ybTgoZKzhdhmOyJOZpAhcIamhgRJ14KoG/TuBjzO0RlmpaMCu0qO3/3v8Aaa8iy83WvaAhcZ1vmxuwLNCJzqO/1ZycFw0qJctaDvs/whwl3WY9xtQx9KDpbRtxFiB4oYeW8wx7+XaWLvoB26VW/YpFkrK7fadXvRxRQwb48eFz6Uq77ghrwhF3HVMeJIjd6FKUdL101c21zHroh6GQ3R7A6aPxIkNEqu5YLbKedLgcvLn3JQVerCu8jh08zbaTahPDb54GE0f78efVYDAGKuTZ12AIh7OaZisCdF6co9LC78hMe8wjcWs4jRUmxhz7FWOFejLRf5lPKR796Esr1GRwPBsK/2lyOhaXNAPeaqQ/4ILbE2EEvRzTzpiNwvjBC5pSzogqjAUpY0idasIdNDufZ14LfY1xsi920e5DgEJuehLtIPZmwihqZ6QJHcaAMwMM7nMk9YaStMlRrxZh1QSRfgdKro/jXvPTF88ZMd4W8fwjxXBhHvSnuNf0hY862ecuIfAG4wJRvlCVnkPB","X-Forefront-Antispam-Report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:CY5PR10MB6011.namprd10.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(1800799024)(376014)(366016)(56012099003)(22082099003)(18002099003);\n DIR:OUT; SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n tMdmpLn9vaYXc7L4Ln4sCpLoTq6X3Jj1AKtcRvPU+X86639io1pJLhmIJn5+SOLziuPrwOaFikOg88bxXFnhXNhuiTAlB1kAO5GEq0zz52w+8fqqM/EJPAO7eYcDOjGtF1JnysMB5nyEHj1PclvjajiS/oCBuPQxbbXhjFI/ILeTCCfWEZc3jn81AU2gyl9bvH7fSfywGzvg1bJp38eFlZ2H5W16Kk5cSH8DZjLsvD04GhOJFtdfieBUG60q/CNgct4LVl7x8x60HJQOzkcPoljnZO0gX3xhe88sURho/sXKu2pVX2NVJV1WLqgImsTbxVPmssz5rFH5Ve6ksiSuKdqCzI/mt/oZZ/n9KG/e7aLPvlv8fEOW4yjsvBr087CNHtpCxVbpnEgDQJ0EFxiC70G91e5PWKeDZIdWN8xTDPqLlN/XJSe9Seoxsenfyz8Z1NqrmedqQ4QpQYsHF2goYJkKZHqUONd9weQz4/Ys5CXUWBE4Bg6J7RN/Lk8MgEVXAyTFgKBK6MepAoTHGTABEc9xZuO+m8T08kYivLqENH/cYxeElS8z8qz0j/FRP5JTXe6lEAag9VTN5q1CsPKBDvvfrx2KDw3LHRmiccN3yagih0kUEgPXY+4+XLLTmhQqU2OzZMIltp4/++DMFOT/olXux0hmeBf9U+xlHqg/D5fBFowU28AwTrNgfZCtGmaY4bWBStzzgIXOUwaPyIOy73iiMZp7nn6VNoFmYGh2IkKX8rAS0bAi7Cvl1acWYGUh3c4IW+D6VDO54z/p5d4QY1z7xCmpbxv/2mnN5lk204EDBkYHuwAKq+DCcy9oDumiMZI1CqsDfLkYpNDx5nngeEE+MO3xPrEudkJXSrWsEJk6EeOPknCbIlKrD9A3kQGogs/qgi34gpd5zlXYe/pKzeXdsqBRDiz1dlNSIMxjXj5oZC4E8knmmzNVWnlbeUBoMZK8TxAcOBquXwXFDDVVPQ8eYSITP2rXqRVHn2eNysxgv90mXxkToBqNQIbVYxW0oCLQVKIfWImX1jwE8gcFN66vVi6dZGPodRQcImmgYvLTraVJf+R2d9UPutin1pTGd0j3bKrXB3yfKR+jM6QnsQIkenHKMU4URu34umMweR00tcUZ1xjiryOTOFATZ9hLdHP8F8y1loLvhF+3d+KS6V6hxdOva7ouB47qB10LMxrxRsD0hjZveDnePauu3H704h2vzFOoNfa36mTUlnFxFBZpVadS9/DGS/3bQ3aN6rOIh1tbr8Xj26Asp56/fo58ODYGQbr8ie7JgLoM+Z8Velf35876CwK445knA8YFMlpl7Zn8ak0nx+tYj2riyC0ixVD3BitbsibjR21kABFFrxqT8SnAnQuJlFA4UsmN8uhEqdpYWogzFY2NSzJd7YDhFlRkadcJsBrEWjPu3DnZump+H1u7Duxsj80OtZHz6zOCtw0AN/iMTsdvi2v6w10M36oQsHXHrqCiKLJFoUeKJqrM4Jb12/DHC0gcY51t2E+hQiaNpraeFnVBpQAH+LItbZh0BJ0DH4rw5LWqcP2CZ2JW329R91CgQtuDaep1dnm7bkza5qYDrbA+RbevZLp/CDuzT9EbHnXENGNItuQyGTc1I+u3od3biqOci9K5L/cNaAEFpNK/qAx8ssBxzxs1ZgDO9kc2BLKGlGION6uHZ6+dIVgC7CtC+ymmKryaJTJlOjW5n+Qt2tnPoDGda48es70xYZoFDYw1eWHy2khvxCZOh/OpAbEAPiNzwKRKbIhUakBQjTEMgX/QIijMvpTY","X-Exchange-RoutingPolicyChecked":"\n QIq2i/BgrX1QwX8nO71RlB7KPCq/On+Q4IpAqczb7wNPbrVTgE2rgbH0Et5tquk7ETPD5Q7q3EZ4iZ+WAUOqmZDvVTcBEn5Nwphdaf54WOaBGvjzX8PtCgGc2+/XAepvqzHHHuIhrMcjc+j6lC/aSmpD59mO1yfCCfuUM83dICmGUHONXmy28CeT8p2sLEYwXZn4w0gnn19NjOmhM82XFamUg1kz3cSz982CKc3U0dWhxT1PpKtfrH7gIRcq+3nC+lMr7vsnweEjSD5mKwgyeTPeV1+bimzVRgw+QmESmETMo1GYqZQXHhclyVr+R7ETefLGW+pq6dOnxzOPC/fobg==","X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0":"\n M+Nu6hH9CWgJ5zfJB1oRoXvnVCLnna3Pzy0eSZdYAKtCEOXorcXMo58aMUV67aKDRDO8lj3LNE0D4mYAGmzmcN/yQmaFqP2gjK/HgR2aJoj8ZvwuSJcbwVDVtVnNaBJANFX92AZo8YWPj8GeSHf9VQQ+0Ud4/9qNKlKZFKVCDrjoeviQZE1Di3ZCTRCQdzqNCW9dL3LmQNBjeTKjeX04xn3zuI4Kp1oZZ6wh7IG2XlWecz++LKzngmIJiYKAWiXp7/SRVmcFgvcjitvkDeizdDehQoHNKaMnbX6NE6BEWkeao68HPagrS1yQtx7GaRJ3azoIi9Mgh6oBqQy9VtSBgk3Tgd8fXyqdCmCY3DLb3ehEFBmJ0/C+H//SdwIVRcY+qWLRBddxp1MSPA5S7HT7Z5+tbtZLpRQI7aUXv+Gt7jKwIEJQwtwZ9doyim8fjMc+WpAFdmQemkieQ0I8XtazDOGaEsjVkvnUJXa66eCB1uLxzB6HjFaz0CFH4j5ra+yj0DOzu0cGGJ4pVj/FxnL6JYIFP1KklSgLI1gOrraQuM/rHwslLSsbscEPogu1xQGGAspWe+8JIbcXJDjSRlyMV0Ncd9KScFl2rvrzNGcVL3A=","X-OriginatorOrg":"oracle.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 04c7ec65-6ec3-44c1-2865-08de9a209fe3","X-MS-Exchange-CrossTenant-AuthSource":"CY5PR10MB6011.namprd10.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"14 Apr 2026 12:23:24.8395 (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"4e2c6054-71cb-48f1-bd6c-3a9705aca71b","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"\n 2lX9ik46X8XVBnkmSKUZQSLO8n2KnIjrocBTMmOVGNYntqcyTuqnPYI4mAbZ+Ubfc2Dx/VkazG2IEgt/Ykuzy02jKlB/h72I1z6zVkqueFvRdHER2EM3eDg/4au5xjx1lSIE6QOtkmbB/1RoRgREGw==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"MN2PR10MB4285","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-14_03,2026-04-13_04,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=notspam policy=default score=0 malwarescore=0\n spamscore=0 adultscore=0 bulkscore=0 suspectscore=0\n lowpriorityscore=0\n phishscore=0 mlxlogscore=999 mlxscore=0 classifier=spam adjust=0 reason=mlx\n scancount=1 engine=8.19.0-2604070000 definitions=main-2604140115","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDE0MDExNSBTYWx0ZWRfX2LzdQh0TPY3Q\n /EmpJdksObUUOFek2gVwxX3sQxyWJnvxMghsWZp+0H3pq4GOJfUVapFWZ3Pi6hGDkzjhlcWbIPc\n 2R5d0MEgSjKWhsGWLEMI3sg/JH4MYCgilUEEkSApxXDgif+VyHAfnmDhofW1F9fnLXdT4m+nW/9\n p6APG2Auye5GU3X+NLAl+Buc95dPG24rrT4z/dBYu9r1pirWrV4iGVZ/Z2osznuOvVpDKy9e6od\n bzuHJHS/IIYwBKxCJyzgkF+yhvkVaOmc5ekfHCk33CWoZnzbQS/qTuQKCbPQndPB8bEAc5HMOd6\n j5r0iqE3tvma26Sgw1HtQim/QCIFXFEjjq9AfQqmg+9EjsDlLbGoFD3gIiiSWzhjRfMULXyCbbN\n m5R7iKi8csb7DauIsLu3TNjAgdo3IJVztqkacttIuxBE7QWDembcPNz71Wb7hE4lvohwfAWBgK3\n fR4F8cn9aYgSmNVTnQw==","X-Proofpoint-GUID":"QLtSKEGthDBwiTW-7zqXyRbG8BSI_wFA","X-Proofpoint-ORIG-GUID":"QLtSKEGthDBwiTW-7zqXyRbG8BSI_wFA","X-Authority-Analysis":"v=2.4 cv=JY6Ma0KV c=1 sm=1 tr=0 ts=69de31c3 b=1 cx=c_pps\n a=WeWmnZmh0fydH62SvGsd2A==:117\n a=WeWmnZmh0fydH62SvGsd2A==:17\n a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19\n a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10\n a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22\n a=3I1J8UUJPc9JN9BFgKH3:22 a=mDV3o1hIAAAA:8 a=yPCof4ZbAAAA:8\n a=EtVehNF6vVAjHvIjOK4A:9","X-BeenThere":"libc-alpha@sourceware.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Libc-alpha mailing list <libc-alpha.sourceware.org>","List-Unsubscribe":"<https://sourceware.org/mailman/options/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe>","List-Archive":"<https://sourceware.org/pipermail/libc-alpha/>","List-Post":"<mailto:libc-alpha@sourceware.org>","List-Help":"<mailto:libc-alpha-request@sourceware.org?subject=help>","List-Subscribe":"<https://sourceware.org/mailman/listinfo/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=subscribe>","Errors-To":"libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org"},"content":"From: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>\n\nThis commit adds FLEX FDE support for SFrame v3.  In FLEX FDEs,\npayload may include control words and offset words. FLEX us ebavked\nwgen CFI patterns require it and target hook allows it.\nFLEX is supported in binutils by x86_64 and s390x backends.\n---\n debug/Makefile                                |   3 +\n debug/tst-backtrace-flex.c                    | 164 ++++++++++++++++++\n sysdeps/generic/sframe-read.c                 | 158 ++++++++++++++---\n sysdeps/generic/sframe-read.h                 |  13 +-\n sysdeps/generic/sframe.c                      | 137 +++++++++++++--\n sysdeps/generic/sframe.h                      |  19 ++\n sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h |   6 +\n sysdeps/unix/sysv/linux/x86_64/uw-sigframe.h  |   6 +\n 8 files changed, 473 insertions(+), 33 deletions(-)\n create mode 100644 debug/tst-backtrace-flex.c","diff":"diff --git a/debug/Makefile b/debug/Makefile\nindex c6c1069b40..d36f024d8b 100644\n--- a/debug/Makefile\n+++ b/debug/Makefile\n@@ -291,6 +291,9 @@ $(objpfx)tst-backtrace1: $(shared-thread-library)\n \n # When SFrame is enabled, make sure the dwarf unwinder is also exercised.\n ifeq ($(enable-gsframe),yes)\n+tests-internal += tst-backtrace-flex\n+LDLIBS-tst-backtrace-flex += $(common-objpfx)elf/sframe-read.o\n+\n dw_unwind_pair := \\\n   tst-backtrace1-nosframe:tst-backtrace1 \\\n   tst-backtrace2-nosframe:tst-backtrace2 \\\ndiff --git a/debug/tst-backtrace-flex.c b/debug/tst-backtrace-flex.c\nnew file mode 100644\nindex 0000000000..572c427fd4\n--- /dev/null\n+++ b/debug/tst-backtrace-flex.c\n@@ -0,0 +1,164 @@\n+/* Test SFrame v3 FLEX FRE decoding in the backtrace test suite.\n+   Copyright (C) 2026 Free Software Foundation, Inc.\n+   This file is part of the GNU C Library.\n+\n+   The GNU C Library is free software; you can redistribute it and/or\n+   modify it under the terms of the GNU Lesser General Public\n+   License as published by the Free Software Foundation; either\n+   version 2.1 of the License, or (at your option) any later version.\n+\n+   The GNU C Library is distributed in the hope that it will be useful,\n+   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+   Lesser General Public License for more details.\n+\n+   You should have received a copy of the GNU Lesser General Public\n+   License along with the GNU C Library; if not, see\n+   <https://www.gnu.org/licenses/>.  */\n+\n+#include <sframe-read.h>\n+#include <support/check.h>\n+\n+#define TEST_FRE0_DATAWORDS 5\n+#define TEST_FRE1_DATAWORDS 4\n+#define TEST_FDE_COUNT 1\n+#define TEST_FRE_COUNT 2\n+#define TEST_FUNC_SIZE 0x10\n+\n+#define FLEX_CFA_SP_CTRL \\\n+  SFRAME_V3_FLEX_FDE_CTRLWORD_ENCODE (7, 0, 1)\n+#define FLEX_FP_RBP_CTRL \\\n+  SFRAME_V3_FLEX_FDE_CTRLWORD_ENCODE (6, 1, 1)\n+#define FLEX_RA_REG_CTRL \\\n+  SFRAME_V3_FLEX_FDE_CTRLWORD_ENCODE (2, 0, 1)\n+\n+#define TEST_FRE_SECTION_LEN \\\n+  (sizeof (sframe_func_desc_attr_v3) \\\n+   + sizeof (sframe_frame_row_entry_addr1) + TEST_FRE0_DATAWORDS \\\n+   + sizeof (sframe_frame_row_entry_addr1) + TEST_FRE1_DATAWORDS)\n+\n+struct sframe_test_section\n+{\n+  sframe_header header;\n+  sframe_func_desc_idx_v3 fde;\n+  sframe_func_desc_attr_v3 attr;\n+  sframe_frame_row_entry_addr1 fre0;\n+  int8_t fre0_data[TEST_FRE0_DATAWORDS];\n+  sframe_frame_row_entry_addr1 fre1;\n+  int8_t fre1_data[TEST_FRE1_DATAWORDS];\n+} __attribute__ ((packed));\n+\n+static const struct sframe_test_section test_sframe_section =\n+{\n+  .header =\n+    {\n+      .sfh_preamble = { SFRAME_MAGIC, SFRAME_VERSION_3, SFRAME_F_FDE_SORTED },\n+      .sfh_abi_arch = SFRAME_ABI_AMD64_ENDIAN_LITTLE,\n+      .sfh_cfa_fixed_fp_offset = SFRAME_CFA_FIXED_FP_INVALID,\n+      .sfh_cfa_fixed_ra_offset = -8,\n+      .sfh_auxhdr_len = 0,\n+      .sfh_num_fdes = TEST_FDE_COUNT,\n+      .sfh_num_fres = TEST_FRE_COUNT,\n+      .sfh_fre_len = TEST_FRE_SECTION_LEN,\n+      .sfh_fdeoff = 0,\n+      .sfh_freoff = sizeof (sframe_func_desc_idx_v3),\n+    },\n+  .fde =\n+    {\n+      .sfdi_func_start_offset = 0,\n+      .sfdi_func_size = TEST_FUNC_SIZE,\n+      .sfdi_func_start_fre_off = 0,\n+    },\n+  .attr =\n+    {\n+      .sfda_func_num_fres = TEST_FRE_COUNT,\n+      .sfda_func_info = SFRAME_V1_FUNC_INFO (SFRAME_V3_FDE_PCTYPE_INC,\n+\t\t\t\t\t     SFRAME_FRE_TYPE_ADDR1),\n+      .sfda_func_info2 = SFRAME_V3_SET_FDE_TYPE (0, SFRAME_FDE_TYPE_FLEX),\n+      .sfda_func_rep_size = 0,\n+    },\n+  /* FRE0 (start 0): CFA via SP+8, RA padding, FP via deref(FP+0).  */\n+  .fre0 =\n+    {\n+      .sfre_start_address = 0,\n+      .sfre_info =\n+\t{\n+\t  .fre_info = SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP,\n+\t\t\t\t\t  TEST_FRE0_DATAWORDS,\n+\t\t\t\t\t  SFRAME_FRE_DATAWORD_1B),\n+\t},\n+    },\n+  .fre0_data = { FLEX_CFA_SP_CTRL, 8, SFRAME_FRE_RA_OFFSET_INVALID,\n+\t\t FLEX_FP_RBP_CTRL, 0 },\n+  /* FRE1 (start 8): CFA via SP+16, RA via register rule r2+0.  */\n+  .fre1 =\n+    {\n+      .sfre_start_address = 8,\n+      .sfre_info =\n+\t{\n+\t  .fre_info = SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP,\n+\t\t\t\t\t  TEST_FRE1_DATAWORDS,\n+\t\t\t\t\t  SFRAME_FRE_DATAWORD_1B),\n+\t},\n+    },\n+  .fre1_data = { FLEX_CFA_SP_CTRL, 16, FLEX_RA_REG_CTRL, 0 },\n+};\n+\n+static int\n+do_test (void)\n+{\n+  sframe_decoder_ctx dctx = { 0 };\n+  sframe_frame_row_entry fre;\n+  _Unwind_Reason_Code err;\n+  int32_t off;\n+\n+  err = __sframe_decode (&dctx, (const char *) &test_sframe_section);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+\n+  err = __sframe_find_fre (&dctx, 0, &fre);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (__sframe_fre_get_fde_type (&fre), SFRAME_FDE_TYPE_FLEX);\n+\n+  TEST_COMPARE (__sframe_fre_get_udata (&fre, 0, &err), FLEX_CFA_SP_CTRL);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (__sframe_fre_get_udata (&fre, 2, &err),\n+\t\tSFRAME_FRE_RA_OFFSET_INVALID);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+\n+  off = __sframe_fre_get_cfa_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (off, 8);\n+\n+  off = __sframe_fre_get_fp_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (off, 0);\n+\n+  off = __sframe_fre_get_ra_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (off, -8);\n+\n+  err = __sframe_find_fre (&dctx, 8, &fre);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+\n+  TEST_COMPARE (__sframe_fre_get_udata (&fre, 2, &err), FLEX_RA_REG_CTRL);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+\n+  off = __sframe_fre_get_cfa_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (off, 16);\n+\n+  off = __sframe_fre_get_ra_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_NO_REASON);\n+  TEST_COMPARE (off, 0);\n+\n+  off = __sframe_fre_get_fp_offset (&dctx, &fre, &err);\n+  TEST_COMPARE (err, _URC_END_OF_STACK);\n+  TEST_COMPARE (off, 0);\n+\n+  err = __sframe_find_fre (&dctx, TEST_FUNC_SIZE, &fre);\n+  TEST_COMPARE (err, _URC_END_OF_STACK);\n+\n+  return 0;\n+}\n+\n+#include <support/test-driver.c>\ndiff --git a/sysdeps/generic/sframe-read.c b/sysdeps/generic/sframe-read.c\nindex 9464cd71e6..ec139a49a7 100644\n--- a/sysdeps/generic/sframe-read.c\n+++ b/sysdeps/generic/sframe-read.c\n@@ -451,6 +451,49 @@ sframe_get_fre_offset (sframe_frame_row_entry *fre,\n     }\n }\n \n+/* Get IDX'th data word from FRE as unsigned value.\n+   Set ERRP as applicable.  */\n+\n+static uint32_t\n+sframe_get_fre_udata (sframe_frame_row_entry *fre,\n+\t\t      int idx,\n+\t\t      _Unwind_Reason_Code *errp)\n+{\n+  uint8_t offset_cnt, offset_size;\n+\n+  if (!sframe_fre_sanity_check_p (fre))\n+    {\n+      *errp = _URC_END_OF_STACK;\n+      return 0;\n+    }\n+\n+  offset_cnt = sframe_fre_get_offset_count (fre->fre_info);\n+  offset_size = sframe_fre_get_offset_size (fre->fre_info);\n+\n+  if (offset_cnt < (idx + 1))\n+    {\n+      *errp = _URC_END_OF_STACK;\n+      return 0;\n+    }\n+  *errp = _URC_NO_REASON;\n+\n+  if (offset_size == SFRAME_FRE_OFFSET_1B)\n+    {\n+      uint8_t *sp = (uint8_t *)fre->fre_offsets;\n+      return sp[idx];\n+    }\n+  else if (offset_size == SFRAME_FRE_OFFSET_2B)\n+    {\n+      uint16_t *sp = (uint16_t *)fre->fre_offsets;\n+      return sp[idx];\n+    }\n+  else\n+    {\n+      uint32_t *ip = (uint32_t *)fre->fre_offsets;\n+      return ip[idx];\n+    }\n+}\n+\n /* Decode the SFrame FRE start address offset value from FRE_BUF in on-disk\n    binary format, given the FRE_TYPE.  Updates the FRE_START_ADDR.  */\n \n@@ -592,6 +635,26 @@ __sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre)\n   return SFRAME_V1_FRE_CFA_BASE_REG_ID (fre_info);\n }\n \n+/* Get the FDE type associated with the FRE.  */\n+\n+uint8_t\n+__sframe_fre_get_fde_type (sframe_frame_row_entry *fre)\n+{\n+  if (fre == NULL)\n+    return SFRAME_FDE_TYPE_DEFAULT;\n+\n+  return fre->fre_fde_type;\n+}\n+\n+/* Get IDX'th data word from FRE as unsigned value.  */\n+\n+uint32_t\n+__sframe_fre_get_udata (sframe_frame_row_entry *fre, int idx,\n+\t\t\t_Unwind_Reason_Code *errp)\n+{\n+  return sframe_get_fre_udata (fre, idx, errp);\n+}\n+\n /* Get the CFA offset from the FRE.  If the offset is unavailable,\n    sets errp.  */\n \n@@ -600,7 +663,10 @@ __sframe_fre_get_cfa_offset (sframe_decoder_ctx *dctx __attribute__ ((__unused__\n \t\t\t     sframe_frame_row_entry *fre,\n \t\t\t     _Unwind_Reason_Code *errp)\n {\n-  return sframe_get_fre_offset (fre, SFRAME_FRE_CFA_OFFSET_IDX, errp);\n+  bool flex_p = (__sframe_fre_get_fde_type (fre) == SFRAME_FDE_TYPE_FLEX);\n+  uint32_t idx = flex_p ? SFRAME_FRE_CFA_OFFSET_IDX + 1\n+\t\t\t: SFRAME_FRE_CFA_OFFSET_IDX;\n+  return sframe_get_fre_offset (fre, idx, errp);\n }\n \n /* Get the FP offset from the FRE.  If the offset is unavailable, sets\n@@ -611,14 +677,10 @@ __sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,\n \t\t\t    sframe_frame_row_entry *fre,\n \t\t\t    _Unwind_Reason_Code *errp)\n {\n+  _Unwind_Reason_Code fp_err = _URC_NO_REASON;\n+  bool flex_p = (__sframe_fre_get_fde_type (fre) == SFRAME_FDE_TYPE_FLEX);\n   uint32_t fp_offset_idx = 0;\n-  int8_t fp_offset = sframe_decoder_get_fixed_fp_offset (dctx);\n-\n-  *errp = _URC_NO_REASON;\n-  /* If the FP offset is not being tracked, return the fixed FP offset\n-     from the SFrame header.  */\n-  if (fp_offset != SFRAME_CFA_FIXED_FP_INVALID)\n-    return fp_offset;\n+  int8_t fixed_fp_offset = sframe_decoder_get_fixed_fp_offset (dctx);\n \n   /* In some ABIs, the stack offset to recover RA (using the CFA) from is\n      fixed (like AMD64).  In such cases, the stack offset to recover FP will\n@@ -627,7 +689,32 @@ __sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,\n \t\t    != SFRAME_CFA_FIXED_RA_INVALID)\n \t\t   ? SFRAME_FRE_RA_OFFSET_IDX\n \t\t   : SFRAME_FRE_FP_OFFSET_IDX);\n-  return sframe_get_fre_offset (fre, fp_offset_idx, errp);\n+  if (flex_p)\n+    {\n+      _Unwind_Reason_Code ra_reg_err;\n+      uint32_t flex_ra_reg_data\n+\t= sframe_get_fre_udata (fre, SFRAME_FRE_RA_OFFSET_IDX * 2,\n+\t\t\t\t&ra_reg_err);\n+      if (ra_reg_err == _URC_NO_REASON\n+\t  && flex_ra_reg_data == SFRAME_FRE_RA_OFFSET_INVALID)\n+\tfp_offset_idx = SFRAME_FRE_FP_OFFSET_IDX * 2;\n+      else\n+\tfp_offset_idx = SFRAME_FRE_FP_OFFSET_IDX * 2 + 1;\n+    }\n+\n+  int32_t fp_offset = sframe_get_fre_offset (fre, fp_offset_idx, &fp_err);\n+\n+  /* If the FP offset is fixed and the FRE does not provide one, use the\n+     fixed offset in the SFrame header.  */\n+  if ((!flex_p || (flex_p && fp_err != _URC_NO_REASON))\n+      && fixed_fp_offset != SFRAME_CFA_FIXED_FP_INVALID)\n+    {\n+      *errp = _URC_NO_REASON;\n+      return fixed_fp_offset;\n+    }\n+\n+  *errp = fp_err;\n+  return fp_offset;\n }\n \n /* Get the RA offset from the FRE.  If the offset is unavailable, sets\n@@ -638,16 +725,48 @@ __sframe_fre_get_ra_offset (sframe_decoder_ctx *dctx,\n \t\t\t    sframe_frame_row_entry *fre,\n \t\t\t    _Unwind_Reason_Code *errp)\n {\n-  int8_t ra_offset = sframe_decoder_get_fixed_ra_offset (dctx);\n-  *errp = _URC_NO_REASON;\n+  _Unwind_Reason_Code ra_err = _URC_NO_REASON;\n+  bool flex_p = (__sframe_fre_get_fde_type (fre) == SFRAME_FDE_TYPE_FLEX);\n+  int8_t fixed_ra_offset = sframe_decoder_get_fixed_ra_offset (dctx);\n+\n+  uint32_t ra_offset_idx = SFRAME_FRE_RA_OFFSET_IDX;\n+  if (flex_p)\n+    {\n+      _Unwind_Reason_Code ra_reg_err;\n+      uint32_t flex_ra_reg_data\n+\t= sframe_get_fre_udata (fre, SFRAME_FRE_RA_OFFSET_IDX * 2,\n+\t\t\t\t&ra_reg_err);\n+\n+      /* In FLEX rows, a missing RA rule means use the fixed RA offset from\n+\t the SFrame header (if available).  */\n+      if (ra_reg_err == _URC_NO_REASON\n+\t  && flex_ra_reg_data == SFRAME_FRE_RA_OFFSET_INVALID)\n+\t{\n+\t  if (fixed_ra_offset != SFRAME_CFA_FIXED_RA_INVALID)\n+\t    {\n+\t      *errp = _URC_NO_REASON;\n+\t      return fixed_ra_offset;\n+\t    }\n+\n+\t  *errp = _URC_END_OF_STACK;\n+\t  return 0;\n+\t}\n+\n+      ra_offset_idx = SFRAME_FRE_RA_OFFSET_IDX * 2 + 1;\n+    }\n+  int32_t ra_offset = sframe_get_fre_offset (fre, ra_offset_idx, &ra_err);\n \n-  /* If the RA offset was not being tracked, return the fixed RA offset\n-     from the SFrame header.  */\n-  if (ra_offset != SFRAME_CFA_FIXED_RA_INVALID)\n-    return ra_offset;\n+  /* If the RA offset is fixed and the FRE does not provide one, use the\n+     fixed offset in the SFrame header.  */\n+  if ((!flex_p || (flex_p && ra_err != _URC_NO_REASON))\n+      && fixed_ra_offset != SFRAME_CFA_FIXED_RA_INVALID)\n+    {\n+      *errp = _URC_NO_REASON;\n+      return fixed_ra_offset;\n+    }\n \n-  /* Otherwise, get the RA offset from the FRE.  */\n-  return sframe_get_fre_offset (fre, SFRAME_FRE_RA_OFFSET_IDX, errp);\n+  *errp = ra_err;\n+  return ra_offset;\n }\n \n /* Decode the specified SFrame buffer SF_BUF and return the new SFrame\n@@ -737,10 +856,6 @@ __sframe_find_fre (sframe_decoder_ctx *ctx, int64_t pc,\n       || ctx->sfd_fres == NULL)\n     return _URC_END_OF_STACK;\n \n-  /* Glibc's SFrame unwinder currently supports only DEFAULT FDEs.  */\n-  if (sframe_get_fde_type (&fdep, version) != SFRAME_FDE_TYPE_DEFAULT)\n-    return _URC_END_OF_STACK;\n-\n   fre_type = sframe_get_fre_type (&fdep, version);\n   fres = ctx->sfd_fres + fdep.func_start_fre_off;\n   if (version == SFRAME_VERSION_3)\n@@ -795,6 +910,7 @@ __sframe_find_fre (sframe_decoder_ctx *ctx, int64_t pc,\n \t{\n \t  /* Decode last FRE bits: offsets size.  */\n \t  frep->fre_offsets = fres + addr_size + sizeof (frep->fre_info);\n+\t  frep->fre_fde_type = sframe_get_fde_type (&fdep, version);\n \t  return _URC_NO_REASON;\n \t}\n \ndiff --git a/sysdeps/generic/sframe-read.h b/sysdeps/generic/sframe-read.h\nindex 9bda6b1b19..ffb6e46c3a 100644\n--- a/sysdeps/generic/sframe-read.h\n+++ b/sysdeps/generic/sframe-read.h\n@@ -38,7 +38,8 @@ typedef struct sframe_decoder_ctx\n   int sfd_fre_nbytes;\n } sframe_decoder_ctx;\n \n-#define MAX_NUM_STACK_OFFSETS\t3\n+/* Default FDEs use up to 3 data words, FLEX FDEs may use up to 6.  */\n+#define MAX_NUM_STACK_OFFSETS\t6\n \n /* User interfacing SFrame Row Entry.\n    An abstraction provided by libsframe so the consumer is decoupled from\n@@ -52,6 +53,7 @@ typedef struct sframe_frame_row_entry\n {\n   uint32_t fre_start_addr;\n   const char *fre_offsets;\n+  uint8_t fre_fde_type;\n   unsigned char fre_info;\n } sframe_frame_row_entry;\n \n@@ -75,6 +77,15 @@ __sframe_find_fre (sframe_decoder_ctx *ctx, int64_t pc,\n extern uint8_t\n __sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre);\n \n+/* Get the FDE type associated with the FRE.  */\n+extern uint8_t\n+__sframe_fre_get_fde_type (sframe_frame_row_entry *fre);\n+\n+/* Get IDX'th data word from the FRE as unsigned value.  */\n+extern uint32_t\n+__sframe_fre_get_udata (sframe_frame_row_entry *fre, int idx,\n+\t\t\t_Unwind_Reason_Code *errp);\n+\n /* Get the CFA offset from the FRE.  Sets ERRP if an error is\n    detected.  */\n \ndiff --git a/sysdeps/generic/sframe.c b/sysdeps/generic/sframe.c\nindex 3c5721f513..30644494bb 100644\n--- a/sysdeps/generic/sframe.c\n+++ b/sysdeps/generic/sframe.c\n@@ -34,6 +34,52 @@ read_stack_value (_Unwind_Ptr loc)\n   return value;\n }\n \n+/* Resolve a FLEX rule register number to a known register value.  */\n+\n+static _Unwind_Reason_Code\n+sframe_flex_get_reg_value (frame *frame, uint32_t reg_num, _Unwind_Ptr *value)\n+{\n+#if defined SFRAME_FLEX_REG_FP && defined SFRAME_FLEX_REG_SP\n+  if (reg_num == SFRAME_FLEX_REG_SP)\n+    *value = frame->sp;\n+  else if (reg_num == SFRAME_FLEX_REG_FP)\n+    *value = frame->fp;\n+  else\n+    return _URC_END_OF_STACK;\n+\n+  return _URC_NO_REASON;\n+#else\n+  return _URC_END_OF_STACK;\n+#endif\n+}\n+\n+/* Apply one FLEX control-word + offset recovery rule.  */\n+\n+static _Unwind_Reason_Code\n+sframe_apply_flex_rule (frame *frame, _Unwind_Ptr cfa, uint32_t reg_data,\n+\t\t\tint32_t offset, bool cfa_p, _Unwind_Ptr *value)\n+{\n+  _Unwind_Ptr base;\n+  bool reg_p = SFRAME_V3_FLEX_FDE_CTRLWORD_REG_P (reg_data);\n+  bool deref_p = SFRAME_V3_FLEX_FDE_CTRLWORD_DEREF_P (reg_data);\n+\n+  if (cfa_p && !reg_p)\n+    return _URC_END_OF_STACK;\n+\n+  if (reg_p)\n+    {\n+      uint32_t reg_num = SFRAME_V3_FLEX_FDE_CTRLWORD_REGNUM (reg_data);\n+      if (sframe_flex_get_reg_value (frame, reg_num, &base) != _URC_NO_REASON)\n+\treturn _URC_END_OF_STACK;\n+    }\n+  else\n+    base = cfa;\n+\n+  _Unwind_Ptr loc = base + (_Unwind_Ptr) ((intptr_t) offset);\n+  *value = deref_p ? read_stack_value (loc) : loc;\n+  return _URC_NO_REASON;\n+}\n+\n /* Helper to avoid PLT call in libc.  Fixes elf/check-localplt\n    errors.  */\n \n@@ -52,6 +98,7 @@ _dl_find_object_helper (void *address, struct dl_find_object *result)\n int\n __stacktrace_sframe (void **ra_lst, int count, frame *frame)\n {\n+  uint32_t fde_type;\n   _Unwind_Ptr sframe_vma, cfa, return_addr, ra_stack_loc, fp_stack_loc, pc,\n     frame_ptr;\n   int cfa_offset, fp_offset, ra_offset, i;\n@@ -121,6 +168,8 @@ __stacktrace_sframe (void **ra_lst, int count, frame *frame)\n       if (SFRAME_V2_FRE_RA_UNDEFINED_P (frep->fre_info))\n \treturn i;\n \n+      fde_type = __sframe_fre_get_fde_type (frep);\n+\n       /* Get the CFA offset from the FRE.  If offset is unavailable,\n \t sets err.  */\n       cfa_offset = __sframe_fre_get_cfa_offset (dctx, frep, &err);\n@@ -128,9 +177,21 @@ __stacktrace_sframe (void **ra_lst, int count, frame *frame)\n \t/* Force fallback to DWARF stacktracer.  */\n \treturn 0;\n \n-      /* Get CFA using base reg id from the FRE info.  */\n-      cfa = ((__sframe_fre_get_base_reg_id (frep)\n-\t      == SFRAME_BASE_REG_SP) ? frame->sp : frame->fp) + cfa_offset;\n+      if (fde_type == SFRAME_FDE_TYPE_FLEX)\n+\t{\n+\t  uint32_t cfa_reg_data\n+\t    = __sframe_fre_get_udata (frep, SFRAME_FRE_CFA_OFFSET_IDX, &err);\n+\t  if (err != _URC_NO_REASON\n+\t      || sframe_apply_flex_rule (frame, 0, cfa_reg_data,\n+\t\t\t\t\t cfa_offset, true, &cfa)\n+\t\t != _URC_NO_REASON)\n+\t    /* Force fallback to DWARF stacktracer.  */\n+\t    return 0;\n+\t}\n+      else\n+\t/* Get CFA using base reg id from the FRE info.  */\n+\tcfa = ((__sframe_fre_get_base_reg_id (frep) == SFRAME_BASE_REG_SP)\n+\t       ? frame->sp : frame->fp) + cfa_offset;\n \n       /* Get the RA offset from the FRE.  If the offset is\n \t unavailable, sets err.  */\n@@ -139,10 +200,35 @@ __stacktrace_sframe (void **ra_lst, int count, frame *frame)\n \t/* Force fallback to DWARF stacktracer.  */\n \treturn 0;\n \n-      /* RA offset is available, get the value stored in the stack\n-\t location.  */\n-      ra_stack_loc = cfa + ra_offset;\n-      return_addr = read_stack_value (ra_stack_loc);\n+      if (fde_type == SFRAME_FDE_TYPE_FLEX)\n+\t{\n+\t  _Unwind_Reason_Code ra_reg_err;\n+\t  uint32_t ra_reg_data\n+\t    = __sframe_fre_get_udata (frep, SFRAME_FRE_RA_OFFSET_IDX * 2,\n+\t\t\t\t      &ra_reg_err);\n+\t  if (ra_reg_err == _URC_NO_REASON\n+\t      && ra_reg_data != SFRAME_FRE_RA_OFFSET_INVALID)\n+\t    {\n+\t      if (sframe_apply_flex_rule (frame, cfa, ra_reg_data, ra_offset,\n+\t\t\t\t\t  false, &return_addr)\n+\t\t  != _URC_NO_REASON)\n+\t\t/* Force fallback to DWARF stacktracer.  */\n+\t\treturn 0;\n+\t    }\n+\t  else\n+\t    {\n+\t      /* Fixed RA offset case in FLEX uses default stack rule.  */\n+\t      ra_stack_loc = cfa + ra_offset;\n+\t      return_addr = read_stack_value (ra_stack_loc);\n+\t    }\n+\t}\n+      else\n+\t{\n+\t  /* RA offset is available, get the value stored in the stack\n+\t     location.  */\n+\t  ra_stack_loc = cfa + ra_offset;\n+\t  return_addr = read_stack_value (ra_stack_loc);\n+\t}\n \n       ra_lst[i] = (void *) return_addr;\n \n@@ -152,10 +238,39 @@ __stacktrace_sframe (void **ra_lst, int count, frame *frame)\n       frame_ptr = frame->fp;\n       if (err == _URC_NO_REASON)\n \t{\n-\t  /* FP offset is available, get the value stored in the stack\n-\t     location.  */\n-\t  fp_stack_loc = cfa + fp_offset;\n-\t  frame_ptr = read_stack_value (fp_stack_loc);\n+\t  if (fde_type == SFRAME_FDE_TYPE_FLEX)\n+\t    {\n+\t      _Unwind_Reason_Code ra_reg_err, fp_reg_err;\n+\t      int fp_idx = SFRAME_FRE_FP_OFFSET_IDX * 2;\n+\t      uint32_t ra_reg_data\n+\t\t= __sframe_fre_get_udata (frep, SFRAME_FRE_RA_OFFSET_IDX * 2,\n+\t\t\t\t\t  &ra_reg_err);\n+\t      if (ra_reg_err == _URC_NO_REASON\n+\t\t  && ra_reg_data == SFRAME_FRE_RA_OFFSET_INVALID)\n+\t\tfp_idx -= 1;\n+\t      uint32_t fp_reg_data = __sframe_fre_get_udata (frep, fp_idx,\n+\t\t\t\t\t\t\t     &fp_reg_err);\n+\t      if (fp_reg_err == _URC_NO_REASON)\n+\t\t{\n+\t\t  if (sframe_apply_flex_rule (frame, cfa, fp_reg_data, fp_offset,\n+\t\t\t\t\t      false, &frame_ptr)\n+\t\t      != _URC_NO_REASON)\n+\t\t    /* Force fallback to DWARF stacktracer.  */\n+\t\t    return 0;\n+\t\t}\n+\t      else\n+\t\t{\n+\t\t  fp_stack_loc = cfa + fp_offset;\n+\t\t  frame_ptr = read_stack_value (fp_stack_loc);\n+\t\t}\n+\t    }\n+\t  else\n+\t    {\n+\t      /* FP offset is available, get the value stored in the stack\n+\t\t location.  */\n+\t      fp_stack_loc = cfa + fp_offset;\n+\t      frame_ptr = read_stack_value (fp_stack_loc);\n+\t    }\n \t}\n \n       /* Set up for the next frame.  */\ndiff --git a/sysdeps/generic/sframe.h b/sysdeps/generic/sframe.h\nindex 2bb720bb43..240a452a20 100644\n--- a/sysdeps/generic/sframe.h\n+++ b/sysdeps/generic/sframe.h\n@@ -323,6 +323,22 @@ typedef struct sframe_func_desc_attr_v3\n   ((info2) & SFRAME_V3_FDE_TYPE_MASK)\n #define SFRAME_V3_FDE_FRE_TYPE(info) (SFRAME_V2_FUNC_FRE_TYPE (info))\n #define SFRAME_V3_FDE_PC_TYPE(info) (SFRAME_V2_FUNC_PC_TYPE (info))\n+#define SFRAME_V3_FDE_SIGNAL_P(info) (((info) >> 7) & 0x1)\n+\n+/* Set the FDE type in the info2 byte, preserving upper bits.  */\n+#define SFRAME_V3_SET_FDE_TYPE(info2, fde_type) \\\n+  (((info2) & ~SFRAME_V3_FDE_TYPE_MASK) \\\n+   | ((fde_type) & SFRAME_V3_FDE_TYPE_MASK))\n+\n+#define SFRAME_V3_FDE_UPDATE_SIGNAL_P(signal_p, info) \\\n+  ((((signal_p) & 0x1) << 7) | ((info) & 0x7f))\n+\n+#define SFRAME_V3_FLEX_FDE_CTRLWORD_ENCODE(reg, deref_p, reg_p) \\\n+  ((((reg) << 0x3) | (0 << 0x2) | (((deref_p) & 0x1) << 0x1) | ((reg_p) & 0x1)))\n+\n+#define SFRAME_V3_FLEX_FDE_CTRLWORD_REGNUM(data) ((data) >> 3)\n+#define SFRAME_V3_FLEX_FDE_CTRLWORD_DEREF_P(data) (((data) >> 1) & 0x1)\n+#define SFRAME_V3_FLEX_FDE_CTRLWORD_REG_P(data) ((data) & 0x1)\n \n /* Size of stack frame offsets in an SFrame Frame Row Entry.  A single\n    SFrame FRE has all offsets of the same size.  Offset size may vary\n@@ -353,6 +369,9 @@ typedef struct sframe_func_desc_attr_v3\n    may or may not be tracked.  */\n #define SFRAME_FRE_FP_OFFSET_IDX    2\n \n+/* Invalid RA offset.  Used as padding in FLEX FREs when RA is not tracked.  */\n+#define SFRAME_FRE_RA_OFFSET_INVALID 0\n+\n typedef struct sframe_fre_info\n {\n   /* Information about\ndiff --git a/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h b/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h\nindex 7aa9e4bd60..51dfa7456f 100644\n--- a/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h\n+++ b/sysdeps/unix/sysv/linux/aarch64/uw-sigframe.h\n@@ -32,6 +32,12 @@\n #define SVC_0           0x010000d4\n #endif\n \n+/* DWARF register number of the frame-pointer for SFrame CFA tracking.  */\n+#define SFRAME_FLEX_REG_FP 29\n+/* DWARF register number of the stack-pointer for SFrame CFA and FP\n+   tracking.  */\n+#define SFRAME_FLEX_REG_SP 31\n+\n #define MD_DECODE_SIGNAL_FRAME aarch64_decode_signal_frame\n \n static _Unwind_Reason_Code\ndiff --git a/sysdeps/unix/sysv/linux/x86_64/uw-sigframe.h b/sysdeps/unix/sysv/linux/x86_64/uw-sigframe.h\nindex 7813667789..1eea78a224 100644\n--- a/sysdeps/unix/sysv/linux/x86_64/uw-sigframe.h\n+++ b/sysdeps/unix/sysv/linux/x86_64/uw-sigframe.h\n@@ -27,6 +27,12 @@\n \n /* SFrame is only supported by x86_64 targets.  */\n \n+/* DWARF register number of the frame-pointer for SFrame CFA tracking.  */\n+#define SFRAME_FLEX_REG_FP 6\n+/* DWARF register number of the stack-pointer for SFrame CFA and FP\n+   tracking.  */\n+#define SFRAME_FLEX_REG_SP 7\n+\n #define MD_DECODE_SIGNAL_FRAME x86_64_decode_signal_frame\n \n #ifdef __LP64__\n","prefixes":["2/2"]}