<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hello,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m trying to change the default behavior for how structures are passed to functions to use pass-by-value. Currently LLVM’s default behavior is to pass structures by reference. I’m not disputing the benefits of this but I really want to
 change the default behavior for experimentation purposes.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">To this end I’ve changed the code in DefaultABIInfo::classifyArgumentType() to use the different types. What I’ve found is that none of the options yield the expected results for the input code (see below). Except for the indirect case,
 the function signature is changed to take each structure element. How can I modify LLVM to pass structures by value?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">Javier<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[Original Code]<o:p></o:p></p>
<p class="MsoNormal">struct myType {<o:p></o:p></p>
<p class="MsoNormal">  long val;<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal">int convert(struct myType in)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">  return (int)in.val;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[Expected Result]<o:p></o:p></p>
<p class="MsoNormal">define i32 @convert(%myType %in) nounwind readonly alwaysinline{<o:p></o:p></p>
<p class="MsoNormal">entry:<o:p></o:p></p>
<p class="MsoNormal">  %in.addr = alloca %myType, align 8<o:p></o:p></p>
<p class="MsoNormal">  store %myType %in, %myType* %in.addr, align 8<o:p></o:p></p>
<p class="MsoNormal">  %0 = getelementptr inbounds %myType* %in.addr, i32 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  %1 = load i64* %0, align 8<o:p></o:p></p>
<p class="MsoNormal">  %conv = trunc i64 %1 to i32<o:p></o:p></p>
<p class="MsoNormal">  ret i32 %conv<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[ABIArgInfo::getIndirect(0) – Default]<o:p></o:p></p>
<p class="MsoNormal">%struct.myType = type { i64 }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">define i32 @convert(%struct.myType* nocapture byval %in) nounwind readonly {<o:p></o:p></p>
<p class="MsoNormal">entry:<o:p></o:p></p>
<p class="MsoNormal">  %val = getelementptr inbounds %struct.myType* %in, i64 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  %0 = load i64* %val, align 8, !tbaa !0<o:p></o:p></p>
<p class="MsoNormal">  %conv = trunc i64 %0 to i32<o:p></o:p></p>
<p class="MsoNormal">  ret i32 %conv<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[ABIArgInfo::getExtend(), ABIArgInfo::getDirect(), ABIArgInfo::getExpand()]<o:p></o:p></p>
<p class="MsoNormal">define i32 @convert(i64 %in.coerce0) nounwind readnone {<o:p></o:p></p>
<p class="MsoNormal">entry:<o:p></o:p></p>
<p class="MsoNormal">  %conv = trunc i64 %in.coerce0 to i32<o:p></o:p></p>
<p class="MsoNormal">  ret i32 %conv<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>