Convert a few std::strings to StringRef.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 4 Jul 2014 14:12:46 +0000 (14:12 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 4 Jul 2014 14:12:46 +0000 (14:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212342 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bitcode/ReaderWriter.h
lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Reader/BitcodeReader.h
lib/LTO/LTOModule.cpp

index 8cf573544f8d85f9e6e36fc997d3b398304e1877..29c15af9ac6e3713239cb67f81d4cab127e384ee 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef LLVM_BITCODE_READERWRITER_H
 #define LLVM_BITCODE_READERWRITER_H
 
+#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/ErrorOr.h"
 #include <string>
 
@@ -44,8 +45,7 @@ namespace llvm {
   /// Read the header of the specified bitcode buffer and extract just the
   /// triple information. If successful, this returns a string and *does not*
   /// take ownership of 'buffer'. On error, this returns "".
-  std::string getBitcodeTargetTriple(MemoryBuffer *Buffer,
-                                     LLVMContext &Context);
+  StringRef getBitcodeTargetTriple(MemoryBuffer *Buffer, LLVMContext &Context);
 
   /// Read the specified bitcode file, returning the module.
   /// This method *never* takes ownership of Buffer.
index c02b587e3fc6fb548ba7a0db9ab9d050dbea3373..348234da095884471794bd652477c22376849a27 100644 (file)
@@ -71,6 +71,15 @@ static bool ConvertToString(ArrayRef<uint64_t> Record, unsigned Idx,
   return false;
 }
 
+ErrorOr<StringRef> BitcodeReader::convertToStringRef(ArrayRef<uint64_t> Record,
+                                                     unsigned Idx) {
+  if (Idx > Record.size())
+    return Error(InvalidRecord);
+
+  return StringRef((char*)&Record[Idx], Record.size() - Idx);
+}
+
+
 static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {
   switch (Val) {
   default: // Map unknown/new linkages to external
@@ -2116,13 +2125,13 @@ std::error_code BitcodeReader::ParseBitcodeInto(Module *M) {
   }
 }
 
-ErrorOr<std::string> BitcodeReader::parseModuleTriple() {
+ErrorOr<StringRef> BitcodeReader::parseModuleTriple() {
   if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID))
     return Error(InvalidRecord);
 
   SmallVector<uint64_t, 64> Record;
 
-  std::string Triple;
+  StringRef Triple;
   // Read all the records for this module.
   while (1) {
     BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
@@ -2142,10 +2151,10 @@ ErrorOr<std::string> BitcodeReader::parseModuleTriple() {
     switch (Stream.readRecord(Entry.ID, Record)) {
     default: break;  // Default behavior, ignore unknown content.
     case bitc::MODULE_CODE_TRIPLE: {  // TRIPLE: [strchr x N]
-      std::string S;
-      if (ConvertToString(Record, 0, S))
-        return Error(InvalidRecord);
-      Triple = S;
+      ErrorOr<StringRef> S = convertToStringRef(Record, 0);
+      if (std::error_code EC = S.getError())
+        return EC;
+      Triple = S.get();
       break;
     }
     }
@@ -2154,7 +2163,7 @@ ErrorOr<std::string> BitcodeReader::parseModuleTriple() {
   return Triple;
 }
 
-ErrorOr<std::string> BitcodeReader::parseTriple() {
+ErrorOr<StringRef> BitcodeReader::parseTriple() {
   if (std::error_code EC = InitStream())
     return EC;
 
@@ -3469,10 +3478,10 @@ ErrorOr<Module *> llvm::parseBitcodeFile(MemoryBuffer *Buffer,
   return M;
 }
 
-std::string llvm::getBitcodeTargetTriple(MemoryBuffer *Buffer,
-                                         LLVMContext &Context) {
+StringRef llvm::getBitcodeTargetTriple(MemoryBuffer *Buffer,
+                                       LLVMContext &Context) {
   BitcodeReader *R = new BitcodeReader(Buffer, Context);
-  ErrorOr<std::string> Triple = R->parseTriple();
+  ErrorOr<StringRef> Triple = R->parseTriple();
   R->releaseBuffer();
   delete R;
   if (Triple.getError())
index 1d4869a2d5a795c8de9949b25fe2e92122ef8512..e831ea59231aab843136dd9515b93f150ac6fe9e 100644 (file)
@@ -196,6 +196,9 @@ class BitcodeReader : public GVMaterializer {
 
   static const std::error_category &BitcodeErrorCategory();
 
+  static ErrorOr<StringRef> convertToStringRef(ArrayRef<uint64_t> Record,
+                                               unsigned Idx);
+
 public:
   enum ErrorType {
     BitcodeStreamInvalidSize,
@@ -220,7 +223,7 @@ public:
     InvalidValue // Invalid version, inst number, attr number, etc
   };
 
-  std::error_code Error(ErrorType E) {
+  static std::error_code Error(ErrorType E) {
     return std::error_code(E, BitcodeErrorCategory());
   }
 
@@ -252,7 +255,7 @@ public:
 
   /// @brief Cheap mechanism to just extract module triple
   /// @returns true if an error occurred.
-  ErrorOr<std::string> parseTriple();
+  ErrorOr<StringRef> parseTriple();
 
   static uint64_t decodeSignRotatedValue(uint64_t V);
 
@@ -354,7 +357,7 @@ private:
   std::error_code ResolveGlobalAndAliasInits();
   std::error_code ParseMetadata();
   std::error_code ParseMetadataAttachment();
-  ErrorOr<std::string> parseModuleTriple();
+  ErrorOr<StringRef> parseModuleTriple();
   std::error_code ParseUseLists();
   std::error_code InitStream();
   std::error_code InitStreamFromBuffer();
index 961c759e84cf66952a7b5cf8f0cc56d14f239c70..589ce2dd8103b193cdc0f89153ef5c550e4d3dc1 100644 (file)
@@ -70,8 +70,8 @@ bool LTOModule::isBitcodeFile(const char *path) {
 
 bool LTOModule::isBitcodeForTarget(MemoryBuffer *buffer,
                                    StringRef triplePrefix) {
-  std::string Triple = getBitcodeTargetTriple(buffer, getGlobalContext());
-  return StringRef(Triple).startswith(triplePrefix);
+  StringRef Triple = getBitcodeTargetTriple(buffer, getGlobalContext());
+  return Triple.startswith(triplePrefix);
 }
 
 LTOModule *LTOModule::createFromFile(const char *path, TargetOptions options,