get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/83801/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 83801,
    "url": "http://patches.dpdk.org/api/patches/83801/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1604649795-27476-7-git-send-email-juraj.linkes@pantheon.tech/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1604649795-27476-7-git-send-email-juraj.linkes@pantheon.tech>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1604649795-27476-7-git-send-email-juraj.linkes@pantheon.tech",
    "date": "2020-11-06T08:03:07",
    "name": "[v8,06/14] build: organize Arm config into dict",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "091d954af6c9d7ac1e24666b239862f3858ec798",
    "submitter": {
        "id": 1626,
        "url": "http://patches.dpdk.org/api/people/1626/?format=api",
        "name": "Juraj Linkeš",
        "email": "juraj.linkes@pantheon.tech"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1604649795-27476-7-git-send-email-juraj.linkes@pantheon.tech/mbox/",
    "series": [
        {
            "id": 13717,
            "url": "http://patches.dpdk.org/api/series/13717/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=13717",
            "date": "2020-11-06T08:03:01",
            "name": "Arm build options rework",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/13717/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/83801/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/83801/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 0861DA0524;\n\tFri,  6 Nov 2020 09:05:54 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 0D6195B3C;\n\tFri,  6 Nov 2020 09:03:37 +0100 (CET)",
            "from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20])\n by dpdk.org (Postfix) with ESMTP id 80DCB5947\n for <dev@dpdk.org>; Fri,  6 Nov 2020 09:03:31 +0100 (CET)",
            "from localhost (localhost [127.0.0.1])\n by lb.pantheon.sk (Postfix) with ESMTP id 00558B6B69;\n Fri,  6 Nov 2020 09:03:27 +0100 (CET)",
            "from lb.pantheon.sk ([127.0.0.1])\n by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id j1zhScwcLbLd; Fri,  6 Nov 2020 09:03:26 +0100 (CET)",
            "from service-node1.lab.pantheon.local (unknown [46.229.239.141])\n by lb.pantheon.sk (Postfix) with ESMTP id EF019B6B6B;\n Fri,  6 Nov 2020 09:03:21 +0100 (CET)"
        ],
        "X-Virus-Scanned": "amavisd-new at siecit.sk",
        "From": "=?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "To": "bruce.richardson@intel.com, Ruifeng.Wang@arm.com,\n Honnappa.Nagarahalli@arm.com, Phil.Yang@arm.com, vcchunga@amazon.com,\n Dharmik.Thakkar@arm.com, jerinjacobk@gmail.com, hemant.agrawal@nxp.com,\n ajit.khaparde@broadcom.com, ferruh.yigit@intel.com, aconole@redhat.com",
        "Cc": "dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "Date": "Fri,  6 Nov 2020 09:03:07 +0100",
        "Message-Id": "<1604649795-27476-7-git-send-email-juraj.linkes@pantheon.tech>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1604649795-27476-1-git-send-email-juraj.linkes@pantheon.tech>",
        "References": "<1604584762-25321-1-git-send-email-juraj.linkes@pantheon.tech>\n <1604649795-27476-1-git-send-email-juraj.linkes@pantheon.tech>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v8 06/14] build: organize Arm config into dict",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Use dictionary lookup instead of checking for existing variables,\niterating over all elements in the list or checking lists for optional\nconfiguration. Move variable contents into the dictionary for variables\nthat would be referenced only once.\nFallback to generic part number if the discovered part number is\nunknown.\n\nSigned-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>\n---\n config/arm/meson.build | 282 +++++++++++++++++++++++------------------\n 1 file changed, 160 insertions(+), 122 deletions(-)",
    "diff": "diff --git a/config/arm/meson.build b/config/arm/meson.build\nindex eda485e7f..5d232f1c4 100644\n--- a/config/arm/meson.build\n+++ b/config/arm/meson.build\n@@ -28,115 +28,146 @@ flags_common_default = [\n \t['RTE_CACHE_LINE_SIZE', 128]\n ]\n \n-# implementer specific aarch64 flags, with middle priority\n-# (will overwrite common flags)\n-flags_implementer_generic = [\n-\t['RTE_MACHINE', '\"armv8a\"'],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_CACHE_LINE_SIZE', 128],\n-\t['RTE_MAX_LCORE', 256]\n-]\n-flags_implementer_arm = [\n-\t['RTE_MACHINE', '\"armv8a\"'],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 16]\n-]\n-flags_implementer_cavium = [\n-\t['RTE_MAX_VFIO_GROUPS', 128],\n-\t['RTE_CACHE_LINE_SIZE', 128],\n-\t['RTE_MAX_LCORE', 96],\n-\t['RTE_MAX_NUMA_NODES', 2]\n-]\n-flags_implementer_dpaa = [\n-\t['RTE_MACHINE', '\"dpaa\"'],\n-\t['RTE_LIBRTE_DPAA2_USE_PHYS_IOVA', false],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 16],\n-\t['RTE_MAX_NUMA_NODES', 1]\n-]\n-flags_implementer_emag = [\n-\t['RTE_MACHINE', '\"emag\"'],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 32],\n-\t['RTE_MAX_NUMA_NODES', 1]\n-]\n-flags_implementer_armada = [\n-\t['RTE_MACHINE', '\"armv8a\"'],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 16],\n-\t['RTE_MAX_NUMA_NODES', 1]\n-]\n-\n-# part number specific aarch64 flags, with highest priority\n-# (will overwrite both common and implementer specific flags)\n flags_part_number_thunderx = [\n \t['RTE_MACHINE', '\"thunderx\"'],\n \t['RTE_USE_C11_MEM_MODEL', false]\n ]\n-flags_part_number_thunderx2 = [\n-\t['RTE_MACHINE', '\"thunderx2\"'],\n-\t['RTE_ARM_FEATURE_ATOMICS', true],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 256],\n-\t['RTE_MAX_NUMA_NODES', 2]\n-]\n-flags_part_number_octeontx2 = [\n-\t['RTE_MACHINE', '\"octeontx2\"'],\n-\t['RTE_ARM_FEATURE_ATOMICS', true],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_EAL_IGB_UIO', false],\n-\t['RTE_MAX_LCORE', 36],\n-\t['RTE_MAX_NUMA_NODES', 1]\n-]\n-flags_part_number_n1generic = [\n-\t['RTE_MACHINE', '\"neoverse-n1\"'],\n-\t['RTE_ARM_FEATURE_ATOMICS', true],\n-\t['RTE_USE_C11_MEM_MODEL', true],\n-\t['RTE_EAL_NUMA_AWARE_HUGEPAGES', false],\n-\t['RTE_LIBRTE_VHOST_NUMA', false],\n-\t['RTE_MAX_MEM_MB', 1048576],\n-\t['RTE_CACHE_LINE_SIZE', 64],\n-\t['RTE_MAX_LCORE', 64],\n-\t['RTE_MAX_NUMA_NODES', 1]\n-]\n-\n-# arm config (implementer 0x41) is the default config\n-part_number_config_arm = [\n-\t['generic', ['-march=armv8-a+crc', '-moutline-atomics']],\n-\t['native', ['-march=native']],\n-\t['0xd03', ['-mcpu=cortex-a53']],\n-\t['0xd04', ['-mcpu=cortex-a35']],\n-\t['0xd07', ['-mcpu=cortex-a57']],\n-\t['0xd08', ['-mcpu=cortex-a72']],\n-\t['0xd09', ['-mcpu=cortex-a73']],\n-\t['0xd0a', ['-mcpu=cortex-a75']],\n-\t['0xd0b', ['-mcpu=cortex-a76']],\n-\t['0xd0c', ['-march=armv8.2-a+crypto', '-mcpu=neoverse-n1'], flags_part_number_n1generic]\n-]\n-part_number_config_cavium = [\n-\t['generic', ['-march=armv8-a+crc+crypto','-mcpu=thunderx']],\n-\t['native', ['-march=native']],\n-\t['0xa1', ['-mcpu=thunderxt88'], flags_part_number_thunderx],\n-\t['0xa2', ['-mcpu=thunderxt81'], flags_part_number_thunderx],\n-\t['0xa3', ['-mcpu=thunderxt83'], flags_part_number_thunderx],\n-\t['0xaf', ['-march=armv8.1-a+crc+crypto','-mcpu=thunderx2t99'], flags_part_number_thunderx2],\n-\t['0xb2', ['-march=armv8.2-a+crc+crypto+lse','-mcpu=octeontx2'], flags_part_number_octeontx2]\n-]\n-part_number_config_emag = [\n-\t['generic', ['-march=armv8-a+crc+crypto', '-mtune=emag']],\n-\t['native', ['-march=native']]\n-]\n+part_number_config_arm = {\n+\t'generic': {'machine_args':  ['-march=armv8-a+crc', '-moutline-atomics']},\n+\t'native': {'machine_args':  ['-march=native']},\n+\t'0xd03': {'machine_args':  ['-mcpu=cortex-a53']},\n+\t'0xd04': {'machine_args':  ['-mcpu=cortex-a35']},\n+\t'0xd07': {'machine_args':  ['-mcpu=cortex-a57']},\n+\t'0xd08': {'machine_args':  ['-mcpu=cortex-a72']},\n+\t'0xd09': {'machine_args':  ['-mcpu=cortex-a73']},\n+\t'0xd0a': {'machine_args':  ['-mcpu=cortex-a75']},\n+\t'0xd0b': {'machine_args':  ['-mcpu=cortex-a76']},\n+\t'0xd0c': {\n+\t\t'machine_args':  ['-march=armv8.2-a+crypto', '-mcpu=neoverse-n1'],\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"neoverse-n1\"'],\n+\t\t\t['RTE_ARM_FEATURE_ATOMICS', true],\n+\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t['RTE_EAL_NUMA_AWARE_HUGEPAGES', false],\n+\t\t\t['RTE_LIBRTE_VHOST_NUMA', false],\n+\t\t\t['RTE_MAX_MEM_MB', 1048576],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t['RTE_MAX_LCORE', 64],\n+\t\t\t['RTE_MAX_NUMA_NODES', 1]\n+\t\t]\n+\t}\n+}\n \n-## Arm implementer ID (MIDR in Arm Architecture Reference Manual)\n-implementer_generic = ['Generic armv8', flags_implementer_generic, part_number_config_arm]\n-implementer_0x41 = ['Arm', flags_implementer_arm, part_number_config_arm]\n-implementer_0x43 = ['Cavium', flags_implementer_cavium, part_number_config_cavium]\n-implementer_0x50 = ['Ampere Computing', flags_implementer_emag, part_number_config_emag]\n-implementer_0x56 = ['Marvell ARMADA', flags_implementer_armada, part_number_config_arm]\n-implementer_dpaa = ['NXP DPAA', flags_implementer_dpaa, part_number_config_arm]\n+## Arm implementers (ID from MIDR in Arm Architecture Reference Manual)\n+## Part numbers are specific to Arm implementers\n+# implementer specific aarch64 flags have middle priority\n+#     (will overwrite common flags)\n+# part number specific aarch64 flags have the highest priority\n+#     (will overwrite both common and implementer specific flags)\n+implementers = {\n+\t'generic': {\n+\t\t'description': 'Generic armv8',\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"armv8a\"'],\n+\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 128],\n+\t\t\t['RTE_MAX_LCORE', 256]\n+\t\t],\n+\t\t'part_number_config': part_number_config_arm\n+\t},\n+\t'0x41': {\n+\t\t'description': 'Arm',\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"armv8a\"'],\n+\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t['RTE_MAX_LCORE', 16]\n+\t\t],\n+\t\t'part_number_config': part_number_config_arm\n+\t},\n+\t'0x43': {\n+\t\t'description': 'Cavium',\n+\t\t'flags': [\n+\t\t\t['RTE_MAX_VFIO_GROUPS', 128],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 128],\n+\t\t\t['RTE_MAX_LCORE', 96],\n+\t\t\t['RTE_MAX_NUMA_NODES', 2]\n+\t\t],\n+\t\t'part_number_config': {\n+\t\t\t'generic': {'machine_args': ['-march=armv8-a+crc+crypto', '-mcpu=thunderx']},\n+\t\t\t'native': {'machine_args': ['-march=native']},\n+\t\t\t'0xa1': {\n+\t\t\t\t'machine_args': ['-mcpu=thunderxt88'],\n+\t\t\t\t'flags': flags_part_number_thunderx\n+\t\t\t},\n+\t\t\t'0xa2': {\n+\t\t\t\t'machine_args': ['-mcpu=thunderxt81'],\n+\t\t\t\t'flags': flags_part_number_thunderx\n+\t\t\t},\n+\t\t\t'0xa3': {\n+\t\t\t\t'machine_args': ['-mcpu=thunderxt83'],\n+\t\t\t\t'flags': flags_part_number_thunderx\n+\t\t\t},\n+\t\t\t'0xaf': {\n+\t\t\t\t'machine_args': ['-march=armv8.1-a+crc+crypto','-mcpu=thunderx2t99'],\n+\t\t\t\t'flags': [\n+\t\t\t\t\t['RTE_MACHINE', '\"thunderx2\"'],\n+\t\t\t\t\t['RTE_ARM_FEATURE_ATOMICS', true],\n+\t\t\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t\t\t['RTE_MAX_LCORE', 256],\n+\t\t\t\t\t['RTE_MAX_NUMA_NODES', 2]\n+\t\t\t\t]\n+\t\t\t},\n+\t\t\t'0xb2': {\n+\t\t\t\t'machine_args': ['-march=armv8.2-a+crc+crypto+lse','-mcpu=octeontx2'],\n+\t\t\t\t'flags': [\n+\t\t\t\t\t['RTE_MACHINE', '\"octeontx2\"'],\n+\t\t\t\t\t['RTE_ARM_FEATURE_ATOMICS', true],\n+\t\t\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t\t\t['RTE_EAL_IGB_UIO', false],\n+\t\t\t\t\t['RTE_MAX_LCORE', 36],\n+\t\t\t\t\t['RTE_MAX_NUMA_NODES', 1]\n+\t\t\t\t]\n+\t\t\t}\n+\t\t}\n+\t},\n+\t'0x50': {\n+\t\t'description': 'Ampere Computing',\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"emag\"'],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t['RTE_MAX_LCORE', 32],\n+\t\t\t['RTE_MAX_NUMA_NODES', 1]\n+\t\t],\n+\t\t'part_number_config': {\n+\t\t\t'generic': {'machine_args':  ['-march=armv8-a+crc+crypto', '-mtune=emag']},\n+\t\t\t'native': {'machine_args':  ['-march=native']}\n+\t\t}\n+\t},\n+\t'0x56': {\n+\t\t'description': 'Marvell ARMADA',\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"armv8a\"'],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t['RTE_MAX_LCORE', 16],\n+\t\t\t['RTE_MAX_NUMA_NODES', 1]\n+\t\t],\n+\t\t'part_number_config': part_number_config_arm\n+\t},\n+\t'dpaa': {\n+\t\t'description': 'NXP DPAA',\n+\t\t'flags': [\n+\t\t\t['RTE_MACHINE', '\"dpaa\"'],\n+\t\t\t['RTE_LIBRTE_DPAA2_USE_PHYS_IOVA', false],\n+\t\t\t['RTE_USE_C11_MEM_MODEL', true],\n+\t\t\t['RTE_CACHE_LINE_SIZE', 64],\n+\t\t\t['RTE_MAX_LCORE', 16],\n+\t\t\t['RTE_MAX_NUMA_NODES', 1]\n+\t\t],\n+\t\t'part_number_config': part_number_config_arm\n+\t}\n+}\n \n dpdk_conf.set('RTE_ARCH_ARM', 1)\n dpdk_conf.set('RTE_FORCE_INTRINSICS', 1)\n@@ -152,7 +183,7 @@ else\n \timplementer_id = 'generic'\n \tif machine == 'generic' and not meson.is_cross_build()\n \t\t# generic build\n-\t\timplementer_config = implementer_generic\n+\t\timplementer_config = implementer['generic']\n \t\tpart_number = 'generic'\n \telif not meson.is_cross_build()\n \t\t# native build\n@@ -167,9 +198,9 @@ else\n \t\t\tpart_number = cmd_output[3]\n \t\tendif\n \t\t# Set to generic if variable is not found\n-\t\timplementer_config = get_variable('implementer_' + implementer_id, ['generic'])\n+\t\timplementer_config = implementers.get(implementer_id, ['generic'])\n \t\tif implementer_config[0] == 'generic'\n-\t\t\timplementer_config = implementer_generic\n+\t\t\timplementer_config = implementer['generic']\n \t\t\tpart_number = 'generic'\n \t\tendif\n \t\tif arm_force_native_march == true\n@@ -179,28 +210,35 @@ else\n \t\t# cross build\n \t\timplementer_id = meson.get_cross_property('implementer_id', 'generic')\n \t\tpart_number = meson.get_cross_property('part_number', 'generic')\n-\t\timplementer_config = get_variable('implementer_' + implementer_id)\n+\t\timplementer_config = implementers.get(implementer_id)\n \tendif\n \n-\tmessage('Arm implementer: ' + implementer_config[0])\n+\tmessage('Arm implementer: ' + implementer_config['description'])\n \tmessage('Arm part number: ' + part_number)\n \n+\tpart_number_config = implementer_config['part_number_config']\n+\tif part_number_config.has_key(part_number)\n+\t\t# use the specified part_number machine args if found\n+\t\tpart_number_config = part_number_config[part_number]\n+\telif not meson.is_cross_build()\n+\t\t# default to generic machine args if part_number is not found\n+\t\t# and not forcing native machine args\n+\t\t# but don't default in cross-builds; if part_number is specified\n+\t\t# incorrectly in a cross-file, it needs to be fixed there\n+\t\tpart_number_config = part_number_config['generic']\n+\telse\n+\t\t# doing cross build and part number is not in part_number_config\n+\t\terror('Cross build part number 0@0 not found.'.format(part_number))\n+\tendif\n+\n \t# use default flags with implementer flags\n-\tdpdk_flags = flags_common_default + implementer_config[1]\n+\tdpdk_flags = flags_common_default + implementer_config['flags'] + part_number_config.get('flags', [])\n \n+\t# apply supported machine args\n \tmachine_args = [] # Clear previous machine args\n-\tforeach marg: implementer_config[2]\n-\t\tif marg[0] == part_number\n-\t\t\t# apply supported machine args\n-\t\t\tforeach flag: marg[1]\n-\t\t\t\tif cc.has_argument(flag)\n-\t\t\t\t\tmachine_args += flag\n-\t\t\t\tendif\n-\t\t\tendforeach\n-\t\t\tif marg.length() > 2\n-\t\t\t\t# add extra flags for the part\n-\t\t\t\tdpdk_flags += marg[2]\n-\t\t\tendif\n+\tforeach flag: part_number_config['machine_args']\n+\t\tif cc.has_argument(flag)\n+\t\t\tmachine_args += flag\n \t\tendif\n \tendforeach\n \n",
    "prefixes": [
        "v8",
        "06/14"
    ]
}