<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
Hi,<br><br>I just bumped into a bug in this code. The problem was as follows:<br><br>I have defined a set of registers with rather similar names including digits.<br><br>The code section at <br><br>RegisterInfoEmitter::run(){<br>...<br> // Process sub-register sets.<br><br>runs and fills the RegisterAliases map.<br><br>then, <br><br>...<br>for (unsigned i = 0, e = Regs.size(); i != e; ++i) {<br>    RegNo[Regs[i].TheDef] = i;<br>    NumAliases += RegisterAliases[Regs[i].TheDef].size();<br>}<br><br>runs. Only, now there are duplicates in the RegisterAliases map for the same Regs[i]-Record.<br><br>This lead to duplicate output of the REG_Overlaps lists:<br><br>error: redefinition of 'const unsigned int llvm::<unnamed>::a23g_Overlaps []'<br>/local/scratch/ejonpan/llvm/build/lib/Target/Hubble/HubbleGenRegisterInfo.inc:2700: error: 'const unsigned int llvm::<unnamed>::a23g_Overlaps [4]'<br> previously defined here<br>/local/scratch/ejonpan/llvm/build/lib/Target/Hubble/HubbleGenRegisterInfo.inc:2732: error: redefinition of 'const unsigned int llvm::<unnamed>::a6<br>7g_Overlaps []'<br>/local/scratch/ejonpan/llvm/build/lib/Target/Hubble/HubbleGenRegisterInfo.inc:2717: error: 'const unsigned int llvm::<unnamed>::a67g_Overlaps [4]'<br> previously defined here<br><br>This behaved very oddly, as the error disappeared after changing register names from eg a23g to aa23g.<br><br>It was the map ordering operator that was the trouble, it seems, as the problem disappeared when I used std::string::compare() instead for<br>the RegisterAliases map.<br><br>struct LessRecord {<br>  bool operator()(const Record *Rec1, const Record *Rec2) const {<br>    return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;<br>  }<br>};<br><br>struct LessRecordRegAliases{<br>  bool operator()(const Record *Rec1, const Record *Rec2) const {<br>    return Rec1->getName().compare(Rec2->getName()) < 0;<br>  }<br>};<br><br>The conclusion is that the StringRef::compare_numeric() is not 
deterministic and should not be used in this context, as the map::operator[] will not find 
the<br>object, and insert a duplicate in this case. Note that my reg-names included digits and where very similar. <br><br>/Jonas<br><br>
<br><br><br>                                    </div></body>
</html>