Index: lib/MC/MCParser/AsmParser.cpp =================================================================== --- lib/MC/MCParser/AsmParser.cpp +++ lib/MC/MCParser/AsmParser.cpp @@ -342,7 +342,8 @@ /// \brief Process the specified file for the .incbin directive. /// This returns true on failure. - bool processIncbinFile(const std::string &Filename); + bool processIncbinFile(const std::string &Filename, int64_t Skip, + int64_t Count); /// \brief Reset the current lexer position to that given by \p Loc. The /// current token is not set; clients should ensure Lex() is called @@ -643,7 +644,8 @@ /// Process the specified .incbin file by searching for it in the include paths /// then just emitting the byte contents of the file to the streamer. This /// returns true on failure. -bool AsmParser::processIncbinFile(const std::string &Filename) { +bool AsmParser::processIncbinFile(const std::string &Filename, int64_t Skip, + int64_t Count) { std::string IncludedFile; unsigned NewBuf = SrcMgr.AddIncludeFile(Filename, Lexer.getLoc(), IncludedFile); @@ -651,7 +653,8 @@ return true; // Pick up the bytes from the file and emit them. - getStreamer().EmitBytes(SrcMgr.getMemoryBuffer(NewBuf)->getBuffer()); + StringRef Bytes = SrcMgr.getMemoryBuffer(NewBuf)->getBuffer(); + getStreamer().EmitBytes(Bytes.drop_front(Skip).take_front(Count)); return false; } @@ -4388,20 +4391,38 @@ } /// parseDirectiveIncbin -/// ::= .incbin "filename" +/// ::= .incbin "filename" [ , skip [ , count ] ] bool AsmParser::parseDirectiveIncbin() { // Allow the strings to have escaped octal character sequence. std::string Filename; SMLoc IncbinLoc = getTok().getLoc(); if (check(getTok().isNot(AsmToken::String), "expected string in '.incbin' directive") || - parseEscapedString(Filename) || - parseToken(AsmToken::EndOfStatement, + parseEscapedString(Filename)) + return true; + + int64_t Skip = 0; + int64_t Count = -1; + if (getLexer().isNot(AsmToken::EndOfStatement)) { + if (parseToken(AsmToken::Comma, + "unexpected token in '.incbin' directive") || + parseAbsoluteExpression(Skip)) + return true; + + if (getLexer().isNot(AsmToken::EndOfStatement)) { + if (parseToken(AsmToken::Comma, + "unexpected token in '.incbin' directive") || + parseAbsoluteExpression(Count)) + return true; + } + } + + if (parseToken(AsmToken::EndOfStatement, "unexpected token in '.incbin' directive")) return true; // Attempt to process the included file. - if (processIncbinFile(Filename)) + if (processIncbinFile(Filename, Skip, Count)) return Error(IncbinLoc, "Could not find incbin file '" + Filename + "'"); return false; } Index: test/MC/AsmParser/directive_incbin.s =================================================================== --- test/MC/AsmParser/directive_incbin.s +++ test/MC/AsmParser/directive_incbin.s @@ -4,3 +4,13 @@ .incbin "incbin\137abcd" # "\137" is underscore "_" # CHECK: .ascii "abcd\n" + +.data +.incbin "incbin\137abcd", 1 + +# CHECK: .ascii "bcd\n" + +.data +.incbin "incbin\137abcd", 1, 2 + +# CHECK: .ascii "bc"