Skip to content

[ms] [llvm-ml] Add support for @CatStr built-in function symbol #130781

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 89 additions & 9 deletions llvm/lib/MC/MCParser/MasmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,19 @@ class MasmParser : public MCAsmParser {
std::optional<std::string> evaluateBuiltinTextMacro(BuiltinSymbol Symbol,
SMLoc StartLoc);

// Generic (target and platform independent) directive parsing.
enum BuiltinFunction {
BI_NO_FUNCTION, // Placeholder
BI_CATSTR,
};

/// Maps builtin name --> BuiltinFunction enum, for builtins handled by this
/// class.
StringMap<BuiltinFunction> BuiltinFunctionMap;

bool evaluateBuiltinMacroFunction(BuiltinFunction Function, StringRef Name,
std::string &Res);

// ".ascii", ".asciz", ".string"
bool parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated);

Expand Down Expand Up @@ -959,7 +972,7 @@ class MasmParser : public MCAsmParser {
bool parseDirectiveEcho(SMLoc DirectiveLoc);

void initializeDirectiveKindMap();
void initializeBuiltinSymbolMap();
void initializeBuiltinSymbolMaps();
};

} // end anonymous namespace
Expand Down Expand Up @@ -999,7 +1012,7 @@ MasmParser::MasmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,

initializeDirectiveKindMap();
PlatformParser->Initialize(*this);
initializeBuiltinSymbolMap();
initializeBuiltinSymbolMaps();

NumOfMacroInstantiations = 0;
}
Expand Down Expand Up @@ -1084,15 +1097,25 @@ bool MasmParser::expandMacros() {
}

std::optional<std::string> ExpandedValue;
auto BuiltinIt = BuiltinSymbolMap.find(IDLower);
if (BuiltinIt != BuiltinSymbolMap.end()) {

if (auto BuiltinIt = BuiltinSymbolMap.find(IDLower);
BuiltinIt != BuiltinSymbolMap.end()) {
ExpandedValue =
evaluateBuiltinTextMacro(BuiltinIt->getValue(), Tok.getLoc());
} else {
auto VarIt = Variables.find(IDLower);
if (VarIt != Variables.end() && VarIt->getValue().IsText) {
ExpandedValue = VarIt->getValue().TextValue;
} else if (auto BuiltinFuncIt = BuiltinFunctionMap.find(IDLower);
BuiltinFuncIt != BuiltinFunctionMap.end()) {
StringRef Name;
if (parseIdentifier(Name)) {
return true;
}
std::string Res;
if (evaluateBuiltinMacroFunction(BuiltinFuncIt->getValue(), Name, Res)) {
return true;
}
ExpandedValue = Res;
} else if (auto VarIt = Variables.find(IDLower);
VarIt != Variables.end() && VarIt->getValue().IsText) {
ExpandedValue = VarIt->getValue().TextValue;
}

if (!ExpandedValue)
Expand Down Expand Up @@ -3197,6 +3220,18 @@ bool MasmParser::parseTextItem(std::string &Data) {
continue;
}

// Try to resolve as a built-in macro function
auto BuiltinFuncIt = BuiltinFunctionMap.find(ID.lower());
if (BuiltinFuncIt != BuiltinFunctionMap.end()) {
Data.clear();
if (evaluateBuiltinMacroFunction(BuiltinFuncIt->getValue(), ID, Data)) {
return true;
}
ID = StringRef(Data);
Expanded = true;
continue;
}

// Try to resolve as a variable text macro
auto VarIt = Variables.find(ID.lower());
if (VarIt != Variables.end()) {
Expand Down Expand Up @@ -6204,7 +6239,7 @@ bool MasmParser::parseMSInlineAsm(
return false;
}

void MasmParser::initializeBuiltinSymbolMap() {
void MasmParser::initializeBuiltinSymbolMaps() {
// Numeric built-ins (supported in all versions)
BuiltinSymbolMap["@version"] = BI_VERSION;
BuiltinSymbolMap["@line"] = BI_LINE;
Expand All @@ -6216,6 +6251,9 @@ void MasmParser::initializeBuiltinSymbolMap() {
BuiltinSymbolMap["@filename"] = BI_FILENAME;
BuiltinSymbolMap["@curseg"] = BI_CURSEG;

// Function built-ins (supported in all versions)
BuiltinFunctionMap["@catstr"] = BI_CATSTR;

// Some built-ins exist only for MASM32 (32-bit x86)
if (getContext().getSubtargetInfo()->getTargetTriple().getArch() ==
Triple::x86) {
Expand Down Expand Up @@ -6289,6 +6327,48 @@ MasmParser::evaluateBuiltinTextMacro(BuiltinSymbol Symbol, SMLoc StartLoc) {
llvm_unreachable("unhandled built-in symbol");
}

bool MasmParser::evaluateBuiltinMacroFunction(BuiltinFunction Function,
StringRef Name,
std::string &Res) {
if (parseToken(AsmToken::LParen, "invoking macro function '" + Name +
"' requires arguments in parentheses")) {
return true;
}

MCAsmMacroParameters P;
switch (Function) {
default:
return true;
case BI_CATSTR:
break;
}
MCAsmMacro M(Name, "", P, {}, true);

MCAsmMacroArguments A;
if (parseMacroArguments(&M, A, AsmToken::RParen) || parseRParen()) {
return true;
}

switch (Function) {
default:
llvm_unreachable("unhandled built-in function");
case BI_CATSTR: {
for (const MCAsmMacroArgument &Arg : A) {
for (const AsmToken &Tok : Arg) {
if (Tok.is(AsmToken::String)) {
Res.append(Tok.getStringContents());
} else {
Res.append(Tok.getString());
}
}
}
return false;
}
}
llvm_unreachable("unhandled built-in function");
return true;
}

/// Create an MCAsmParser instance.
MCAsmParser *llvm::createMCMasmParser(SourceMgr &SM, MCContext &C,
MCStreamer &Out, const MCAsmInfo &MAI,
Expand Down
12 changes: 9 additions & 3 deletions llvm/test/tools/llvm-ml/macro_function.asm
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,20 @@ expr_recursive_test PROC
ret
expr_recursive_test ENDP

expand_as_directive_test @CatStr(P, RO, C)
; CHECK-LABEL: expand_as_directive_test:

ret
expand_as_directive_test ENDP

custom_strcat MACRO arg1, arg2
EXITM <arg1&arg2>
ENDM

expand_as_directive_test custom_strcat(P, ROC)
; CHECK-LABEL: expand_as_directive_test:
expand_as_directive_custom_test custom_strcat(P, ROC)
; CHECK-LABEL: expand_as_directive_custom_test:

ret
expand_as_directive_test ENDP
expand_as_directive_custom_test ENDP

end