Index: llvm/trunk/test/tools/llvm-rc/Inputs/deep-include.rc
===================================================================
--- llvm/trunk/test/tools/llvm-rc/Inputs/deep-include.rc
+++ llvm/trunk/test/tools/llvm-rc/Inputs/deep-include.rc
@@ -1,3 +1,3 @@
 // Whether this is found depends on whether the /I flag searches within the
 // "nested" subdirectory
-foo BITMAP "nested-bitmap.bmp"
\ No newline at end of file
+foo BITMAP "nested_bitmap.bmp"
Index: llvm/trunk/test/tools/llvm-rc/Inputs/include-noquotes.rc
===================================================================
--- llvm/trunk/test/tools/llvm-rc/Inputs/include-noquotes.rc
+++ llvm/trunk/test/tools/llvm-rc/Inputs/include-noquotes.rc
@@ -0,0 +1,3 @@
+// Test including filenames without quotes.
+// In this form, the path can't include dashes.
+foo BITMAP ./nested/nested_bitmap.bmp
Index: llvm/trunk/test/tools/llvm-rc/include-paths.test
===================================================================
--- llvm/trunk/test/tools/llvm-rc/include-paths.test
+++ llvm/trunk/test/tools/llvm-rc/include-paths.test
@@ -3,6 +3,11 @@
 ; RUN: llvm-rc /FO %t.include.res %p/Inputs/include.rc
 ; RUN: llvm-readobj %t.include.res | FileCheck --check-prefix=FOUND %s
 
+; Try including files without quotes.
+; RUN: rm -f %t.noquotes.res
+; RUN: llvm-rc /FO %t.noquotes.res %p/Inputs/include-noquotes.rc
+; RUN: llvm-readobj %t.noquotes.res | FileCheck --check-prefix=FOUND %s
+
 ; Should find the bitmap if the folder is explicitly specified.
 ; RUN: rm -f %t.nested-include.res
 ; RUN: llvm-rc /FO %t.nested-include.res /I %p/Inputs/nested %p/Inputs/deep-include.rc
@@ -41,4 +46,4 @@
 FOUND-NEXT: )
 
 MISSING:      llvm-rc: Error in BITMAP statement (ID foo):
-MISSING-NEXT: error : file not found : nested-bitmap.bmp
+MISSING-NEXT: error : file not found : nested_bitmap.bmp
Index: llvm/trunk/test/tools/llvm-rc/parser.test
===================================================================
--- llvm/trunk/test/tools/llvm-rc/parser.test
+++ llvm/trunk/test/tools/llvm-rc/parser.test
@@ -145,11 +145,6 @@
 ; PLANGUAGE2:  llvm-rc: Error parsing file: expected '-', '~', integer or '(', got ,
 
 
-; RUN: not llvm-rc /dry-run /V %p/Inputs/parser-html-bad-string.rc 2>&1 | FileCheck %s --check-prefix PHTML1
-
-; PHTML1:  llvm-rc: Error parsing file: expected string, got ThisPassesInTheOriginalToolButDocSaysItShouldBeQuoted
-
-
 ; RUN: not llvm-rc /dry-run /V %p/Inputs/parser-html-extra-comma.rc 2>&1 | FileCheck %s --check-prefix PHTML2
 
 ; PHTML2:  llvm-rc: Error parsing file: expected string, got ,
Index: llvm/trunk/tools/llvm-rc/ResourceScriptParser.h
===================================================================
--- llvm/trunk/tools/llvm-rc/ResourceScriptParser.h
+++ llvm/trunk/tools/llvm-rc/ResourceScriptParser.h
@@ -84,6 +84,7 @@
   Expected<RCInt> readInt();               // Parse an integer.
   Expected<StringRef> readString();        // Parse a string.
   Expected<StringRef> readIdentifier();    // Parse an identifier.
+  Expected<StringRef> readFilename();      // Parse a filename.
   Expected<IntOrString> readIntOrString(); // Parse an integer or a string.
   Expected<IntOrString> readTypeOrName();  // Parse an integer or an identifier.
 
Index: llvm/trunk/tools/llvm-rc/ResourceScriptParser.cpp
===================================================================
--- llvm/trunk/tools/llvm-rc/ResourceScriptParser.cpp
+++ llvm/trunk/tools/llvm-rc/ResourceScriptParser.cpp
@@ -214,6 +214,12 @@
   return read().value();
 }
 
+Expected<StringRef> RCParser::readFilename() {
+  if (!isNextTokenKind(Kind::String) && !isNextTokenKind(Kind::Identifier))
+    return getExpectedError("string");
+  return read().value();
+}
+
 Expected<StringRef> RCParser::readIdentifier() {
   if (!isNextTokenKind(Kind::Identifier))
     return getExpectedError("identifier");
@@ -385,7 +391,7 @@
 }
 
 RCParser::ParseType RCParser::parseCursorResource() {
-  ASSIGN_OR_RETURN(Arg, readString());
+  ASSIGN_OR_RETURN(Arg, readFilename());
   return llvm::make_unique<CursorResource>(*Arg);
 }
 
@@ -427,8 +433,13 @@
     return getExpectedError("filename, '{' or BEGIN");
 
   // Check if this is a file resource.
-  if (look().kind() == Kind::String)
+  switch (look().kind()) {
+  case Kind::String:
+  case Kind::Identifier:
     return llvm::make_unique<UserDefinedResource>(Type, read().value());
+  default:
+    break;
+  }
 
   RETURN_IF_ERROR(consumeType(Kind::BlockBegin));
   std::vector<IntOrString> Data;
@@ -487,17 +498,17 @@
 }
 
 RCParser::ParseType RCParser::parseBitmapResource() {
-  ASSIGN_OR_RETURN(Arg, readString());
+  ASSIGN_OR_RETURN(Arg, readFilename());
   return llvm::make_unique<BitmapResource>(*Arg);
 }
 
 RCParser::ParseType RCParser::parseIconResource() {
-  ASSIGN_OR_RETURN(Arg, readString());
+  ASSIGN_OR_RETURN(Arg, readFilename());
   return llvm::make_unique<IconResource>(*Arg);
 }
 
 RCParser::ParseType RCParser::parseHTMLResource() {
-  ASSIGN_OR_RETURN(Arg, readString());
+  ASSIGN_OR_RETURN(Arg, readFilename());
   return llvm::make_unique<HTMLResource>(*Arg);
 }
 
Index: llvm/trunk/tools/llvm-rc/ResourceScriptToken.cpp
===================================================================
--- llvm/trunk/tools/llvm-rc/ResourceScriptToken.cpp
+++ llvm/trunk/tools/llvm-rc/ResourceScriptToken.cpp
@@ -281,13 +281,14 @@
   assert(!streamEof());
 
   const char CurChar = Data[Pos];
-  return std::isalpha(CurChar) || CurChar == '_';
+  return std::isalpha(CurChar) || CurChar == '_' || CurChar == '.';
 }
 
 bool Tokenizer::canContinueIdentifier() const {
   assert(!streamEof());
   const char CurChar = Data[Pos];
-  return std::isalnum(CurChar) || CurChar == '_';
+  return std::isalnum(CurChar) || CurChar == '_' || CurChar == '.' ||
+         CurChar == '/' || CurChar == '\\';
 }
 
 bool Tokenizer::canStartInt() const {