aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-03-13 11:45:43 +0000
committerGitHub <noreply@github.com>2022-03-13 11:45:43 +0000
commit41f402f0b19c7e4f19f8d4d65d15223d2752f302 (patch)
treed3cbf6a68ea6a86bf538f46a2d4090656929a9cf /gcc
parent8c88e8e0c9c3ebc627e3f3373cd7303d487c8d63 (diff)
parentd9a5bddb4c64268f2411a2b317872fe0c26284c3 (diff)
downloadgcc-41f402f0b19c7e4f19f8d4d65d15223d2752f302.zip
gcc-41f402f0b19c7e4f19f8d4d65d15223d2752f302.tar.gz
gcc-41f402f0b19c7e4f19f8d4d65d15223d2752f302.tar.bz2
Merge #1004
1004: Added column!() macro r=CohenArthur a=mvvsmk Fixes issue #979 1) Added the column!() macro using the LOCATION_COLUMN() from gcc_linemap 2) To-Do: add relevant test cases. Signed-off-by : M V V S Manoj Kumar <mvvsmanojkumar@gmail.com> The test case I added always fails, I can't figure out whether there is a problem in my test case or there is something wrong with my implementation of the column!() macro. Do let me know where I am going wrong and also if I missed something . :) Co-authored-by: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/expand/rust-macro-builtins.cc14
-rw-r--r--gcc/rust/expand/rust-macro-builtins.h3
-rw-r--r--gcc/rust/rust-linemap.cc9
-rw-r--r--gcc/rust/rust-linemap.h9
-rw-r--r--gcc/rust/util/rust-hir-map.cc1
-rw-r--r--gcc/testsuite/rust/execute/torture/builtin_macros3.rs24
6 files changed, 60 insertions, 0 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc
index ce0be92..c33a2e8 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -49,4 +49,18 @@ MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc)
return AST::ASTFragment ({file_str});
}
+AST::ASTFragment
+MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc)
+{
+ auto current_column
+ = Session::get_instance ().linemap->location_to_column (invoc_locus);
+ // auto column_no
+ // = AST::SingleASTNode (make_string (invoc_locus, current_column));
+
+ auto column_no = AST::SingleASTNode (std::unique_ptr<AST::Expr> (
+ new AST::LiteralExpr (std::to_string (current_column), AST::Literal::INT,
+ PrimitiveCoreType::CORETYPE_U32, {}, invoc_locus)));
+
+ return AST::ASTFragment ({column_no});
+}
} // namespace Rust
diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h
index 37923cf..ae9ba37 100644
--- a/gcc/rust/expand/rust-macro-builtins.h
+++ b/gcc/rust/expand/rust-macro-builtins.h
@@ -68,6 +68,9 @@ public:
static AST::ASTFragment file (Location invoc_locus,
AST::MacroInvocData &invoc);
+
+ static AST::ASTFragment column (Location invoc_locus,
+ AST::MacroInvocData &invoc);
};
} // namespace Rust
diff --git a/gcc/rust/rust-linemap.cc b/gcc/rust/rust-linemap.cc
index 637d749..b32a965a 100644
--- a/gcc/rust/rust-linemap.cc
+++ b/gcc/rust/rust-linemap.cc
@@ -42,6 +42,8 @@ public:
int location_line (Location);
+ int location_column (Location);
+
protected:
Location get_predeclared_location ();
@@ -111,6 +113,13 @@ Gcc_linemap::location_line (Location loc)
return LOCATION_LINE (loc.gcc_location ());
}
+// Return the column number for a given location.
+int
+Gcc_linemap::location_column (Location loc)
+{
+ return LOCATION_COLUMN (loc.gcc_location ());
+}
+
// Stop getting locations.
void
diff --git a/gcc/rust/rust-linemap.h b/gcc/rust/rust-linemap.h
index c8472a1..0ba95f8 100644
--- a/gcc/rust/rust-linemap.h
+++ b/gcc/rust/rust-linemap.h
@@ -72,6 +72,9 @@ public:
// Return the line number for a given location.
virtual int location_line (Location) = 0;
+ // Return the column number for a given location.
+ virtual int location_column (Location) = 0;
+
protected:
// Return a special Location used for predeclared identifiers. This
// Location should be different from that for any actual source
@@ -149,6 +152,12 @@ public:
rust_assert (Linemap::instance_ != NULL);
return Linemap::instance_->location_line (loc);
}
+
+ static int location_to_column (Location loc)
+ {
+ rust_assert (Linemap::instance_ != NULL);
+ return Linemap::instance_->location_column (loc);
+ }
};
#endif // !defined(RUST_LINEMAP_H)
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 9190bd9..5b0417b 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -750,6 +750,7 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro)
builtin_macros = {
{"assert", MacroBuiltin::assert},
{"file", MacroBuiltin::file},
+ {"column", MacroBuiltin::column},
};
auto builtin = builtin_macros.find (macro->get_rule_name ());
diff --git a/gcc/testsuite/rust/execute/torture/builtin_macros3.rs b/gcc/testsuite/rust/execute/torture/builtin_macros3.rs
new file mode 100644
index 0000000..ed11780
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/builtin_macros3.rs
@@ -0,0 +1,24 @@
+// { dg-output "14\n42\n" }
+macro_rules! column {
+ () => {{}};
+}
+
+extern "C" {
+ fn printf(fmt: *const i8, ...);
+}
+
+fn print(s: u32) {
+ printf("%u\n\0" as *const str as *const i8, s);
+}
+
+fn main() -> i32 {
+ let c0 = column!();
+
+ print(c0);
+
+ let c1 = column!();
+
+ print(c1);
+
+ 0
+} \ No newline at end of file