{"id":5342,"date":"2025-01-28T12:23:33","date_gmt":"2025-01-28T11:23:33","guid":{"rendered":"https:\/\/www.islandwalking.com\/wordpress\/?p=5342"},"modified":"2025-01-28T12:39:03","modified_gmt":"2025-01-28T11:39:03","slug":"llvm-exercise-iv","status":"publish","type":"post","link":"https:\/\/www.islandwalking.com\/wordpress\/llvm-exercise-iv\/","title":{"rendered":"LLVM Exercise IV"},"content":{"rendered":"<p>How about calling another function:<\/p>\n<blockquote>\n<pre>int foo() {\r\n    return 0xFF;\r\n}\r\n\r\nint bar() {\r\n    return foo();\r\n}\r\n<\/pre>\n<\/blockquote>\n<p>Code snippets:<\/p>\n<blockquote>\n<pre>...\r\n\r\ndef CC_HP41MCODE : CallingConv&lt;[]&gt;;\r\n\r\n...\r\n\r\ndef SDT_HP41MCODENCXQ : SDTypeProfile&lt;0, -1,\r\n                                      [SDTCisVT&lt;0, iPTR&gt;]&gt;;\r\ndef HP41MCODENCXQ : SDNode&lt;\"HP41MCODEISD::NCXQ\",\r\n                           SDT_HP41MCODENCXQ,\r\n                           [SDNPHasChain, SDNPOptInGlue,\r\n                            SDNPOutGlue, SDNPVariadic]&gt;;\r\n\r\n...\r\n\r\ndef calltarget : Operand;\r\n\r\n...\r\n\r\nlet isCall=1 in {\r\n    def NCXQ : HP41MCODEInst&lt;0x001, (outs),\r\n                             (ins calltarget:$addr),\r\n                             \"?NC XQ $addr\",\r\n                             [(HP41MCODENCXQ\r\n                              tglobaladdr:$addr)]&gt;;\r\n}\r\n\r\n...\r\n\r\nNCXQ,         \/\/ A call instruction.\r\n\r\n...\r\n\r\nSDValue\r\nHP41MCODETargetLowering::LowerCall(\r\n        TargetLowering::CallLoweringInfo &amp;CLI,\r\n        SmallVectorImpl &amp;InVals) const {\r\n    ...\r\n\r\n    CCInfo.AnalyzeCallOperands(Outs, CC_HP41MCODE);\r\n\r\n    ...\r\n\r\n    Chain = DAG.getNode(HP41MCODEISD::NCXQ, DL, NodeTys, Ops);\r\n\r\n    ...\r\n\r\n    return Chain;\r\n}\r\n\r\n...\r\n\r\n<\/pre>\n<\/blockquote>\n<p>The following assembly is produced:<\/p>\n<blockquote>\n<pre>\t.file\t\"hello.c\"\r\n\t.text\r\n\t.globl\tfoo                     ! -- Begin function foo\r\n\t.type\tfoo,@function\r\nfoo:                                    ! @foo\r\n! %bb.0:                                ! %entry\r\n\tLDI S&amp;X HEX: 0FF\r\n\tRTN\r\n.Lfunc_end0:\r\n\t.size\tfoo, .Lfunc_end0-foo\r\n                                        ! -- End function\r\n\t.globl\tbar                     ! -- Begin function bar\r\n\t.type\tbar,@function\r\nbar:                                    ! @bar\r\n! %bb.0:                                ! %entry\r\n\t?NC XQ foo\r\n\tRTN\r\n.Lfunc_end1:\r\n\t.size\tbar, .Lfunc_end1-bar\r\n                                        ! -- End function\r\n\t.ident\t\"clang version 20.0.0git (https:\/\/github.com\/llvm\/llvm-project.git ea1dfd50bfdfbd75969fd7653bc71c81f2a2350f)\"\r\n\t.section\t\".note.GNU-stack\"\r\n\t.addrsig\r\n\t.addrsig_sym foo\r\n\r\n<\/pre>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>How about calling another function: int foo() { return 0xFF; } int bar() { return foo(); } Code snippets: &#8230; def CC_HP41MCODE : CallingConv&lt;[]&gt;; &#8230; def SDT_HP41MCODENCXQ : SDTypeProfile&lt;0, -1, [SDTCisVT&lt;0, iPTR&gt;]&gt;; def HP41MCODENCXQ : SDNode&lt;&#8220;HP41MCODEISD::NCXQ&#8221;, SDT_HP41MCODENCXQ, [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, SDNPVariadic]&gt;; &#8230; def calltarget : Operand; &#8230; let isCall=1 in { def NCXQ : HP41MCODEInst&lt;0x001, &hellip; <a class=\"read-excerpt\" href=\"https:\/\/www.islandwalking.com\/wordpress\/llvm-exercise-iv\/\">Continue reading <span class=\"meta-nav\">&raquo;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5342","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/comments?post=5342"}],"version-history":[{"count":4,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5342\/revisions"}],"predecessor-version":[{"id":5346,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5342\/revisions\/5346"}],"wp:attachment":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/media?parent=5342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/categories?post=5342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/tags?post=5342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}