LTO: Add API to choose whether to embed uselists
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 27 Apr 2015 23:38:54 +0000 (23:38 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 27 Apr 2015 23:38:54 +0000 (23:38 +0000)
Reverse libLTO's default behaviour for preserving use-list order in
bitcode, and add API for controlling it.  The default setting is now
`false` (don't preserve them), which is consistent with `clang`'s
default behaviour.

Users of libLTO should call `lto_codegen_should_embed_uselists(CG,true)`
prior to calling `lto_codegen_write_merged_modules()` whenever the
output file isn't part of the production workflow in order to reproduce
results with subsequent calls to `llc`.

(I haven't added tests since `llvm-lto` (the test tool for LTO) doesn't
support bitcode output, and even if it did: there isn't actually a good
way to test whether a tool has passed the flag.  If the order is already
"natural" (if the order will already round-trip) then no use-list
directives are emitted at all.  At some point I'll circle back to add
tests to `llvm-as` (etc.) that they actually respect the flag, at which
point I can somehow add a test here as well.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235943 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm-c/lto.h
include/llvm/LTO/LTOCodeGenerator.h
lib/LTO/LTOCodeGenerator.cpp
tools/lto/lto.cpp

index 9d0d7263a589b8bcbf73ed1f4d14a50570e86cbe..1db077822ae223f238f47cba0fed36d0bb78bb7f 100644 (file)
@@ -40,7 +40,7 @@ typedef bool lto_bool_t;
  * @{
  */
 
-#define LTO_API_VERSION 14
+#define LTO_API_VERSION 15
 
 /**
  * \since prior to LTO_API_VERSION=3
@@ -558,6 +558,18 @@ extern void
 lto_codegen_set_should_internalize(lto_code_gen_t cg,
                                    lto_bool_t ShouldInternalize);
 
+/**
+ * \brief Set whether to embed uselists in bitcode.
+ *
+ * Sets whether \a lto_codegen_write_merged_modules() should embed uselists in
+ * output bitcode.  This should be turned on for all -save-temps output.
+ *
+ * \since LTO_API_VERSION=15
+ */
+extern void
+lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
+                                      lto_bool_t ShouldEmbedUselists);
+
 #ifdef __cplusplus
 }
 #endif
index 88156304344620cce8a114b90813ec2c2c1a3d24..3b4be81b223ce49b3683eb1f49f6f4dc31ca30c8 100644 (file)
@@ -80,6 +80,7 @@ struct LTOCodeGenerator {
   void setOptLevel(unsigned optLevel) { OptLevel = optLevel; }
 
   void setShouldInternalize(bool Value) { ShouldInternalize = Value; }
+  void setShouldEmbedUselists(bool Value) { ShouldEmbedUselists = Value; }
 
   void addMustPreserveSymbol(const char *sym) { MustPreserveSymbols[sym] = 1; }
 
@@ -176,6 +177,7 @@ private:
   void *DiagContext = nullptr;
   LTOModule *OwnedModule = nullptr;
   bool ShouldInternalize = true;
+  bool ShouldEmbedUselists = false;
 };
 }
 #endif
index 6a19849e668483c6cf70fd09d71b9ae545a06ac4..3cf13a0ef2cda4637418151b92a087689a909a1f 100644 (file)
@@ -202,8 +202,7 @@ bool LTOCodeGenerator::writeMergedModules(const char *path,
   }
 
   // write bitcode to it
-  WriteBitcodeToFile(IRLinker.getModule(), Out.os(),
-                     /* ShouldPreserveUseListOrder */ true);
+  WriteBitcodeToFile(IRLinker.getModule(), Out.os(), ShouldEmbedUselists);
   Out.os().close();
 
   if (Out.os().has_error()) {
index e66a7786a146283c35b5cfde9686a9bce4475534..d6ceebed728fcb46bba13d1e921bf668e0cbd512 100644 (file)
@@ -338,3 +338,8 @@ void lto_codegen_set_should_internalize(lto_code_gen_t cg,
                                         bool ShouldInternalize) {
   unwrap(cg)->setShouldInternalize(ShouldInternalize);
 }
+
+void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
+                                           lto_bool_t ShouldEmbedUselists) {
+  unwrap(cg)->setShouldEmbedUselists(ShouldEmbedUselists);
+}