<div dir="ltr">How did you find this?  Was it causing a symptom of something breaking?</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 29, 2017 at 2:54 PM Rui Ueyama via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ruiu created this revision.<br>
Herald added subscribers: hiraditya, emaste.<br>
<br>
Correctly set reserved bits for UUID version 4.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D40623" rel="noreferrer" target="_blank">https://reviews.llvm.org/D40623</a><br>
<br>
Files:<br>
  lld/ELF/SyntheticSections.cpp<br>
  llvm/include/llvm/Support/RandomNumberGenerator.h<br>
  llvm/lib/Support/RandomNumberGenerator.cpp<br>
<br>
<br>
Index: llvm/lib/Support/RandomNumberGenerator.cpp<br>
===================================================================<br>
--- llvm/lib/Support/RandomNumberGenerator.cpp<br>
+++ llvm/lib/Support/RandomNumberGenerator.cpp<br>
@@ -89,3 +89,15 @@<br>
   return std::error_code(errno, std::system_category());<br>
 #endif<br>
 }<br>
+<br>
+// UUID v4 is a 122-bit random number in the form of<br>
+// RRRRRRRR-RRRR-4RRR-xRRR-RRRRRRRRRRRR, where R is a random byte and<br>
+// x's most siginificant two bits are 0b10.<br>
+std::error_code llvm::getUuidV4(void *Buffer) {<br>
+  if (auto EC = getRandomBytes(Buffer, 16))<br>
+    return EC;<br>
+  char *Buf = (char *)Buffer;<br>
+  Buf[7] = 0x40 | (Buf[7] & 0xf);<br>
+  Buf[9] = 0x80 | (Buf[9] & 0x3f);<br>
+  return std::error_code();<br>
+}<br>
Index: llvm/include/llvm/Support/RandomNumberGenerator.h<br>
===================================================================<br>
--- llvm/include/llvm/Support/RandomNumberGenerator.h<br>
+++ llvm/include/llvm/Support/RandomNumberGenerator.h<br>
@@ -65,6 +65,9 @@<br>
<br>
 // Get random vector of specified size<br>
 std::error_code getRandomBytes(void *Buffer, size_t Size);<br>
+<br>
+// Get UUID v4.<br>
+std::error_code getUuidV4(void *Buffer);<br>
 }<br>
<br>
 #endif<br>
Index: lld/ELF/SyntheticSections.cpp<br>
===================================================================<br>
--- lld/ELF/SyntheticSections.cpp<br>
+++ lld/ELF/SyntheticSections.cpp<br>
@@ -368,7 +368,7 @@<br>
     });<br>
     break;<br>
   case BuildIdKind::Uuid:<br>
-    if (auto EC = getRandomBytes(HashBuf, HashSize))<br>
+    if (auto EC = getUuidV4(HashBuf))<br>
       error("entropy source failure: " + EC.message());<br>
     break;<br>
   case BuildIdKind::Hexstring:<br>
<br>
<br>
</blockquote></div>